Page 1 of 1

Relecionar RecordSet

Posted: Thu Sep 19, 2024 4:20 pm
by servicomver
Hola, como puedo Relacionar 2 Recordset de dos tablas distintas ?
Tengo 2 Tablas:
INVENTARIO
con _: Codigo, Descripcion y Linea
LINEAS
con _: 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.

Re: Relecionar RecordSet

Posted: Thu Sep 19, 2024 4:39 pm
by leandro
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

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 _ 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

Re: Relecionar RecordSet

Posted: Thu Sep 19, 2024 10:28 pm
by servicomver
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

Re: Relecionar RecordSet

Posted: Thu Sep 19, 2024 11:40 pm
by servicomver
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.

Re: Relecionar RecordSet

Posted: Fri Sep 20, 2024 11:39 am
by leandro
Hola buenos días como estas?

Que bueno que lo hayas resuelto

Seria así

Code: Select all | Expand

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
 

Re: Relecionar RecordSet

Posted: Fri Sep 20, 2024 8:17 pm
by Armando
Servicomver:

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

Code: Select all | Expand

   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 _).

Code: Select all | Expand

   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