Ver Mensaje Individual
  #6  
Antiguo 17-04-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Reputación: 18
BlackDaemon Va por buen camino
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
PD2 mañana posteo el resultado final. o las dudas que se me presenten
Responder Con Cita