Ver Mensaje Individual
  #1  
Antiguo 03-08-2018
marco3k marco3k is offline
Miembro
 
Registrado: feb 2015
Posts: 60
Reputación: 10
marco3k Va por buen camino
Actualizar varias filas en un ClientDataSet desconectado.

Hola, tengo una duda respecto al manejo de ClientDataSet, quisiera saber si hay alguna manera de actualizar varios registros en un ClientDataset que trabaja en modo desconectado. Lo que hice es obtener los datos de una BD Firebird con componentes IBX en un ClientDataSet y ahi hago mis operaciones para sacar reportes.
Hay un campo que se llama seleccion el cual el usuario hace click y selecciones que mes quiere imprimir el código que asi:
Código Delphi [-]
procedure TLogicaBoletaPago.VerBoleta;
var var_cod_boleta_tmp,var_cod_boleta : string;
begin
  if TListaBoletaTmp.RecordCount>0 then
  begin
    TListado.Filter := '';
    TListado.Filtered := True;
    repeat
      TListado.Edit;
      TListado.FieldByName('SELECCION').AsInteger := 0;
      TListado.Post;
      TListado.Next;
    until TListado.Eof;
    TListado.First;
    //***
    TListaBoletaTmp.First;
    while TListaBoletaTmp.Eof = False do
    begin
      if TListaBoletaTmp.FieldByName('SELECCION').Value=True then
      begin
        var_cod_boleta_tmp := TListaBoletaTmp.FieldByName('anio').AsString +
        TListaBoletaTmp.FieldByName('mes').AsString +
        TListaBoletaTmp.FieldByName('mes_sup').AsString +
        TListaBoletaTmp.FieldByName('dni').AsString +
        TListaBoletaTmp.FieldByName('tipo_pla').AsString +
        TListaBoletaTmp.FieldByName('nro_bol').AsString;
        TListado.RecordCount;
        TListado.First;
        while TListado.Eof = False do
        begin
          var_cod_boleta := TListado.FieldByName('anio').AsString +
          TListado.FieldByName('mes').AsString +
          TListado.FieldByName('mes_sup').AsString +
          trim(TListado.FieldByName('dni').AsString) +
          TListado.FieldByName('tipo_pla').AsString +
          TListado.FieldByName('nro_bol').AsString;
          if var_cod_boleta_tmp = var_cod_boleta then
          begin
            TListado.Edit;
            TListado.FieldByName('SELECCION').AsInteger := 1;
            TListado.Post;
          end;
          TListado.Next;
        end;
      end;
      TListaBoletaTmp.Next;
    end;
  end;
  TListaBoletaTmp.First;
  TListado.Filter := '[seleccion] = 1';
  TListado.Filtered := True;
end;
El código anterior funciona bien, pero cuando hay varios registros se ejecuta un poco lento. Es ahi donde viene mi duda si hay un comando a lo Visual Foxpro "REPLACE ALL".
Aca tengo la versión en Visual Foxpro del codigo Delphi anterior:
Código:
    IF USED("cur_bol")
        SELECT cur_bol
        SET FILTER TO 
        REPLACE ALL seleccion WITH 0
        GO TOP 
        SELECT cur_boleta_rep
        GO TOP
        SCAN FOR cur_boleta_rep.seleccion = .T.
            SELECT cur_bol
            REPLACE ALL cur_bol.seleccion WITH 1 FOR cur_bol.anio + cur_bol.mes + cur_bol.mes_sup + ALLTRIM(cur_bol.dni) + cur_bol.tipo_pla + ALLTRIM(cur_bol.nro_bol) =;
            cur_boleta_rep.anio + cur_boleta_rep.mes + cur_boleta_rep.mes_sup + ALLTRIM(cur_boleta_rep.dni) + cur_boleta_rep.tipo_pla + ALLTRIM(cur_boleta_rep.nro_bol)    
        ENDSCAN 
        SELECT cur_bol
        SET FILTER TO seleccion = 1
        COUNT TO var_filas
        GO TOP 
    ENDIF
Como se puede apreciar la version de Visual Foxpro tiene menos código, hace lo mismo que el código delphi y mas rápido, ya que si hay varios registros sigue ejecutandose rápido y tambien se conecta a la misma BD Firebird con conexion ODBC, obtiene los datos en un cursor y ahi saco los reportes.


Visual FoxPro tiene un comando que es REPLACE y con parametro ALL me reemplaza varios registros a la vez, en cambio en delphi tengo que hacer 3 bucles para actualizar datos:
1. Para poner 0(cero) al campo seleccion del ClientDataSet temporal
2. para recorrer los periodos seleccionados
3. para poner 1(uno) en el ClientDataSet donde estan las boletas de pago.


Por eso la duda es si hay algun comando "REPLACE" en Delphi que me permita ejecutar mas rápido mi rutina.
Agradesco de antemano si me pudieran ayudar, ya que aun no he logrado ejecutar mas rápido mi código delphi.


PD: Uso Delphi 7.

Última edición por ecfisa fecha: 03-08-2018 a las 02:29:09. Razón: ajustar código foxpro
Responder Con Cita