Você está na página 1de 17

03/04/2019 copiar registros de clientdataset sem varrer - Fórum DevMedia

Login

Mostrar menu

copiar registros de clientdataset sem varrer


11/11/2008

28

Delphi

seguinte: tenho 2 clientdatasets e quero copiar os registros de um para o outro sem varrer. Só
que um dos clients está filtrado, e eu quero copiar só os registros filtrados e não todos.

Se eu usar a propriedade data do tclientdataset eu copio todos os registros, mas eu não quero,
quero copiar só os filtrados, para gerar um ´data´ menor.

Preciso disso porque esse data eu vou passar como parametro variant para um metodo de um
remotedatamodule.

Tem algum jeito?

Vitor Rubio

Curtir tópico +0

RESPONDER

https://www.devmedia.com.br/forum/copiar-registros-de-clientdataset-sem-varrer/366055 1/17
03/04/2019 copiar registros de clientdataset sem varrer - Fórum DevMedia

POSTS Login

11/11/2008

 Emerson Nascimento

só conheço fazendo a varredura nos registros.


se for o caso, desabilite os controles para ganhar em performance.

1 cdsOriginal.DisableControls;
2 [faz a varredura e a cópia]
3 cdsOriginal.EnableControls;

RESPONDER

Gostei +0

11/11/2008

 Vitor Rubio

eu já fiz assim mesmo, mas se eu arranjasse outro jeito de fazer isso sem varrer ia ficar mais
generico, mas seguro e talvez mais rapido.

coloquei os disablecontrols e enablecontrols, coloquei tambem register para essa procedure


ser executada nos registradores, mas não sei se vou ter um ganho significativo de performance
com isso.

https://www.devmedia.com.br/forum/copiar-registros-de-clientdataset-sem-varrer/366055 2/17
03/04/2019 copiar registros de clientdataset sem varrer - Fórum DevMedia

Login
valew!

RESPONDER

Gostei +0

11/11/2008

 Diegotiemann

tente o seguinte:

1 ClientDataSet1.data:=ClientDataSet2.Data;

RESPONDER

Gostei +0

12/11/2008

 Vitor Rubio

https://www.devmedia.com.br/forum/copiar-registros-de-clientdataset-sem-varrer/366055 3/17
03/04/2019 copiar registros de clientdataset sem varrer - Fórum DevMedia

tente o seguinte: Login

1 ClientDataSet1.data:=ClientDataSet2.Data;

diego, desse jeito eu copio todos os dados, não só os filtrados.

Vou tentar usando clonecursor e copiar o data do dataset ´clonado´, se funcionar eu posto
aqui.

RESPONDER

Gostei +0

12/11/2008

 Vitor Rubio

com clone cursor tambem não adianta, olha só: exemplo tipico de conexão ao banco de dados
employee.gdb, com dbxpress.
2 dbgrids para ver o conteudo dos 2 datasets, etc.

1 ClientDataSet1.Filter := ´EMP_NO=2´;
2 ClientDataSet1.Filtered := true;
3 cds := TClientDataSet.Create(nil);
4 //cds.CloneCursor(ClientDataSet1, false, false);
5 //cds.CloneCursor(ClientDataSet1, false, true);
6 //cds.CloneCursor(ClientDataSet1, true, false);
7 cds.CloneCursor(ClientDataSet1, true, true);
8 ClientDataSet2.Data := cds.Data;
https://www.devmedia.com.br/forum/copiar-registros-de-clientdataset-sem-varrer/366055 4/17
03/04/2019 copiar registros de clientdataset sem varrer - Fórum DevMedia

9 cds.Free;

Login

nenhuma dessas opções colocou no segundo client só o ´EMP_NO=2´, ou seja:


APARENTEMENTE É IMPOSSIVEL COPIAR O DATA FILTRADO, SEM TER DE VARRER.

Embora, se for varrer, dar um disablecontrols, usar um cursor clonado e varrer o clone seria
uma boa opção para não tirar o clientdataset da ´posição´ que ele estiver.

RESPONDER

Gostei +0

12/11/2008

 Tonidavi2004

vitor^_^ você pode fazer assim.

1 type
2 TForm1 = class(TForm)
3
4 function DataSetProvider1DataRequest(Sender: TObject;
5 Input: OleVariant): OleVariant;
6 procedure Button1Click(Sender: TObject);
7
8 implementation
9
10 {$R *.DFM}
11
12 function TForm1.DataSetProvider1DataRequest(Sender: TObject;
13 Input: OleVariant): OleVariant;
14 begin
15 with (Sender as TDataSetProvider) do

https://www.devmedia.com.br/forum/copiar-registros-de-clientdataset-sem-varrer/366055 5/17
03/04/2019 copiar registros de clientdataset sem varrer - Fórum DevMedia

16 begin
17 DataSet.Filter := Input;
Login
18 DataSet.Filtered := True;
19 Result := Data;
20 end;
21 end;
22
23 procedure TForm1.Button1Click(Sender: TObject);
24 begin
25 ClientDataSet2.CreateDataSet;
26 ClientDataSet2.Data := ClientDataSet1.DataRequest(Seu Filtro);
27 end;

RESPONDER

Gostei +0

12/11/2008

 Upgradesource

Vitor
não sei o que vc quer fazer ou se tem que ser assim, tentei achar algo forma de fazer isso com
o filter, mas sem sucesso.

Mas se for possivel tente usar o param

ex

no botao filtrar tente algo asism

clientdataset1.close;

https://www.devmedia.com.br/forum/copiar-registros-de-clientdataset-sem-varrer/366055 6/17
03/04/2019 copiar registros de clientdataset sem varrer - Fórum DevMedia

ClientDataSet1.Params[0].AsInteger := 19;
Login
clientdataset1.Open;
ClientDataSet1.SaveToFile(´tabela.cds´);

ClientDataSet2.LoadFromFile(´tabela.cds´);
clientdataset2.open;

[ ]´s

RESPONDER

Gostei +0

12/11/2008

 Vitor Rubio

não entendi essa dica do params, meu cds não tem parametros.

vou experimentar a dica do tonidavi2004, se der certo eu posto aqui

RESPONDER

Gostei +0

https://www.devmedia.com.br/forum/copiar-registros-de-clientdataset-sem-varrer/366055 7/17
03/04/2019 copiar registros de clientdataset sem varrer - Fórum DevMedia

Login
12/11/2008

 Luiz Henrique

Blz vitor,

Set a opcao ClientDataSet1.LogChanges:= False, para nao efetuar backups de registros e logs,
segundo um colega de outro forum NDDV, economiza memoria, + velocidade e etc...

T+

RESPONDER

Gostei +0

12/11/2008

 Vitor Rubio

usando o datarequest dá exception de operation not alowed with unidirectional datasets.

isso porque o meu dataset é um sql dataset do dbxpress.

talvez se ligar em outro provider e outro client funcione.

https://www.devmedia.com.br/forum/copiar-registros-de-clientdataset-sem-varrer/366055 8/17
03/04/2019 copiar registros de clientdataset sem varrer - Fórum DevMedia

RESPONDER

Login

Gostei +0

12/11/2008

 Tonidavi2004

Post aqui o código que fez que causou o erro.

RESPONDER

Gostei +0

12/11/2008

 Vitor Rubio

FuncionoooooooooU!!!

porem eu preciso de mais um provider e mais um dataset, e encadear tudo, mas funcionou.

RESPONDER

https://www.devmedia.com.br/forum/copiar-registros-de-clientdataset-sem-varrer/366055 9/17
03/04/2019 copiar registros de clientdataset sem varrer - Fórum DevMedia

Gostei +0
Login

12/11/2008

 Vitor Rubio

o codigo do tonidavi2004 funcionou, mas eu tive que ligar outro client e provider, pois não
funcion com datasets unidirecionais, e o dataset do meu provider era um sqldataset.

vou postar o codigo do dfm para que vocês possam copiar - colar, e o codigo da unit

unit:

1 unit Unit1;
2
3 interface
4
5 uses
6 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
7 Dialogs, DBXpress, FMTBcd, DB, StdCtrls, Provider, DBClient, Grids,
8 DBGrids, SqlExpr;
9
10 type
11 TForm1 = class(TForm)
12 SQLConnection1: TSQLConnection;
13 SQLDataSet1: TSQLDataSet;
14 DBGrid1: TDBGrid;
15 ClientDataSet1: TClientDataSet;
16 DataSetProvider1: TDataSetProvider;
17 Button3: TButton;
18 ClientDataSet2: TClientDataSet;
19 DataSource1: TDataSource;
20 DataSource2: TDataSource;
21 DBGrid2: TDBGrid;
22 Button2: TButton;
23 DataSetProvider2: TDataSetProvider;
24 ClientDataSet3: TClientDataSet;
25 procedure Button3Click(Sender: TObject);
26 procedure Button2Click(Sender: TObject);
27 function DataSetProvider2DataRequest(Sender: TObject;
28 Input: OleVariant): OleVariant;
29 private
30 { Private declarations }
31 public
https://www.devmedia.com.br/forum/copiar-registros-de-clientdataset-sem-varrer/366055 10/17
03/04/2019 copiar registros de clientdataset sem varrer - Fórum DevMedia

32 { Public declarations }
33 end;
Login
34
35 var
36 Form1: TForm1;
37
38 implementation
39
40 {$R *.dfm}
41
42 procedure TForm1.Button3Click(Sender: TObject);
43 var cds: TClientDataSet;
44 begin
45
46 ClientDataSet2.Filter := ´EMP_NO=2´;
47 ClientDataSet2.Filtered := true;
48
49 cds := TClientDataSet.Create(nil);
50 //cds.CloneCursor(ClientDataSet2, false, false);
51 //cds.CloneCursor(ClientDataSet2, false, true);
52 //cds.CloneCursor(ClientDataSet2, true, false);
53 cds.CloneCursor(ClientDataSet2, true, true);
54 ClientDataSet3.Data := cds.Data;
55 cds.Free;
56
57 end;
58
59 procedure TForm1.Button2Click(Sender: TObject);
60 begin
61
62 ClientDataSet3.Data := ClientDataSet2.DataRequest(´EMP_NO=2´);
63
64 end;
65
66 function TForm1.DataSetProvider2DataRequest(Sender: TObject;
67 Input: OleVariant): OleVariant;
68 begin
69 with (Sender as TDataSetProvider) do
70 begin
71 DataSet.Filter := Input;
72 DataSet.Filtered := True;
73 Result := Data;
74 end;
75 end;
76
77 end.

dfm:

1 object Form1: TForm1

https://www.devmedia.com.br/forum/copiar-registros-de-clientdataset-sem-varrer/366055 11/17
03/04/2019 copiar registros de clientdataset sem varrer - Fórum DevMedia

2 Left = 290
3 Top = 278
Login
4 Width = 684
5 Height = 222
6 Caption = ´Form1´
7 Color = clBtnFace
8 Font.Charset = DEFAULT_CHARSET
9 Font.Color = clWindowText
10 Font.Height = -11
11 Font.Name = ´MS Sans Serif´
12 Font.Style = []
13 OldCreateOrder = False
14 PixelsPerInch = 96
15 TextHeight = 13
16 object DBGrid1: TDBGrid
17 Left = 16
18 Top = 16
19 Width = 320
20 Height = 120
21 DataSource = DataSource1
22 TabOrder = 0
23 TitleFont.Charset = DEFAULT_CHARSET
24 TitleFont.Color = clWindowText
25 TitleFont.Height = -11
26 TitleFont.Name = ´MS Sans Serif´
27 TitleFont.Style = []
28 end
29 object Button3: TButton
30 Left = 24
31 Top = 160
32 Width = 75
33 Height = 25
34 Caption = ´Button3´
35 TabOrder = 1
36 OnClick = Button3Click
37 end
38 object DBGrid2: TDBGrid
39 Left = 344
40 Top = 16
41 Width = 320
42 Height = 120
43 DataSource = DataSource2
44 TabOrder = 2
45 TitleFont.Charset = DEFAULT_CHARSET
46 TitleFont.Color = clWindowText
47 TitleFont.Height = -11
48 TitleFont.Name = ´MS Sans Serif´
49 TitleFont.Style = []
50 end
51 object Button2: TButton
52 Left = 104
53 Top = 160
54 Width = 75
55 Height = 25
56 Caption = ´Button2´
https://www.devmedia.com.br/forum/copiar-registros-de-clientdataset-sem-varrer/366055 12/17
03/04/2019 copiar registros de clientdataset sem varrer - Fórum DevMedia

57 TabOrder = 3
58 OnClick = Button2Click
Login
59 end
60 object SQLConnection1: TSQLConnection
61 ConnectionName = ´Employee.gdb´
62 DriverName = ´Interbase´
63 GetDriverFunc = ´getSQLDriverINTERBASE´
64 LibraryName = ´dbexpint.dll´
65 LoginPrompt = False
66 Params.Strings = (
67 ´DriverName=Interbase´
68
69 ´Database=C:\Arquivos de programas\Arquivos comuns\Borland Shared´ +
70 ´\Data\employee.gdb´
71 ´RoleName=RoleName´
72 ´User_Name=sysdba´
73 ´Password=masterkey´
74 ´ServerCharSet=´
75 ´SQLDialect=3´
76 ´BlobSize=-1´
77 ´CommitRetain=False´
78 ´WaitOnLocks=True´
79 ´ErrorResourceFile=´
80 ´LocaleCode=0000´
81 ´Interbase TransIsolation=ReadCommited´
82 ´Trim Char=False´)
83 VendorLib = ´gds32.dll´
84 Connected = True
85 Left = 24
86 Top = 32
87 end
88 object SQLDataSet1: TSQLDataSet
89 CommandText = ´select * from EMPLOYEE´
90 MaxBlobSize = -1
91 Params = <>
92 SQLConnection = SQLConnection1
93 Left = 64
94 Top = 32
95 end
96 object ClientDataSet1: TClientDataSet
97 Aggregates = <>
98 Params = <>
99 ProviderName = ´DataSetProvider1´
100 Left = 136
101 Top = 32
102 end
103 object DataSetProvider1: TDataSetProvider
104 DataSet = SQLDataSet1
105 Left = 96
106 Top = 32
107 end
108 object ClientDataSet2: TClientDataSet
109 Active = True
110 Aggregates = <>
111 Params = <>
https://www.devmedia.com.br/forum/copiar-registros-de-clientdataset-sem-varrer/366055 13/17
03/04/2019 copiar registros de clientdataset sem varrer - Fórum DevMedia

112 ProviderName = ´DataSetProvider2´


113 Left = 208
Login
114 Top = 32
115 end
116 object DataSource1: TDataSource
117 DataSet = ClientDataSet2
118 Left = 136
119 Top = 80
120 end
121 object DataSource2: TDataSource
122 DataSet = ClientDataSet3
123 Left = 384
124 Top = 56
125 end
126 object DataSetProvider2: TDataSetProvider
127 DataSet = ClientDataSet1
128 OnDataRequest = DataSetProvider2DataRequest
129 Left = 176
130 Top = 32
131 end
132 object ClientDataSet3: TClientDataSet
133 Aggregates = <>
134 Params = <>
135 Left = 424
136 Top = 24
137 end
138 end

o codigo que deu erro é o mesmo do button2, ou seja, a dica do tonidavi2004, só que quando
deu erro eu tentei copiar o clientdataset 1 filtrado para o cds3

vou testar essa ultima dica para ver se da certo

RESPONDER

Gostei +0

https://www.devmedia.com.br/forum/copiar-registros-de-clientdataset-sem-varrer/366055 14/17
03/04/2019 copiar registros de clientdataset sem varrer - Fórum DevMedia

12/11/2008
Login

 Vitor Rubio

mesmo com o logchanges false ele copia todo o data, se eu tentar copiar o data direto depois
de filtrado.

Tirando a varredura, o datarequest do tonidavi2004 foi o jeito que funcionou.

Agora me pergunto o que seria mais performatico: a dica do datarequest ou a varredura?

RESPONDER

Gostei +0

13/11/2008

 Discorpio

Boa noite a todos.

Existe um outro jeito, Vitor, e esse jeito chama-se IBExpert.

Como ?

O IBExpert permite você gerar Scripting de SQL com os dados da tabela, por exemplo, se a sua
tabela contiver 10.000 registros, ele gera 10.000 instruções Inserts.

Ao abrir o IBExpert, você abre o banco e a tabela que voce quer clonar, no canto superior
https://www.devmedia.com.br/forum/copiar-registros-de-clientdataset-sem-varrer/366055 15/17
03/04/2019 copiar registros de clientdataset sem varrer - Fórum DevMedia

esquerdo da janela da tabela, tem um botão chamado table, a clicar ali voce seleciona Export
Login
Data into Script, então voce pode selecionar os campos que queira exportar na aba Fields e na
combo Export as, voce escolhe a sentença, se Insert Stataments, Update Statements, ou
Procedure Statements, em File Name, digite o nome do arquivo texto que ele vai exportar a
sentença.

Se voce preferir com os dados filtrados, aplique o filtro indo na aba Data e do mesmo lado
esquerdo, aplique o Filtro Criteria e depois Apply Filter.

Isto é bom até quando quero transportar dados de um tipo de banco de dados para outro tipo,
Ex: FireBird para PostGres

Esta é uma opção caso voce não queira fazer isto via código.

RESPONDER

Gostei +0

MAIS TÓPICOS

Buscar no Fórum

Clique aqui para fazer login e interagir na Comunidade :)

https://www.devmedia.com.br/forum/copiar-registros-de-clientdataset-sem-varrer/366055 16/17
03/04/2019 copiar registros de clientdataset sem varrer - Fórum DevMedia

Login

Plataforma para Programadores

Comunidade

Revistas

Baixe o App

Fale conosco

Assinatura Empresarial

Hospedagem web por Porta 80 Web Hosting

https://www.devmedia.com.br/forum/copiar-registros-de-clientdataset-sem-varrer/366055 17/17