Insert no Delphi

06/11/2004

42

Boa noite pessoal,

Estou desenvolvendo uma aplicação em Delphi 6 e Interbase 6.

Estou tentando fazer um Insert pelo Delphi mas está ocorrendo erros.

As linhas de código que digitei foram:


with dmData.IB Do
begin
close;
Sql.Clear;
Sql.Add(´Insert into TB_DATA (´COD_GERAL´,´HORAENTRA´,´ENTRADA´)´);
Sql.Add(´VALUES (+dmData.dsetBusca.FieldByName(´COD_GERAL´),DATE,TIME)´);
Open;

É a primeira vez que estou fazendo INSERT via Delphi e não sei qual é o tipo de problema..



OBRIGADO !!!


Responder

Post mais votado

06/11/2004

Colega,

Existem alguns erros na segunda linha:

1. Já que vc está concatenando valores para gerar a string da instrução SQL, onde está [b:b596c5606d]´VALUES (+[/b:b596c5606d] deveria estar [b:b596c5606d]´values(´+[/b:b596c5606d]

2. Vc está passando um TField ao invés de um valor do TField. Onde está [b:b596c5606d]dmData.dsetBusca.FieldByName(´COD_GERAL´)[/b:b596c5606d] deveria estar [b:b596c5606d]dmData.dsetBusca.FieldByName(´COD_GERAL´).AsString[/b:b596c5606d]

3. A data e a hora que vc está informando devem ser convertidos para string na concatenação. Além disso, vc precisaria estar convertendo dentro de um dos formatos de data aceitos pelo IB/FB, 2004-11-06, por exemplo... então não bastaria um DateToStr(Date), pq o formato seria 06/11/2004, não sendo interpretado corretamente pelo IB/FB.

4. Em querys que executam instruções as instruções DML INSERT, UPDATE e DELETE, e todas as instruções DDL (CREATE, DROP, etc), vc [b:b596c5606d]não[/b:b596c5606d] utiliza o método Open e sim [b:b596c5606d]ExecSQL[/b:b596c5606d].

Bem, a chave da questão é que efetuar todas estas concatenações e conversões tornam o desenvolvimento muito passível de erros, por isso deve-se sempre utilizar parametros nas querys...

Da forma que está, a instrução poderia ser montada assim :
with dmData.IB Do
begin
  close;
  Sql.Clear;
  Sql.Add(´insert into TB_DATA (COD_GERAL, HORAENTRA, ENTRADA)´);
  Sql.Add(´values(´ + dmData.dsetBusca.FieldByName(´COD_GERAL´).AsString +´,´+ FormatDateTime(´yyyy-mm-dd´,Date) +´,´+ TimeToStr(Time)+´)´);
  ExecSQL;
end;


Percebe como fica fácil de errar ? Por isso eu faria assim :
with dmData.IB Do
begin
  close;
  Sql.Clear;
  Sql.Add(´insert into TB_DATA (COD_GERAL,HORAENTRA,ENTRADA)´);
  Sql.Add(´values(:cod_geral, :horaentra, :entrada)´);
  ParamByName(´cod_geral´).AsInteger:= dmData.dsetBusca.FieldByName(´COD_GERAL´).AsInteger;
  ParamByName(´horaentra´).AsDate:= Date;
  ParamByName(´entrada´).AsString:= TimeToStr(Time); 
  ExecSQL;
end;

Desta forma, apesar de conter 3 linhas a mais de código, a instrução fica ´limpa´ e menos suceptível a erros...

Espero ter ajudado...
T+


Responder

Mais Posts

06/11/2004

Arved

caro Vinicius2K muito obrigado pela ajuda... vou testar pra ver se funciona... mas acredito q isso resolva...

e se eu invez de mover o valor +dmData.dsetBusca.FieldByName(´COD_GERAL´) para o cod_geral eu tivesse movido o valor de um EDIT por exemplo o edtBusca, Como ficaria??


Kra, valeu mesmo, [color=red:aa5ec559ea]tá difícil[/color:aa5ec559ea] aqui, vou ficar sem dormir essa noite porq eu tenho que entregar esse programa que está dando alguns tipos de problemas ainda nessa manhã.


Responder

06/11/2004

Vinicius2k

e se eu invez de mover o valor +dmData.dsetBusca.FieldByName(´COD_GERAL´) para o cod_geral eu tivesse movido o valor de um EDIT por exemplo o edtBusca, Como ficaria??


Colega,

Bastaria que vc substituisse por [b:633f3a7918]edtBusca.Text[/b:633f3a7918].

Entendo sua preocupação, mas, por favor, não use palavras de baixo calão nas suas mensagens. É uma infração às [url=http://delphiforum.icft.com.br/forum/viewtopic.php?t=6689]Regras de Conduta[/url] do Fórum e passível de punição por parte da moderação e/ou administração. OK? :wink:

T+


Responder

06/11/2004

Sandra

Entendo sua preocupação, mas, por favor, não use [b:29a4c0177e]palavras de baixo calão[/b:29a4c0177e] nas suas mensagens. É uma infração às [url=http://delphiforum.icft.com.br/forum/viewtopic.php?t=6689]Regras de Conduta[/url] do Fórum e passível de punição por parte da moderação e/ou administração. OK? :wink: T+

Vinícius,

A parte do texto citada foi [color=red:29a4c0177e]substituída[/color:29a4c0177e]!


Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar