Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

sweet-tooth

Como adicionar registros em 2 tabelas no SQL Server?

Recommended Posts

Olá,sou novo aqui,um amigo me indicou o site dizendo que a galera aqui é fera.

 

Eu to fazendo um sistema aqui,pois estou estudando programação,só que agora como ta em periodo de férias,tenho uma duvida que não da pra esperar as aulas voltarem.

Eu criei uma tela para cadastrar/adicionar produtos,e adicionei campos como fornecedor,lote,nota fiscal,pra ter um controle maior dos produtos que entram.Mas eu não queria guardar isso tudo numa tabela só no banco de dados,pra não ficar muito bagunçado,e mesmo pra evitar que dados sejam sobrepostos,por isso criei uma "estoque" e outra "controle_produtos" que é onde vai lote,nota,validade etc.

Eu preciso saber,se tem como o VB atualizar duas tabelas de uma só vez.

Depois de preenchido todos os campos,o usuário vai clicar no botão adicionar,com isso os registros de nome,preço,quantidade e etc tem que ir pra tabela "estoque",enquanto lote,nota,fornecedor tem que ir para "controles_produtos",mas isso no mesmo clique,quando o botão for ativado ele deve abastecer as duas tabelas.

Eu tentei mexer um pouco aqui,mas não manjo muito ainda,e não consegui fazer,só consigo abastecer uma tabela por vez mesmo

 

Eu vou postar o código:

 

Private Sub Command1_Click()

 

Dim strsql As String

abreconexao

If Textcodigo <> "" Then

strsql = "select * from estoque where produto_prod = '" & Textcodigo & "' "

With rs

.Open strsql, conn, adOpenKeyset, adLockPessimistic

If .EOF Then

.AddNew

!cod_prod = Textcodigo

!produto_prod = Textproduto

!quantidade_prod = Textquantidade

.Update

MsgBox "inclusão realizada com sucesso"

Else

MsgBox "A inclusão falhou"

Exit Sub

End If

End With

End If

rs.Close

 

 

 

End Sub

 

 

 

 

O que eu deixei em negrito,é a parte expecífica o que está sendo adicionado,mas isso tudo indo pra uma só tabela,como exemplo,como ficaria se eu quisesse adicionar o código (textcodigo),produto (textproduto) e quantidade (textquantidade) em tabelas diferentes???

Compartilhar este post


Link para o post
Compartilhar em outros sites

PAra que você possa adicionar também em outra tabela, é só executar a parte do código que abre uma tabela e realizar a inclusão, mas modificando o que for necessário - sql, campos, valores - para a outra tabela.Aproveitando que você está utilizando SQL, dá uma pesquisa sobre Insert Into, pode ser melhor do que utilizar o AddNew.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu por tentar ajudar amigo,mas eu não sei como fazer essa referencia a uma nova tabela,se você poder me passar um exemplo ficaria mais fácil.E eu conheço o insert into do SQL,mas não to sabendo usar no VB,se não for de mais,pode me explicar também?Eu tentei mexer no código,na hora de adicionar até disse que foi adicionado com sucesso na msgbox que configurei,mas quando consulto o SQL não tem registro nenhum não,ficou assim:Private Sub Command1_Click()Dim strsql As StringabreconexaoIf Textproduto <> "" Then strsql = "select * from estoque where produto_prod = '" & Textproduto & "' " With rs .Open strsql, conn, adOpenKeyset, adLockPessimistic If .EOF Then strsql = "insert into estoque (produto_prod) values ('" & Textproduto.Text & "')" MsgBox "inclusão realizada com sucesso" Else MsgBox "A inclusão falhou" Exit SubEnd IfEnd WithEnd Ifrs.CloseEnd Sub

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hmm...já que você conhece SQL vamos usar só SQL que fica bem mais fácil.

Supondo que conn é um Adodb.connection ficaria assim:

If Textcodigo <> "" Then	 abreconexao	 If conn.execute("select * from estoque where produto_prod = '" & Textproduto"'").eof then		 conn.execute "insert into estoque (cod_prod, produto_prod, quantidade_prod) values (" & Textcodigo & ", '" & Textproduto & "', " & Textquantidade & ")"		 MsgBox "inclusão realizada com sucesso"	 Else		 MsgBox "A inclusão falhou"	  End IfEnd If

Para realizar outra inclusão, é só fazer de novo aquela parte do conn.execute(...), mudando a instrução SQL.

Todas as instruções SQL (update,delete,insert,select) podem ser realizadas desse jeito, a única que muda um pouco por poder retornar resultados é a select:

dim rs as new adodb.recordsetset rs = conn.execute("select * from tabela")

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu amigão,graças a você estou mais próximo do que eu preciso fazer!

 

Eu consigo inserir os dados,só que tentei apenas um registro para tabela,to tetando fazer adicionar todos agora,mas eu não consigo por causa de uma combobox.Como que eu faço pra listar na combobox os dados que estão no banco de dados?

Na combo fornecedores,preciso exibir os fornecedores que estão cadastrados no banco de dados.No SQL usaria o comando select fornecedor from fornecedores,assim pegaria apenas os registros da coluna fornecedor da tabela de fornecedores,eu arrisquei uns códigos no VB com execute,mas não obtive resultado,não dava erro,mas tambem não trazia os resultados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para pegar os dados da tabela fornecedores e ir adicionando na combo ficaria assim:

dim rsFornecedores as new adodb.recordsetset rsFornecedores = conn.execute("select * from fornecedores")while not rsFornecedores.eof	combo.additem rsFornecedores("campo")	combo.itemdata(combo.newindex) = rsFornecedores("codigo")	rsFornecedores.movenextwend

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou precisar de um pouco mais de seu conhecimento cara http://forum.imasters.com.br/public/style_emoticons/default/natal_dry.gif

 

1º Não to conseguindo inserir os registros nas duas tabelas de novo!

Eu acho que sei a causa,é por causa da data que preciso adicionar a uma das tabelas,mas não to conseguindo fazer isso com o insert into. Veja o erro que aparece:

The Conversion of char data type to smalldatetime data type resulted in an out-of-range smalldatetime value.

No SQL,a coluna data,está definida como smalldatetime mas já tentei mudar para datetime mas não funciona,e eu configurei a data para dmy (dia/mes/ano) no SQL,que é a forma que o VB mostra a data (a máscara é preenchida automaticamente com a data do dia com código usado no form_load).

Com o .addnew eu consigo inserir os dados,mas aí não consigo abastecer as duas tabelas ao mesmo tempo.Sinceramente acho mais fácil usar o insert into que você ensinou.

 

Olha só o código do insert into:

 

abreconexao

Dim strsql As String

 

If Textnome <> "" Then

strsql = "select * from clientes where nome_cli = '" & Textnome & "' "

With rs

.Open strsql, conn, adOpenKeyset, adLockPessimistic

If .EOF Then

conn.Execute "insert into clientes (codigo_cli, nome_cli, tel_cli, cel_cli, bairro_cli, cep_cli, rua_cli, numero_cli, complemento, data) values ('" & Textcodigo & "', '" & Textnome & "', '" & Mskresid & "', '" & mskcel & "', '" & Textbairro & "', '" & Mskcep & "', '" & Textrua & "', '" & Textnumero & "', '" & Textcomplemento & "', '" & mskdata & "')"

MsgBox "inclusão realizada com sucesso"

Else

MsgBox "A inclusão falhou"

Exit Sub

End If

End With

Else

MsgBox "É necessário preencher todos os campos para realizar a inclusão", vbInformation, "Erro"

Exit Sub

End If

Set rs = Nothing

Agora parte do mesmo código mas usando .addnew:

 

conn.Execute "insert into clientes (codigo_cli, nome_cli, tel_cli, cel_cli, bairro_cli, cep_cli, rua_cli, numero_cli, complemento, data) values ('" & Textcodigo & "', '" & Textnome & "', '" & Mskresid & "', '" & mskcel & "', '" & Textbairro & "', '" & Mskcep & "', '" & Textrua & "', '" & Textnumero & "', '" & Textcomplemento & "', '" & mskdata & "')"

 

'.AddNew

' !codigo_cli = Textcodigo

' !nome_cli = Textnome

' !bairro_cli = Textbairro

' !cep_cli = Format(Mskcep, "#####-###")

' !tel_cli = Format(Mskresid, "####-####")

' !cel_cli = Format(mskcel, "####-####")

' !complemento = Textcomplemento

' !rua_cli = Textrua

' !numero_cli = Textnumero

' !Data = Format(mskdata, "##/##/####")

' .Update

MsgBox "inclusão realizada com sucesso"

Else

MsgBox "A inclusão falhou"

Exit Sub

Como posso resolver isso?

 

 

 

2º O código da combobox,da erro de objeto requirido,eu deixei ele assim:

abreconexao ''''''É sub usada para conectar com o banco de dados

Dim rsFornecedores As New adodb.Recordset

Set rsFornecedores = conn.Execute("select * from fornecedores")

While Not rsFornecedores.EOF

combo.AddItem rsFornecedores("fornecedor") '''''''Quando da o erro de objeto requirido aponta esta linha

 

combo.ItemData(combo.NewIndex) = rsFornecedores("fornecedor")

rsFornecedores.MoveNext

Wend

O caso da combo,acho que é mais simples,eu devia ter falado,eu não preciso retornar todos valores que estão na tabela fornecedores,só preciso retornar a coluna fornecedor.

 

Se você conseguir resolver mais essa cara,ia ser de grande ajuda,quero adiantar esse projeto,porque depois quando voltar as aulas todos vão estar cheios de problemas pra resolver como eu estou agora,então já to correndo atrás desde já.

Flw,valeu por tudo que já fez.

Compartilhar este post


Link para o post
Compartilhar em outros sites

1º: Hmm faz o seguinte, usa um msgbox para ver como está ficando a sql montada:

msgbox "insert into clientes (codigo_cli, nome_cli, tel_cli, cel_cli, bairro_cli, cep_cli, rua_cli, numero_cli, complemento, data) values ('" & Textcodigo & "', '" & Textnome & "', '" & Mskresid & "', '" & mskcel & "', '" & Textbairro & "', '" & Mskcep & "', '" & Textrua & "', '" & Textnumero & "', '" & Textcomplemento & "', '" & mskdata & "')"
Vê como a data está ficando, caso esteja tudo certo o que pode estar acontecendo é que no SQL Server o jeito de colocar as datas no SQL é diferente. Não sei te dizer como é pois nunca o usei, mas sei que no MySQL a data é colocada como texto mesmo. Caso o erro continue dá uma olhada no fórum do SQL Server.

 

2º: Por acaso a combobox combo existe? ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hoje passei o dia fora,não tive tempo de mexer muito http://forum.imasters.com.br/public/style_emoticons/default/natal_mad.gif

Bom,voltando para a combobox,creio que eu confundi alguns pontos em que deveria estar o nome da combo e eu coloquei como se fosse o campo que eu queria retornar,agora eu mudei o código e o nome e corrigiu o erro de objeto requirido,porém agora da o erro de Type Mismatch.

Buscando informações a respeito aqui,li alguns comentarios sob o ItemData só retornar numeros,e o que eu preciso é do nome do fornecedor,pq na hora de cadastrar um produto,deve-se escolher o nome de um fornecedor já cadastrado.

Tem alguma forma de retornar valores alfabéticos?Se não tiver vou usar um textbox mesmo,e o usuário escreve o nome do fornecedor ao invez de escolher na lista,vai ficar "menos elegante" apenas.

Quanto o problema com a data eu fiz o que você recomendou e a data está sendo retornada assim "22122006",sem as barras de separação,eu mudei a coluna no SQL de smalldatetime pra varchar,acho que isso vai resolver.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hmm...

Eu estava usando o ItemData ali para guardar o código do fornecedor, para que se caso fosse necessário o uso em uma consulta futura. O nome dele é usado no AddItem. A propriedae ItemData é uma coisa interna, o que é mostrado para o usuário é o valor utilizado no AddItem, que pode ser Alfanumérico:

combo.AddItem rsFornecedores("fornecedor") 'aqui você coloca o nome, para o usuário ver na listacombo.ItemData(combo.NewIndex) = rsFornecedores("COD_FORNECEDOR") 'aqui o código, caso queira, se não é só tirar essa linha

Já quanto ao campo data, o que você tem que fazer é ao invés de incluir no SQL só mskdata incluir o Format(mskdata, "##/##/####"):

"insert into clientes (codigo_cli, nome_cli, tel_cli, cel_cli, bairro_cli, cep_cli, rua_cli, numero_cli, complemento, data) values ('" & Textcodigo & "', '" & Textnome & "', '" & Mskresid & "', '" & mskcel & "', '" & Textbairro & "', '" & Mskcep & "', '" & Textrua & "', '" & Textnumero & "', '" & Textcomplemento & "', '" & Format(mskdata, "##/##/####") & "')"

O mesmo tem que ser feito com os outros campos que estão em MaskEditBox, veja se eles estão indo com suas respecticas máscaras. Se eu não me engano a próprio MaskEditBox tem uma propriedade que indica como ele retorna o valor, com ou sem a máscara.

Compartilhar este post


Link para o post
Compartilhar em outros sites

To precisando de ajuda de novo,pensei que o assunto tinha morrido,mas que nada.Eu consegui inserir os registros nas duas tabelas,mas agora,como consigo resgata-los?Os dados foram para duas tabelas diferentes,com campos diferentes em cada uma,vamos supor que eu precise fazer uma consulta e juntar os registros das duas tabelas de uma só vez,como que eu faço isso?Eu estou fazendo a consulta assim:Dim strsql As StringabreconexaoIf Textcodigo <> "" Then strsql = "select * from estoque where cod_prod = '" & Textcodigo & "' " With rs .Open strsql, conn, adOpenKeyset, adLockPessimistic If Not .EOF Then Textproduto.Text = rs![produto] & "" Textquantidade.Text = rs![quantidade] & "" cbotipo = rs![tipo] & "" end ifend withend if..........O problema é que depois do cbotipo por exemplo,teria que pegar dados que estão na outra tabela,mas não sei como consultar a outra tabela,apenas uma por vez.A única maneira que penso,é criar duas tabelas iguais com nomes diferentes,assim todas tabelas teriam os mesmos registros,porém com chaves primárias e algumas mudanças entre elas.Mas eu realmente acharia melhor se conseguir levantar os registros de ambas se for possível.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você quer pegar os dados que estão na tabela produtos e na tabela estoque?

 

Caso sim, e caso as duas tabelas tenha o campo o cod_prod a SQL ficaria assim:

sql = "select p.nome,e.produto, e.tipo, e.quantidade ... from estoques e, produtos p where p.cod_prod = '" & Textcodigo & "' and e.cod_prod = p.cod_prod" 'no "..." você coloca os outros campos que quer das tabelas sempre colocando a letra que a representa e o ponto antes

Dá uma olhada na série de artigos VB x SQL, são muito bons.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.