Xbrowse desde array vacio
Xbrowse desde array vacio
Hola amigos
Se puede crear un xbrowse con un array y esta array que este vacio ?
La idea ir llenado el array desde un button y resfrescando el browse, pero siempre me da el error array acces.
un saludo
Se puede crear un xbrowse con un array y esta array que este vacio ?
La idea ir llenado el array desde un button y resfrescando el browse, pero siempre me da el error array acces.
un saludo
Hola,
Bueno, yo tengo hecho algo parecido y espero te sirva.
En realidad es un XBrowse definido a partir de un array vacio también.
Y luego, a partir de un botón, lo relleno de elementos y hago un refresh.
Espero te sirva, un saludo.
Javier.
Bueno, yo tengo hecho algo parecido y espero te sirva.
En realidad es un XBrowse definido a partir de un array vacio también.
Y luego, a partir de un botón, lo relleno de elementos y hago un refresh.
Espero te sirva, un saludo.
Javier.
Code: Select all
function Main()
local aDatos
aDatos := { { "", "", "" } }
REDEFINE XBROWSE oBrw ARRAY aDatos ID ID_BRW OF oDlg
......
carga datos en array
......
oBrw:Refresh()
return nil
Hola,
Lo único mas parecido que he encontrado para que no muestre el browse, es el metodo para ocultar las columnas.
Lo único mas parecido que he encontrado para que no muestre el browse, es el metodo para ocultar las columnas.
Code: Select all
oBrw:aCols[1]:cHeader := "primera"
oCol1 := oBrw:oCol( "primera" )
oCol1:Hide()
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Este es un ejemplo para mostrar un XBrowse sin líneas y luego ir añadiéndoselas:
Code: Select all
#include "FiveWin.ch"
#include "XBrowse.ch"
function Main()
local oWnd,oBrw,aData
aData := { { "Linea", Date(), 0 } }
DEFINE WINDOW oWnd TITLE "Click botón derecho a la derecha de las columnas"
@ 0,0 XBROWSE oBrw OF oWnd ARRAY aData AUTOCOLS
oBrw:CreateFromCode()
oWnd:oClient := oBrw
oBrw:bRClicked := { || AddRow( oBrw ) }
ACTIVATE WINDOW oWnd ;
ON INIT ( ASize( aData, 0 ), oBrw:GoTop(), oBrw:Refresh() )
return nil
function AddRow( oBrw )
local n := oBrw:nLen + 1
AAdd( oBrw:aArrayData, { Str( n ), Date() + n, n } )
oBrw:GoBottom()
oBrw:Refresh()
return nil
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Un ejemplo simple puede ser un listado de una busqueda
En este caso no sabemos cual será el resultado de aData, pero si sabemos que son 3 columnas y va a marcar error al llegar, otra forma podría ser
Code: Select all
aData := {}
DO WHILE !eof
if date == date()
aAdd( aData, { linea, fecha, posicion } )
endIf
ENDDO
@ 0,0 XBROWSE oBrw OF oWnd ARRAY aData COLS 1,2,3
Code: Select all
@ 0,0 XBROWSE oBrw OF oWnd ARRAY aData HEAD "Linea", "Fecha", "Posición" AUTOCOLS
Saludos
Quique
Quique
Amigos:
Tal vez la solución sea definir el xBrowse y sus columnas pero condicionar el contenido de cada columna a que el arreglo no este vacio.
A ver si me explico:
yo uso este código pero con un record set, pero puede darse el caso de que el recordset este vacio y es ahí donde esta la similitud y entra la parte de la condición.
Observen que los datos de cada columna estan condicionados a que el record set no este vacio, despues tambien condicionamos algunos bloques de código
De esta forma puedo ver el xbrowse vacio sin renglón alguno más cuando se agrega algun registro este se muestra en el browse.
Esta es la imágen del browse vacio.
En fin, es solo una idea que habra que adaptarla al uso de arreglos.
Ojala sirva para despertar ideas.
Saludos
Tal vez la solución sea definir el xBrowse y sus columnas pero condicionar el contenido de cada columna a que el arreglo no este vacio.
A ver si me explico:
yo uso este código pero con un record set, pero puede darse el caso de que el recordset este vacio y es ahí donde esta la similitud y entra la parte de la condición.
Code: Select all
oBrw:=TxBrowse():New(oDlg)
oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW // Con cursor de todo el renglón
oBrw:nColDividerStyle := LINESTYLE_LIGHTGRAY
oBrw:nRowDividerStyle := LINESTYLE_LIGHTGRAY
oBrw:lColDividerComplete := (.F.) // (.T.) Matiene siempre llena la pantalla
oBrw:nHeaderHeight := 25 // Altura de los encabezados
oBrw:nRowHeight := 22 // Altura del renglón
oBrw:nHeaderLines := 1 // Número de líneas de encabezados
oBrw:nDataLines := 1 // Número de líneas de detalle
oBrw:nFooterHeight := 20 // Altura del footer
oBrw:nFooterLines := 1 // Número de líneas en el footer
oBrw:lFooter := (.T.) // Sí queremos línea de footer
oBrw:lHScroll := (.F.) // Quitamos el scroll horizontal
aCol[ 1] := oBrw:AddCol()
aCol[ 1]:bStrData := { || IF(oRsRes:BOF() .AND. oRsRes:EOF(),SPACE(1),oRsRes:Fields("RES_NOM"):Value)}
aCol[ 1]:cHeader := "Nombre del residente"
aCol[ 1]:nHeadStrAlign := AL_LEFT
aCol[ 1]:nDataStrAlign := AL_LEFT
aCol[ 1]:nWidth := 350
aCol[ 2] := oBrw:AddCol()
aCol[ 2]:bStrData := { || IF(oRsRes:BOF() .AND. oRsRes:EOF(),SPACE(1),oRsRes:Fields("RES_INI"):Value)}
aCol[ 2]:cHeader := "Iniciales"
aCol[ 2]:nHeadStrAlign := AL_LEFT
aCol[ 2]:nDataStrAlign := AL_LEFT
aCol[ 2]:nWidth := 45
Code: Select all
oBrw:bGoTop := { || IF( ! oRsRes:BOF() .AND. ! oRsRes:EOF(), oRsRes:MoveFirst(), ) }
oBrw:bGoBottom := { || IF( ! oRsRes:BOF() .AND. ! oRsRes:EOF(), oRsRes:MoveLast(), ) }
oBrw:bBof := { || oRsRes:BOF() }
oBrw:bEof := { || oRsRes:EOF() }
oBrw:bBookMark := { | uBm | IF( oRsRes:BOF() .AND. oRsRes:EOF(), 0, IF( uBm == NIL, oRsRes:BookMark, oRsRes:BookMark := uBm ) ) }
oBrw:bKeyNo := { | n | IF( oRsRes:BOF() .AND. oRsRes:EOF(), 0, IF( n == NIL, oRsRes:AbsolutePosition, oRsRes:AbsolutePosition := n ) ) }
oBrw:bKeyCount := {|| oRsRes:RecordCount() }
oBrw:SetAdo(oRsRes)
Esta es la imágen del browse vacio.
En fin, es solo una idea que habra que adaptarla al uso de arreglos.
Ojala sirva para despertar ideas.
Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Pues el experto en el tema sería Antonio porque el problema es manejarlo de manera general para que lo detecte el xbrowse, yo creo que lo mas fácil sería detectar si el array está vacío y no mostrar la línea, supongo que de alguna manera eso hace porque en el ejemplo que puso antonio o en el que pusiste tu así se muestra.
Saludos
Quique
Quique
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Quique,
Usando tu ejemplo como base:
Sería deseable que FiveWin modificase automaticamente el contenido de aData ? y variarle sus datos sin que el programador lo sepa ?
Creo que es preferible generar un error para mostrarle que aData no contiene los datos correctos.
Usando tu ejemplo como base:
Code: Select all
#include "FiveWin.ch"
#include "XBrowse.ch"
function Main()
local oWnd, oBrw, aData := {}
DEFINE WINDOW oWnd
@ 0, 0 XBROWSE oBrw OF oWnd ARRAY aData HEAD "One", "Two", "Three" AUTOCOLS
oBrw:CreateFromCode()
oWnd:oClient = oBrw
ACTIVATE WINDOW oWnd
return nil
Creo que es preferible generar un error para mostrarle que aData no contiene los datos correctos.
No hay que modificar los datos, simplemente mostrar un browse vacío, ese no es error, si lo que quiero mostrar es el listado de las facturas y ese día no se ha facturado, o si quiero mostrar la lista de personas que trabajaron horas extra el día anterior y nadie se quedó, no son errores, simplemente, es un browse vacío
Saludos
Quique
Quique
- Willi Quintana
- Posts: 859
- Joined: Sun Oct 09, 2005 10:41 pm
- Location: Cusco - Perú
- Contact:
Lo hago asi con twbrowse, el concepto seria el mismo para otro
browser
Salu2
.....
...
..
.
aDetalle := {}
AaDd(aDetalle, {"", "", "", 0, 0, 0, "", ""})
...
....
DEFINE DIALOG oDlgB ;
....
...
REDEFINE LISTBOX oLbxA ;
FIELDS aDetalle[oLbxA:nAt, 2], ;
aDetalle[oLbxA:nAt, 3], ;
STR(aDetalle[oLbxA:nAt, 4],12,3), ;
STR(aDetalle[oLbxA:nAt, 5],12,3), ;
STR(aDetalle[oLbxA:nAt, 6],12,3) ;
HEADERS "Producto", ;
"Unidad", ;
"Cantidad", ;
"Precio", ;
"Sub Total" ; //
....
...
..
.
REDEFINE BUTON oRell
ACTION (aDetalle := LlenaDetas(cCodigo, aDetalle), ;
oLbxA:SetArray(aDetalle), ;
oLbxA:Refresh())
...
..
Function LlenaDetas(cCodigo,aDetalle)
If !DbSeek(cCodigo)
Return(adetalle)
EndIf
aDetalle := {}
.... aqui relleno el array segun los datos
Return(aDetalle) // retorna el arreglo con datos...
browser
Salu2
.....
...
..
.
aDetalle := {}
AaDd(aDetalle, {"", "", "", 0, 0, 0, "", ""})
...
....
DEFINE DIALOG oDlgB ;
....
...
REDEFINE LISTBOX oLbxA ;
FIELDS aDetalle[oLbxA:nAt, 2], ;
aDetalle[oLbxA:nAt, 3], ;
STR(aDetalle[oLbxA:nAt, 4],12,3), ;
STR(aDetalle[oLbxA:nAt, 5],12,3), ;
STR(aDetalle[oLbxA:nAt, 6],12,3) ;
HEADERS "Producto", ;
"Unidad", ;
"Cantidad", ;
"Precio", ;
"Sub Total" ; //
....
...
..
.
REDEFINE BUTON oRell
ACTION (aDetalle := LlenaDetas(cCodigo, aDetalle), ;
oLbxA:SetArray(aDetalle), ;
oLbxA:Refresh())
...
..
Function LlenaDetas(cCodigo,aDetalle)
If !DbSeek(cCodigo)
Return(adetalle)
EndIf
aDetalle := {}
.... aqui relleno el array segun los datos
Return(aDetalle) // retorna el arreglo con datos...