La Web del Programador: Comunidad de Programadores
 
    Pregunta:  273 - COMO FUNCIONA EL SET RELATION
Autor:  Alexis
Hola amigos soy yo de nuevo dando lata, tengo el siguiente problema , Tengo Dos Bases de Datos llamdas X y Y necesito que en un DBEDIT aparecan 5 Campos de la Base X, pero el campo 4 es la clave de algun articulo de la Base Y ahora bien mi pregunts es ¿ Hay algun manera que con el Set RELATIOn se pueda hacer eso?
Ejemplos
Datos en la Base X:
Clave Descripcion
1 Linea Blanca
2 Linea de muebles

Datos en la base Y:
Clave Descripcion Clave_linea
001 Lavadora 456 1
002 refrigerador X 1

Bueno Cuando haga un Dbedit a mi base Y, necesito que aparezca la descripcion de la linea 1, Diran Bueno pues guardala en la otra base, pues no puedo , imaginenese que tengo como 400 lineas como con mas de 5000 articulos, se va a tardar un monton, y mejor asi las relaciono y nadamas despliego informacion, ademas que tambien es un relajo a la hora de que hacen un cambio a la descripcion de la linea, tendria que cambiar a todas en la otra base
Saludos


  Respuesta:  Javier Albo
Es incorrecta la afirmación de que el usar SET RELATION con tablas en red y miles de registros el programa se pone muy lento si no tienes una máquina rápida. A diario tengo la posibilidad de trabajar con 2 tablas relacionadas en un entorno de red con mas de 60 puestos de trabajo. Una de estas tablas tiene 14 MILLONES de registros y la otra tiene 24 MILLONES y SET RELATION no produce el problema que se menciona.

[email protected]

Atte.

  Respuesta:  Gerardo A. Mendoza
Hola: Sabes, usar DBEdit es OBSOLETO, tienes que cambiar a usar TBRowse porque es más flexible y potente, además de que te adentras en OO (Objetos).
En lo personal nunca he usado Set Relation en los desarrollos que he realizado, lo he sustituido por una rutina de búsqueda que me hace la "relación", ya que a final de cuentas hace lo mismo Set Relation. Te muestro como:
Function Busca(cClave, nPosCampo, nIndice)
Local nIndAnt, xValor, cTipo

// Valores por defecto si no los pasan
if nPosCampo == Nil; nPosCampo := 0; End
if nIndice == Nil; nIndice := 1; End

nIndAnt := PonIndice(nIndice) //indice de búsqueda
DBSeek(cClave)
If nPosCampo > 0 // un campo en particular
If Found()
xValor := FieldGet(nPosCampo)
Else
cTipo := ValType(FieldGet(nPosCampo))
If cTipo == [C]; xValor := [S/desc]
ElseIf cTipo == [N]; xValor := 0
ElseIf cTipo == [D]; xValor := CtoD([00/00/0000])
ElseIf cTipo == [L]; xValor := .f.
Else
xValor := []
EndIf
EndIf
Else
xValor := Found()
EndIf
PonIndice(nIndAnt)
Return( xValor )

Function PonIndice(nIndice)
// Esta rutina pone como activo un índice en
// especial y retorna el índice que estaba.
Local nIndAnt := IndexOrd()
DBSetOrder( nIndice )
Return( nIndAnt )

Como puedes ver esta rutina puede tener varias aplicaciones, dependiendo de su uso:
If ARTICULO->( Busca(cCveArt) ) // Buscar clave
// Encontre el artículo
EndIf

// Obtiene la descripción en un objeto TBRowse
oCol := TBColumn([Desc. Articulo], {|| ARTICULO->( DETFACTURA->faccveart, 2)})

// Busca sobre el Indice 3 (por Grupo)
If ARTICULO->( Busca(cGpoArt,, 3))
cGrupo := ARTICULO->grupo // deja el apuntador y dispongo de todos los campos
Else
// Error en grupo
EndIf

Como ves, esta rutina hace más versátil muchas cosas en el desarrollo de sistemas.
Espero que te sirva. Cualquier duda avísame. :-)

  Respuesta:  Juan Reyes
Aqui vá,...
USE X NEW EXCLUSIVE
INDEX ON X->Clave TO X1
USE Y NEW EXCLUSIVE

SELECT Y
Y->(DbGoTop())

// Si lo haces on objetos TBrowse :

oTb := TBrowseDB( 1, 1, 24, 78 )
...oTb:addColumn( TbColumnNew( "CODIGO" , {|| Y->Clave }))
...oTb:addColumn( TbColumnNew( "DESCRIPCION", {|| Y->Descripcion }))
...oTb:addColumn( TbColumnNew( "LINEA" , { || IIF( X->( DbSeek( Y->Clave_Linea )), X->Descripcion, Space( 20 ))})
.
.
.

// si lo haces con DBEdit ( no te lo recomiendo )
Local acColumnas := { "Y->Clave", "Y->Descripcion", " IIF( X->( DbSeek( Y->Clave_Linea )), X->Descripcion, Space( 20 ))")
USE X NEW EXCLUSIVE
INDEX ON X->Clave TO X1
USE Y NEW EXCLUSIVE

SELECT Y
Y->(DbGoTop())

DBEDIT( 1, 1, 24, 78, acColumnas, . .. .. . .. )

aunque hace años que no uso dbedit, la idea está.

No te recomiendo usar SET RELATION ya que en entornos de red y con artos registros, 5 mil como dices tu se te podrá lentísimo, si tienes una máquina rápida te salvas, pero si no ?.

Si ves la NG de clipper 5.2e te darás cuenta que DBEDIT tiene un asterisco al lado derecho del nombre de la función, que significa esto, que DBEDIT ESTA OBSOLETO, a si que a aprender objetos TBRowse, ganarás velocidad, un gran ahorro de memori y flexibilidad.

Chao amigo,
http://members.xoom.com/jonysoft
http://members.xoom.com/manuales