PDA

Ver la Versión Completa : Modificar un registro en Firebird


jorosmtz
07-08-2011, 05:57:28
Buen día, mi pregunta es debido a que puedo hacer una inserción masiva:


With DataModule1.IBCQuery1 do
begin
try
Close;
SQL.Clear;
SQL.Add('Insert into TBPRODUCTO (FECHA, HORA, CLAVEPRODUCTO, NOMBREPRODUCTO) ');
SQL.Add('Values (:FechaNueva, :HoraNueva, :ClaveDelProducto, :NombreDelProducto) ');
ParamByName('FechaNueva').AsDate := Fecha.Date; //es un TDateTimePicker
ParamByName('HoraNueva').AsString := Hora.Text; //es una edit
ParamByName('ClaveDelProducto').AsString := EditClaveProducto.Text;
ParamByName('NombreDelProducto').AsString := EditNombreProducto.Text;
ExecSQL;
DataModule1.IBCConnection.Commit;
MessageDlg('Se agregó nuevo producto con éxito',mtInformation,[mbOK],0);
except
DataModule1.IBCConnection.Rollback;
MessageDlg('Hubo un error al agregar el nuevo producto',mtInformation,[mbOK],0);
end;
end;


Ok, ahora mi pregunta es, ¿como puedo hacer para hacer una actualización masiva?

P.D. Estoy incursionando en "Firebird-Sentencias SQL", es por eso que les pregunto. Al hacer búsquedas en la web (incluyendo aquí) lo que veo es como hacer "update" registro por registro, pero me gustaría hacer un "update" masivo, que cuando haga el "ExecSQL" se actualicen todos los datos de un solo jalón, como en el ejemplo que puse, donde hago una inserción masiva.

Gracias de antemano.

jorosmtz
07-08-2011, 06:01:37
Olvide comentar, estoy usando Firebird 2.5

ecfisa
07-08-2011, 07:26:29
que cuando haga el "ExecSQL" se actualicen todos los datos de un solo jalón, como en el ejemplo que puse
Hola Javier.

El equivalente al ejemplo que pusiste pero realizando una modificación, sería:

with IBQuery do
begin
try
Close;
SQL.Clear;
SQL.Add('UPDATE TBPRODUCTO SET ');
SQL.Add('FECHA = :FECHA,');
SQL.Add('HORA = :HORA,');
SQL.Add('CLAVEPRODUCTO = :CLAVEPRODUCTO,');
SQL.Add('NOMBREPRODUCTO = :NOMBREPRODUCTO ');
SQL.Add('WHERE CLAVEPRODUCTO = :OLD_CLAVEPRODUCTO');
ParamByName('FECHA').AsDateTime:= Fecha.Date;
ParamByName('HORA').AsString:= Hora.Text;
ParamByName('CLAVEPRODUCTO').AsString:= EditClaveProducto.Text;
ParamByName('NOMBREPRODUCTO').AsDateTime:= EditNombreProducto.Text;
ParamByName('OLD_CLAVEPRODUCTO').AsString:= EditClaveProducto.Text;
ExecSQL;
...
end;


Saludos.

jorosmtz
07-08-2011, 21:02:31
Muchas gracias ecfisa, funcionó muy bien, aunque ajusté un poquito el código para optimizar líneas:


with DataModulePpal.IBCQueryAgenda do
begin
try
// DataModulePpal.IBCConnection.StartTransaction;
Close;
SQL.Clear;
SQL.Add('Update TBPRODUCTO set FECHA = :FechaNueva, HORA = :HoraNueva, ');
SQL.Add('CLAVEPRODUCTO = :ClaveDelProducto, NOMBREPRODUCTO = :NombreDelProducto');
SQL.Add('Where IDPRODUCTO = ' + IntToStr(NumProducto));
ParamByName('FechaNueva').AsDate := Fecha.Date;
ParamByName('HoraNueva').AsString := Hora.Text;
ParamByName('ClaveDelProducto').AsString := EditClaveProducto.Text;
ParamByName('NombreDelProducto').AsString := EditNombreProducto.Text;
ExecSQL;
DataModule1.IBCConnection.Commit;
MessageDlg('Se modificó el producto con éxito',mtInformation,[mbOK],0);
except
DataModule1.IBCConnection.Rollback;
MessageDlg('Hubo un error al modificar el producto, vuelva a intentarlo',mtError,[mbOK],0);
end;
end;


Gracias de nuevo, en verdad muy claro el ejemplo.

Chris
07-08-2011, 23:51:56
Que bueno que ecfisa ya te halla solucionado tu problema. Solo quiero hacerte una aclaración. Realmente no estás haciendo inserciones o actualizaciones masivas. Cuando se dice hacer una acción masiva, se refiere a por ejemplo insertar o actualizar más de un registro a la vez con una sola consulta SQL. Solo te lo quiero aclarar porque quedé un poco confundido con el título y el código que nos proporcionaste.

Saludos,
Chris

jorosmtz
08-08-2011, 14:40:09
Muchas gracias Chris, ahora entiendo un poco más eso. ¿hay alguna forma de cambiar el título del tema? Si es así, ¿podrían ayudarme a cambiarlo?

Gracias de nuevo por la aclaración.

ecfisa
08-08-2011, 14:58:13
¿hay alguna forma de cambiar el título del tema? Si es así, ¿podrían ayudarme a cambiarlo?


Con mucho gusto. Decime que título deseas ponerle y me encargo de modificarlo.

Un saludo.

jorosmtz
08-08-2011, 16:38:47
Muy amable. Sería "Update en Firebird" o algo así, solo que sea alusivo a la pregunta que hice.

Gracias de nuevo, lo del título equivocado se debe a que soy nuevo en esto de los RDBMS.