Xbrowse desde array vacio

Xbrowse desde array vacio

Postby Frafive » Wed Jul 09, 2008 11:30 am

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
Frafive
 
Posts: 189
Joined: Wed Apr 05, 2006 9:48 pm

Postby jfafive » Wed Jul 09, 2008 11:47 am

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.

Code: Select all  Expand view
function Main()

local aDatos

aDatos := { { "", "", "" } }

REDEFINE XBROWSE oBrw ARRAY aDatos ID ID_BRW OF oDlg

......
carga datos en array
......

oBrw:Refresh()

return nil
jfafive
 
Posts: 396
Joined: Tue Mar 18, 2008 9:41 pm
Location: Marbella

Postby Frafive » Wed Jul 09, 2008 2:48 pm

Hola

De esa forma me muestra una fila en el xbrowse, con los datos vacios, lo que quiero es que no me muestra ninguna fila y despues desde un button le voy añadiendo datos al xbrowse.

un saludo

Gabriel
Frafive
 
Posts: 189
Joined: Wed Apr 05, 2006 9:48 pm

Postby jfafive » Wed Jul 09, 2008 3:01 pm

Yo tambien tengo el browse que muestra la fila vacia. La verdad es que todavia no he dedicado tiempo a resolver ese tema.

Si lo averiguo, te lo haré saber.

Un saludo.
jfafive
 
Posts: 396
Joined: Tue Mar 18, 2008 9:41 pm
Location: Marbella

Postby ADBLANCO » Wed Jul 09, 2008 6:17 pm

Si lo logran Hacer, Me Avisan!!! :roll:
Saludos

Angel, Valencia, Venezuela

xH .997 - FW 7.9 - BCC55 - WorkShop - MySql
User avatar
ADBLANCO
 
Posts: 299
Joined: Mon Oct 22, 2007 3:03 pm
Location: Valencia - Venezuela

Postby jfafive » Thu Jul 10, 2008 2:11 pm

Hola,

Lo único mas parecido que he encontrado para que no muestre el browse, es el metodo para ocultar las columnas.

Code: Select all  Expand view

oBrw:aCols[1]:cHeader := "primera"
oCol1 := oBrw:oCol( "primera" )
oCol1:Hide()

jfafive
 
Posts: 396
Joined: Tue Mar 18, 2008 9:41 pm
Location: Marbella

Postby Antonio Linares » Wed Jul 30, 2008 12:16 pm

Este es un ejemplo para mostrar un XBrowse sin líneas y luego ir añadiéndoselas:
Code: Select all  Expand view
#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
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41866
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby quique » Thu Aug 28, 2008 1:49 am

Esto funciona si quiero limpiar el arreglo, pero ¿si no se como viene el arreglo? puede venir vacía como puede traer elementos
Saludos
Quique
User avatar
quique
 
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am

Postby Antonio Linares » Thu Aug 28, 2008 7:26 am

Quique,

Habría que comprobar que valores lleva aData.

Podríamos hacer que la Clase TXBrowse lo compruebe automaticamente, pero lo lógico sería que el programador lo compruebe según sus necesidades.

Quizás no he entendido bien lo que planteas ?
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41866
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby quique » Thu Aug 28, 2008 2:50 pm

Un ejemplo simple puede ser un listado de una busqueda

Code: Select all  Expand view
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


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  Expand view
@ 0,0 XBROWSE oBrw OF oWnd ARRAY aData HEAD "Linea", "Fecha", "Posición" AUTOCOLS
Saludos
Quique
User avatar
quique
 
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am

Postby Armando » Thu Aug 28, 2008 5:20 pm

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.

Code: Select all  Expand view
      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


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

Code: Select all  Expand view
      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)


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.

Image

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
User avatar
Armando
 
Posts: 3179
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Postby quique » Thu Aug 28, 2008 9:59 pm

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
User avatar
quique
 
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am

Postby Antonio Linares » Fri Aug 29, 2008 6:53 am

Quique,

Usando tu ejemplo como base:
Code: Select all  Expand view
#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

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.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41866
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby quique » Fri Aug 29, 2008 3:46 pm

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
User avatar
quique
 
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am

Postby Willi Quintana » Fri Aug 29, 2008 8:52 pm

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...
User avatar
Willi Quintana
 
Posts: 1010
Joined: Sun Oct 09, 2005 10:41 pm
Location: Cusco - Perú

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 36 guests