INSERT INTO EM TABELAS RELACIONADAS!

VALRALA 13/10/2016 19:26:21
#468073
Bom dia amigos da VBMania!
Pessoal to com uma grande duvida, sempre quando vou busca itens em em tabelas relacionadas uso WHERE, agora como inserir itens em 2 tabelas relacionada?
Tenho a seguintes Tabelas!

TBVenda TBProdutoVenda

codigo PK codigo
datacompra codBarraProduto
formaPag quantidade
Total ValorUnitario

Amigos aqui o relacionamento sera 1 para muito, ao efetuar uma venda 1 unico registro na TBVenda e todos Produtos vendidos na TBProdutoVendido.
Dei uma pesquisada e vi que é possivel fazer isso usando 2 Insert!
Amigos to terminando um sistema em VB.NET não conheço so o basico de SQL.Podem me ajudar com a query?
Valeu amigos e uma otima noite!
Até mais!

XLEGENDARY 13/10/2016 22:10:03
#468075
Se bem entendi,
Sua lógica está esquisita. Se você tem um produto e quer vender esse produto então vc tem ele cadastrado no banco, ok esse é um ponto. Agora vc quer vender produtos e quer gravar isso em alguma tabela, ou seja vendas, aí sim vc preenche a tabela vendas com as saídas dos produtos pegando a pk do produto na tabela produto. Não precisa fazer 2 inserts pra isso pois são operações distintas.

PLUGSOFTSM 13/10/2016 22:32:54
#468076
Em Sql Server uma forma bem básica de vc fazer isso seria fazer o seguinte:

Using ConDB As SqlConnection = New SqlConnection(Dns)
ConDB.Open()
Using Trans As SqlTransaction = ConDB.BeginTransaction
Try
Dim [txt-color=#007100]CodNum [/txt-color]As Long = 0
[ô]Inserção da Venda
Using RstCmd As SqlCommand = New SqlCommand([Ô]Insert Into TbVenda(DataCompra, FormaPag, Total) Values(@DataCompra, @FormaPag, @Total); Select @@Identity[Ô], ConDB, Trans)
RstCmd.Parameters.Add([Ô]@DataCompra[Ô], SqlDbType.SmallDateTime).Value = [Data]
RstCmd.Parameters.Add([Ô]@FormaPag[Ô], SqlDbType.Int).Value = [Forma]
RstCmd.Parameters.Add([Ô]@Total[Ô], SqlDbType.SmallMoney).Value = [Valor]
CodNum = RstCmd.ExecuteScalar
End Using
[ô]Inserção dos itens vendidos
For I As Integer = 1 To Totitens
Using RstCmd As SqlCommand = New SqlCommand([Ô]Insert Into TBProdutoVenda(Codigo, CodBarProduto, Quantidade, ValorUnitario) Values(@Codigo, @CodBarProduto, @Quantidade, @ValorUnitario)[Ô], ConDB, Trans)
RstCmd.Parameters.Add([Ô]@Codigo[Ô], SqlDbType.Int).Value = [txt-color=#007100]CodNum[/txt-color]
RstCmd.Parameters.Add([Ô]@CodBarProduto[Ô], SqlDbType.VarChar, 13).Value = [CodigoBarras]
RstCmd.Parameters.Add([Ô]@Quantidade[Ô], SqlDbType.Real).Value = [Qtde]
RstCmd.Parameters.Add([Ô]@ValorUnitario[Ô], SqlDbType.SmallMoney).Value = [Valor]
RstCmd.ExecuteNonQuery()
End Using
Next
Trans.Commit()
Catch ex As Exception
Trans.Rollback()
MessageBox.Show(ex.Message, [Ô]Erro[Ô], MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Using
End Using

Este é um exemplo o mais básico possível. Na medida que for evoluindo nos teus conhecimentos irá otimizando a rotina
O transaction é necessário pois evita que sejam gravados apenas parte dos dados. Ou grava tudo ou não grava nada
a expressão [txt-color=#0000f0]Select @@Identity[/txt-color] vai te retornar o código gerado para o registro

Espero ter ajudado!
OMAR2011 14/10/2016 08:08:21
#468081
PLUGSOFTSM, se não me engano apenas um insert.
O seu tem dois.
PLUGSOFTSM 14/10/2016 12:59:40
#468083
Vc não consegue atualizar duas tabelas com um insert apenas... pelo menos eu não conheço um modo pra isso
Um insert para a venda
Outro insert para cada item vendido
VALRALA 14/10/2016 15:10:40
#468087
Citação:

:
Em Sql Server uma forma bem básica de vc fazer isso seria fazer o seguinte:

Using ConDB As SqlConnection = New SqlConnection(Dns)
ConDB.Open()
Using Trans As SqlTransaction = ConDB.BeginTransaction
Try
Dim [txt-color=#007100]CodNum [/txt-color]As Long = 0
[ô]Inserção da Venda
Using RstCmd As SqlCommand = New SqlCommand([Ô]Insert Into TbVenda(DataCompra, FormaPag, Total) Values(@DataCompra, @FormaPag, @Total); Select @@Identity[Ô], ConDB, Trans)
RstCmd.Parameters.Add([Ô]@DataCompra[Ô], SqlDbType.SmallDateTime).Value = [Data]
RstCmd.Parameters.Add([Ô]@FormaPag[Ô], SqlDbType.Int).Value = [Forma]
RstCmd.Parameters.Add([Ô]@Total[Ô], SqlDbType.SmallMoney).Value = [Valor]
CodNum = RstCmd.ExecuteScalar
End Using
[ô]Inserção dos itens vendidos
For I As Integer = 1 To Totitens
Using RstCmd As SqlCommand = New SqlCommand([Ô]Insert Into TBProdutoVenda(Codigo, CodBarProduto, Quantidade, ValorUnitario) Values(@Codigo, @CodBarProduto, @Quantidade, @ValorUnitario)[Ô], ConDB, Trans)
RstCmd.Parameters.Add([Ô]@Codigo[Ô], SqlDbType.Int).Value = [txt-color=#007100]CodNum[/txt-color]
RstCmd.Parameters.Add([Ô]@CodBarProduto[Ô], SqlDbType.VarChar, 13).Value = [CodigoBarras]
RstCmd.Parameters.Add([Ô]@Quantidade[Ô], SqlDbType.Real).Value = [Qtde]
RstCmd.Parameters.Add([Ô]@ValorUnitario[Ô], SqlDbType.SmallMoney).Value = [Valor]
RstCmd.ExecuteNonQuery()
End Using
Next
Trans.Commit()
Catch ex As Exception
Trans.Rollback()
MessageBox.Show(ex.Message, [Ô]Erro[Ô], MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Using
End Using

Este é um exemplo o mais básico possível. Na medida que for evoluindo nos teus conhecimentos irá otimizando a rotina
O transaction é necessário pois evita que sejam gravados apenas parte dos dados. Ou grava tudo ou não grava nada
a expressão [txt-color=#0000f0]Select @@Identity[/txt-color] vai te retornar o código gerado para o registro

Espero ter ajudado!




-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Boa tarde PLUGSOFTSM!
Então PLUGSOFTSM, o problema é que to usando Banco de Dados Access, e to no final do projeto.
Cara sei que seria ssim, ao Inserir o código na TBvendas, tenho que pegar o codigo PK da TBVends, para Inserir logo em seguida na TBProdutoVenda.Mas como fazer isso em Access, pois a tabela TBVendas esta relacionada com a TBProdutoVendas.
Relacionamento 1 para muitos.

VALRALA 14/10/2016 15:15:07
#468088
Citação:

:
Se bem entendi,
Sua lógica está esquisita. Se você tem um produto e quer vender esse produto então vc tem ele cadastrado no banco, ok esse é um ponto. Agora vc quer vender produtos e quer gravar isso em alguma tabela, ou seja vendas, aí sim vc preenche a tabela vendas com as saídas dos produtos pegando a pk do produto na tabela produto. Não precisa fazer 2 inserts pra isso pois são operações distintas.




Boa tarde XLEGENDARY, cara tem ideia de codigo para resolver isso?
Porfavor post!
PLUGSOFTSM 14/10/2016 18:00:28
#468091
Bem... ai complica um pouco
Não me lembro mais muito bem do velho access mas sei que ele tem um comando que retorna o maior valor de uma chave primaria numa tabela.... Mas não lembro mais como se faz
Uma solução seria fazer um insert da venda
[Ô]Insert Into TbVenda(DataCompra, FormaPag, Total) Values([DataCompra], [FormaPag], [Total])

Em seguida faz uma consulta pra pegar o maior valor da chave primaria
[Ô]Select max(Codigo) as maior from tbvendas[Ô]

armazena o valor numa variável tipo CodNum por exemplo

Faz um insert para cada produto vendido
[Ô]Insert Into TBProdutoVenda(Codigo, CodBarProduto, Quantidade, ValorUnitario) Values([CodNum], [CodBarProduto], [Quantidade], [ValorUnitario])[Ô]

Esse tipo de operação é um tanto perigoso uma vez que não trata concorrência de registros
Assim, se seu sistema for muitiusuario corre o risnco que no instante seguinte a gravação do registro da sua venda, cheque a tabela tbvendas um outro registro
Fazendo a consulta vc vai pegar o numero do maior registro gravado que não é o que deseja e sim do último que chegou
Assim, corre-se o risco de gravar itens de duas vendas no mesmo registro e deixar o outro órfão

Uma solução pra isso, seria gravar o número do pdv na tabela tbvendas
alterar a sua consulta
[Ô]Select max(Codigo) as maior from tbvendas[Ô]
para
[Ô]Select max(Codigo) as maior from tbvendas where NumPdv = [Ô] & NumPdv

Isso talvez ajude
Mas começe a avaliar a possiblidade de migrar seu sistema para um banco de dados mais robusto e confiável. O Access é muito [Ô]pobre[Ô]

XLEGENDARY 14/10/2016 19:50:38
#468093
Gente, será que eu não entendi direito?
Se vc quer fazer o que eu falei acima, vc tem que cadastrar produtos e depois vender produtos. Não tenho ideia do que seja diferente disso no que entendi, como é que vc cadastra um produto de venda e depois já vende ao mesmo tempo? Isso não existe,

Confirme se é isso que vc quer pois se for isso, vc só tá errando a lógica e não o código. Portanto vc faria inserts de produtos em uma tela e depois venderia em outra, pegando a pk do produto e gravando na tabela de vendas, o que por si só já resolveria, mas já que vc quer que sejam relacionadas o que é de fato o correto. No momento da venda vc distingue um produto de outro pela sua pk, logo ao vender isso irá gerar suas fk e se tiver fk igual ele acumula ou não dependendo do seu select de retorno. Não tenho código pra postar pq tô em celular e digitar código aqui e horrível. Mas se a lógica e essa que tô pensando e só separar as responsabilidades. Quer pegar a pk? Faz um select nela e armazena em uma variável por exemplo, com essa pk salva na variável vc consegue fazer o que quiser com ela pois já estará endereçada na memória, e o que vc quer fazer? Salvar em uma tabela de vendas,então amigo e só salvar a variável que tá lá na memória te esperando pra ser consumida, aí vc faz o insert na tabela venda e ao invés de por um campo qualquer pra salvar como chave, coloque sua variável

é isso que vc quer fazer?

Só pensar em quando vai em um mercado, os produtos já estão lá pq alguém cadastrou isso em um estoque, e o que o sistema de caixa faz? Consulta em estoque a quantidade, diminui a quantidade que tá sendo passada e tudo isso por onde? Por um campo chave único que só aquele produto tem.
Mais detalhado do que isso eu não sei...
VALRALA 15/10/2016 19:13:23
#468105
Obrigado galera, eu ja consegui.
Tópico encerrado , respostas não são mais permitidas