none
Ajuda entender comando insert RRS feed

  • Discussão Geral

  • Boa noite galera,

    Gostaria de entender como é feito os vinculos de FK na programação, exemplo:

    Tenho uma tabela cidade uma estado e uma endereço , na qual o cod da cidade iria ser fk na tabela endereço.

    Porém na hora do insert ele é feito apenas em uma tabela por vez, como seria feito o código para esse vinculo rodar.

    Alguem consegue me explicar esse funcionamento ?

    Desde já agradeço

    quinta-feira, 21 de março de 2013 04:02

Todas as Respostas

  • Deixa eu ver se entendi.
    Você possui três tabelas que há relacionamento correto ?
    E na hora do insert você que validar os relacionamento e saber quais são as chaves primárias certo ?
    Se meu raciocinio estiver correto há várias formas de se fazer.
    A 1° vc executa uma procedure e na procedure voce trata os relacionamentos, mas ou menos assim vc envias as informações qu vc quer inserir e a mesma após obter esse valores realizar os selects e realiza a inserção.Assim a a procedure seria responsável por validar quais são os relacionamento.
    2°Se vc não quer realizar a criação da procedure, então você terá que realizar um select na base para obter is valores de relacionamento e pegar o resultado do select e inserir com os devidos valores.
    Deu para entender ?
    quinta-feira, 21 de março de 2013 14:27
  • Entendi +-


    Tentando explicar melhor por exemplo: tenho uma tabela estado e uma tabela cidade, a tabela cidade tem o campo estado_codigo que é uma chave estrangeira vindo da tabela estado.

    Ai na hora de um usuario por exemplo fazer um insert de uma cidade, iria ter os campos id(que seria autoincrement nen precisa por),cidade e estado_codigo.

    O campo cidade blz, mas o campo estado_codigo não posso por para o usuario digitar o cod e sim o nome do estado.. A minha duvida é essa como fazer essa validação de ele digitar o nome do estado so que para inserir vai ter que ser o codigo.

    Se tiver algum exemplo seria melhor.

    Agradeço desde já.


    quarta-feira, 27 de março de 2013 03:00
  • Faz o seguinte coloca uma combobox que é alimentada através da tabela estado.
    No displaymember irá ser o nome do estado, e no value será o codigo do estado, ai no insert você só passa o valor da combo.
    O código ficaria assim:

    "Sua combo".DisplayMember = "Descricao"
    "Sua combo".ValueMember = "ID"
    quarta-feira, 27 de março de 2013 12:20
  • Ainda to meio confuso sobre o que fazer , acho que estou explicando mal.

    Tipo assim a tabela cliente tem os campos particulares dela, e também tem o cod_cid que é uma fk vindo da tabela Cidade.

    Mas ao inserir o usuário nao pode inserir o código em si ele vai ter que inserir o nome da cidade e o estado, mas ao fazer esse insert o banco tem que pegar o cod em si disso, esse vinculo que estou meio perdido.

    Agradeço desde já.

    quarta-feira, 27 de março de 2013 15:02
  • Então na tabela cliente na coluna cod_cid você irá inserir o nome da cidade invés do código da mesma ?

    quarta-feira, 27 de março de 2013 15:06
  • Bruno, 

    a gente tem algo parecido aqui, no cadastro do cliente temos a cidade e o estado,

    no qual são carregados em duas combobox.

    ex: cboCidade e cboEstado

    onde carregamos o estado e só depois que selecionar o estado e que carregamos a cbocidade com todas as cidades do estado selecionado.

    Como carregamos as combobox:

    cboestado

    Aqui eu estou usando u dataset já carregado com a tabela do estado.

    cboestado.DataSource = DataSet.Tables(aqui o nome da tabela estado, neste caso o nome da tabela estado)
    cboestado.DisplayMember = "Aqui o nome do campo para visualizar na cboestado"
    cboestado.ValueMember = "Aqui o ID da tabela, neste caso o id da tabela estado"

     cboestado.SelectedIndex = -1  'Este caso para trazer a combobox sem dados selecionado

    na cbocidade e só aplicar a mesma idéia acima para carregar a combobox, com apenas um detalhe diferente, quando carregar um dataset para carregar as cidades do banco, filtrar pelo estado selecionado.

    Ai para incluir na tabela do cliente.cod_cid  e só pegar o valor da combobox

     cliente.cod_cid =cbocidade.SelectedValue.

    Espero ter ajudado.



    Oliveira

    quarta-feira, 27 de março de 2013 23:06
  • Marcio é isso mesmo só mais uma duvida , estou  tentando filtar assim

        cmd.CommandText = "select * from cidade where est_cod = " & cmbEstado.SelectedValue

    E está dando erro, sabe me dizer como faço esa filtragem.

    Agradeço desde já

    quinta-feira, 28 de março de 2013 03:31
  • Se vc nos dizer qual erro fica mais facil te ajudar.

    Mas é provavel que seja um problema relacionado ao tipo do campo est_cod. Se est_cod é do tipo varchar (ou char) entao o comando correto é 

    cmd.CommandText = "select * from cidade where est_cod = '" & cmbEstado.SelectedValue &"'"

    Nos de mais detalhes sobre o problema que a ajuda será mais precisa.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    quinta-feira, 28 de março de 2013 15:44
    Moderador
  • Segue abaixo o código..

      Private Sub carregacidade()

            cmd.CommandText = "select * from cidade where est_cod = '" & cmbEstado.SelectedValue & "'"




            dtadp.SelectCommand = cmd

            dtadp.Fill(dtcidade)


             cmbCidade.DataSource = dtcidade
             cmbCidade.DisplayMember = "CID_NOME"
             cmbCidade.ValueMember = "CID_COD"







        End Sub

        Private Sub carregaestado()


            cmd.CommandText = "select * from estado order by est_nome"


            dtadp.SelectCommand = cmd

            dtadp.Fill(dtestado)


            cmbEstado.DataSource = dtestado
            cmbEstado.DisplayMember = "EST_UF"
            cmbEstado.ValueMember = "EST_COD"
            cmbEstado.SelectedIndex = -1






        End Sub

    Parou de dar erro, mas a combo de cidades não carrega nada agora.

    O Campo EST_COD no banco é numérico.

    Agradeço desde já.


    • Editado Bruno 91 quinta-feira, 28 de março de 2013 17:34
    quinta-feira, 28 de março de 2013 17:13
  • Faz o seguinte:

    Coloque um breakpoint nesta linha:

    dtadp.Fill(dtcidade)

    E inspecione o conteudo de cmd.CommandText

    Creio que se a combo cidades esta vazia é porque vc relamente nao tem nenhuma cidade que pertença ao estado selecionado.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée


    quinta-feira, 28 de março de 2013 17:35
    Moderador
  • Opa mas impossivel eu inserir o script com todos os estados e cidades do Brasil
    quinta-feira, 28 de março de 2013 17:48
  • Neste caso é sua consulta que esta sendo feita errada.. como eu disse coloque um breakpoint e inspecione o conteudo de CommandText.

    Uma vez que vc consiga ver este conteudo, verifique se é possivel executa-la dentro do Queryanalyser.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    quinta-feira, 28 de março de 2013 18:12
    Moderador
  • Desculpa mas não entendi.
    quinta-feira, 28 de março de 2013 19:00
  • Vc sabe criar um breakpoint dentro do seu codigo?

    Caso nao saiba, veja este artigo sobre depuraçao de codigo:

    http://www.macoratti.net/vbn_debg.htm

    Leia a parte que fala de "Usando pontos de interrupção"

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    quinta-feira, 28 de março de 2013 19:06
    Moderador
  • Consegui executar o código galera..

    Só tem um porém por exemplo carrego sp e ele exibe todas as cidades de sp, ai se eu trocar o estado ele carrega todas as cidades de sp e do outro estado que acabei de  exibir.

    Tentei executar um combobox.items.clear antes de iniciar novamente e ele gera o erro

    Não é possível modificar a coleção de itens quando a propriedade DataSource está definida.

    Segue todo o código

    Imports System.Data
    Imports System.Data.OleDb

    Public Class frmCadastroCliente

        Dim Conn As OleDb.OleDbConnection
        Dim sConnString As String = _
            "Provider=OraOLEDB.Oracle;" & _
            "Data Source=XE;" & _
            "User ID=system;" & _
            "Password=123"
        Dim cmd As New OleDb.OleDbCommand()
        Dim dtadp As OleDbDataAdapter = New OleDbDataAdapter
        Dim dsmala As DataSet
        Dim dtcidade As New DataTable
        Dim dtestado As New DataTable










        Private Sub carregaestado()


            cmd.CommandText = "select * from estado order by est_nome"


            dtadp.SelectCommand = cmd
            dtadp.Fill(dtestado)

            cmbEstado.DataSource = dtestado
            cmbEstado.DisplayMember = "EST_UF"
            cmbEstado.ValueMember = "EST_COD"
            cmbEstado.SelectedIndex = -1






        End Sub



        Private Sub Label2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label2.Click

        End Sub

        Private Sub GroupBox1_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs)

        End Sub

        Private Sub Label8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

        End Sub

        Private Sub Label5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label5.Click

        End Sub

        Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Conn = New OleDb.OleDbConnection(sConnString)
            cmd.Connection = Conn


            Conn.Open()



            carregaestado()



        End Sub

        Private Sub GroupBox1_Enter_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GroupBox1.Enter

        End Sub

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        End Sub

        Private Sub cmbCidade_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged

        End Sub

        Private Sub ComboBox2_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox2.SelectedIndexChanged
        


        End Sub

        Private Sub ComboBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.Click



            cmd.CommandText = "select * from cidade where est_cod = '" & cmbEstado.SelectedValue & "'"


            dtadp.SelectCommand = cmd



            dtadp.Fill(dtcidade)


            cmbCidade.DataSource = dtcidade
            cmbCidade.DisplayMember = "CID_NOME"
            cmbCidade.ValueMember = "EST_COD"


        End Sub
    End Class

    quinta-feira, 28 de março de 2013 19:56
  • seucombobox.datasource = Nothing
    Assim vc limpa o combobox
    quinta-feira, 28 de março de 2013 20:07
  •    Private Sub ComboBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.Click

            ComboBox1.DataSource = Nothing
            cmd.CommandText = "select * from cidade where est_cod = '" & ComboBox2.SelectedValue & "'"


            dtadp.SelectCommand = cmd



            dtadp.Fill(dtcidade)


            ComboBox1.DataSource = dtcidade
            ComboBox1.DisplayMember = "CID_NOME"
            ComboBox1.ValueMember = "EST_COD"




        End Sub

    Seria assim ? Testei e continua a pegar os valores do primeiro estado.

    Desculpa pela burrice imensa ai galera.. estou aprendendo agora!



    • Editado Bruno 91 quinta-feira, 28 de março de 2013 20:14
    quinta-feira, 28 de março de 2013 20:13
  • Relaxa
    Ninguém sabe vb.net 100%
    Antes de você inserir o dataset na sua combo você está limpando a mesma ?
    quinta-feira, 28 de março de 2013 20:18
  • Nao intendi.. o cod inteiro que fiz e esse aqui

    Imports System.Data
    Imports System.Data.OleDb

    Public Class frmCadastroCliente

        Dim Conn As OleDb.OleDbConnection
        Dim sConnString As String = _
            "Provider=OraOLEDB.Oracle;" & _
            "Data Source=XE;" & _
            "User ID=system;" & _
            "Password=123"
        Dim cmd As New OleDb.OleDbCommand()
        Dim dtadp As OleDbDataAdapter = New OleDbDataAdapter
        Dim dsmala As DataSet
        Dim dtcidade As New DataTable
        Dim dtestado As New DataTable










        Private Sub carregaestado()


            cmd.CommandText = "select * from estado order by est_nome"


            dtadp.SelectCommand = cmd
            dtadp.Fill(dtestado)

            cmbEstado.DataSource = dtestado
            cmbEstado.DisplayMember = "EST_UF"
            cmbEstado.ValueMember = "EST_COD"
            cmbEstado.SelectedIndex = -1






        End Sub



        Private Sub Label2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label2.Click

        End Sub

        Private Sub GroupBox1_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs)

        End Sub

        Private Sub Label8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

        End Sub

        Private Sub Label5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label5.Click

        End Sub

        Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Conn = New OleDb.OleDbConnection(sConnString)
            cmd.Connection = Conn


            Conn.Open()



            carregaestado()



        End Sub

        Private Sub GroupBox1_Enter_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GroupBox1.Enter

        End Sub

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        End Sub

        Private Sub cmbCidade_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged

        End Sub

        Private Sub ComboBox2_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox2.SelectedIndexChanged
        


        End Sub

        Private Sub ComboBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.Click



            cmd.CommandText = "select * from cidade where est_cod = '" & cmbEstado.SelectedValue & "'"


            dtadp.SelectCommand = cmd



            dtadp.Fill(dtcidade)


            cmbCidade.DataSource = dtcidade
            cmbCidade.DisplayMember = "CID_NOME"
            cmbCidade.ValueMember = "EST_COD"


        End Sub
    End Class

    quinta-feira, 28 de março de 2013 20:21
  • Tenta assim:

    dtcidade = Nothing

    quinta-feira, 28 de março de 2013 20:25
  • da erro 

    Valor não pode ser nulo.
    Nome do parâmetro: dataTable

    Não sei mais o que fazer galera para dar certo e não acabar com a paciência de vocês.

    quinta-feira, 28 de março de 2013 21:28
  • Boa noite amigo!

    Bom, deixa eu ver se eu entendi sua ultima dúvida:

    Você carregou as cidades do estado de são paulo e ficou ok? Aí você trocou o estado, por exemplo minas gerais, e quando foi ver, seu combobox estava com as cidades do estado de são paulo MAIS as cidades do estado de minas gerais???

    Se for isso, tente limpar o combobox das cidades antes de carregar de novo.

    seucombobox.Items.Clear

    E só depois de fazer isso, execute de novo o código que carrega as cidades.

    Att.

    Giovani

    sexta-feira, 29 de março de 2013 01:50
  • Não da assim gera erro, do dataset já testei
    sábado, 30 de março de 2013 14:44
  • Olá amigo!

    Bom, eu estudei os códigos que você postou, e implementei em um formulário meu. Eu preenchi um combobox com um campo de uma tabela minha e com o outro botão eu apaguei os dados.

    Ficou assim: http://gyazo.com/776e2dc2ca586e49b4741aec974f4bfd


    Depois eu cliquei no botão carregar para popular o combobox e ficou assim:

    http://gyazo.com/0b343a8a63bb94978c47ce7864b1031f

    O nome michel se repete porque eu estou usando uma tabela de ordem de serviço pegando o campo Nome da mesma. Então por isso está repetindo. Eu não tenho uma tabela específica para estado cidade, ok?

    E logo em seguida eu cliquei no botão apagar e ficou assim:

    http://gyazo.com/d67c0bf86d67f67c3835e2320337f15d

    Agora vamos ao código que adaptei do seu post:

    Carrega Combobox:

    Dim sSql As String = "select * from ClientexHoraMaq"
            Using con As OleDbConnection = GetConnection()
                Try
                    con.Open()
                    Dim da As OleDbDataAdapter = New OleDbDataAdapter(sSql, con)
                    Dim dtnome As New DataTable
                    da.Fill(dtnome)
                    Me.ComboBox1.DataSource = dtnome
                    Me.ComboBox1.DisplayMember = "Nome_tm"
                    Me.ComboBox1.ValueMember = "id_tm"
                    con.Close()
                Catch ex As Exception
                    Stop
                End Try
            End Using

    O código acima está no evento click do botão carregar.

    Agora o botão apagar:

    ComboBox1.DataSource = Nothing

    Também no evento click do botão apagar.

    Aqui o seu código funcionou. Eu suspeito que o problema esteja na forma diferente que eu e você buscamos dados no banco de dados. Eu não aprendi a usar dataset para conectar ao banco (e fez uma falta enorme nessas ultimas semanas), eu faço a conexão de forma manual, digamos... Eu ACHO que pode ser isso.... por dataset ser um negócio novo para mim, pois só uso ele com o report viewer, eu não sou a melhor pessoa para opinar sobre isso.

    Estou postando aqui a minha função getconnection (que está sendo utilizado no código do primeiro botão) que aprendi quando comecei a estudar VB.net:

    Public Function GetConnection() As OleDbConnection
            'Obtem a string de conexão
    
            Dim caminhoBD As String = System.Configuration.ConfigurationManager.AppSettings("CaminhoDB")
    
            Dim strConexao As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & caminhoBD & ";Persist Security Info=False;"
            'Retorna uma conexão.
            Return New OleDbConnection(strConexao)
    
        End Function

    Se você não utiliza um arquivo de configuração no seu programa, na linha: Dim CaminhoDB, basta você colocar o local do seu banco de dados. E não se esqueça, eu uso access 2007, por isso a strconexao está com o provider=Microsoft.ACE.OLEDB.12. Se vc utiliza um acces que tenha extensão mdb, se não me engano o provider será esse:

    Provider=Microsoft.Jet.OLEDB.4.0

    Agora se você utliza outro banco de dados, você pode consultar aqui:http://www.connectionstrings.com/

    Para fazer a conexão manual com seu banco de dados, caso seja do seu interesse.

    Bom, testa aí, veja se você consegue reproduzir isso no seu programa e se voltar a dar erro, por favor, coloque o erro para nós estudarmos ele.

    Bom trabalho e bons estudos!

    Att.

    Giovani


    sábado, 30 de março de 2013 16:13
  • Consegui da seguinte maneira a cada inicio da função usei o seguinte:

    cmbEstado.DataSource = Nothing
            cmbEstado.Items.Clear()

            cmd.CommandText = "select * from estado order by est_nome"

            dtestado.Clear()

    Assim funcionou agradeço a todos pela ajuda!


    quarta-feira, 3 de abril de 2013 01:26