Buen dia Daniel
Muchas gracias por el dato, esta respuesta bastante clara, seguro que puede aliviar mi dolor de cabeza, voy a analizarla y aplicarla, pues tambien he activado el Wbrowse de Hernan C..
Solo para redondear la idea, y aclarar el concepto del uso de scopes que mencionas, ¿estas son referidas a estas funciones (inicio,Fin, etc)?? , bueno te comentare que en clipper puro, yo tambien desarrolle mi propio browse que me resolvia algunos problemas que tenia con ese browse y tenia funciones parecidas a las tuyas, pero obviamente sin los conceptos de Objetos .... asi que yo pensaria poner tu aporte como partes de las funciones standares de las aplicaciones, y usarlas para los diversos documentos que a crear, pues po lo que veo son bastantes standarizadas y genericas. ten la seguridad que les contare los resultados..
estare en contacto.. !!
muchas gracias por ello ...
Lubin
DanielPuente wrote:Lubin:
Por un lado el set filter deberia funcionar, que browse usas ?. Yo no lo uso (uso scopes) pero por ejemplo para wbrowse la sintaxis es:
::SetFilter( cField, uVal1, uVal2 )
Por lo que en tu codigo te falta el limite "hasta" del filtro (tenes solo el "desde", aunque hay un:
DEFAULT uVal2 := uVal1
O sea que si el valor es el mismo de inicio y fin igual deberia funcionar.
oLbx:setfilter("FAC_DETA->NR_DOC", XNRO_NEW)
Si te fijas lo que hace ::Setfilter() en la clase para filtrar (ademas de contemplar el filtrado x indices, detectar si el rdd es cdx, ads y demas ) es modificar ::bGoTop, ::bGoBottom y ::bSkip. Eso significa que si tenes un indice x la expresion que queres filtrar podes hacer algo como esto incluso con indices ntx:
oBrw2:bGoTop := { || Inicio ( cFiltro, oBrw2 ) }
oBrw2:bGoBottom := { || Fin ( cFiltro, oBrw2 ) }
oBrw2:bSkip :={|n| Moveb("brow",cFiltro,n)}
oBrw2:bLogicLen := { || cCantReg }
FUNCTION Inicio( xKey, oBrw )
DBSEEK( xKey ) // Busca tu clave en la base y si la encuentra ahi es el inicio logico de tu browse
oBrw:Refresh()
return nil
FUNCTION Fin( xKey, oBrw )
DBSEEK( Ultima( xKey ), .T. )
DBSKIP( -1 ) // Busca el valor siguiente
oBrw:Refresh()
return nil
FUNCTION Ultima( xValue )
LOCAL cType := VALTYPE( xValue )
LOCAL xNext
DO CASE
CASE ( cType == "C" )
xValue := STUFF( xValue, LEN( xValue ), 1, ;
CHR( ASC( RIGHT( xValue, 1 ) ) + 1 ) )
CASE ( cType == "N" )
xValue++
CASE ( cType == "D" )
xValue++
ENDCASE
xNext := xValue
RETURN( xNext )
FUNCTION Moveb(cAlias,cKey,nReg)
LOCAL nNext:=0
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. !BOF() .AND. &((cAlias)->(IndexKey(0)))=cKey
(cAlias)->(DbSkip(-1))
nNext--
ENDDO
IF !BOF()
(cAlias)->(DbSkip())
ENDIF
nNext++
ENDIF
RETURN (nNext)
Todo esto siempre con wbrowse de Hernan Ceccarelli que es lo que yo uso. Buscate en dbwide el programa ca-windows del amigo Alfredo Arteaga que viene con parte del codigo fuente y aprenderas estas y unas cuantas cositas mas.
Otra cosa que podes hacer es usar un transitorio (cada terminal usa SU transitorio en su c: en forma exclusiva), donde guardas los registros de la factura previo dbzap() x cada factura y despues volcas los registros a la dbf. Y obviamente browseas esos registros del transitorio.
Saludos,