Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Llenar Edits desde un DBGrid con campos de una DB (https://www.clubdelphi.com/foros/showthread.php?t=42523)

BlackDaemon 16-04-2007 22:06:43

Llenar Edits desde un DBGrid con campos de una DB
 
Bueno pues lo que quiero hacer es eso, al darle doble clic a un DBGrid que me llenen los datos de los campos a unos Edits que tengo en el mismo form,
hacerlo con una sola tabla es fácil, pero como lo haría desde 2 tablas ??
Por ej primero realizar una búsqueda con %LIKE% en las DOS y llenar los resultados en un SOLO DBGrid, eso último creo que se puede jugando con la propiedad Gridcolumns del DBGrid pero la anterior pregunta no la se hacer, osea por ej buscar en una tabla por código, obteniendo los resultados mostrar solo el código en el DBGrid, ahora sacar el ID de ese código y con ese ID buscar en la otra tabla y sacar TODOS los demás campos y llenar el MISMO DBGrid, una ves echo esto al darle cilc a una celda del DBGrid que se me llenen los Edits que tengo en ese Form, pero esos Edits llaman datos de las 2 tablas, por ej el dódigo está en una tabla, y las descripciones en otra, eso no lo se hacer, me he complicado mucho trabajando con 2 tablas, no se por que, pero lo he echo :o

Ahora bién aquí les pongo el código con el cual se llenan los Edits al darle doble clic en una celda del DBGrid, NO es lo que necesito, pero a alguien siempre le servirá.

Todo esto lo ponen en el evento DobleClick del DBGrid

Código Delphi [-]
procedure TForm1.DBGrid1DblClick(Sender: TObject);
begin
if (ZQBusqueda.RecordCount > 0) then
  begin
  ECodigo.Text := ZQBusqueda.FieldbyName('codigo').AsString;
  ECantidad1.Text := ZQBusqueda.FieldByName('listaprecio').AsString;
 //Aquí ponen los demas Edits, ComboBox, DateTimerPicker, etc
 //Pero esto solo funciona cuando tu DBGrid esta conectado
 // a una sola tabla a través de su respectivo DataSource
  end
else begin
   //Mostramos un mensaje cuando no tenemos ningún dato en el DBGrid
  showmessage('No hay registros...');
end;
end;

Espero que a alguien le sirva, luego pondré "todas"m mis pequeñas aplicaciones que he ido haciendo a lo largo de aprender delphi

Bueno, quisiera poder hacer eso pero desde 2 tablas, espero que me puedan guiar un poco, como verán en un tema mas abajo de este, he luchado mucho con las 2 tablas, obteniendo malos resultados xD

saludos

Caral 16-04-2007 22:29:11

Hola BlackDaemon
Para mi todo radica en la sentencia sql que hagas.
Una sentencia sql puede leer una o muchas tablas y extraer los datos que te convengan para luego filtrarlos, creo que deberias practicar un poco con esto de sql.
No le tengas miedo a usar varias tablas y mezclar la informacion, es mas siempre es lo mas conveniente.
Saludos

ContraVeneno 17-04-2007 01:12:16

Una sentencia SQL correcta, con unos DBEdits bien enlazados, te evitan el tener que codificar el llenado de datos.

BlackDaemon 17-04-2007 03:15:24

Cita:

Empezado por ContraVeneno
Una sentencia SQL correcta, con unos DBEdits bien enlazados, te evitan el tener que codificar el llenado de datos.

Hola, me podrías poner un poco de código ??
Hablo de la sentencia correcta, por eso pregunté, por que no se como hacerlo, osea, como recién estoy trabajando con delphi se me complica mucho las cosas, pero al ver códigos o ejemplos me doy cuenta que todo lo que he preguntado es bién fácil, y para la próxima pues ya se como enfrentar el problema :D

saludos y gracias por las respuestas.

Caral 17-04-2007 04:44:29

Hola
Para hacer una consulta sql, por supuesto hay que saber por lo menos lo basico de esto, por ejemplo, una consulta de dos tablas, con dos datetimepicker y un edit.
Para la consulta de empleados:
Código Delphi [-]
ADOQuery1.SQL.Add('SELECT Empleados.CodEmpleado , Empleados.Nombre, Empleados.SxH, PagoPlan.CodEmpleado , PagoPlan.FechaPL, PagoPlan.HrsLab, PagoPlan.MontBrut, PagoPlan.Exts, PagoPlan.Otrs, PagoPlan.Totl, PagoPlan.CCSS, PagoPlan.TotPag ');
ADOQuery1.SQL.Add('FROM PagoPlan INNER JOIN Empleados ON PagoPlan.CodEmpleado = Empleados.CodEmpleado ');
ADOQuery1.SQL.Add('WHERE PagoPlan.FechaPL >= # '+DateToStr(DTP1.Date)+ '# AND PagoPlan.FechaPL <= # '+DateToStr(DTP2.Date)+'#');
ADOQuery1.SQL.Add('AND Empleados.CodEmpleado = ' +Edit1.Text+ '');
Como veras estan las tablas empleados y pagoplan
Se indica que filtre entre dos fechas y el codigo de empleado
Si te fijas bien se saca la fecha de pagoplan y el codigo de empleados
Es en realidad una consulta sencilla y lo mas basico, pero creo que te puede dar una idea.
Al incluir este codigo en un query es como si estuvieses viendo una sola tabla, es cuestion de un poco de practica.
Otra cosa, no confundas Delphi con sql, son cosas diferentes.
Saludos
Saludos

BlackDaemon 17-04-2007 09:14:13

Bueno, como dije, con algunos ejemplos se me aclara todo :)
he podído hacer várias querys con _Casi_ los mismos resultados
he estado probando en esta estructura simple de base de datos en MySQL

Código SQL [-]
CREATE TABLE `categorias` (
  `id_categoria` int(11) NOT NULL auto_increment,
  `Categoria` varchar(15) NOT NULL,
  PRIMARY KEY  (`id_categoria`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

-- 
-- Volcar la base de datos para la tabla `categorias`
-- 

INSERT INTO `categorias` VALUES (1, 'Tramontina');
INSERT INTO `categorias` VALUES (2, 'Tablas');

-- --------------------------------------------------------

-- 
-- Estructura de tabla para la tabla `productos`
-- 

CREATE TABLE `productos` (
  `id_producto` int(11) NOT NULL auto_increment,
  `descripcion` varchar(30) default NULL,
  `Categoria` varchar(15) NOT NULL,
  PRIMARY KEY  (`id_producto`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=27 ;

-- 
-- Volcar la base de datos para la tabla `productos`
-- 

INSERT INTO `productos` VALUES (24, 'Juego de Cuchillos de mesa', 'Tramontina');
INSERT INTO `productos` VALUES (26, 'Llaves tubo de 30 piezas', 'Tramontina');

-- --------------------------------------------------------

-- 
-- Estructura de tabla para la tabla `tarifas`
-- 

CREATE TABLE `tarifas` (
  `id_tarifas` int(11) NOT NULL auto_increment,
  `id_producto` int(11) NOT NULL,
  `codigo` int(11) default NULL,
  `ListaPrecio` varchar(10) NOT NULL,
  `Precio` int(11) NOT NULL,
  PRIMARY KEY  (`id_tarifas`),
  KEY `id_producto` (`id_producto`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=18 ;

-- 
-- Volcar la base de datos para la tabla `tarifas`
-- 

INSERT INTO `tarifas` VALUES (9, 24, 2147483647, 'precio1', 23);
INSERT INTO `tarifas` VALUES (10, 24, 2147483647, 'precio2', 43);
INSERT INTO `tarifas` VALUES (11, 24, 2147483647, 'precio3', 564);
INSERT INTO `tarifas` VALUES (15, 26, 34653, 'precio1', 56);
INSERT INTO `tarifas` VALUES (16, 26, 34653, 'precio2', 78);
INSERT INTO `tarifas` VALUES (17, 26, 34653, 'precio3', 90);

-- 
-- Filtros para las tablas descargadas (dump)
-- 

-- 
-- Filtros para la tabla `tarifas`
-- 
ALTER TABLE `tarifas`
  ADD CONSTRAINT `tarifas_ibfk_1` FOREIGN KEY (`id_producto`) REFERENCES `productos` (`id_producto`) ON DELETE CASCADE ON UPDATE CASCADE;

Ahora puse un Query unido a un DataSource y un DBGrid donde estarán los datos de los campos de las 2 tablas.
Primero intenté con esta query que me dió malos resultados.
Código SQL [-]
SELECT prod.*, tari.*
FROM productos AS prod JOIN tarifas AS tari
ON prod.id_producto = tari.id_producto

Bueno como mi intención solo es mostrar el código de la tabla TARIFAS y la descripción de la _otra_ tabla PRODUCTOS en el DBGrid, para que una ves ahí puedan darle doble clic y llenar todos los demás datos en los DBEdits o Edits, perooo hay un problema, que el anterior query muestra TODOS los códigos, ya que se repiten en la tabla tarifas
Me listaba algo así, ( siguiendo la estructura de la anterior base de datos )

Este era el resultado en el DBGrid una vés modificado la propiedad GridColumns y solo poner 2, una con el código y otra con la descripción

Código:

codigo            descripcion
2147483647    Juego de Cuchillos de mesa
2147483647    Juego de Cuchillos de mesa
2147483647    Juego de Cuchillos de mesa
34653            Llaves tubo de 30 piezas
34653            Llaves tubo de 30 piezas
34653            Llaves tubo de 30 piezas


bueno eso es el resultado del anterior query, claro que imagínense que tenemos 10 000 productos con sus 3 precios serían 30 000 registros que mostraríamos en el DBGrid pero para eso está la búsqueda con %LIKE% donde filtraremos por código, pero igual, por ej si la búqueda te arroja 10 códigos que coincidan con la búsqueda en total serían 30 los resultados en el DBGrid, y son inecesários los otros 2, y eso que es con este ejemplo que solo se manejan 3 listas de prcios, ahora tenía que buscar una forma de filtrar a que me muestre los resultados uno de cada uno.

Pues aquí está una forma

Código SQL [-]
SELECT DISTINCT  prod.id_producto, prod.descripcion, tari.codigo
FROM productos AS prod JOIN tarifas AS tari
ON prod.id_producto = tari.id_producto

bueno con eso tenía un resultado favorable que era lo que buscaba
como esto
Código:

2147483647    Juego de Cuchillos de mesa
34653            Llaves tubo de 30 piezas

Perfecto, pero ahora esos serían los datos que me mostraría en el DBGrid y el query solo tendría esos campos en memória ( según lo que se )
Pero que pasaba si quería obtener el el precio1 ? o el precio2 ? bueno, ( según lo que se ) el query con el que habría echo la búsqueda no los tendría en memória y no me serviría, al menos que haya realizado una búsqueda interna con todos los campos, como el primer query, pero ya seria otra petición al servidor pudiendo evitarlo ( no se, son mis manias mias de querer hacer con un query todo el trabajo xD )
Pues pensé y como solo muestro esos datos en el DBGrid y nada mas, podía llamar a todos los campos pero NO visualizarlos y filtrarlos con en único campo que los diferéncian en la tabla TARIFAS que sería el campo ListaPrecio entonces lo que hise fué esta otra query

Código SQL [-]
SELECT prod.*, tari.*
FROM productos AS prod JOIN tarifas AS tari
ON prod.id_producto = tari.id_producto
WHERE tari.listaprecio = 'precio1'

donde me da los mismos resultados que el anterior

Código:

2147483647    Juego de Cuchillos de mesa
 34653            Llaves tubo de 30 piezas

peroooooo con la diferéncia que tengo TODOS los demas valores de las tablas en memória y podría fácilmente llamar a uno con FieldByName('campo') esto lo usaré al darle doble clic en el DBGrid
entonces "pienso" que me quedaría como esto.

Primero modificar un poco el query anterior para aceptar una busqueda por código con un WHERE LIKE

Código Delphi [-]
procedure TForm1.DBGrid1DblClick(Sender: TObject);
begin
if (ZQBusqueda.RecordCount > 0) then
  begin
  ECodigo.Text := ZQBusqueda.FieldbyName('codigo').AsString;
  ECantidad1.Text := ZQBusqueda.FieldByName('listaprecio').AsString;
 //Aquí ponen los demas Edits, ComboBox, DateTimerPicker, etc
 //Pero esto solo funciona cuando tu DBGrid esta conectado
 // a una sola tabla a través de su respectivo DataSource
  end
else begin
   //Mostramos un mensaje cuando no tenemos ningún dato en el DBGrid
  showmessage('No hay registros...');
end;
end;

bueno no lo he probado esto último, solo puse por que creo que devería darme resultados satisfactorios, pero lo demás ya esta bién y gracias Caral por la idea

saludos

PD no se por que, pero me dan ganas de pegar código, pienso que a álguien mas le servirá algún día xDD :D
PD2 mañana posteo el resultado final. o las dudas que se me presenten


La franja horaria es GMT +2. Ahora son las 08:47:35.

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