Page 1 of 1

Algún browse maestro - exclavo para NTX?

Posted: Wed Nov 11, 2009 4:38 pm
by triumvirato
Necesito saber si hay algún tipo de browse que permita trabajar como maestro-exclavo pero con índices NTX. Los que llevo vistos hasta ahora son para CDX.

Muchas gracias! Saludos!

Re: Algún browse maestro - exclavo para NTX?

Posted: Wed Nov 11, 2009 6:57 pm
by ADBLANCO
TODO DEPENDE COMO ABRAS LA TABLA,
SI UTILIZAS INDICES NTX DE TODAS FORMAS TRABAJARÁ EL OBJETO BROWSE
EL ORDEN DE LA INFORMACIÓN VA A DEPENDER DE CUAL DE LOS .NTX TENGAS APUNTADO EN ESE MOMENTO
SET INDEX TO IND1,IND2,IND3 // INDICES NTX
O
SET ORDER TO 1

Re: Algún browse maestro - exclavo para NTX?

Posted: Wed Nov 11, 2009 7:12 pm
by triumvirato
ADBLANCO,

Perdoname pero no entiendo muy bien tu explicación... He abierto sin problemas browses con bases de datos con índices NTX sin problemas, cambiando los índices, etc. pero lo que busco es (y quizás es que no me explicado bien) un doble browse, que al moverse por el maestro, me actualice el browse exclavo, un maestro - detalle creo que así se le denomina mejor. Pero eso sí, que me funcione con índices NTX, porque lo que he encontrado hasta ahora es para CDX.

Gracias y un saludo.

Re: Algún browse maestro - exclavo para NTX?

Posted: Wed Nov 11, 2009 7:20 pm
by acuellar
Triumvirato

Es asi:
USE nombase VIA "DBFNTX" ...

Saludos

Adhemar

Re: Algún browse maestro - exclavo para NTX?

Posted: Wed Nov 11, 2009 7:28 pm
by ADBLANCO
Esto hace lo que tu dices:
Espero que te sirva de ejemplo

Code: Select all


    REDEFINE LISTBOX oLbx ;
             FIELDS TRANSFORM(TMPLIMIT->F_INICIO,'99/99/9999')  ,;
                    TRANSFORM(TMPLIMIT->F_FINAL,'99/99/9999')   ,;
                    TMPLIMIT->VERSION+CRLF                      ,;
                    TRANSFORM(TMPLIMIT->LIMITE,'999,999,999.99'),;
                    IIF(TMPLIMIT->FLK_ACTIVO,'Activo','Inactivo');
             FIELDSIZES 75,75,95,105,95,95;
             MESSAGE "Seleccione Versión/Límite/Vigencia ([Enter] o Doble Click => Modificar),(F2 - Incluir Nueva Versión/Limite/Vigencia)";
             HEADERS "Desde","Hasta","Version","Monto Limite","Estatus" ID 401 OF oDlg ;
             WHEN lEdit .and. lMod
    bModiPlan      := {|| modi_plan(oDlg,cRamo,nRamo,cPlan,nPlan,TMPLIMIT->IntId),oLbx:setfocus(.t.) }
    oLbx:cAlias    := "tmplimit"
    oLbx:bldblClick:= {|| EVAL(bModiPlan) }
    oLbx:nFreeze   :=  5   && Congela hasta la Quinta columna
    oLbx:bKeyDown  := {|nKey| IIF(nKey==VK_RETURN,EVAL(bModiPlan),),;
                                 Carga_CobTmp(cPlan,TMPLIMIT->IntId,oLbx2),;
                                 oLbx:Click(),;
                                 oLbx:SetFocus(.t.)}
    oLbx:bChange   := {||  Carga_CobTmp(cPlan,TMPLIMIT->IntId,oLbx2),;
                                 oLbx:Click(),;
                                 oLbx:SetFocus(.t.)}
    oLbx:nHeaderHeight := 31  && Da la altura del header
    oLbx:Set3DStyle()
    oLbx:Ajustify  := {0,0,0,1,0}
    oLbx:bGotFocus := {|| IIF(TMPLIMIT->(RECCOUNT())>0,(oButMod:Enable(),oButMod:lActive:=.t.),oButMod:Disable()),;
               oButMod:bAction:={|| EVAL(bModiPlan) },;
              oButMod:cMsg:="Modificar Versión/Límite/Vigencia Seleccionada de la Lista",;
                          oSay1:Show()            ,;
                          oButDupli:Enable()      ,;
                          oButDupli:Enable()      ,;
                          oButDupli:cMsg:="Duplicar Esta Versión/Límite/Vigencia",;
                          bButDupli:={|| EVAL(bDupLimite)},;
                          oButActiva:Enable()     ,;
                          oButActiva:lActive:=.t. ,;
                          oButActiva:cMsg:="Activar/Desactivar Versión",;
                          bButActiva :={|| EVAL(bActivLimit)},;
                          oButInserta:Enable()    ,;
                          oButInserta:lActive:=.t.,;
                          EVAL(bSay2)             ,;
                          bButInserta:={|| EVAL(bInsLimite)},;
                          oButInserta:cMsg:="Incluir Nueva Versión/Límite/Vigencia a la Lista",;
                          oButElim:Enable()       ,;
                          oButElim:lActive:=.t.   ,;
                          bButElim:={|| EVAL(bElimLimite)},;
                          oButElim:cMsg:="Eliminar Versión/Límite/Vigencia a la Lista",;
                          oButListar:lActive:=.t. ,;
                          oButListar:Enable()}
    REDEFINE LISTBOX oLbx2 ;
             FIELDS TMPCOBER->COBERTURA;
             FIELDSIZES 300;
             HEADERS "Cobertura" ID 402 OF oDlg ;
             WHEN .f. //lEdit .and. lMod
    oLbx2:cAlias       :="tmpcober"
    oLbx2:nHeaderHeight:= 31  && Da la altura del header
    oLbx2:Set3DStyle()
    oLbx2:Ajustify:={0}
    oLbx2:lDrawSelect  :=.f.





 
y auque está hecho para sql, las tablas están en dbf

Code: Select all

******************************************************************************************
STATIC FUNCTION CARGA_COBTMP(cPlan,nPlanVigencia,oLbx2)
******************************************************************************************
LOCAL oQuery                ,;
      bSeek                 ,;
      xPlan:=alltrim(cPlan) ,;
      nPlan:=len(xPlan)     ,;
      lOk:=.f.

  TMPCOBER->(DBZAP())  // INICIALIZO ARCHIVO TEMPORAL DE TIPOS DE COBERTURA
  IF nPlanVigencia>0
    bSeek:={||'SELECT '+cDTBase+'.DtsCobertura.VchDescripcion,'+;
                        cDTBase+'.DtsPlanVigenciaCobertura.IntIdDtsPlanVigenciaCobertura,'+;
                        cDTBase+'.DtsPlanVigenciaCobertura.IntIdDtsCobertura,'+;
                        cDTBase+'.DtsPlanVigenciaCobertura.IntIdDtsSubCobertura '+;
                'FROM '+cDTBase+'.DtsPlan '+;
          'INNER JOIN '+cDTBase+'.DtsPlanVigencia ON ('+cDTBase+'.DtsPlan.IntIdDtsPlan = '+cDTBase+'.DtsPlanVigencia.IntIdDtsPlan) '+;
          'INNER JOIN '+cDTBase+'.DtsPlanVigenciaCobertura ON ('+cDTBase+'.DtsPlanVigencia.IntIdDtsPlanVigencia = '+cDTBase+'.DtsPlanVigenciaCobertura.IntIdDtsPlanVigencia) '+;
          'INNER JOIN '+cDTBase+'.DtsCobertura ON ('+cDTBase+'.DtsPlanVigenciaCobertura.IntIdDtsCobertura = '+cDTBase+'.DtsCobertura.IntIdDtsCobertura) '+;
               'WHERE '+cDTBase+'.DtsPlan.VchDescripcion = "'+xPlan+SPACE(30-nPlan)+'"'+;
                ' AND '+cDTBase+'.DtsPlanVigenciaCobertura.IntIdDtsPlanVigencia = '+str(nPlanVigencia,10,0)+;
                ' AND '+cDTBase+'.DtsPlan.TinStatus <> 0'+;
                ' AND '+cDTBase+'.DtsPlanVigenciaCobertura.TinStatus <> 0'+;
           ' ORDER BY '+cDTBase+'.DtsPlanVigenciaCobertura.IntIdDtsCobertura,'+;
                       +cDTBase+'.DtsPlanVigenciaCobertura.IntIdDtsSubCobertura'}
    oQuery    :=TMSQuery():New( oDTbase )                                  // inicializa la clase
    oQuery:Open( eval(bSeek) )                                             // efectua el query
    IF ( oQuery:nRowCount>0 )                                              // Si Existe Data
      DO WHILE !oQuery:lEof
        TMPCOBER->(DBAPPEND())
        TMPCOBER->COBERTURA:=oQuery:Xfieldget(1)
        TMPCOBER->IntId    :=oQuery:Xfieldget(2)
        TMPCOBER->COBERT   :=oQuery:Xfieldget(3)
        TMPCOBER->SUBCOBERT:=oQuery:Xfieldget(4)
        IF TMPCOBER->SUBCOBERT>0
          TMPCOBER->COBERTURA:=' - '+DtsSubCobertura(TMPCOBER->SUBCOBERT)
        ENDIF
        oQuery:Fetch()
      ENDDO
      lOk  :=.t.
    ENDIF
    oQuery:Close()
    TMPCOBER->(DBGOTOP())
  ENDIF
  oLbx2:Refresh()
  RETURN lOk

 

Re: Algún browse maestro - exclavo para NTX?

Posted: Wed Nov 11, 2009 8:00 pm
by triumvirato
acuellar wrote:Triumvirato

Es asi:
USE nombase VIA "DBFNTX" ...

Saludos

Adhemar

Adhemar,

Muchas gracias por tu nota, en efecto la apertura de la base de datos sí la tenía clara, lo que no sabía (y aún no tengo muy claro) es cómo a la par que me muevo pro un browse, hacer que se actualice el otro, creo que el ejemplo de ADBLANCO es lo que busco. No obstante, muchas gracias de nuevo.

Saludos!

Re: Algún browse maestro - exclavo para NTX?

Posted: Wed Nov 11, 2009 8:03 pm
by Alfredo Arteaga
He aquí las funciones que usé mucho tiempo para trabajar con mi viejo Clipper. Estas simulan el comportamiento de SCOPE con NTX y funcionan!

Code: Select all

// --- Redefinici¢n de Movimiento en Browse, Scope para NTX ------

// oBrw:bGoTop    :={||  GoToTop(cAlias,cKey)}
// oBrw:bGoBottom :={||  GoToBot(cAlias,cKey)}
// oBrw:bSkip     :={|n| MovePtr(cAlias,cKey,n)}


FUNCTION GoToTop(cAlias,cKey)
   DbSelectArea(cAlias)
   (cAlias)->(DbSeek(cKey))
RETURN (NIL)

FUNCTION GoToBot(cAlias,cKey)
   LOCAL cTem:=STUFF(cKey,Len(cKey),1,Chr(Asc(Right(cKey,1))+1))
   DbSelectArea(cAlias)
   (cAlias)->(DbSeek(cTem,.T.))
   (cAlias)->(DbSkip(-1))
   IF &((cAlias)->(IndexKey(0)))=cKey
      (cAlias)->(DbSkip(0))
   ELSE
      (cAlias)->(DbSeek(cKey))
   ENDIF
RETURN (NIL)

FUNCTION MovePtr(cAlias,cKey,nReg)
   LOCAL nNext:=0
   DbSelectArea(cAlias)
   IF nReg=0 .OR. (cAlias)->(LastRec())=0 .OR. !(&((cAlias)->(IndexKey(0)))=cKey)
      (cAlias)->(DbSkip(0))
   ELSEIF nReg>0 .AND. (cAlias)->(RecNo())<>(cAlias)->(LastRec())+1
      DO WHILE nNext<=nReg .AND. !(cAlias)->(EoF()) .AND. &((cAlias)->(IndexKey(0)))=cKey
         (cAlias)->(DbSkip())
         nNext++
      ENDDO
      (cAlias)->(DbSkip(-1))
      nNext--
   ELSEIF nReg<0
      DO WHILE nNext>=nReg .AND. !(cAlias)->(BoF()) .AND. &((cAlias)->(IndexKey(0)))=cKey
         (cAlias)->(DbSkip(-1))
         nNext--
      ENDDO
      IF !(cAlias)->(BoF())
         (cAlias)->(DbSkip())
      ENDIF
      nNext++
   ENDIF
RETURN (nNext)
 

Re: Algún browse maestro - exclavo para NTX?

Posted: Wed Nov 11, 2009 8:08 pm
by triumvirato
ADBLANCO wrote:Esto hace lo que tu dices:
Espero que te sirva de ejemplo

y auque está hecho para sql, las tablas están en dbf
Angel,

Creo que es lo que estoy buscando... así que me pondré manos a la obra a ver si puedo entender bien el código, soy completamente novato en POO y en FW, así que tengo que ir pasito a pasito.

Entre todo este tiempo he visto una clase GTBrowse (de theful) que hace exáctamente lo que busco, pero es para CDX igualmente (al menos eso dicen los manuales de la clase) y lo que busco es eso mismo pero para NTX y creo que en tu código es posible que esté lo que busco.

MUCHAS MUCHAS GRACIAS.

Saludos!

Re: Algún browse maestro - exclavo para NTX?

Posted: Wed Nov 11, 2009 9:26 pm
by Antonio Linares
David,

Tienes un ejemplo completo de maestro-esclavo en FWH\samples\gallery\onemany :-)

Re: Algún browse maestro - exclavo para NTX?

Posted: Thu Nov 12, 2009 8:02 am
by triumvirato
Alfredo Arteaga wrote:He aquí las funciones que usé mucho tiempo para trabajar con mi viejo Clipper. Estas simulan el comportamiento de SCOPE con NTX y funcionan!

Alfredo,

Muchas gracias por tu aporte y ayuda. Veremos si es lo bastante rápido para los NTX...

Saludos!

Re: Algún browse maestro - exclavo para NTX?

Posted: Thu Nov 12, 2009 8:09 am
by triumvirato
Antonio Linares wrote:David,

Tienes un ejemplo completo de maestro-esclavo en FWH\samples\gallery\onemany :-)
Antonio,

Gracias, es perfecto y sencillo, veremos si lo suficientemente rápido para mis bases y los NTX...

Gracias!

Re: Algún browse maestro - exclavo para NTX?

Posted: Thu Nov 12, 2009 3:48 pm
by Patricio Avalos Aguirre
Hola

No seria mejor cambiarse a los CDX, te tomara un par de horas en cabiarte
solo un consejo