PDA

Ver la Versión Completa : Pasar datos de un Table a un GRID


Lenny
12-01-2012, 16:44:11
Estimados, de antemano espero que tuvieran muy felices fiestas en familia y con amigos, y, nuevamente los molesto...

Tengo una base de datos de correos y usuarios (internos de una empresa, no spam) los cuales podrian ir cambiando segun el ingreso/egreso de personal, cambios de areas, etc... el problema, es que necesito cargar todos los datos a un GRID ¿Por? mi idea es tener 2 grid, en uno la lista completa de usuarios/mails para al hacer doble click en uno de estos se pase al segundo grid y trabajar con la lista de mail's/usuarios previamente cargados, por que no DBGrid? por que esta en linea en varios equipos, y si elijo o hago algun cambio en la lista de correos/usuarios quien ejecute el programa despues vera estos cambios... por lo mismo necesito sea local y cuando quiera nuevamente hacer la seleccion la lista se cargue de nuevo porsi ocurrieron cambios en ese rato... se entiende???

Lo de pasar la info entre Grid's lo tengo claro, solo necesito saber como pasar los datos de la Base de Datos al Grid independiente de los cambios en la base de datos, de antemano muchas gracias...

PD: Utilizo Delpho 2010, MySQL, Zeos...

Neftali [Germán.Estévez]
12-01-2012, 17:08:54
...solo necesito saber como pasar los datos de la Base de Datos al Grid independiente de los cambios en la base de datos, de antemano muchas gracias...

No se si te he entendido bien.

Quieres pasar los datos de una tabla de la Base de Datos a un "Grid independiente". Lo que no tengo claro es lo del grid independiente.
¿Te refieres a un TStringGrid, por ejemplo o a un DBGrid que no esté conectado con esa tabla?
Tampoco tengo claro qué vas a hacer luego con los datos que pases a ese segundo Grid.

Intenta aclarar eso y tal vez podamos ser un poco más concretos.

Para un TStringGrid, debería bastar con un recorido por la tabla tipo:


i := 0;
table1.First;
while (not (Tabla1.eof)) do begin

StringGrid1.cell[1,i] : tabla1.FieldByName('codigo').AsString;
StringGrid1.cell[2,i] : tabla1.FieldByName('Name').AsString;
...


table1.Next;
i := i + 1;
end;


Para el segundo caso, creo que lo mejor es utilizar un TClientDataSet con la misma estructura del primero, pero como te he dicho, antes de continuar, a ver si puedes aclarar los temas que antes te he comentado..

Lenny
12-01-2012, 19:37:25
Muchas gracias estimado, te explico mejor:

Tengo una base de datos, de los cuales existe una lista de usuarios y mails. Estos dependiendo de la necesidad se utilizan, en este caso para informar a los usuarios de X situacion, por lo cual quien envia este mail deve seleccionar de toda la lista a quienes es envia el mail.
Como comentaba antes, podria hacerlo desde un DBGrid, pero segun la idea que tengo no serviria, ya que entorpeseria a otro usuario si quiere enviar mails, que necesito???

2 Grids, uno con todos los mails cargados desde la base de datos, y el otro en blanco, para cuando haga doble click en el primero se borre y cargue en el segundo, con esto al terminar solo saque los mails del grid 2, y al cerrar/abrir borrar ambos grid y vovler a cargar los datos, se entiende??? Todo menos lo de cargar los datos al grid lo tengo mas menos claro, solo falta eso.

Eso estimado, prove tu codigo y quedo asi:

var
i : Integer;
begin
i := 0;
BDatos.Usuarios_T.First;
while (not (BDatos.Usuarios_T.eof)) do
begin
StringGrid1.Cells [1,i] := BDatos.Usuarios_T.FieldByName('NOMBRE').AsString;
StringGrid1.cells[2,i] := BDatos.Usuarios_T.FieldByName('CORREO').AsString;
BDatos.Usuarios_T.Next;
i := i + 1;
end;
end;

Funciona de perlas, pero necesito agrege mas lineas en caso de ser mas usuarios, te pasaste, te agradesco nuevamente...

kapcomx
12-01-2012, 20:53:07
Lenny, tengo un ejemplo que pasa el resultado de una consulta a un stringgrid, espero te sirva

este ejemplo toma los datos de una consulta (queryex2) y los pasa a un string grid.

se me ocurre que al momento de darle doble clic al registro en tu primer grid generes una consulta con la clave de ese registro y posteriormente llenes la segunda grid con los datos que te resulten de esa consulta.



procedure TFORMCAJACHICA.CONSTRUYECREDITOClick(Sender: TObject);

var
i,x:Integer; //x para controlar el numero de fila i ciclo for
r: real;

begin

// con esto limpia el stringgrid

for I := 1 to StringGrid1.RowCount - 1 do
StringGrid1.Rows[i].Clear;



stringgrid1.Rowcount:=(queryex2.recordcount + 5); //defino el numero de filas del stringgrid en base al numero de registros y le agrego 5 mas
stringgrid1.ColCount:=12; //defino las columnas

with StringGrid1 do
begin
// defino el Título de las columnas en base a los de los campos de la consulta
Cells[0, 0] := '';
Cells[1, 0] := 'FOLIO';
Cells[2, 0] := 'FECHA';
Cells[3, 0] := 'CHOFER';
Cells[4, 0] := 'GRUA';
Cells[5, 0] := 'CLIENTE';
Cells[6, 0] := 'SERVICIO';
Cells[7, 0] := 'SUBTOTAL';
Cells[8, 0] := 'I.V.A.';
Cells[9, 0] := 'RET.';
Cells[10, 0] := 'TOTAL';
Cells[11, 0] := 'FACTURA';

end;
//persoonalizo el ancho de las columnas

stringgrid1.ColWidths[0]:=25;
stringgrid1.ColWidths[1]:=70;
stringgrid1.ColWidths[2]:=80;
stringgrid1.ColWidths[3]:=70;
stringgrid1.ColWidths[4]:=60;
stringgrid1.ColWidths[5]:=280;
stringgrid1.ColWidths[6]:=105;
stringgrid1.ColWidths[7]:=70;
stringgrid1.ColWidths[8]:=70;
stringgrid1.ColWidths[9]:=70;
stringgrid1.ColWidths[10]:=70;
stringgrid1.ColWidths[11]:=70;

x:=1;

queryEX2.first;
while not (queryEX2.eof) do
begin
with StringGrid1 do
begin

Cells[0, x] := '';
if QUERYEX2.fieldvalues['folio']=null then
Cells[1, x] := ''
else
Cells[1, x] :=QUERYEX2.fieldvalues['folio'];

if (QUERYEX2.FieldValues['FECHA'] <> null) then
begin
Present:= QUERYEX2.FieldValues['FECHA'];
DecodeDate(Present, Year, Month, Day);
case month of
1: mes := 'Ene';
2: mes := 'Feb';
3: mes := 'Mar';
4: mes := 'Abr';
5: mes := 'May';
6: mes := 'Jun';
7: mes := 'Jul';
8: mes := 'Ago';
9: mes := 'Sep';
10: mes := 'Oct';
11: mes := 'Nov';
12: mes := 'Dic';
end;

Cells[2, x] := IntToStr(Day) + '-' + mes + '-' + IntToStr(Year);
end;
if QUERYEX2.fieldvalues['cHOFER']=null then
Cells[3, x] := ''
else
Cells[3, x] :=(QUERYEX2.fieldvalues['CHOFER']);
if QUERYEX2.fieldvalues['GRUA']=null then
Cells[4, x] := ''
else
Cells[4, x] :=(QUERYEX2.fieldvalues['GRUA']);
if QUERYEX2.fieldvalues['ASEG']=null then
Cells[5, x] := ''
else
Cells[5, x] :=(QUERYEX2.fieldvalues['ASEG']);
if QUERYEX2.fieldvalues['TIPO2']=null then
Cells[6, x] := ''
else
Cells[6, x] :=(QUERYEX2.fieldvalues['TIPO2']);

if ((QUERYEX2.fieldvalues[sub]=null) OR (QUERYEX2.fieldvalues[sub]=0))then
Cells[7, x] := ''
else
begin
r:= queryex2.fieldvalues[sub];
Cells[7, x] :=Format('%0:2f',[r]);
end;
if ((QUERYEX2.fieldvalues['IVA']=null) OR (QUERYEX2.fieldvalues['IVA']=0))then
Cells[8, x] := ''
else
begin
r:= queryex2.fieldvalues['IVA'];
Cells[8, x] :=Format('%0:2f',[r]);
end;
if ((QUERYEX2.fieldvalues['IMPRET']=null) OR (QUERYEX2.fieldvalues['IMPRET']=0))then
Cells[9, x] := ''
else
begin
r:= queryex2.fieldvalues['IMPRET'];
Cells[9, x] :=Format('%0:2f',[r]);
end;
if ((QUERYEX2.fieldvalues['IMPNETO']=null) OR (QUERYEX2.fieldvalues['IMPNETO']=0))then
Cells[10, x] := ''
else
begin
r:= queryex2.fieldvalues['IMPNETO'];
Cells[10, x] :=Format('%0:2f',[r]);
end;

if QUERYEX2.fieldvalues['fac']=null then
Cells[11, x] := ''
else
Cells[11, x] :=(QUERYEX2.fieldvalues['fac']);

Inc(x);
end;
queryEX2.Next;
end;
StringGrid1.Row:=X;


end;


este ejemplo lo tengo en delphi 7. componentes zeos Mysql 5.0
cualquier cosa que no entiendas me avisas. :cool:

Neftali [Germán.Estévez]
13-01-2012, 13:11:27
Eso estimado, prove tu codigo y quedo asi:


var
i : Integer;
begin
i := 0;
BDatos.Usuarios_T.First;
while (not (BDatos.Usuarios_T.eof)) do begin
StringGrid1.Cells [1,i] := BDatos.Usuarios_T.FieldByName('NOMBRE').AsString;
StringGrid1.cells[2,i] := BDatos.Usuarios_T.FieldByName('CORREO').AsString;
BDatos.Usuarios_T.Next;
i := i + 1;
end;
end;

Funciona de perlas, pero necesito agrege mas lineas en caso de ser mas usuarios, te pasaste, te agradesco nuevamente...

Esto último no lo entiendo....
Con este código rellenas tantas líneas del StringGrid como registros en la tabla.
Lo que no entiendo es qué quieres decir con "...necesito agrege mas lineas en caso de ser mas usuarios". Esto no me ha quedado claro.