Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   guardar datos de una fila seleccionada de un dbrig en variables (https://www.clubdelphi.com/foros/showthread.php?t=61650)

deprimera 15-11-2008 22:23:35

guardar datos de una fila seleccionada de un dbrig en variables
 
hola

toy con un problemita en delphi..queria ver si tenian idea de como solucionarlo

tengo un dbgrid con la propiedad options: rowselect en true para que me pueda mostrar toda la fila seleccionada. Lo que yo kiero hacer es q cuando selecciono una fila m guarde los datos en variables.
Tengo las columnas Código, Servicio y Precio y las keria guardar en las variables cod, desc y precio y tengo un boton agregar para q cuando selecccione la fila lo apreto y ahi m guarde las variables. Puse esto pero no anda:

procedure Tcodigo.BitBtn1Click(Sender: TObject);
begin
if DBGrid1.SelectedRows.Count>0 then
with DBGrid1.DataSource.DataSet do
for i:=DBGrid1.SelectedRows.Count-1 downto 0 do
begin
GotoBookmark(pointer(DBGrid1.SelectedRows.Items[i]));
cod:=adotable1.fieldbyname('Código').AsInteger;
desc:=adotable1.fieldbyname('Servicio').AsString;
end;

edit1.Text:=inttostr(cod);
edit2.Text:=desc;
end;

si tienen idea de como solucionarlo, avisenme.

Saludos

Caral 15-11-2008 22:52:28

Hola
Pregunto:
Donde declaras las variables??.
Código Delphi [-]
procedure Tcodigo.BitBtn1Click(Sender: TObject);
var
cod: Integer;
desc: String;
begin
if DBGrid1.SelectedRows.Count>0 then
with DBGrid1.DataSource.DataSet do
for i:=DBGrid1.SelectedRows.Count-1 downto 0 do
begin
GotoBookmark(pointer(DBGrid1.SelectedRows.Items[i]));
cod:=adotable1.fieldbyname('Código').AsInteger;
desc:=adotable1.fieldbyname('Servicio').AsString;
end;

edit1.Text:=inttostr(cod);
edit2.Text:=desc;
end;
Saludos

deprimera 15-11-2008 23:02:52

gracias x tu rapida respuesta...yo las tengo declaradas en las variables globales y no hace nada...si las pongo dentro del procedimiento como m dijist m tira en el edit1 un número (4434496) q no es el código y en el edit2 no pone nada

Caral 15-11-2008 23:11:19

Hola
Bueno, y asi:
Código Delphi [-]
procedure Tcodigo.BitBtn1Click(Sender: TObject);
var
cod: Integer;
desc: String;
begin
cod:=  adotable1.fieldbyname('Código').Value;
desc:= adotable1.fieldbyname('Servicio').Value;
edit1.Text:=inttostr(cod);
edit2.Text:= desc;
end;
Si las variables son globales, se salen del procedimiento y podrian contener cualquier otro valor inicial.
Saludos

deprimera 15-11-2008 23:21:34

gracias por lo q m pasast FUNCIONO BIEN!!!
pero ahora tengo otra duda...si pongo otro dbgrid2 y necesito hacer lo mismo pero hay un campo q se llama distinto...en vez d servicios es descripción...tendria q chekear q dbrgid es el q esta seleccionado no? m podrias pasar ese codigo? t mando la foto para q veas el diseño

Caral 15-11-2008 23:26:35

Hola
No se si entiendo bien, pero me da la impresion de que vas a poner dos dbgrid enlazados al mismo table.
Si es asi, no tendras que hacer nada simplemente pones la nueva variable con el nuevo campo.
Recuerda que todo esta en el adotable, NO en el dbgrid.
Saludos

Caro 15-11-2008 23:27:18

Hola, debes hacerlo como lo ultimo que te indica Caral, aunque no tenga el foco tu DBGrid siempre va a estar en el primer registro, SelectedRow se utilza cuando tu propiedad MultiSelect esta en True para ver cuales de tus filas estan marcadas.

Saluditos

deprimera 15-11-2008 23:30:18

1 Archivos Adjunto(s)
aca t mando el archivo adjunto

pienso q tengo q agregar este codigo y chekear q dbgrid esta seleccionado:

procedure Tcodigo.BitBtn1Click(Sender: TObject);
var
cod: Integer;
desc: String;
begin
cod:= adotable1.fieldbyname('Código').Value;
desc:= adotable1.fieldbyname('Servicio').Value;

cod:= adotable2.fieldbyname('Código').Value;
desc:= adotable2.fieldbyname('Descripción').Value;


edit1.Text:=inttostr(cod);
edit2.Text:= desc;
end;

Caral 15-11-2008 23:33:03

Hola
Para mi esto es un masterdetail, creo que nos falta informacion de tu parte
Saludos

Caral 15-11-2008 23:37:51

Hola
Que base de datos usas?.
Que tan grande es el programa?.
Esto te lo digo para saber si lo envías en un zip, tal vez me guío mas.
Saludos

deprimera 15-11-2008 23:40:05

tengo 2 tablas distintas una d productos y otra d servicios...necesito guardar en las variables cod y desc lo seleccionado por el usuario para luego pasarlo a una factura...toy haciendo un software de una pelukeria para un final d la facultad...q otros datos necesitas?

Caro 15-11-2008 23:40:37

Cita:

Empezado por deprimera (Mensaje 326375)
gracias por lo q m pasast FUNCIONO BIEN!!!
pero ahora tengo otra duda...si pongo otro dbgrid2 y necesito hacer lo mismo pero hay un campo q se llama distinto...en vez d servicios es descripción...tendria q chekear q dbrgid es el q esta seleccionado no? m podrias pasar ese codigo? t mando la foto para q veas el diseño

No necesitas chekear, ambos dbGrids estan enlazados a dos diferentes DataSet(tus AdoQuerys), por lo tanto estaran apuntando a un registro, al principio al peimero hasta que tu lo cambies, solo tienes que obtener los valores del registro donde se encuentra en ese momento.

Código Delphi [-]
cod:= adotable1.fieldbyname('Código').AsInteger;
desc:= adotable1.fieldbyname('Servicio').AsString;
 
codDelOtro := adotable2.fieldbyname('Código').Value;
descDelOtro := adotable2.fieldbyname('Descripcion').AsString;

Saluditos

deprimera 15-11-2008 23:43:02

la base de datos la hice en access y el programa zipeado con la base de datos pesa 1.93 mb.. como t lo puedo enviar?

coso 15-11-2008 23:43:41

hola, puedes usar directamente el dataset de cada dbgrid

Código Delphi [-]

cod1 := DBGrid1.DataSource.Dataset.FieldByName('cod').Asinteger;
cod2 := DBGrid2.DataSource.DataSet.FieldByName('cod').Asinteger;

Caro 15-11-2008 23:46:11

Parece que no me estan leyendo :(, ni modo.

Saluditos

deprimera 15-11-2008 23:51:29

caro gracias por tus respuestas lo q m pasast funciona bien...pero lo q yo kiero es guardar los datos en cod y desc ya sea si se esta pulsando el dbgrid1 o el dbgrid2 no kiero hacer otras variables para desp pasarlo a una factura

Caral 15-11-2008 23:51:32

Hola
Caro, yo si te leo, como no hacerlo.
Saludos

coso 15-11-2008 23:52:33

Yo es que no entiendo bien bien que es lo que quiere hacer...

para coger los valores de cada campo (por cierto, código no es un nombre de campo correcto) puedes o bien, sabiendo a que dataset esta relacionado

Código Delphi [-]

cod := AdoQuery1.FieldByName('codigo').Asinteger;

o bien desde el dataset del dbgrid (que es el mismo solo que accedido de manera mas relativa)

Código Delphi [-]

cod := DBGrid1.DataSource.DataSet.FieldByName('codigo').Asinteger;

no sobreescribas variables, pues no tienes sentido :confused:
Cita:

procedure Tcodigo.BitBtn1Click(Sender: TObject);
var
cod: Integer;
desc: String;
begin
cod:= adotable1.fieldbyname('Código').Value;
desc:= adotable1.fieldbyname('Servicio').Value; // con lo de despues...esto para que sirve?

cod:= adotable2.fieldbyname('Código').Value;
desc:= adotable2.fieldbyname('Descripción').Value;


edit1.Text:=inttostr(cod);
edit2.Text:= desc;
end;
y si nos explicas un poco mejor que es lo que quieres hacer...

Caral 15-11-2008 23:59:15

Hola
Vamos a ver si entiendo.
Tienes dos dbgrid
Estos, estan enlazados a dos adotables independientes
Quieres que cuando se presione en alguno de los dos dbgrid este dato se pase a los edits, independientemente de cual dbgrid o table sea.
Es asi?.
Saludos

coso 15-11-2008 23:59:38

si lo que quieres es coger cod, descr (que existen tanto en productos como servicios) entonces si, tendras que averiguar que dbgrid es la seleccionada (aunque si lo miras bien, puedes usar una unica tabla productos+servicios y en ella que este incluidos todos los trabajos/ventas). Puedes usar DBGrid.Focused, por ejemplo:

Código Delphi [-]

if DBGrid1.Focused then 
begin     
    cod := DBGrid1.DataSource.DataSet.FieldByName('cod').Asinteger;
...
end
else
if DBGrid2.Focused then 
begin
    cod := DBGrid2.DataSource.DataSet.FieldByName('cod').Asinteger;
...

end;

lo malo es que al clickar el boton, las grids te perderan el foco. Creo que tendrias que ponerlo todo en una unica tabla o bien hacer dos botones de agregar, uno por productos y otro por servicios. saludos.

coso 16-11-2008 00:02:40

O bien usando el dblclick de cada dbgrid...

Código Delphi [-]

procedure TForm1.DBGridDblClick(sender : TObject);
begin
    cod := (sender as TDBGrid).DataSource.DataSet.FieldByName('codigo').Asinteger;
    descr := (sender as TDBGrid).DataSource.DataSet.FieldByName('descr').Asstring;

    insertar_(cod,descr);
end;

poniendo esto en el OnDblClick de las dos dbgrids.

deprimera 16-11-2008 00:04:34

tengo 2 tablas una de Servicios y otra de Productos...
los campos de Servicios son Código, Servicio y Precio
los campos de Productos son Código, Descripción y Precio..echos en access

yo quiero q al seleccionar una fila d cualkier dbgrid (el dbgrid1 asociado a un adotable1 q pertenece a la tabla Servicios y el dbgrid2 asociado a un adotable2 q pertenece a la tabla Productos) m lo guarde en las variables cod y desc para pasarlos a otra pantalla donde se realiza una factura

Caro 16-11-2008 00:08:44

Cita:

Empezado por Caral (Mensaje 326391)
Hola
Caro, yo si te leo, como no hacerlo.
Saludos

Oh, muchas gracias amiguito ;).

Creo que ya te he entendido deprimera, tu quieres obtener los valores del ultimo DBGrid que ha tenido el foco, si es así no se puede directamente, ya que si preguntas por Focused el que va tener el foco es tu boton o si preguntas por ActiveCOntrol lo mismo.

Lo que se me ocurre es que guardes en una variable el ultimo dbGrid en el que s ele ha hecho click, eso lo puedes hacer en el evento OnEnter, pero también debes definirte una variable global.

Código Delphi [-]
 DBGridFoco : TDBGrid; //Nuestra variable global
 
 en el codigo de tu boton
 
 if DBGridFoco = DBGrid1 then
  begin
   cod:= adotable1.fieldbyname('Codigo').AsInteger;
   desc:= adotable1.fieldbyname('Servicio').AsString;
  end;

 if DBGridFoco = DBGrid2 then
  begin
   cod:= adotable2.fieldbyname('Codigo').AsInteger;
   desc:= adotable2.fieldbyname('descripcion').AsString;
  end;
 
//Ahora en el evento OnEnter de cada DBGrid
 
procedure TForm1.DBGrid1Enter(Sender: TObject);
begin
 DBGridFoco := DBGrid1;
end;
procedure TForm1.DBGrid2Enter(Sender: TObject);
begin
 DBGridFoco := DBGrid2;
end;

La variable global puede ser de otro tu tipo, solo te sirve para que identifiques cual ha sido el ultimo que ha tenido el foco.

Saluditos

Caral 16-11-2008 00:12:15

Hola
Perdona pero no termino de entender el concepto, para mi se podría hacer con sql.
Coso va muy bien con la explicación, creo que mejor lo sigues a el.
Saludos

coso 16-11-2008 00:12:19

Entonces, en el evento OnDblClick o bien OnClick, deberas recoger las variables y luego enviarlas.

Código Delphi [-]
procedure TForm1.DBGridOnDblClick(sender : TObject);
var
    cod : integer;
    dsc : string;
    prc : double;
begin
    cod := (sender as TDBGrid).FieldByName('codigo').Asinteger;
    prc := (sender as TDBGrid).FieldByName('precio').Asfloat; 

    if (sender as TDBGrid) = DBGrid1 then // DBGrid1 = la de servicios
    dsc := DBGrid1.DataSource.Dataset.FieldByName('servicio').Asstring
    else 
    if (sender as TDBGrid) = DBGrid2 then // DBGrid2 = la de productos
    dsc := DBGrid2.DataSource.DataSet.FieldByName('descripcion').Asstring;

    Insertar_en_factura(cod,dsc,prc);
end;

coso 16-11-2008 00:14:42

Cita:

Perdona pero no termino de entender el concepto, para mi se podría hacer con sql.
¿como se podria hacer con sql? pura curiosidad

coso 16-11-2008 00:17:06

Cita:

Coso va muy bien con la explicación, creo que mejor lo sigues a el.
jejj pues yo viendo el codigo de caro, creo que mejor, pues asi usas el boton inicial :D y te olvidas de los eventos. saludos.

coso 16-11-2008 00:19:33

Bueno, espero que entre todos te hayamos aclarado algo. saludos.

Caral 16-11-2008 00:23:42

Hola
Cita:

Empezado por coso (Mensaje 326402)
¿como se podria hacer con sql? pura curiosidad

Lo que quieres es ponerme a trabajar un sábado, eres malo como la leche:D:D
Amigo, lo que se me ocurre es que para que usar dos table, que ademas son lentos, cuando se puede usar un solo query, ademas se podria hacer un enlace de las dos tablas y presentar una sola consulta.
Bueno, ya sabes en estas cosas soy muy novato asi que es solo una opinión, los que sabéis sois vosotros, Caro y tu.
Saludos

Caro 16-11-2008 00:25:50

Cita:

Empezado por coso (Mensaje 326404)
Bueno, espero que entre todos te hayamos aclarado algo.

Lo mismo espero yo ;).

Saluditos

coso 16-11-2008 00:26:33

Pues si, podria usarse un join de las dos (siendo el nombre de descripcion = servicio) o bien una unica tabla...

deprimera 16-11-2008 00:28:04

bueno les agradezco mucho a los 3= caral coso y caro por las ayuditas...voy a ver con todo lo q m pasaron como lo puedo solucionarr...besos y gracias nuevamente

Caro 16-11-2008 00:35:23

Holitas, yo creo que no se puede hacer con un join, porque supongo o se vende un sevicio o se vende un producto, nose la verdad no entiendo bien :confused:.

Saluditos

Caral 16-11-2008 00:40:33

Hola
Caro, me parece que se venden los dos, según entendí es una peluquería.
Si le cortas el pelo, tal vez le vendes el champu, negocio redondo.:D:D
Hacemos un Join y si no sirve, le hacemos una oferta, dos por uno :D:D:D
Saludos

deprimera 16-11-2008 00:40:44

caro este codigo es el que funciona como yo queria:)
DBGridFoco : TDBGrid; //Nuestra variable global
en el codigo de tu boton
if DBGridFoco = DBGrid1 then
begin
cod:= adotable1.fieldbyname('Codigo').AsInteger;
desc:= adotable1.fieldbyname('Servicio').AsString;
end;
if DBGridFoco = DBGrid2 then
begin
cod:= adotable2.fieldbyname('Codigo').AsInteger;
desc:= adotable2.fieldbyname('descripcion').AsString;
end;
//Ahora en el evento OnEnter de cada DBGrid
procedure TForm1.DBGrid1Enter(Sender: TObject);
begin
DBGridFoco := DBGrid1;
end;
procedure TForm1.DBGrid2Enter(Sender: TObject);
begin
DBGridFoco := DBGrid2;
end;

espero poder encontrate pronto en el foro pq seguramente tendre mas dudas y necesito terminar el programa para poder recibirme.[/b]muchas graciass

Caro 16-11-2008 00:51:53

Cita:

Empezado por Caral (Mensaje 326413)
Hola
Caro, me parece que se venden los dos, según entendí es una peluquería.
Si le cortas el pelo, tal vez le vendes el champu, negocio redondo.:D:D
Hacemos un Join y si no sirve, le hacemos una oferta, dos por uno :D:D:D
Saludos

Ok ;) :D. Pero si se vendieran ambos, sigo pensando que estan en tablas separadas y despues de escoger recién entraría a la tabla que los relaciona, ahora si se pudiera vender ambos, creo que debería poderse escoger tanto el servicio o servicios y el producto o los productos.

Cita:

Empezado por deprimera (Mensaje 326414)
espero poder encontrate pronto en el foro pq seguramente tendre mas dudas y necesito terminar el programa para poder recibirme.[/b]muchas graciass

No estoy todo el tiempo conectada, si estuviera y se la respuesta te ayudo, sino, no te preocupes encontraras muchos amiguitos caperusos (que saben mucho e inclusive saben muchíiiiiiisimo mas que yo), asi como coso y Caral ;), que te ayudaran.

Saluditos

Caral 16-11-2008 00:52:35

Hola
La verdad me decanto por la opción de coso y dobleclick, sin ofender.
Y sigo insistiendo en usar querys con sql, tarde o temprano tendra problemas con los table.
Solo opino.
Saludos

Caro 16-11-2008 00:59:23

Cita:

Empezado por Caral (Mensaje 326416)
Hola
La verdad me decanto por la opción de coso y dobleclick, sin ofender.
Y sigo insistiendo en usar querys con sql, tarde o temprano tendra problemas con los table.

Yo también estoy de acuerdo que deprimera utilizara Querys, piensalo deprimera con los querys podras hacer muchas mas cosas sin complicarte la vida, tu codigo no va a cambiar mucho. Ahora, supongo que despues tendra que darle la opción de seleccionar varios registros en ese caso yo utilizaría un boton, si es que se va ha dar esa posibilidad con el tiempo.

Saluditos

coso 16-11-2008 01:25:22

...tambien puede usar las dos...boton y ademas, el dblclick.


La franja horaria es GMT +2. Ahora son las 00:33:17.

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