Hola nuevamente!!
¿Cómo podría hacerle para insertar en un StringGrid una consulta de base de datos?
Insertar consulta en TStringgrid
Started by
jramirez
, Jan 21 2014 11:04 AM
4 replies to this topic
#1
Posted 21 January 2014 - 11:04 AM
#2
Posted 21 January 2014 - 11:25 AM
Con mucho trabajo, te lo digo por experiencia propia. Mejor, utiliza un TDbGrid, que para éso sirve...
#3
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
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.
Si lo quieres hacer sobre un TStringGrid debes hacerlo a pie de la siguiente manera
delphi
Var I, W, X : Integer; begin W := Grid1.Canvas.TextWidth('X'); DbConn.Open; Query.Open; //Ajusta Número de Filas y Columnas Grid1.ColCount := Query.Fields.Count; Grid1.RowCount := Query.RecordCount+1; //Agrega los titulos de las columnas Grid1.ColWidths[0] := 5; //La primera columna se deja como indicador For I := 0 to Query.Fields.Count - 1 do Begin //Grid1.Rows[0][I+1] := Query.Fields[I].FieldName; //El que necesites Grid1.Rows[0][I+1] := Query.Fields[I].DisplayLabel; Grid1.ColWidths[I] := Query.Fields[I].DisplayWidth* W; End; Query.First; X := 0; //Primera linea de la grilla While not Query.Eof do Begin Inc(X); For I := 0 to Query.Fields.Count - 1 do Grid1.Cols[I][X] := Query.Fields[I].AsString; Query.Next; 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.
#4
Posted 22 January 2014 - 01:04 PM
Me dio una idea de como hacerlo!!
Muchas Gracias por sus respuestas!!!
Muchas Gracias por sus respuestas!!!
#5
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.
Con esto, hacemos...
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.
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
unit oGrillas type filaGrilla=array of string; //.... procedure AgregarFilaGrilla(grilla:TStringGrid); //agrego una fila a la grilla {cuando se agrega una fila pero antes se eliminaron, en realidad el contenido de las filas no se borra, por eso se pone un clear} begin with grilla do begin //Agrego una linea a la grilla, al ultimo por supuesto RowCount:=RowCount + 1; Rows[RowCount - 1].Clear; //RowHeights[RowCount - 1]:= altura; //16; end; end; procedure limpiarGrilla(grilla:TStringGrid); begin with grilla do begin try RowCount:=2; //pongo dos filas Row:=1; //me posiciono en la fila 1 Rows[1].Clear; //borro el contenido de la fila 1 except on E:Exception do begin ShowException(E,E); //raise; end; end; //del try end; end; procedure EliminarFilaGrilla(grilla:TStringGrid); //elimina una fila de la grilla, la seleccionada var i:integer; j:integer; begin with grilla do begin //si la grilla tiene mas de dos filas y la fila seleccionada no es la ultima, elimino fila if (RowCount > 2) and (Row <> (RowCount - 1)) then begin for i := Row to (RowCount + 1) do for j:= 0 to (colCount - 1) do Rows[i][j]:=Rows[i + 1][j]; RowCount:= RowCount - 1; //quito la ultima fila end; //del if (RowCount... end; //del with end; function sacarDatosGrilla(grilla:TStringGrid):filaGrilla; //recupera los datos de la fila seleccionada de la grilla var //mAux:filaGrilla; fila:filaGrilla; //array of string; j:integer; begin SetLength(fila,1); //tiene una componente al principio with grilla do begin //si la grilla tiene mas de dos filas y la fila seleccionada no es la ultima, recupero datos if (RowCount > 2) and (Row <> (RowCount - 1)) then for j:=0 to (colCount - 1) do begin setLength(fila,j + 1); fila[j]:=Cells[j,Row]; end; end; //del with result:=fila; //mAux; end; procedure ponerDatosGrilla(var datosFila:filaGrilla;grilla:TStringGrid); overload; //agrega una fila con datos en la grilla var j:integer; begin with grilla do for j:=0 to (colCount - 1) do try Cells[j,(RowCount - 1)]:=datosFila[j]; except end; end; procedure ponerDatosGrilla(var datosFila:filaGrilla;fila:integer; grilla:TStringGrid); overload; //agrega una fila con datos en la grilla, en la posición que se le indica var j:integer; begin with grilla do for j:=0 to (colCount - 1) do try Cells[j, fila]:=datosFila[j]; except end; end; procedure cargarTStringGrid(grilla:TStringGrid;consulta:tmdoQuery); overload; var i, j:integer; begin with consulta, grilla do begin FetchAll; //Para saber la cantidad de registros que trae. //Filas de la Grilla = Cant de Registros + título + fila final RowCount:= RecordCount + 1 + 1; Rows[RowCount - 1].Clear; //Columnas de la Grilla = Cant de Campos ColCount:=FieldCount; //Pongo el puntero del record en el primer lugar First; for i:=1 to (RowCount - 2) do begin //Cargo la fila for j:=0 to (ColCount - 1) do begin Cells[j, i]:=Fields[j].AsString; end; Next; //proximo record end; //del for i:=1 ... end; //del with end; procedure cargarTStringGrid(grilla:TStringGrid;consulta:TIBQuery); overload; var i, j:integer; begin with consulta, grilla do begin FetchAll; //Para saber la cantidad de registros que trae. //Filas de la Grilla = Cant de Registros + título + fila final RowCount:= RecordCount + 1 + 1; Rows[RowCount - 1].Clear; //Columnas de la Grilla = Cant de Campos ColCount:=FieldCount; //Pongo el puntero del record en el primer lugar First; for i:=1 to (RowCount - 2) do begin //Cargo la fila for j:=0 to (ColCount - 1) do begin Cells[j, i]:=Fields[j].AsString; end; Next; //proximo record end; //del for i:=1 ... end; //del with end; procedure titulosGrilla(grilla:tStringGrid;titulos:array of string; anchos:array of integer); var j:integer; begin with grilla do begin ColCount:=high(titulos) + 1; for j:= 0 to (ColCount - 1) do begin cols[j].add(titulos[j]); ColWidths[j]:=anchos[j]; end; end; end;
Con esto, hacemos...
delphi
procedure TfrmGestionSumarios.FormShow(Sender: TObject); begin self.Caption:='Gestión de sumarios - ' + gNombre_Sucursal; //Ponemos los títulos de la grilla en tiempo de ejecución titulosGrilla(gSumarios, ['Sección', 'Título', 'N° O.P.', 'Texto', 'Estado'], [105, 160, 70, 360, 80]); dtFechaSumario.Date:=date; end; procedure TfrmGestionSumarios.btnBuscarClick(Sender: TObject); var fecha:TDate; estado, condicion_sumario:string; begin fecha:=dtFechaSumario.Date; with DataModule1 do begin terminarTransaccion; try transaccion.StartTransaction; case rgTipoSumario.ItemIndex of 0: begin estado:=''; condicion_sumario:='TODOS'; end; 1: begin estado:=''; condicion_sumario:='DEL_DIA'; end; 2: begin estado:=''; condicion_sumario:='ARRASTRE'; end; end; consultaSumario(gCodigo_Sucursal, fecha, qSumarios, estado, condicion_sumario); //Aquí uso las funciones limpiarGrilla(gSumarios); cargarTStringGrid(gSumarios, qSumarios); transaccion.Commit; gSumarios.SetFocus; except on e:Exception do begin terminarTransaccion; mErrores(e, 'La consulta no pudo realizarse', lblTituloGestionSumario.Caption); end; end; end; end; procedure TfrmFacturacionCaja.btnEliminarDetalleClick(Sender: TObject); var total:double; begin //Si no está vacía la grilla y no seleccionó la última fila if (gDetalleFactura.RowCount > 2) and (gDetalleFactura.Row < gDetalleFactura.RowCount - 1) then begin //eliminamos la fila seleccionada EliminarFilaGrilla(gDetalleFactura); //Actualizamos el Total total:=sumarColumnaGrilla(gDetalleFactura,3); txtTotalNumeros.Text:=floatToStrF(total,ffFixed,10,2); end; // del if 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.










