Relecionar RecordSet

Post Reply
servicomver
Posts: 192
Joined: Fri Nov 18, 2005 7:34 pm

Relecionar RecordSet

Post 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.
User avatar
leandro
Posts: 1688
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Contact:

Re: Relecionar RecordSet

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

Re: Relecionar RecordSet

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

Re: Relecionar RecordSet

Post 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.
User avatar
leandro
Posts: 1688
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Contact:

Re: Relecionar RecordSet

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

Re: Relecionar RecordSet

Post 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
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
Post Reply