PDA

Ver la Versión Completa : Dudas con ClientDataSet en Memoria


Paulao
26-09-2011, 15:15:41
Tengo un CDS(Client DataSet) que es usado solamente en memoria. El es cargado en alguno momento. O que gustaria de hacer es ver todos los datos de este CDS en el Debug del Delphi. Asi, yo tengo asi: CdsValid.Data. Pero mi gustaria de ver las informaciones y pode hacer mis comparaciones para resolver mis problemas, pero tengo dificultad. Antes que mi pregunte voy a decir:
1) Es en memoria, no tiene dataset ninguno a el.
2) Es un proyecto no desarrollados por mi.
3) El carga en alguna parte del sistema y descarga en un relatorio(QReport)

DarKraZY
26-09-2011, 15:39:18
Ya que un TClientDataSet hereda de TDataSet puedes crear un formulario con un TDBGrid y un TDataSource y relacionarlo todo para mostrar esa información.

Saludos!

Paulao
26-09-2011, 19:25:01
Como hago para tener la query asociada a el? Y los nombres de los campos? Hay como? Para mi lo mas importante es la query asociada a el.

ecfisa
26-09-2011, 19:46:20
Hola Paulao.

Revisá este enlace (http://www.clubdelphi.com/foros/showthread.php?t=69061) y mirá sobre la propiedad CommandText del TClientDataSet.

Saludos.

Paulao
26-09-2011, 20:35:56
Como yo dijo anteriormente, no hay CommandText. Este CDS es en memoria. El se va populando en una ocasion que aún no he resolvido. Mi gustaria de saber si hay como buscar alguno select o saber las colunas. Lo valores yo tengo como saber.(CDSValid.Data[0]) y ponendo las posiciones del vector(0,1,2,3,4...N).

ecfisa
27-09-2011, 00:32:39
Hola Paulao.

Concretamente, ¿ Que buscas hacer con el ClientDataSet en memoria ?, ¿ Que es lo que no podés lograr ?

Supongamos que creaste los campos:

ID : Integer;
Codigo : sring;
Fecha : tDate
Numero : Integer;

y los cargas así:

procedure TForm1.FormShow(Sender: TObject);
var
i: Integer;
begin
Randomize;
with CDS do
begin
CreateDataSet;
Open;
for i:= 1 to 1000 do
begin
Append;
FieldByName('ID').AsInteger := i;
FieldByName('Codigo').AsString := 'Cod'+
StringOfChar('0',4-Length(IntToStr(1000-i)))+ IntToStr(1000-i);
FieldByName('Fecha').AsDateTime := Date();
FieldByName('Numero').AsFloat := Random(10000);
Post;
end;
First;
end;
end;


Te pongo algunos ejemplos simples de acciones que podés hacer con un TClientDataSet en memoria:

Seleccionar el índice:

procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
with CDS do
begin
Close;
case RadioGroup1.ItemIndex of
0: CDS.IndexFieldNames:= 'ID';
1: CDS.IndexFieldNames:= 'Codigo';
2: CDS.IndexFieldNames:= 'Fecha';
3: CDS.IndexFieldNames:= 'Numero';
end;
Open;
end;
end;


Obtener los nombres y valores de los campos:

procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
for i:= 0 to CDS.FieldCount -1 do
ListBox1.Items.Add(CDS.Fields[i].FieldName+': '+CDS.Fields[i].AsString);
end;


Buscar un campo:

function Buscar(ACDS: TClientDataSet; Campo: string; Dato: Variant): Boolean;
begin
CDS.Locate(Campo, Dato,[]);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Buscar(CDS,'ID', 990);
if Buscar(CDS,'Codigo','Cod0091') then
...
end;

...

Y la lista sigue...

Sería más fácil resolver tu inquietud si nos contás en que radica tu dificultad ;)

Un saludo.

DarKraZY
27-09-2011, 09:44:40
Como yo dijo anteriormente, no hay CommandText. Este CDS es en memoria. El se va populando en una ocasion que aún no he resolvido. Mi gustaria de saber si hay como buscar alguno select o saber las colunas. Lo valores yo tengo como saber.(CDSValid.Data[0]) y ponendo las posiciones del vector(0,1,2,3,4...N).

Supongo que así puedes sacar la información pero TClientDataSet desciende de TDataSet por lo que puede hacer: MiCDS.FieldByName('PEPE').AsInteger := 5;
MiCDS.Insert;
MiCDS.Post;
while not MiCDS.Eof do
begin
for i := 0 to MiCDS.FieldCount - 1 do
ShowMessage(MiCDS.Fields[i].FieldName);
MiCDS.Next;
end;


Y muchas más... Filter, Eventos...

Lo que no entiendo es lo de la query. Dices que lo cargas en memoria, pero ¿luego quieres acceder a la "query"? ¿Te refieres a los datos? ¿o a la consulta que hiciste?