INSERT INTO COM SELECT
Bom, problema de lógica aqui...
preciso gravar os itens na grid, porem, só só irá ser gravado aqueles itens que não existem na tabela... consulta pelo código, nesse caso aqui referencia.
esta faltando uns parâmetros aqui. ou existe uma forma mais pratica e confiável ?
Base de Dados FireBird
preciso gravar os itens na grid, porem, só só irá ser gravado aqueles itens que não existem na tabela... consulta pelo código, nesse caso aqui referencia.
esta faltando uns parâmetros aqui. ou existe uma forma mais pratica e confiável ?
Base de Dados FireBird
Private Sub btnGravEstq_Click()
ConecBase
Dim cd As Integer
For i = 1 To FlexGrid.Rows
Sql = [Ô]INSERT INTO PRODUTO ([Ô]
Sql = Sql & [Ô] DESCRICAO, REFERENCIA, PCODIGO) VALUES ([Ô]
Sql = Sql & [Ô][ô] [Ô] & FlexGrid.cell(i, 2).text & [Ô][ô],[Ô]
Sql = Sql & [Ô][ô] [Ô] & FlexGrid.cell(i, 7).text & [Ô][ô],[Ô]
Sql = Sql & [Ô][ô] [Ô] & idcdg + 1 & [Ô][ô] (SELECT REFERENCIA FROM PRODUTO WHERE REFERENCIA =[ô][Ô] & FlexGrid.cell(i, 7).text & [Ô][ô]) REFERENCIA =[ô][Ô] & FlexGrid.cell(i, 7).text & [Ô][ô])[Ô]
cnn.Execute Sql
Next
FechaBase
MsgBox ([Ô]Operação realizada com sucesso[Ô]), vbExclamation, [Ô]ATENÇÃO[Ô]
End Sub
Um pouquinho mais de atenção ao colar código, você adicionou o campo [Ô]REFERENCIA[Ô] duas vezes...
KERPLUNK, boa Obersação !..
Se aprende é assim, então...!
Se aprende é assim, então...!
E então, conseguiu consertar?
Não amigo, nao consegui,
mas não estou conseguindo chegar ao resultado...
retorna o campo REFERENCIA nao registrado.
Sql = [Ô]INSERT INTO PRODUTO ([Ô]
Sql = Sql & [Ô] DESCRICAO, REFERENCIA, PCODIGO) VALUES ([Ô]
Sql = Sql & [Ô][ô] [Ô] & FlexGrid.cell(i, 2).text & [Ô][ô],[Ô]
Sql = Sql & [Ô][ô] [Ô] & FlexGrid.cell(i, 7).text & [Ô][ô],[Ô]
Sql = Sql & [Ô][ô] [Ô] & idcdg + 1 & [Ô][ô] SELECT * FROM PRODUTO WHERE REFERENCIA =[ô][Ô] & FlexGrid.cell(i, 7).text & [Ô][ô])[Ô]
cnn.Execute Sql
mas não estou conseguindo chegar ao resultado...
retorna o campo REFERENCIA nao registrado.
[ô]INSERT INTO PRODUTO (DESCRICAO, REFERENCIA, PCODIGO) VALUES ([ô][Ô] & FlexGrid.cell(i, 2).text & [Ô][ô], [ô][Ô] & FlexGrid.cell(i, 7).text & [Ô][ô], [ô][Ô] & idcdg + 1 & [Ô][ô] WHERE NOT EXISTS ( SELECT * FROM PRODUTO WHERE REFERENCIA =[ô][Ô] & FlexGrid.cell(i, 7).text & [Ô][ô])[Ô]
Neste caso irá inserir os valores se a referencia igual ao valor no flex grid não existir.
Só confira apostrofos ([ô]) e aspas ([Ô]) se estão corretos. rsrsrs
Neste caso irá inserir os valores se a referencia igual ao valor no flex grid não existir.
Só confira apostrofos ([ô]) e aspas ([Ô]) se estão corretos. rsrsrs
Recebi os valores, mas não inserta nada na tabela.
Sql = [Ô]INSERT INTO PRODUTO (DESCRICAO, REFERENCIA, PCODIGO) VALUES ([ô][Ô] & FlexGrid.cell(i, 2).text & [Ô][ô], [ô][Ô] & FlexGrid.cell(i, 7).text & [Ô][ô], [ô][Ô] & idcdg + 1 & [Ô][ô] WHERE NOT EXISTS ( SELECT * FROM PRODUTO WHERE REFERENCIA =[ô][Ô] & FlexGrid.cell(i, 7).text & [Ô][ô])[Ô]
Está invocando o COMMIT ?
Citação::
Está invocando o COMMIT ?
olá, LLAIA, não, não invoquei o COMMIT.
achas que dessa forma que estou fazendo esta errado, na sua opnião, como devo fazer... pesquisar na Grid e insertar apenas os itens que não estão cadastrados.
Vc poderia postar a estrutura da tabela e o conteudo da variavel sql.
1 - A maneira que você está fazendo é terrÃvel. Concatenando strings é pedir pra ter erros.
2 - Se está usando .NET o que é o que parece, você deveria usar blocos using. Isso elimina memory leaks, tornando sua aplicação consideravelmente mais estável, segura e eficiente.
3 - Acho que você não entendeu bem o que é uma subquery, mas vamos lá à explicação:
Quando você faz uma query(SELECT), você pode especificar que campos quer trazer no resultado. O caracter coringa [ô]*[ô] funciona da mesma maneira que os caracteres coringa do DOS, onde o asterisco substitui todos os campos que estiverem na tabela. Já numa query de inserção, a especificação de campos e de valores correspondentes é obrigatória. E você pode especificar um valor usando uma query de select dentro de uma query de insert sem o menor problema. O caso é que você está usando asterisco, onde deveria especificar o campo, pois para uma query de insert cada campo especificado precisa de um único valor. Portanto sua query deveria ser:
Na parte destacada em vermelho, você estava anteriormente especificando o caracter coringa [ô]*[ô] e você deveria especificar apenas um campo, pois trata-se de um dos valores da query de INSERT, no caso, referente ao campo [Ô]PCODIGO[Ô]. Por isso, substitua a parte em vermelho pelo campo de onde quer que o valor seja pego.
2 - Se está usando .NET o que é o que parece, você deveria usar blocos using. Isso elimina memory leaks, tornando sua aplicação consideravelmente mais estável, segura e eficiente.
3 - Acho que você não entendeu bem o que é uma subquery, mas vamos lá à explicação:
Quando você faz uma query(SELECT), você pode especificar que campos quer trazer no resultado. O caracter coringa [ô]*[ô] funciona da mesma maneira que os caracteres coringa do DOS, onde o asterisco substitui todos os campos que estiverem na tabela. Já numa query de inserção, a especificação de campos e de valores correspondentes é obrigatória. E você pode especificar um valor usando uma query de select dentro de uma query de insert sem o menor problema. O caso é que você está usando asterisco, onde deveria especificar o campo, pois para uma query de insert cada campo especificado precisa de um único valor. Portanto sua query deveria ser:
Sql = [Ô]INSERT INTO PRODUTO (DESCRICAO, REFERENCIA, PCODIGO) VALUES ([ô][Ô] & FlexGrid.cell(i, 2).text & [Ô][ô], [ô][Ô] & FlexGrid.cell(i, 7).text & [Ô][ô], [ô][Ô] & idcdg + 1 & [Ô][ô] WHERE NOT EXISTS ( SELECT [txt-color=#e80000]NOME_DE_UM_CAMPO[/txt-color] FROM PRODUTO WHERE REFERENCIA =[ô][Ô] & FlexGrid.cell(i, 7).text & [Ô][ô])[Ô]
Na parte destacada em vermelho, você estava anteriormente especificando o caracter coringa [ô]*[ô] e você deveria especificar apenas um campo, pois trata-se de um dos valores da query de INSERT, no caso, referente ao campo [Ô]PCODIGO[Ô]. Por isso, substitua a parte em vermelho pelo campo de onde quer que o valor seja pego.
Tópico encerrado , respostas não são mais permitidas