Inquiridor
Ajuda entender comando insert

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
- Tipo Alterado Felipo Gonçalves quinta-feira, 21 de março de 2013 14:42
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 ? -
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á.
-
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" -
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á.
-
-
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
-
-
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 -
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 SubParou 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
-
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- Editado William John Adam TrindadeModerator quinta-feira, 28 de março de 2013 18:10
-
-
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 -
-
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"
William John Adam Trindade
Analyste-programmeur
----------------------------------------------------------
Sogi informatique ltée -
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 -
-
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 SubSeria 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
-
-
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 -
-
-
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
-
-
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
- Editado Giovani Rodrigues sábado, 30 de março de 2013 16:14 arrumando o texto
-
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!