Jump to content


Photo

Insertar consulta en TStringgrid


  • Please log in to reply
4 replies to this topic

#1 jramirez

jramirez

    Member

  • Miembros
  • PipPip
  • 11 posts

Posted 21 January 2014 - 11:04 AM

Hola nuevamente!!

¿Cómo podría hacerle para insertar en un StringGrid una consulta de base de datos?


  • 0

#2 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1750 posts
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Posted 21 January 2014 - 11:25 AM

Con mucho trabajo, te lo digo por experiencia propia. Mejor, utiliza un TDbGrid, que para éso sirve...
  • 0

#3 genriquez

genriquez

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 539 posts
  • LocationCali, Colombia

Posted 21 January 2014 - 11:30 AM

Hola en Delphi VCL usualmente se utiliza el TDBGrid para estos menesteres y lo hace automáticamente, con solo conectar el Datasource y éste a su vez al TDataSet.

Si lo quieres hacer sobre un TStringGrid debes hacerlo a pie  de la siguiente manera



delphi
  1. Var
  2.   I, W, X : Integer;
  3. begin
  4.   W := Grid1.Canvas.TextWidth('X');
  5.  
  6.   DbConn.Open;
  7.   Query.Open;
  8.  
  9.   //Ajusta Número de Filas y Columnas
  10.   Grid1.ColCount := Query.Fields.Count;
  11.   Grid1.RowCount := Query.RecordCount+1;
  12.  
  13.   //Agrega los titulos de las columnas
  14.  
  15.   Grid1.ColWidths[0] :=  5;  //La primera columna se deja como  indicador
  16.  
  17.   For I := 0 to Query.Fields.Count - 1 do
  18.   Begin
  19.       //Grid1.Rows[0][I+1] := Query.Fields[I].FieldName;  //El que necesites
  20.       Grid1.Rows[0][I+1] := Query.Fields[I].DisplayLabel;
  21.       Grid1.ColWidths[I] :=  Query.Fields[I].DisplayWidth* W;
  22.   End;
  23.  
  24.  
  25.   Query.First;
  26.   X := 0;  //Primera linea de la grilla
  27.  
  28.   While not Query.Eof do
  29.   Begin
  30.       Inc(X);
  31.       For I := 0 to Query.Fields.Count - 1 do
  32.         Grid1.Cols[I][X] := Query.Fields[I].AsString;
  33.  
  34.       Query.Next;
  35.   End;



En FireMonkey no exite el componente TDBGrid, de hecho ya no existen los componentes DataAware, ya todos los componentes pueden mostrar datos de una base de datos gracias a los LiveBinding,  es difícil de adaptarse, pero después te darás cuenta que es una herramienta genial.

Saludos.
  • 0

#4 jramirez

jramirez

    Member

  • Miembros
  • PipPip
  • 11 posts

Posted 22 January 2014 - 01:04 PM

Me dio una idea de como hacerlo!!

Muchas Gracias por sus respuestas!!!  (y)
  • 0

#5 santiago14

santiago14

    Advanced Member

  • Miembros
  • PipPipPip
  • 336 posts
  • LocationCerrillos - Salta - Argentina

Posted 22 January 2014 - 03:24 PM

Yo alguna vez hice un trabajo respecto de eso...
De hecho, hoy en día utilizo todo lo que desarrollé. Te lo paso... Yo lo uso con los componentes TMDOQuery, pero supongo que no ha de se tand difícil adaptarlo para otros.



delphi
  1. unit oGrillas
  2.  
  3. type
  4.   filaGrilla=array of string;
  5.  
  6. //....
  7.  
  8. procedure AgregarFilaGrilla(grilla:TStringGrid);
  9. //agrego una fila a la grilla
  10. {cuando se agrega una fila pero antes se eliminaron,
  11.  en realidad el contenido de las filas no se borra, por
  12.  eso se pone un clear}
  13. begin
  14.   with grilla do
  15.   begin
  16.   //Agrego una linea a la grilla, al ultimo por supuesto
  17.     RowCount:=RowCount + 1;
  18.     Rows[RowCount - 1].Clear;
  19.     //RowHeights[RowCount - 1]:= altura; //16;
  20.   end;
  21. end;
  22.  
  23. procedure limpiarGrilla(grilla:TStringGrid);
  24. begin
  25.   with grilla do
  26.   begin
  27.     try
  28.       RowCount:=2; //pongo dos filas
  29.       Row:=1; //me posiciono en la fila 1
  30.       Rows[1].Clear; //borro el contenido de la fila 1
  31.     except
  32.       on E:Exception do
  33.     begin
  34.       ShowException(E,E);
  35.       //raise;
  36.     end;
  37.     end; //del try
  38.   end;
  39. end;
  40.  
  41. procedure EliminarFilaGrilla(grilla:TStringGrid);
  42. //elimina una fila de la grilla, la seleccionada
  43. var
  44.   i:integer;
  45.   j:integer;
  46. begin
  47.   with grilla do
  48.   begin
  49.   //si la grilla tiene mas de dos filas y la fila seleccionada no es la ultima, elimino fila
  50.     if (RowCount > 2) and (Row <> (RowCount - 1)) then
  51.     begin
  52.       for i := Row to (RowCount + 1) do
  53.         for j:= 0 to (colCount - 1) do
  54.           Rows[i][j]:=Rows[i + 1][j];
  55.       RowCount:= RowCount - 1; //quito la ultima fila
  56.     end; //del if (RowCount...
  57.   end; //del with
  58. end;
  59.  
  60. function sacarDatosGrilla(grilla:TStringGrid):filaGrilla;
  61. //recupera los datos de la fila seleccionada de la grilla
  62. var
  63.   //mAux:filaGrilla;
  64.   fila:filaGrilla; //array of string;
  65.   j:integer;
  66. begin
  67.   SetLength(fila,1); //tiene una componente al principio
  68.   with grilla do
  69.   begin
  70.   //si la grilla tiene mas de dos filas y la fila seleccionada no es la ultima, recupero datos
  71.     if (RowCount > 2) and (Row <> (RowCount - 1)) then
  72.       for j:=0 to (colCount - 1) do
  73.       begin
  74.         setLength(fila,j + 1);
  75.         fila[j]:=Cells[j,Row];
  76.       end;
  77.   end; //del with
  78.   result:=fila; //mAux;
  79. end;
  80.  
  81. procedure ponerDatosGrilla(var datosFila:filaGrilla;grilla:TStringGrid); overload;
  82. //agrega una fila con datos en la grilla
  83. var
  84.   j:integer;
  85. begin
  86.   with grilla do
  87.     for j:=0 to (colCount - 1) do
  88.       try
  89.         Cells[j,(RowCount - 1)]:=datosFila[j];
  90.       except
  91.  
  92.       end;
  93. end;
  94.  
  95. procedure ponerDatosGrilla(var datosFila:filaGrilla;fila:integer;
  96.   grilla:TStringGrid); overload;
  97. //agrega una fila con datos en la grilla, en la posición que se le indica
  98. var
  99.   j:integer;
  100. begin
  101.   with grilla do
  102.     for j:=0 to (colCount - 1) do
  103.       try
  104.         Cells[j, fila]:=datosFila[j];
  105.       except
  106.  
  107.       end;
  108. end;
  109.  
  110. procedure cargarTStringGrid(grilla:TStringGrid;consulta:tmdoQuery); overload;
  111. var
  112.   i, j:integer;
  113. begin
  114.   with consulta, grilla do
  115.   begin
  116.     FetchAll; //Para saber la cantidad de registros que trae.
  117.   //Filas de la Grilla = Cant de Registros + título + fila final
  118.     RowCount:= RecordCount + 1 + 1;
  119.     Rows[RowCount - 1].Clear;
  120.   //Columnas de la Grilla = Cant de Campos
  121.     ColCount:=FieldCount;
  122.   //Pongo el puntero del record en el primer lugar
  123.     First;
  124.     for i:=1 to (RowCount - 2) do
  125.     begin
  126.     //Cargo la fila
  127.       for j:=0 to (ColCount - 1) do
  128.       begin
  129.         Cells[j, i]:=Fields[j].AsString;
  130.       end;
  131.       Next; //proximo record
  132.     end; //del for i:=1 ...
  133.   end; //del with
  134. end;
  135.  
  136. procedure cargarTStringGrid(grilla:TStringGrid;consulta:TIBQuery); overload;
  137. var
  138.   i, j:integer;
  139. begin
  140.   with consulta, grilla do
  141.   begin
  142.     FetchAll; //Para saber la cantidad de registros que trae.
  143.   //Filas de la Grilla = Cant de Registros + título + fila final
  144.     RowCount:= RecordCount + 1 + 1;
  145.     Rows[RowCount - 1].Clear;
  146.   //Columnas de la Grilla = Cant de Campos
  147.     ColCount:=FieldCount;
  148.   //Pongo el puntero del record en el primer lugar
  149.     First;
  150.     for i:=1 to (RowCount - 2) do
  151.     begin
  152.     //Cargo la fila
  153.       for j:=0 to (ColCount - 1) do
  154.       begin
  155.         Cells[j, i]:=Fields[j].AsString;
  156.       end;
  157.       Next; //proximo record
  158.     end; //del for i:=1 ...
  159.   end; //del with
  160. end;
  161.  
  162. procedure titulosGrilla(grilla:tStringGrid;titulos:array of string;
  163.   anchos:array of integer);
  164. var
  165.   j:integer;
  166. begin
  167.   with grilla do
  168.   begin
  169.     ColCount:=high(titulos) + 1;
  170.     for j:= 0 to (ColCount - 1) do
  171.     begin
  172.       cols[j].add(titulos[j]);
  173.       ColWidths[j]:=anchos[j];
  174.     end;
  175.   end;
  176. end;



Con esto, hacemos...


delphi
  1. procedure TfrmGestionSumarios.FormShow(Sender: TObject);
  2. begin
  3.   self.Caption:='Gestión de sumarios - ' + gNombre_Sucursal;
  4. //Ponemos los títulos de la grilla en tiempo de ejecución
  5.   titulosGrilla(gSumarios, ['Sección', 'Título', 'N° O.P.', 'Texto', 'Estado'],
  6.   [105, 160, 70, 360, 80]);
  7.   dtFechaSumario.Date:=date;
  8. end;
  9.  
  10. procedure TfrmGestionSumarios.btnBuscarClick(Sender: TObject);
  11. var
  12.   fecha:TDate;
  13.   estado, condicion_sumario:string;
  14. begin
  15.   fecha:=dtFechaSumario.Date;
  16.   with DataModule1 do
  17.   begin
  18.     terminarTransaccion;
  19.     try
  20.       transaccion.StartTransaction;
  21.       case rgTipoSumario.ItemIndex of
  22.         0:
  23.         begin
  24.           estado:='';
  25.           condicion_sumario:='TODOS';
  26.         end;
  27.         1:
  28.         begin
  29.           estado:='';
  30.           condicion_sumario:='DEL_DIA';
  31.         end;
  32.         2:
  33.         begin
  34.           estado:='';
  35.           condicion_sumario:='ARRASTRE';
  36.         end;
  37.       end;
  38.       consultaSumario(gCodigo_Sucursal, fecha, qSumarios, estado, condicion_sumario);
  39.     //Aquí uso las funciones
  40.       limpiarGrilla(gSumarios);
  41.       cargarTStringGrid(gSumarios, qSumarios);
  42.       transaccion.Commit;
  43.       gSumarios.SetFocus;
  44.     except
  45.       on e:Exception do
  46.       begin
  47.         terminarTransaccion;
  48.         mErrores(e, 'La consulta no pudo realizarse', lblTituloGestionSumario.Caption);
  49.       end;
  50.     end;
  51.   end;
  52. end;
  53.  
  54. procedure TfrmFacturacionCaja.btnEliminarDetalleClick(Sender: TObject);
  55. var
  56.   total:double;
  57. begin
  58. //Si no está vacía la grilla y no seleccionó la última fila
  59.   if (gDetalleFactura.RowCount > 2)
  60.     and (gDetalleFactura.Row < gDetalleFactura.RowCount - 1) then
  61.   begin
  62. //eliminamos la fila seleccionada
  63.     EliminarFilaGrilla(gDetalleFactura);
  64.  
  65.   //Actualizamos el Total
  66.     total:=sumarColumnaGrilla(gDetalleFactura,3);
  67.     txtTotalNumeros.Text:=floatToStrF(total,ffFixed,10,2);
  68.   end; // del if
  69. end;



Sabrán disculpar algunas cosas... pero lo hice hace mucho y no he revisado la "ortografía" desde entonces.
Con esto, puedo poner en la grilla los resultados de consultas.
Un detalle, los campos que trae la consulta deben ser iguales a la cantidad de columnas de la grilla... tengo la solución para ello pero ahora no lo encuentro (había hecho unos procesos que recibían la cantidad de campos que uno quisiera y los ponían en las columnas que uno deseara)

Si sirven estas cosas, me avisan que busco las otras funciones.

Saludos.

  • 0




IP.Board spam blocked by CleanTalk.