FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Relecionar RecordSet
Posts: 198
Joined: Fri Nov 18, 2005 07:34 PM
Relecionar RecordSet
Posted: Thu Sep 19, 2024 04:20 PM

Hola, como puedo Relacionar 2 Recordset de dos tablas distintas ?

Tengo 2 Tablas:

INVENTARIO

con los campos: Codigo, Descripcion y Linea

LINEAS

con los campos: Linea y Descripcion

Necesito que en Listbox que en lugar de poner el campo Linea, ponga el Nombre que le corresponde de la tabla LINEAS

oCone :=tOleAuto():new("ADODB.connection")

oCone:Open( "DRIVER={MySQL ODBC 3.51 Driver};" + ;

"server=" + cServer + ;

";database=" + cDatabase + ;

";uid=" + cUser + ;

";port=" + cPort + ;

";pwd=" + cPass )

oRecordSet := TOleAuto():New("adodb.recordset")

oComando := TOLEAUTO():New("adodb.command")

oRecordSet:CursorType     := 1        // opendkeyset

oRecordSet:CursorLocation := 3        // local cache

oRecordSet:LockType       := 3        // lockoportunistic

oRecordSet:ActiveConnection(oCone)

oRecordSet:Source := "Select * from Inventario Order by Codigo"

oRecordSet:Open()

oRecordSet:MoveFirst()



oRecordSet2 := TOleAuto():New("adodb.recordset")

oComando := TOLEAUTO():New("adodb.command")

oRecordSet2:CursorType     := 1        // opendkeyset

oRecordSet2:CursorLocation := 3        // local cache

oRecordSet2:LockType       := 3        // lockoportunistic

oRecordSet2:ActiveConnection(oCone)

oRecordSet2:Source := "Select * from Lineas Order by Linea"

oRecordSet2:Open()



 DEFINE WINDOW oWndChild MDICHILD OF oWnd  FROM 1, 1 To 35, 118  TITLE  "Catalodo de Inventario"



 DEFINE BUTTONBAR oBar  _3D OF oWndChild SIZE 42, 42



 TWBrowse():lHScroll:= .F.



 @ 3.5, .5 LISTBOX  oLbx FIELDS Transform(oRecordSet:Fields("Codigo"):value,"999999"), oRecordSet:Fields("Descripcion"):value,oRecordSet:Fields("Linea"):value;

                 HEADERS  "Codigo", "Descripcion","Marca","Modelo","Serie","Linea","Sucursal","Ubicacion","Proveedor";

                 FIELDSIZES 80,180,80;

                 SIZE 500, 350 OF oWndchild;

actualmente hace esto:

 1001   Refrigerador     1

Necesito que sea:

 1001   Refrigerador     REFRIGERACION

Espero haberme explicado correctamente, gracias.

Posts: 1818
Joined: Wed Oct 26, 2005 02:49 PM
Re: Relecionar RecordSet
Posted: Thu Sep 19, 2024 04:39 PM
Creo que esa consulta la puedes hacer directo a la base de datos, con la relaci贸n que necesitas y la muestras en un solo recorset, creo que as铆 te podr铆a funcionar.
Code (fw): Select all Collapse
oCone :=tOleAuto():new("ADODB.connection")
oCone:Open( "DRIVER={MySQL ODBC 3.51 Driver};" + ;
"server=" + cServer + ;
";database=" + cDatabase + ;
";uid=" + cUser + ;
";port=" + cPort + ;
";pwd=" + cPass )

oRecordSet := TOleAuto():New("adodb.recordset")
oComando := TOLEAUTO():New("adodb.command")
oRecordSet:CursorType := 1 // opendkeyset
oRecordSet:CursorLocation := 3 // local cache
oRecordSet:LockType := 3 // lockoportunistic
oRecordSet:ActiveConnection(oCone)
oRecordSet:Source := "SELECT INV.*,LNA.descripcion AS des_linea FROM inventario INV LEFT JOIN lineas LNA ON INV.linea=LNA.linea ORDER BY INV.codigo"
oRecordSet:Open()
oRecordSet:MoveFirst()

聽@ 3.5, .5 LISTBOX oLbx FIELDS Transform(oRecordSet:Fields("Codigo"):value,"999999"), oRecordSet:Fields("Descripcion"):value,oRecordSet:Fields("des_linea"):value;
HEADERS "Codigo", "Descripcion","Marca","Modelo","Serie","Linea","Sucursal","Ubicacion","Proveedor";
FIELDSIZES 80,180,80;
SIZE 500, 350 OF oWndchild;
Lo 煤nico es revisar los nombres de los campos de cada una de las tablas, yo coloque los que ven铆an en el POST, asumiendo que sean esos.

Que versi贸n de FW usas? por que ese c贸digo se puede simplificar mucho mas con las funcione de fw, para el manejo de ADO
Saludos
LEANDRO AREVALO
Bogot谩 (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]
Posts: 198
Joined: Fri Nov 18, 2005 07:34 PM
Re: Relecionar RecordSet
Posted: Thu Sep 19, 2024 10:28 PM

Tabla 1

INVENTARIO

Codigo --->1001

Descripcion --->REFRIGERADOR LG 19

Linea --->1

Tabla 2

LINEAS

id --->1

Linea --->REFRIGERACION

oRecordSet:Source := "SELECT INV.*,LNA.Linea AS des_linea FROM inventario INV LEFT JOIN lineas LNA ON INV.linea=LNA.Id ORDER BY INV.codigo"

No se puede conectar me envia un mensaje de conexion:

Error adodb.recordset/16389 E_FAIL: OPEN

Puse algo mal ?

en Listbox debe de quedar

Codigo Descripcion Linea

1001 REFRIGERADOR LG 19 REFRIGERACION

Posts: 198
Joined: Fri Nov 18, 2005 07:34 PM
Re: Relecionar RecordSet
Posted: Thu Sep 19, 2024 11:40 PM

ya logr茅 hacer la relaci贸n:

oRecordSet:Source := "SELECT INV.*,LNA.linea AS des_linea FROM inventario INV LEFT JOIN Lineas LNA ON INV.linea=LNA.ID ORDER BY INV.codigo" ///Conexion OK

Si necesito relacionar mas, seria separado por una , ?

LNA.linea AS des_linea, SUC.sucursal AS des_sucursal FROM inventario INV LEFT JOIN Lineas LNA ON INV.linea=LNA.ID, LEFT JOIN Sucursal SUC ON INV.Sucursal=SUC.ID ORDER BY INV.codigo

O como seria la sintaxis ?

Saludos y much铆simas gracias por su ayuda.

Posts: 1818
Joined: Wed Oct 26, 2005 02:49 PM
Re: Relecionar RecordSet
Posted: Fri Sep 20, 2024 11:39 AM
Hola buenos d铆as como estas?

Que bueno que lo hayas resuelto

Seria as铆
Code (fw): Select all Collapse
SELECT INV.*,LNA.linea AS des_linea, SUC.sucursal AS des_sucursal FROM (inventario INV LEFT JOIN Lineas LNA ON INV.linea=LNA.ID) LEFT JOIN Sucursal SUC ON INV.Sucursal=SUC.ID ORDER BY INV.codigo
Saludos
LEANDRO AREVALO
Bogot谩 (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: Relecionar RecordSet
Posted: Fri Sep 20, 2024 08:17 PM
Servicomver:

A ver si este c贸digo te da m谩s luz, puedes tener tanos JOINs como necesites
Code (fw): Select all Collapse
聽 聽oRsCxp 聽 := FW_OpenRecordSet(oApp:oCon,"SELECT " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"*," +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"PRO_NOM," +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"PRO_DES " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "FROM " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"CarCxp " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "LEFT JOIN " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"Proveedores " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "ON " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"CAR_PRV = Proveedores.PRO_NUM " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "LEFT JOIN " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"Proyectos " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "ON " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"CAR_PRO = PRO_PRO " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "WHERE " + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"CAR_SDO > 0.00 " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "AND " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"! CAR_CAN " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "ORDER BY " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"CAR_FAC",adLockOptimistic,adOpenDynamic,0)
En este c贸digo tengo una tabla (CARCXP) relacionada a dos tablas m谩s (PROVEEDORES y PROYECTOS)

Otro ejemplo m谩s, aunque probablemente ya lo sabes, f铆jate que en la selecci贸n de campos solo defino
los estrictamente necesarios, no siempre debe ser * (Todos los campos).
Code (fw): Select all Collapse
聽 聽oRsHdr := FW_OpenRecordSet(oApp:oCon,"SELECT " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "*," +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "PRO_NOM," +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "PRO_CLI," +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "PRO_DES," +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "CLI_NOM " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"FROM " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "HdrCdg " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"LEFT JOIN " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "Proveedores " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"ON " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "HDR_PRV = PRO_NUM " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"LEFT JOIN " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "Proyectos " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"ON " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "HDR_PRO = PRO_PRO " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"LEFT JOIN " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "Clientes " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"ON " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "PRO_CLI = CLI_NUM " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"WHERE " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "YEAR(HDR_FDE) = '" + STR(nAmo,4,0) + "' " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽"ORDER BY " +;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "HDR_FOL",adLockOptimistic,adOpenDynamic,0)
Sugerencia, t铆rale un ojo a los JOINs (tienes LEFT JOIN,INNER JOIN, RIGHT JOIN) para ver cual es la diferencia.

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

Continue the discussion