Query com insert e update

Firebird

09/01/2014

Olá pessoal, estou usando Delphi 7 com Firebird.
Quero realizar update em uma tabela, mas caso o registro não exista, quero dar insert, tudo na mesma query, tem como?

Grato desde já...

Giovani
Giovani Arakan

Giovani Arakan

Curtidas 0

Melhor post

Giovani Arakan

Giovani Arakan

09/01/2014

Ok pessoal, resolvido.

Usei UPDATE OR INSERT ficou bem rápido. O código ficou assim:

s1 := nextgrid3.Cell[1,i].AsString;
s2 := nextgrid3.Cell[2,i].AsString;
s3 := nextgrid3.Cell[3,i].AsString;

qryaplic.close;
qryaplic.sql.clear;
qryaplic.sql.add('update or insert into produtos (codigo,produto,idtipoprod,unidade) values ('''+s1+''','''+s2+''','''+idtipo+''','''+s3+''') MATCHING (codigo)');
qryaplic.ExecSQL;

pode colocar ao invés de s1, o valor do grid direto na cláusula values.

Valeu

Giovani
GOSTEI 2

Mais Respostas

Douglas

Douglas

09/01/2014

Giovani, fazendo no delphi tem sim, porém antes de realizar o update você terá que verificar
se o registro existe na tabela. Ficaria da seguinte forma abaixo:


procedure TForm1.Button1Click(Sender: TObject);
var
  Qry : TQuery;
begin
  
  Qry := TQuery.Create(self);
  Qry.DatabaseName := 'Nome do seu banco';

  Qry.Close;
  Qry.SQL.Clear;
  Qry.SQL.Add('SELECT * FROM DEVMEDIA  ');
  Qry.SQL.Add('WHERE COD_DEVMEDIA =:COD');
  Qry.ParamByName('COD').AsInteger := //PASSE O CODIGO;
  Qry.Open;

  if not Qry.IsEmpty then
  begin
    //AQUI VOCÊ FAZ O UPDADTE
    Qry.Close;
    Qry.SQL.Clear;
    Qry.SQL.Add('UPDATE DEVMEDIA SET CAMPO =:CAMPO WHERE COD_DEVMEDIA =:COD');
    Qry.ParamByName('COD').AsInteger := campo;
    Qry.ParamByName('COD').AsInteger := cod;
    Qry.ExecSQL;
  end
  else
  begin
    //AQUI VOCÊ FAZ INSERT DA MESMA MANEIRA QUE O UPDATE
  end;

  FreeAndNil(Qry);

end;



OBS: Dá forma que foi feita acima, você executa tudo numa mesma Query repare bem nas verificações
onde eu fecho e em seguida executo a Query ao final eu destruo o mesmo. Lembrando que é apenas
um exemplo para que você possa montar o seu código. Aguardo o seu feedback.



GOSTEI 0
Douglas

Douglas

09/01/2014

Giovani, fazendo no delphi tem sim, porém antes de realizar o update você terá que verificar
se o registro existe na tabela. Ficaria da seguinte forma abaixo:


procedure TForm1.Button1Click(Sender: TObject);
var
  Qry : TQuery;
begin
  
  Qry := TQuery.Create(self);
  Qry.DatabaseName := 'Nome do seu banco';

  Qry.Close;
  Qry.SQL.Clear;
  Qry.SQL.Add('SELECT * FROM DEVMEDIA  ');
  Qry.SQL.Add('WHERE COD_DEVMEDIA =:COD');
  Qry.ParamByName('COD').AsInteger := //PASSE O CODIGO;
  Qry.Open;

  if not Qry.IsEmpty then
  begin
    //AQUI VOCÊ FAZ O UPDADTE
    Qry.Close;
    Qry.SQL.Clear;
    Qry.SQL.Add('UPDATE DEVMEDIA SET CAMPO =:CAMPO WHERE COD_DEVMEDIA =:COD');
    Qry.ParamByName('CAMPO ').AsString := campo;//PASSE O CAMPO PARA ATUALIZAÇÃO
    Qry.ParamByName('COD').AsInteger := cod;//PASSE O CODIGO
    Qry.ExecSQL;
  end
  else
  begin
    //AQUI VOCÊ FAZ INSERT DA MESMA MANEIRA QUE O UPDATE
  end;

  FreeAndNil(Qry);

end;



OBS: Dá forma que foi feita acima, você executa tudo numa mesma Query repare bem nas verificações
onde eu fecho e em seguida executo a Query ao final eu destruo o mesmo. Lembrando que é apenas
um exemplo para que você possa montar o seu código. Aguardo o seu feedback.





Fiz uma correção no código, pois postei errado desculpe.
GOSTEI 0
Giovani Arakan

Giovani Arakan

09/01/2014

Valeu Douglas,

Estava tentando fazer algo tipo UPDATE OR INSERT tipo:

s1 := grid1.cell[1,i].asstring;
s2 := grid1.cell[2,i].AsString;
s3 := grid1.cell[3,i].asstring;

qryaplic.close;
qryaplic.sql.clear;
qryaplic.sql.add('update or insert into produtos (codigo,produto,unidade) values (s1,s2,,s3) MATCHING (codigo)');
qryaplic.ExecSQL;

só que não inclui, o que você acha?

Giovani
GOSTEI 0
Leandro Chiodini

Leandro Chiodini

09/01/2014

Show de Bola.
Topico resolvido entao?

att,
GOSTEI 0
Douglas

Douglas

09/01/2014

Giovani, obrigado pelo feedback. Muito boa sua resolução.
GOSTEI 0
Douglas

Douglas

09/01/2014

Show de Bola.
Topico resolvido entao?

att,[/quote

Leandro, por mim já esta resolvido.
GOSTEI 0
Giovani Arakan

Giovani Arakan

09/01/2014

Ok, Resolvido
GOSTEI 0
William

William

09/01/2014

Estou finalizando o tópico!
GOSTEI 0
POSTAR