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)
-   -   Modificar un registro en Firebird (https://www.clubdelphi.com/foros/showthread.php?t=75238)

jorosmtz 07-08-2011 05:57:28

Modificar un registro en Firebird
 
Buen día, mi pregunta es debido a que puedo hacer una inserción masiva:

Código Delphi [-]
  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

Cita:

Empezado por jorosmtz (Mensaje 408766)
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:
Código Delphi [-]
  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:

Código Delphi [-]
   
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

Cita:

Empezado por jorosmtz (Mensaje 408813)
¿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.


La franja horaria es GMT +2. Ahora son las 22:59:44.

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