INSERT INTO COM SELECT

MOREIRA 11/01/2017 19:55:16
#470623
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

  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
KERPLUNK 11/01/2017 23:19:53
#470625
Um pouquinho mais de atenção ao colar código, você adicionou o campo [Ô]REFERENCIA[Ô] duas vezes...
MOREIRA 12/01/2017 00:19:16
#470626
KERPLUNK, boa Obersação !..

Se aprende é assim, então...!
KERPLUNK 12/01/2017 23:35:17
#470665
E então, conseguiu consertar?
MOREIRA 13/01/2017 07:58:01
#470667
Não amigo, nao consegui,

    

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.
DAMASCENO.CESAR 13/01/2017 08:47:47
#470671
[ô]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
MOREIRA 13/01/2017 08:56:38
#470673
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 & [Ô][ô])[Ô]
LLAIA 13/01/2017 10:04:34
#470674
Está invocando o COMMIT ?
MOREIRA 15/01/2017 14:52:08
#470719
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.
MARCOSLING 15/01/2017 19:27:04
#470726
Vc poderia postar a estrutura da tabela e o conteudo da variavel sql.
KERPLUNK 15/01/2017 23:31:43
#470732
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:

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.
Página 1 de 2 [16 registro(s)]
Tópico encerrado , respostas não são mais permitidas