Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Poner datos de consulta en un DbGrid pero en memoria para poder editar (https://www.clubdelphi.com/foros/showthread.php?t=78505)

MartinS 25-04-2012 14:54:58

Poner datos de consulta en un DbGrid pero en memoria para poder editar
 
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 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:
Código Delphi [-]
...
  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.
Código Delphi [-]
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:
Código Delphi [-]
   DBGrid1.Options:= DBGRid1.Options + [dgMultiSelect];

Operación (de nuevo al memo):
Código Delphi [-]
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

Cita:

Empezado por BlueSteel (Mensaje 430915)
Yo para casos similares utilizo el componente JvMemoryData de las JVCL (Jedi)... puedes revisar este hilo 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
Cita:

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

Resuelto!!!
 
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:

Código Delphi [-]
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.


La franja horaria es GMT +2. Ahora son las 09:53:48.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi