PDA

Ver la Versión Completa : Alguien puede explicarme como funciona realmente un DataSet?


RobertoAmores
25-08-2004, 17:39:06
Necesito capturar una serie de registros de un ClientDataSet, pero no entiendo bien como funciona internamente. Tengo este codigo:


procedure TForm1.Button1Click(Sender: TObject);
begin
IBTable1.Active:=True;
While not ClientDataSet1.Eof do
begin
IBTable1.Insert;
IBTable1.Fields[0].Value := ClientDataSet1.Fields[0].Value;
IBTable1.Fields[1].Value := ClientDataSet1.Fields[1].Value;
IBTable1.Fields[2].Value := ClientDataSet1.Fields[2].Value;
IBTable1.Fields[3].Value := ClientDataSet1.Fields[3].Value;
IBTable1.Fields[4].Value := ClientDataSet1.Fields[4].Value;
IBTable1.Fields[5].Value := ClientDataSet1.Fields[5].Value;
IBTable1.Fields[6].Value := ClientDataSet1.Fields[6].Value;
IBTable1.Fields[7].Value := ClientDataSet1.Fields[7].Value;
IBTable1.Fields[8].Value := ClientDataSet1.Fields[8].Value;
ClientDataSet1.Next;
end;
IBTable1.Post;
IBTable1.Active:=False;
end;


Pero sólo me inserta el primer registro. ¿Ves algo erroneo en el codigo? ¿Sabrias como podria solucionar mi problema?
Muchas gracias por todo, espero tener suerte, ;). Chao.

marto
25-08-2004, 17:46:16
Wop!

¿Por que no pones el Post dentro del bucle?

Sirkius
25-08-2004, 19:26:59
procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
begin
IBTable1.Active:=True;
While not ClientDataSet1.Eof do
begin
IBTable1.Insert;
For i := 0 to 8 do
IBTable1.Fields[i].Value := ClientDataSet1.Fields[i].Value;
ClientDataSet1.Next;
IBTable1.Post;
end;
IBTable1.Active:=False;
end;


Así mejor ;)

roman
25-08-2004, 19:41:15
marto y Sirkius:

¿Están seguros de que es necesario?

La ayuda de Delphi dice:


Dataset methods that change the dataset state, such as Edit, Insert, or Append, or that move from one record to another, such as First, Last, Next, and Prior automatically call Post.


Entonces, según esto, cada vez que entra al bucle, la instrucción IBTable1.Insert automáticamente hará el Post de la última inserción. La única inserción que faltaría sería la última y el POst fuera del bucle se encargaría de ello.

// Saludos

aig
26-08-2004, 08:45:00
El único problema que puede haber puede ser el registro activo de ClientDataSet1, si es el último lógicamente solo pasará un registro.

Prueba a poner ClientDataSet1.First antes del bucle y por si... asegurate que la tabla tiene más de 1 registro o que no está activo ningún filtro o rango.

marto
26-08-2004, 09:07:00
¿Están seguros de que es necesario?


Ya lo pensé roman, pero como nunca he trabajado con los objetos IB... era lo único raro que veía.


El único problema que puede haber puede ser el registro activo de ClientDataSet1..


Amigo aig, a veces lo más evidente se nos escapa :confused: a mi tambien me parece que puede ser eso

Sirkius
26-08-2004, 09:10:02
De todas formas, nada más sencillo que ir con el debugger paso a paso para ver cuantas vueltas da o si pasa algo raro... A mi siempre me resuelve todo el paso a paso :P