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!
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!
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
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.
Triumvirato
Es asi:
USE nombase VIA "DBFNTX" ...
Saludos
Adhemar
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.******************************************************************************************
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 lOkacuellar wrote:Triumvirato
Es asi:
USE nombase VIA "DBFNTX" ...
Saludos
Adhemar
// --- 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)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
David,
Tienes un ejemplo completo de maestro-esclavo en FWH\samples\gallery\onemany ![]()
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!
Antonio Linares wrote:David,
Tienes un ejemplo completo de maestro-esclavo en FWH\samples\gallery\onemany
Hola
No seria mejor cambiarse a los CDX, te tomara un par de horas en cabiarte
solo un consejo