FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Algo con tablas MySql (SOLUCIONADO)
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Algo con tablas MySql (SOLUCIONADO)
Posted: Fri Jun 06, 2025 04:25 AM

Hola Amigos foreros:

No supe c贸mo describir en el t铆tulo del post este problema.

Tengo una tablas llamada MATERIALESl en su estructura hay UN campo llamado Tipo el cual puede

contener 3 posibles valores:

en blanco

material bal铆stico

material anti trauma

En otra tabla llamada PRODUCTOS tengo DOS campos, uno define el tipo de material bal铆stico y

el otro define el tipo de material anti trauma

Ahora, hago un browse de esta 煤ltima tabla (Productos), en el query hago un LEFT JOIN contra la tabla MATERIALES

para obtener la descripci贸n del tipo de material, el problema es que en la tabla PRODUCTOS son dos campos que se

relacionan a un solo campo en la tabla MATERIALES.

Entiendo que la soluci贸n ser铆a hacer dos diferentes tablas de MATERIALES pero el usuario no acepta la separacin麓

Espero haberme explicado y que alguien haya resuelto algo como esto.

Saludos

SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Algo con tablas MySql
Posted: Fri Jun 06, 2025 04:52 AM

Entiendo el problema: tienes una tabla MATERIALES con un campo Tipo que contiene valores como "en blanco", "material bal铆stico" o "material anti trauma", y una tabla PRODUCTOS con dos campos (uno para el tipo de material bal铆stico y otro para el tipo de material anti trauma) que ambos se relacionan con el mismo campo Tipo de la tabla MATERIALES. Al hacer un LEFT JOIN en un SELECT para obtener las descripciones, te enfrentas al desaf铆o de que ambos campos de PRODUCTOS referencian la misma columna en MATERIALES, lo que complica la consulta.

Dado que el usuario no acepta separar la tabla MATERIALES en dos, puedes resolver esto utilizando dos LEFT JOIN en la consulta, uno para cada campo de PRODUCTOS, asociando cada uno al campo Tipo de la tabla MATERIALES. Esto te permitir谩 obtener las descripciones correspondientes para cada tipo de material sin necesidad de modificar la estructura de las tablas.

Soluci贸n propuesta

Supongamos que las tablas tienen la siguiente estructura simplificada:

MATERIALES:

id_material (clave primaria)

Tipo (puede ser "en blanco", "material bal铆stico", "material anti trauma")

Descripci贸n (descripci贸n del tipo de material)

PRODUCTOS:

id_producto (clave primaria)

tipo_material_balistico (referencia al id_material de MATERIALES)

tipo_material_antitrauma (referencia al id_material de MATERIALES)

La consulta SQL para obtener las descripciones de ambos tipos de material ser铆a algo as铆:

sql

SELECT

p.id_producto,

p.tipo_material_balistico,

p.tipo_material_antitrauma,

mb.Descripci贸n AS descripcion_balistico,

ma.Descripci贸n AS descripcion_antitrauma

FROM

PRODUCTOS p

LEFT JOIN MATERIALES mb ON p.tipo_material_balistico = mb.id_material

LEFT JOIN MATERIALES ma ON p.tipo_material_antitrauma = ma.id_material;

Explicaci贸n

Doble LEFT JOIN:

El primer LEFT JOIN (mb) relaciona tipo_material_balistico con id_material de MATERIALES para obtener la descripci贸n del material bal铆stico.

El segundo LEFT JOIN (ma) relaciona tipo_material_antitrauma con id_material de MATERIALES para obtener la descripci贸n del material anti trauma.

Alias distintos (mb y ma): Esto permite diferenciar las dos instancias de la tabla MATERIALES en la misma consulta.

Resultado: La consulta devuelve los campos de PRODUCTOS junto con las descripciones de ambos tipos de material, incluso si alguno de los campos en PRODUCTOS es nulo (gracias al LEFT JOIN).

Ejemplo de resultado

Si tienes datos como:

MATERIALES:

id_material

Tipo

Descripci贸n

1

en blanco

Sin material

2

material bal铆stico

Kevlar

3

material anti trauma

Placa de polietileno

PRODUCTOS:

id_producto

tipo_material_balistico

tipo_material_antitrauma

1

2

3

2

1

NULL

El resultado de la consulta ser铆a:

id_producto

tipo_material_balistico

tipo_material_antitrauma

descripcion_balistico

descripcion_antitrauma

1

2

3

Kevlar

Placa de polietileno

2

1

NULL

Sin material

NULL

Consideraciones

脥ndices: Aseg煤rate de que los campos id_material, tipo_material_balistico y tipo_material_antitrauma tengan 铆ndices para mejorar el rendimiento de la consulta.

Validaci贸n de datos: Verifica que los valores en tipo_material_balistico y tipo_material_antitrauma sean v谩lidos (es decir, que existan en MATERIALES.id_material) para evitar inconsistencias.

Alternativa visual: Si el usuario necesita una interfaz (como un browse en un sistema), aseg煤rate de que el software que usas (por ejemplo, un DBMS o una herramienta de visualizaci贸n) pueda manejar los resultados de esta consulta correctamente, mostrando las descripciones en columnas separadas.

Nota sobre la estructura

Aunque el usuario no quiere separar la tabla MATERIALES, es importante mencionar que mantener una sola tabla para ambos tipos de material puede generar confusi贸n en el futuro, especialmente si los tipos de material tienen reglas o comportamientos distintos. Si en alg煤n momento reconsideran, separar en dos tablas (MATERIALES_BALISTICOS y MATERIALES_ANTITRAUMA) con claves for谩neas espec铆ficas podr铆a simplificar la l贸gica y mejorar la integridad referencial.

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1078
Joined: Thu Sep 27, 2007 03:47 PM
Re: Algo con tablas MySql
Posted: Fri Jun 06, 2025 04:50 PM

Saludos

lo que te entiendo es que tiene una tabla de materiales con esta estructura

en blanco

material bal铆stico

material anti trauma

y otra de productos , que estan sepatados en 2 columnas estos 2 material bal铆stico y

material anti trauma.

Que en realidad deberia ser uno solo ya que el cliente lo requiere asi como tu especificas.

pero van a tener muchos problemas como te indica Antonio linares.

Cuando haces la consulta , te muestra 2 columnas una material bal铆stico y otra material anti trauma, esto lo hace porque haces 2 Join

Si haces un solo Join y Contatenar podria funcionar. o la otra alternativa seria generar una consulta de producto , uniendo los dos columnas y dejar una sola y despues haces tu consulta normal con un solo Join de donde tienes el problema

Ruben Dario Gonzalez
Cali-Colombia
rubendariogd@hotmail.com - rubendariogd@gmail.com
Posts: 230
Joined: Thu Sep 17, 2015 11:40 PM
Re: Algo con tablas MySql
Posted: Fri Jun 06, 2025 06:10 PM

para relacionar las tabla en producto tendria una sola columna o insertar una columna que concatene ambos como un codigo unico sera mas facil para futuras consultas o filtrados que se necesite

Carlos Atuncar - CaSoftSystem
Chincha - Per煤
+51983478218
carlosalbatun@gmail.com
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: Algo con tablas MySql
Posted: Sat Jun 07, 2025 03:54 AM
Maestro Antonio, Carlos y Rub茅n:

Siguiendo la recomendaci贸n del Master Linares tengo este c贸digo
oRsCha := FW_OpenRecordSet(oApp:oCON,"SELECT " +;
                                          "CH.*," +;
                                          "MB.MAT_DES AS Des_Bal," +;
                                          "MA.MAT_DES AS Des_Ant " +;
                                       "FROM " +;
                                          "Chalecos CH " +;
                                       "LEFT JOIN " +;
                                          "Materiales MB ON CH.CHA_MAB = MB.MAT_TIP " +;
                                       "LEFT JOIN " +;
                                          "Materiales MA ON CH.CHA_MAA = MA.MAT_TIP " +;
                                       "ORDER BY " +;
                                          "CH.CHA_MOD",adLockOptimistic,adOpenDynamic,0)
Compila sin error pero se queda mucho tiempo intentando abrir la tabla y al final tira un error de Fuera de Memoria.

A ver que falla encuentran en mi c贸digo

Por cierto, ambas tablas solo tiene una KEY principal, no tienen llaves for谩neas, ser谩 por ah铆?

Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM
Re: Algo con tablas MySql
Posted: Sat Jun 07, 2025 11:41 PM
Armando:
Puedes mostrar la estructura de la tabla de Materiales?
Tengo una tablas llamada MATERIALESl en su estructura hay UN campo llamado Tipo el cual puede
contener 3 posibles valores:
en blanco
material bal铆stico
material anti trauma
Segun entiendo, al menos debe tener 3 campos esa tabla.
1) Id
2) Descripcion (MAT_DES)
3) Tipo (MAT_TIP)
En la tabla productos (Chalecos) debe tener dos campos que relacione con la tabla de Materiales, uno para los que son Material bailistico y otro Antiflama.
1) Balistico: CHA_MAB
2) Antiflama: CHA_MAA
Estos, son el id de la tabla Materiales?
Espero tu respuesta para poder entender mejor el problema
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: Algo con tablas MySql
Posted: Mon Jun 09, 2025 03:01 PM

Y dos select unidos con la orden union ?

Creo que ser铆a lo m谩s sencillo.

Select campo1 as campo form tabla

Uni贸n

Select campo2 as campo from tabla

Procurar铆a una view con esa instrucci贸n

Y ya luego hago la relaci贸n de la tabla con la view.

Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 1144
Joined: Mon Feb 05, 2007 07:15 PM
Re: Algo con tablas MySql
Posted: Mon Jun 09, 2025 06:46 PM
Paisano yo como ya no quiero perder cabello,
lo har铆a todo en un temporal :roll:
Cesar Cortes Cruz

SysCtrl Software

Mexico



' Sin +- FWH es mejor "
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: Algo con tablas MySql
Posted: Mon Jun 09, 2025 08:37 PM
C茅sar:

Agradezco tu atenci贸n, aqu铆 est谩n ambas tablas, en realidad tienen pocos campos
	cCmdSql	:= "CREATE TABLE IF NOT EXISTS Materiales (" +;
                  "MAT_MOD VARCHAR(20)			NOT NULL	DEFAULT ''				   COMMENT 'Modelo'," +;
                  "MAT_DES VARCHAR(35)			NOT NULL	DEFAULT ''				   COMMENT 'Descripci贸n del material'," +;
                  "MAT_UDM DECIMAL(05,0)		NOT NULL	DEFAULT 0				   COMMENT 'Unidad de medida'," +;
                  "MAT_UCO DECIMAL(09,3)	   NOT NULL	DEFAULT 0.000 			   COMMENT '脷ltimo costo de adquisici贸n'," +;
                  "MAT_SDU DECIMAL(11,3)	   NOT NULL	DEFAULT 0.000 			   COMMENT 'Saldo en unidades'," +;
                  "MAT_SDV DECIMAL(11,2)	   NOT NULL	DEFAULT 0.00 			   COMMENT 'Saldo en valores'," +;
                  "MAT_TIP VARCHAR(03)		   NOT NULL	DEFAULT ''				   COMMENT 'Tipo de material, Balisitco o Anti traumatico'," +;
                  "PRIMARY KEY(MAT_MOD))" +;
                  "ENGINE = InnoDB 													      COMMENT 'Materiales';"
	cCmdSql	:= "CREATE TABLE IF NOT EXISTS Placas (" +;
                  "PLA_MOD VARCHAR(25)			NOT NULL	DEFAULT '' 				   COMMENT 'Modelo'," +;
                  "PLA_MAB VARCHAR(20)			NOT NULL	DEFAULT ''				   COMMENT 'Material bal铆stico'," +;
                  "PLA_MAA VARCHAR(20)			NOT NULL	DEFAULT ''				   COMMENT 'Material antitraum谩tico'," +;
                  "PLA_CON TEXT				   NOT NULL								   COMMENT 'Configuraci贸n'," +;
                  "PRIMARY KEY(PLA_MOD))" +;
                  "ENGINE = InnoDB 													      COMMENT 'Placas';"
Como vemos en la tablas Placas hay dos campos en un mismo registro PLA_MAB y PLA_MAA ambos deben relacionarse con
la tabla materiales en el campo MAT_MOD para obtener el campos MAT_DES, el contenido de los campos PLA_MAB y PLA_MAA
nunca son iguales

Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: Algo con tablas MySql (SOLUCIONADO)
Posted: Tue Jun 10, 2025 01:40 AM

Foreros:

Problema solucionado !

Muchas gracias a todos, en especial a Carlos Vargas.

Un abrazo

SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero

Continue the discussion