Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   como agregar registro nuevo en firebird (https://www.clubdelphi.com/foros/showthread.php?t=74318)

martita 11-06-2011 20:56:40

como agregar registro nuevo en firebird
 
hola foro, ya genere en ibexpert mi base de datos con 3 campos
codigo, nombre, telefono el primer campo es el indice
dentro de ibexpert si logro agregar campos con insert into new_table etc, etc, el detalle es con delphi, genere un data module con un ibdatabase y ibtransaction, en una form tengo un dbgrid y un ibquery1 con el cual por medio de un datasource muestro mis datos contenidos en mi tabla new_table, hasta aqui todo bien si me muestra los datos contenidos en la tabla, pero al momento de activar un boton que puse para agregar un nuevo registro me marca error le mando los datos contenidos en unos edit , aqui esta el codigo
Código Delphi [-]
  with ibquery1 do 
  begin
    close;
    sql.clear;
    sql.Add('insert into new_table (codigo, nombre, telefono');
    sql.Add(' VALUES(:xcodigo, :xnombre, :xtelefono) ');
    ParamByName('Xcodigo').Asinteger:=strtoint(edit1.text);
    ParamByName('Xnombre').Asstring:=edit2.text;
    ParamByName('Xtelefono').Asstring:=edit3.text;
    execsql;
  end;
me marca el error: sql error code = 104
token unknown line 2 col. 2
values'. process stopped use stop or run to continue

:o

ecfisa 11-06-2011 21:21:12

Hola martita.

El error aparece por que te está faltando cerrar un paréntesis:
Código Delphi [-]
  with ibquery1 do 
  begin
    close;
    sql.clear;
    sql.Add('insert into new_table(codigo, nombre, telefono)');   // <- aca (en rojo)
    sql.Add(' VALUES(:xcodigo, :xnombre, :xtelefono) '); 
    ParamByName('Xcodigo').Asinteger:=strtoint(edit1.text);
    ParamByName('Xnombre').Asstring:=edit2.text;
    ParamByName('Xtelefono').Asstring:=edit3.text;
    execsql;
  end;

Saludos.

martita 11-06-2011 21:49:59

ok ya graba y no marca error
 
gracias efisa por tu ayuda, ahora lo unico que noto es que no graba los
datos fisicamente hasta que cierrro mi aplicacion osea hasta que hago close
a mi database, hay alguna manera que grabe en firme o al instante ?
por que localmente no afecta pero si tengo una sistema ya multiusuario
me afectaria muchisimo esto por ejemplo si alguien da de alta al sistema un nuevo cliente, los demas no lo podrian ver en el catalogo de clientes, hasta que el que dio de alta ese nuevo registro en el catalogo de clientes cierre y abra su sistema para que guarde el registro fisicamente, esto seria fatal, como podria asegurarse que haga las transacciones en firme o al instante ?

saludos.

ecfisa 11-06-2011 22:25:48

Hola martita.

Para consolidar la escritura de los datos, luego de hacer ExcecSQL, tenés que usar: IBTransaction.Commit ó IBTransaction.CommitRetaining.

La diferencia entre ambos métodos es que, luego de aplicar los cambios CommitRetaining mantiene activa la transacción. En cambio Commit cierra la transacción activa y luego hay que usar StartTransaction para iniciarla nuevamente.
La elección de un método u otro dependerá de lo que necesites efectuar, pero creo que para este caso te conviene CommitRetaining.

Saludos.

lafourcade 13-06-2011 17:53:15

Hola

mira yo uso las siguientes lineas al finalizar el guardado

Código Delphi [-]
execsql;
      sql.Clear;
      sql.add('commit');
      execsql;

el primer execsql seria el que tu ya tienes, a mi m funciona muy bien.


La franja horaria es GMT +2. Ahora son las 15:22:30.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi