Page 1 of 1

Algun ejemplo con ADO y TXBrowse ?

Posted: Wed Sep 19, 2007 1:24 pm
by Armando
Amigos del foro:

Estoy intentando mis primeros pasos con ADO y pretendo hacer un browse con TXBrowse, esto es parte de mi código

oBrw := TXBrowse():New( oWnd )

oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW
oBrw:lColDividerComplete := (.T.)
oBrw:nRowDividerStyle := LINESTYLE_LIGHTGRAY
oBrw:nColDividerStyle := LINESTYLE_LIGHTGRAY
oBrw:nHeaderLines := 1
oBrw:nFooterLines:= 1
oBrw:nDataLines := 1
oBrw:lFooter:= (.T.)
oBrw:lHScroll:= (.F.)
oBrw:SetAdo(oDatos)

oBrw:bGoTop:= {|| oDatos:MoveFirst() }
oBrw:bGoBottom:= {|| oDatos:MoveLast() }
oBrw:bBof:= {|| oDatos:Bof() }
oBrw:bEof:= {|| oDatos:Eof() }
oBrw:bSkip:= { | nSkip | Skipper( oDatos, nSkip ) }
oBrw:bKeyCount:= {|| oDatos:RecordCount() }

aCol[ 1]:= oBrw:AddCol()
aCol[ 1]:bStrData := { || oDatos:Fields(0):Value}
aCol[ 1]:cHeader := "ESTILO"
aCol[ 1]:nHeadStrAlign:= AL_LEFT
aCol[ 1]:nDataStrAlign:= AL_LEFT
aCol[ 1]:nWidth:= 249

oBrw:CreateFromCode()

oWnd:SetControl( oBrw )

Como se puede apreciar solo estoy creando el browse con una sola columna a pesar de que el recordset esta creado con 2 campos, pues bien el browse se muestra con tres columnas, los _ del recordset más la columna que estoy creando, por qué ?, ademas el browse pinta solo el primer renglón, debo ir avanzando haca abajo del browse para que se muestren el resto de los renglones.

Seguramente hay algo que me esta faltando, pero que es ?, alguien que tenga un pequeño ejemplo para crear el browse con TXbrowse y RECORDSET ???

Muy agradecido por su apoyo

Posted: Wed Sep 19, 2007 3:50 pm
by Biel EA6DD
Hola Armando,
lo primero que veo es que utilizas SetAdo antes de definir las columnas. SetAdo debieras colocarlo al final antes del CreateFromCode.

En el metodo SetAdo, si el Browse no tiene definido columnas, le añade todas las columnas del recordset que recibe de parametro. Ademas tambien define los codeblocks de movimiento si no estan definidos.

Pruebalo de la siguiente manera.

Code: Select all

oBrw := TXBrowse():New( oWnd ) 

oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW 
oBrw:lColDividerComplete := (.T.) 
oBrw:nRowDividerStyle := LINESTYLE_LIGHTGRAY 
oBrw:nColDividerStyle := LINESTYLE_LIGHTGRAY 
oBrw:nHeaderLines := 1 
oBrw:nFooterLines:= 1 
oBrw:nDataLines := 1 
oBrw:lFooter:= (.T.) 
oBrw:lHScroll:= (.F.) 

aCol[ 1]:= oBrw:AddCol() 
aCol[ 1]:bStrData := { || oDatos:Fields(0):Value} 
aCol[ 1]:cHeader := "ESTILO" 
aCol[ 1]:nHeadStrAlign:= AL_LEFT 
aCol[ 1]:nDataStrAlign:= AL_LEFT 
aCol[ 1]:nWidth:= 249 

oBrw:SetAdo(oDatos)
oBrw:CreateFromCode() 

oWnd:SetControl( oBrw ) 

Posted: Wed Sep 19, 2007 4:31 pm
by Armando
Biel:

Excelente explicación, el primer problema se ha solucionado, muchas gracias.

Tengo definida la función Skipper() así

STATIC FUNCTION Skipper( oDatos, nSkip )
LOCAL nRec := oDatos:AbsolutePosition
oDatos:Move( nSkip )
IF oDatos:EOF()
oDatos:MoveLast()
ENDIF
IF oDatos:BOF()
oDatos:MoveFirst()
ENDIF
RETURN(oDatos:AbsolutePosition - nRec)

Pero aún así me sigue mostrando solo el primer registro del recordset cuando tiene 5423 registros y al ir avanzando hacia abajo los va pintando. Que será ?

Saludos y muchas gracias nuevamente

Posted: Thu Sep 20, 2007 7:17 am
by Biel EA6DD
La funcion skipper, parece correcta. De todas formas si utilizas el metodo SetAdo, no hace falta definas ningún codeblock de movimiento ni funcion skipper. tXBrowse ya lleva definida la funcion para salto de registros, y si no estan definidos, define todos los codeblock para movimiento dentro del cursor (bGoTop,bGoBottom,bSkip,bBof,bEof,bBookMark,bKeyno, bKeyCount).
Prueba a compilar con el codigo que te puse en el mensaje anterior, sin definir ningun codeblock, para ver que resultado obtienes.

Posted: Thu Sep 20, 2007 1:15 pm
by Armando
Biel:

EXCELENTE !, ahora todo funciona muy bien.

Grande Maestro.

Un Abrazo