Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Filtrar Tabla con datos de otra Tabla (https://www.clubdelphi.com/foros/showthread.php?t=71954)

Lenny 20-01-2011 18:37:41

Filtrar Tabla con datos de otra Tabla
 
Buenas, tengo una duda enorme.

Tengo dos tablas, TABLA1 contiene componentes de una formula (materias primas) y la TABLA2 tiene todos los componentes (materias primas) para crear los productos correspondientes. Cada vez que elijo un producto me muestra cuales son los componentes necesarios, ¿Como puedo "FILTRAR" la TABLA2 para que solo me muestre los componentes que se ven en la TABLA1??? es necesario sea asi, ya que desde hay necesito generar el descuento de STOCK de los componentes y varios productos comparten las mismas materias primas.

De antemano muchas gracias...

PD: Utilizo Delphi 2010, Zeos 7.0.0, MySQL

Aleca 21-01-2011 15:21:17

:confused: como tenes organizadas las tablas, porque me parece que podrias poner una tercera.

Lenny 21-01-2011 16:19:49

Gestion Tablas
 
Tengo 3 Tablas:

Tabla1: Nombre Producto.
Tabla2: Formula Producto (Materias Primas) con las cantidades necesarias.
Tabla3: Materias Primas (Todas) con el STOCK disponible.

Cuando selecciono un producto (Tabla1) me muestra (Filtra) las materias primas necesarias para crear/fabricar aquel producto (Tabla2), hasta hay todo OK, pero el problema es que necesito que la Tabla3 me muestre solamente los productos que muestra la Tabla2 (que pueden ser uno o varios) para asi generar el descuento del STOCK restando desde la Tabla2 a la Tabla3, como varios productos comparten mismas materias primas deve ser asi... se entiende???.
es lo unico que me falta para poder cerrar esta parte del softy no doy con la solucion aun :(...

Ante cualquier consulta, sugerencia o ayuda estare atento... mil gracias de antemano.

Aleca 21-01-2011 16:32:58

podes recorrer la tabla dos e ir agregandole los productos con la clausala 'or'
Código Delphi [-]
  while not tabla2.Eof do
  begin
    Filtro := Filtro + ' or Producto = ' + tabla2Producto;
    Tabla2.Next
  end;
  tabla3.filter := filtro;
algo asi.Aunque la opcion filter no me gusta mucho, habria que armar un sql.

Lenny 21-01-2011 16:50:18

Uuuuuuu te pasaste!!!! dejame provarlo y te cuento!!!!

lo de SQL seria muy interesante, pero la verdad, no se trabajar con SQL por eso trabajo solo con "CODIGO" como el que me acabas de dar... muchas gracias nuevamente, lo reviso y te cuento!!!

Lenny 21-01-2011 17:03:10

Estimado, no me corre intento ejecutarlo asi:

Código Delphi [-]
procedure TPRODUCCIONBG.Change(Sender: TObject);
begin
  while not BDATOS.TMPRIMASF.Eof do
  begin
    Filtro := Filtro + ' or COD_INTERNO = ' + BDATOS.TMPRIMASF;
    BDATOS.MPRIMASF.Next
  end;
  BDATOS.TMPRIMAS.filter := Filtro;
end;

Me envia dos errores:

Código:

[DCC Error] PRODUCBG.pas(67): E2003 Undeclared identifier: 'Filtro'
Código:

[DCC Error] PRODUCBG.pas(67): E2015 Operator not applicable to this operand type
¿Que estoy haciendo mal?, gracias por la paciencia...

Chris 21-01-2011 17:47:33

Lo que tienes que hacer es crear una relación Maestro=Detalle. Para hacerlo, haz lo siguiente:
1. En la TABLA2 establece la propiedad MasterDataset al TDatasource asociado a TABLA1.
2. Nuevamente en TABLA2, establece la propiedad MasterField a "COD_INTERNO" (sin las comillas). COD_INTERNO me imagino que el el campo que indican la relación que tiene un producto con las materias primas.

Si tienes un problema, no dudes en comentarlo y dar la mayor información posible del problema.

Saludos,
Chris

Aleca 21-01-2011 19:10:22

Cita:

Empezado por Lenny (Mensaje 388252)
Estimado, no me corre intento ejecutarlo asi:


Código Delphi [-]procedure TPRODUCCIONBG.Change(Sender: TObject);
begin
while not BDATOS.TMPRIMASF.Eof do
begin
Filtro := Filtro + ' or COD_INTERNO = ' + BDATOS.TMPRIMASF;
BDATOS.MPRIMASF.Next
end;
BDATOS.TMPRIMAS.filter := Filtro;
end;




Me envia dos errores:

Código:

[DCC Error] PRODUCBG.pas(67): E2003 Undeclared identifier: 'Filtro'
Código:

[DCC Error] PRODUCBG.pas(67): E2015 Operator not applicable to this operand type
¿Que estoy haciendo mal?, gracias por la paciencia...

tenes que declarar Filtro: TString;
Código Delphi [-]
procedure TPRODUCCIONBG.Change(Sender: TObject);
var
  Filtro: String;
begin
  Filtro := '';
  while not BDATOS.TMPRIMASF.Eof do
  begin
       Filtro := Filtro + ' or COD_INTERNO = ' + chr(39) + BDATOS.PRIMASF.FieldByName('NOMBRE_CAMPO').ASstring + chr(39);
     BDATOS.MPRIMASF.Next
  end;
    BDATOS.TMPRIMAS.filter := Filtro;
  BDATOS.TMPRIMAS.Filtered := True;
end;
a ver ahora.

Lenny 21-01-2011 23:50:28

Aun No Funciona!!! Help!!!
 
Estimados, e provado de las dos formas y las dos lansan el mismo error:

"Syntax Error"

Código Delphi [-]
procedure TPRODUCCIONBG.Button1Click(Sender: TObject);
var
Filtro: String;
begin
    while not BDATOS.TMPRIMASF.Eof do
  begin
    Filtro := Filtro + ' or COD_INTERNO = ' + BDATOS.TMPRIMASF.FieldByName('COD_INTERNO').ASstring;
    BDATOS.TMPRIMASF.Next
  end;
  BDATOS.TMPRIMAS.Filter := filtro;
end;

Código Delphi [-]
procedure TPRODUCCIONBG.Button2Click(Sender: TObject);
var
  Filtro: String;
begin
  Filtro := '';
  while not BDATOS.TMPRIMASF.Eof do
  begin
       Filtro := Filtro + ' or COD_INTERNO = ' + chr(39) + BDATOS.TMPRIMASF.FieldByName('COD_INTERNO').ASstring + chr(39);
     BDATOS.TMPRIMASF.Next
  end;
    BDATOS.TMPRIMAS.filter := Filtro;
  BDATOS.TMPRIMAS.Filtered := True;
end;

Lamento ser tan insistente... espero puedan ayudarme, de antemano gracias!!!

Aleca 22-01-2011 00:13:39

Cita:

Empezado por Lenny (Mensaje 388321)
Estimados, e provado de las dos formas y las dos lansan el mismo error:

"Syntax Error"


Código Delphi [-]procedure TPRODUCCIONBG.Button1Click(Sender: TObject);
var
Filtro: String;
begin
while not BDATOS.TMPRIMASF.Eof do
begin
Filtro := Filtro + ' or COD_INTERNO = ' + BDATOS.TMPRIMASF.FieldByName('COD_INTERNO').ASstring;
BDATOS.TMPRIMASF.Next
end;
BDATOS.TMPRIMAS.Filter := filtro;
end;





Código Delphi [-]procedure TPRODUCCIONBG.Button2Click(Sender: TObject);
var
Filtro: String;
begin
Filtro := '';
while not BDATOS.TMPRIMASF.Eof do
begin
Filtro := Filtro + ' or COD_INTERNO = ' + chr(39) + BDATOS.TMPRIMASF.FieldByName('COD_INTERNO').ASstring + chr(39);
BDATOS.TMPRIMASF.Next
end;
BDATOS.TMPRIMAS.filter := Filtro;
BDATOS.TMPRIMAS.Filtered := True;
end;




Lamento ser tan insistente... espero puedan ayudarme, de antemano gracias!!!

por las dudas
que es BDATOS ??
TMPrimas ??

Lenny 22-01-2011 00:44:09

BDATOS = DataSource
TMPRIMAS = Table3
TMPRIMASF = Table2

Cualquier otra pregunta estoy atento, muchas gracias por tu paciencia...

Aleca 22-01-2011 10:16:53

Cita:

Empezado por Lenny (Mensaje 388327)
BDATOS = DataSource
TMPRIMAS = Table3
TMPRIMASF = Table2

Cualquier otra pregunta estoy atento, muchas gracias por tu paciencia...

ahh, entonces seria así:
BDATOS.DataSet.Eof o (.First, etc)
BDATOS.DataSet.FieldByName('CAMPO').AsFloat
y si usas Tablas o Querys haces así
TMPRIMAS.Eof, TMPRIMAS.Next
TMPRIMAS.FieldByName('CAMPO').AsString por ejemplo. :)

Lenny 22-01-2011 16:32:27

Aun sigue el error "Syntax error"
 
Aun no funciona... :(:(:(

Sigo en lo que me dicen y aun no resulta... ya estoy perdiendo las esperanzas, esto seria el codigo (mas ordenado):

Código Delphi [-]

procedure TPRODUCCIONBG.Button1Click(Sender: TObject);
var
Filtro: String;
begin 
while not ZTable2.Eof do  begin
Filtro := Filtro + ' or COD_INTERNO = ' + ZTable2.FieldByName('COD_INTERNO').ASstring;
ZTable2.Next  
end;
ZTable1.Filter := filtro;
end;

Código Delphi [-]
procedure TPRODUCCIONBG.Button2Click(Sender: TObject);
var
  Filtro: String;
begin
  Filtro := '';
  while not ZTable2.Eof do
  begin
       Filtro := Filtro + ' or COD_INTERNO = ' + chr(39) + ZTable2.FieldByName('COD_INTERNO').ASstring + chr(39);
     ZTable2.Next
  end;
  ZTable1.filter := Filtro;
  ZTable1.Filtered := True;
end;
Muy agradesido por la ayuda hasta ahora... cualquier duda estare atento...

PD: El COD_INTERNO es ALFANUMERICO por si acaso...

Caral 22-01-2011 16:38:13

Hola
Tal vez no entiendo pero pregunto:
Que hace la variable filtro si no contiene nada?.
aqui:
Filtro := Filtro no contiene nada, o por lo menos no lo veo el los ultimos codigos.
Saludos

Lenny 22-01-2011 17:10:51

Lo que entendi...
 
Teoricamente, segun lo que entendi "FILTRO" deveria guarda los componentes de la FORMULA (materias primas) almacenados en la TABLA2 (materias primas necesarias + cantidad necesaria) Previamente Filtrada desde la TABLA1 que contiene el nombre del producto a fabricar, para luego filtrar la TABLA3 (todas las materias primas + Stock) con el resultado de la TABLA2, la idea es que TABLA2 y TABLA3 muestren las mismas materias primas para ver si existe STOCK suficiente antes de generar el pedido y descuento correspondiente...
Tengo todo previamente listo, como generar el descuento, solo me falta esto... si hay otra forma diferente, bienvenido sean todas las sugerencias y ayuda posible!!!

Espero no enredar mas las cosas con la explicacion, ante cualquier duda estare atento...

Gracias por la paciencia... :o

Caral 22-01-2011 17:19:45

Hola
Teoricamente estas equivocado.
Analicemos tu codigo:

Aqui generamos la variable filtro, Vacia:
Código Delphi [-]
procedure TPRODUCCIONBG.Button1Click(Sender: TObject);
var
Filtro: String;
begin

Aqui decimos que mientras la tabla2 no encuentre su final continue.
La variable filtro sigue estando vacia:
Código Delphi [-]
while not ZTable2.Eof do  begin

Aqui indicamos que filtro (vacio) es igual a Filtro (vacio) mas todo lo demas y que es igual al file Cod_interno de la tabla2 que por ningun lado la veo abierta (supongo se abrio antes):
Código Delphi [-]
Filtro := Filtro + ' or COD_INTERNO = ' + ZTable2.FieldByName('COD_INTERNO').ASstring;
ZTable2.Next

Aqui decimos que la tabla 1 es igual que filtro vacio.
Código Delphi [-]
end;
ZTable1.Filter := filtro;
end;

Ahora: que informacion sacaras de algo vacio?, nada.
Por lo tanto me imagino que dara un error de sintaxis.
Saludos

Lenny 22-01-2011 17:31:14

Muchas gracias Caral, llego al depto y reviso paso a paso lo que me dices, tiene muchisima mas logica lo que tu me dices que lo que yo creo saber... Apenas lo revise te cuento como me fue...
Gracias!!!

Caral 22-01-2011 17:37:14

Hola
El concepto de filtro es de logica y es muy sencillo.
Si quieres filtrar una tabla y ademas recorrerla para hacer la comparacion con otra tabla, primero tienes que recorrer las dos tablas, de ahi, crear dos filtros y hacer la comparación.
Si haces el recorrido de una y no de la otra, podras comparar los datos?, que crees?.
Ademas te falta algo basico y es activar el filtro, cosa que no estas haciendo.
Si te doy el codigo no aprenderas, intento que pienses en lo que te digo.
Si por ultimo no te sale, te doy un ejemplo, pero quiero que lo intentes.
Saludos

Lenny 22-01-2011 18:11:21

Aun complicado...
 
Sigo desorientado... encuentro demasiado logico lo que dices pero aun no doy con la solucion, si podrias darme un ejemplo (no el codigo, tienes toda la razon en lo de aprender) estaria muy agradesido... esto me tiene de cabeza desde un par de dias y de tanto arbol ya no puedo ver el bosque...

Caral 22-01-2011 18:37:22

Hola
Empecemos a quitar arboles.
Que quieres que haga el boton (Button1Click).
Paso a paso.
Saludos


La franja horaria es GMT +2. Ahora son las 21:05:34.

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