Relecionar RecordSet

Relecionar RecordSet

Postby servicomver » Thu Sep 19, 2024 4: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.
servicomver
 
Posts: 192
Joined: Fri Nov 18, 2005 7:34 pm

Re: Relecionar RecordSet

Postby leandro » Thu Sep 19, 2024 4: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: Select all  Expand view  RUN

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

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1688
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Relecionar RecordSet

Postby servicomver » 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
servicomver
 
Posts: 192
Joined: Fri Nov 18, 2005 7:34 pm

Re: Relecionar RecordSet

Postby servicomver » 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.
servicomver
 
Posts: 192
Joined: Fri Nov 18, 2005 7:34 pm

Re: Relecionar RecordSet

Postby leandro » Fri Sep 20, 2024 11:39 am

Hola buenos días como estas?

Que bueno que lo hayas resuelto

Seria así
Code: Select all  Expand view  RUN

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

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1688
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Relecionar RecordSet

Postby Armando » Fri Sep 20, 2024 8:17 pm

Servicomver:

A ver si este código te da más luz, puedes tener tanos JOINs como necesites

Code: Select all  Expand view  RUN

   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: Select all  Expand view  RUN

   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
User avatar
Armando
 
Posts: 3242
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 18 guests