From 3f4cca37f3b88ed841cf2306918b5f3792295668 Mon Sep 17 00:00:00 2001 From: roberto Date: Wed, 25 Nov 2009 11:16:29 +0000 Subject: [PATCH] Se adapta CopyDataTableDA5, para que el puntero de posicion de la tabla source no se pierda git-svn-id: https://192.168.0.254/svn/Proyectos.Acana_FactuGES2/trunk@477 f4e31baf-9722-1c47-927c-6f952f962d4b --- Source/Base/Utiles/uDataTableUtils.pas | 83 ++++++++++++++------------ 1 file changed, 45 insertions(+), 38 deletions(-) diff --git a/Source/Base/Utiles/uDataTableUtils.pas b/Source/Base/Utiles/uDataTableUtils.pas index b0f6face..78a9a328 100644 --- a/Source/Base/Utiles/uDataTableUtils.pas +++ b/Source/Base/Utiles/uDataTableUtils.pas @@ -67,52 +67,57 @@ var AFilter : String; AObj : ISeleccionable; i : Integer; + AID: Integer; + begin AFilter := ''; AFiltered := False; - if OnlySelectedRows then - begin - if not Supports(ASource, ISeleccionable, aObj) then - raise Exception.Create('El origen de datos no soporta la interfaz ISeleccionable (CopyDataTable)'); - - { Si la tabla está abierta, la cerramos antes de aplicar los filtros - porque por cada cambio en el filtro se hacen llamadas internas de TDADataTable. } - if ASource.Active then - ASource.Close; - - // Si la tabla origen viene con un filtro, lo guardamos para luego restablecerlo. - if ASource.Filtered then - begin - AFiltered := True; - AFilter := ASource.Filter; - ASource.Filtered := False; - end; - - ASource.Filter := ''; - - //Si no hay elemento seleccionados filtramos para que ATarget se quede vacia - if (AObj.SelectedRecords.Count = 0) then - ASource.Filter := ASource.Filter + '(' + ASource.RecIDField.FieldName + ' = ' + IntToStr(ID_NULO) + ')' - - //En caso contrario filtramos por los elementos seleccionados - else - for i := 0 to AObj.SelectedRecords.Count - 1 do - begin - if (i > 0) then - ASource.Filter := ASource.Filter + ' or '; - ASource.Filter := ASource.Filter + '(' + ASource.RecIDField.FieldName + ' = ' + IntToStr(AObj.SelectedRecords.Items[i]) + ')'; - end; - ASource.Filtered := True; - end; - - DABin := Binary.Create; - DADataStreamer := TDABin2DataStreamer.Create(nil); - ShowHourglassCursor; ASource.DisableControls; ATarget.DisableControls; + AID := ASource.GetRowRecIDValue; //Se guarda la posicion de la tabla fuente + try + + if OnlySelectedRows then + begin + if not Supports(ASource, ISeleccionable, aObj) then + raise Exception.Create('El origen de datos no soporta la interfaz ISeleccionable (CopyDataTable)'); + + { Si la tabla está abierta, la cerramos antes de aplicar los filtros + porque por cada cambio en el filtro se hacen llamadas internas de TDADataTable. } + if ASource.Active then + ASource.Close; + + // Si la tabla origen viene con un filtro, lo guardamos para luego restablecerlo. + if ASource.Filtered then + begin + AFiltered := True; + AFilter := ASource.Filter; + ASource.Filtered := False; + end; + + ASource.Filter := ''; + + //Si no hay elemento seleccionados filtramos para que ATarget se quede vacia + if (AObj.SelectedRecords.Count = 0) then + ASource.Filter := ASource.Filter + '(' + ASource.RecIDField.FieldName + ' = ' + IntToStr(ID_NULO) + ')' + + //En caso contrario filtramos por los elementos seleccionados + else + for i := 0 to AObj.SelectedRecords.Count - 1 do + begin + if (i > 0) then + ASource.Filter := ASource.Filter + ' or '; + ASource.Filter := ASource.Filter + '(' + ASource.RecIDField.FieldName + ' = ' + IntToStr(AObj.SelectedRecords.Items[i]) + ')'; + end; + ASource.Filtered := True; + end; + + DABin := Binary.Create; + DADataStreamer := TDABin2DataStreamer.Create(nil); + ATarget.LogicalName := ASource.LogicalName; // We need to specify new dataset LogicalName ATarget.RemoteFetchEnabled := False; // "Desconectamos" la tabla destino del servidor @@ -136,6 +141,8 @@ begin ASource.Filtered := True; end; + ASource.Locate(ASource.RecIDField.FieldName, AID, []); //Se intenta restablecer la posicion inicial de la tabla fuente + finally FreeAndNil(DABin); FreeAndNil(DADataStreamer);