INSERT INTO EM TABELAS RELACIONADAS!
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!
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.
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!
O seu tem dois.
Um insert para a venda
Outro insert para cada item vendido
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.
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!
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[Ô]
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...