PDA

Ver la Versión Completa : Poner datos de consulta en un DbGrid pero en memoria para poder editar


MartinS
25-04-2012, 14:54:58
Hola:
Bueno el tema es el siguiente:
Necesito generar un informe de clientes donde consten determinadas novedades.
Realizo la consulta SQL en firebird que me devuelve las novedades del cliente en particular (Fecha y detalle) pero necesito que estas permanezcan en memoria en un grid o similar donde se pueda seleccionar cual agregar y cual no de todas las listadas.
La idea esta armada por medio de un asistente donde se inicia seleccionando el cliente, se hace clic en un boton siguiente y cargas las novedades que con anterioridad han sido generadas (aqui una vez listadas tengo que poder indicar cual agrego y cual no) ya que al hace clic otra vez en siguiente me guarda el informe con los datos del cliente mas las novedades que he decidido incorporar. El tema es que el usuario puede volver hacia atrás con el asistente por lo que no guardo nada hasta que no se finalice este desechando toda edicion que haya hecho hasta ahi.-

La estructura de las tablas son:

Novedades
Id
IdCte
Fecha
Detalle

NovedInforme
Id
IdInforme
Fecha
detalle

Informe
Id
IdCte
Fecha
Participacion
Saldo
....

En definitiva donde se cargan las novedades agregaria una columna adicional con el valor de si o no dependiendo si la necesito o no y una vez que hago clic en siguiente paso todo eso del "Grid en memoria" a la tabla correspondiente grabando previamente el informe.-

Otra opcion seria utilizar una tabla de soporte solo para poner esas novedades, editarlas y una vez incorporadas a NovedInforme eliminarlas pero no se si es conveniente.-

Tengo tambien instaladas los componentes JEDI y vi uno que es MemoryData pero no se bien como funciona. Acepto sugerencia y orientacion en el tema.-

Gracias.-

PD Espero que me haya expresado bien.- :o

Saludos ;)

BlueSteel
25-04-2012, 15:41:15
Yo para casos similares utilizo el componente JvMemoryData de las JVCL (Jedi)... puedes revisar este hilo (http://www.clubdelphi.com/foros/showpost.php?p=386001&postcount=7)en donde explico como usarlo

Espero que te sirva.

Salu2:D:p

ecfisa
25-04-2012, 15:43:18
Hola Martin.

En este momento se me ocurren dos ideas, espero que alguna te sirva.

La primera es usar un TCheckListBox para cargar los datos del TDBGrid y hacer la selección desde el primer componente:

...
CheckListBox1.MultiSelect:= True;
while not IBQuery1.Eof do
begin
CheckListBox1.Items.Add(IBQuery1.FieldByName('FECHA').AsString+' '+
IBQuery1.FieldByName('DETALLE').AsString);
IBQuery1.Next;
end;...

Luego hacer la operación que desees. A modo de ejemplo agrego los datos a un memo, pero lo mismo sería agregarlos a un DataSet.

procedure TForm1.btnAgregarClick(Sender: TObject);
var
i: Integer;
begin
for i:= 0 to CheckListBox1.Count-1 do
if CheckListBox1.State[i] = cbChecked then
Memo1.Lines.Add(CheckListBox1.Items[i]); // agregar
end;


La segunda es usar la propiedad dgMultiSelect del TDBGrid:

DBGrid1.Options:= DBGRid1.Options + [dgMultiSelect];


Operación (de nuevo al memo):

procedure TForm1.btnAgregarClick(Sender: TObject);
var
i: Integer;
begin
for i:= 0 to DBGrid1.SelectedRows.Count - 1 do
begin
DBGrid1.DataSource.DataSet.Bookmark:= DBGrid1.SelectedRows[i];
Memo1.Lines.Add(DBGrid1.Columns[0].Field.AsString+' '+
DBGrid1.Columns[1].Field.AsString); // agregar
end;
end;

Logicamente el componente JvMemoryData quizá haga más sencilla la tarea...

Saludos.

MartinS
25-04-2012, 16:05:58
Yo para casos similares utilizo el componente JvMemoryData de las JVCL (Jedi)... puedes revisar este hilo (http://www.clubdelphi.com/foros/showpost.php?p=386001&postcount=7)en donde explico como usarlo

Espero que te sirva.

Salu2:D:p

Hola Blue
Gracias por responder. Duda: Datos llamas al componente MemoryData?


Para ecfisa
En este momento se me ocurren dos ideas, espero que alguna te sirva.

Si, me sirven y creo que ambas aunque me inclino por la primera para probar a ver que ocurre. Tambien voy a probar el MemoryData pero cuando depure un poco el asistente ya que probando e inventando creo que tengo demasiados IbDataSet, Ibquery, IbSql, etc, etc y todos con codigo :D:D:D

Gracias gente.-
Saludos

MartinS
25-04-2012, 16:51:03
Bueno, comento resultados...
En definitiva use el componente de JEDI (MemoryData) porque lo utilizo como una base de datos plana y me es mas facil hacer despues la asignacion de los datos correspondientes a las tablas finales caso contrario utilizando listas iba a tener que calcular a partir desde donde empezaba la fecha y desde donde empezaba el texto. Asi queda la asignacion:

Procedure TPGenInfoInstit.Importacion;
Begin
NovInternos.Close;
NovInternos.SQL.Clear;
NovInternos.SQL.Add('Select IdInt,Fecha,Detalle From Novedades ');
NovInternos.SQL.Add('Where IdInt = :Cod');
NovInternos.ParamByName('Cod').AsInteger := Codigo;
NovInternos.Open;
Memoria.Close;
Memoria.EmptyTable;
Memoria.Open;
while not NovInternos.Eof do
begin
Memoria.Append;
MemoriaFecha.Value := NovInternos.FieldByName('Fecha').AsDateTime;
MemoriaDetalle.AsString := NovInternos.FieldByName('Detalle').AsString;
MemoriaImprime.AsString := 'Sí';
Memoria.Post;
NovInternos.Next;
end;
End;

Gracias y saludos.