FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Multiarray en xBrowse
Posts: 1380
Joined: Fri Oct 14, 2005 01:28 PM
Multiarray en xBrowse
Posted: Mon Jul 18, 2011 02:57 PM

Estimados;
Tengo un array con este formato: aDatos:= { { dato1, {a1,b1,c1,d1} }, { dato2, {a2,b2,c2,g2} },....}
(Si bien lo tengo con wbrowse de Checcarelli, ahora pretendo pasarlo a xbrowse)
la idea es que el browse muestre los datos así:
|dato1|a1|b1|c1|d1|
|dato2|a2|b2|c2|d2|
...
|datox|ax|bx|cx|dx|

Desde ya muchas gracias
Saludos

Resistencia - "Ciudad de las Esculturas"

Chaco - Argentina
Posts: 401
Joined: Thu Oct 06, 2005 10:15 PM
Re: Multiarray en xBrowse
Posted: Mon Jul 18, 2011 03:49 PM
Code (fw): Select all Collapse
aDatos := {{ dato1, a1,b1,c1,d1}, { dato1, a1,b1,c1,d1}, { dato1, a1,b1,c1,d1}, { dato1, a1,b1,c1,d1} }
Saludos,



Pablo Alberto Vidal

/*

------------------------------------------------------

Harbour 3.2.0, Fivewin 17.02, BCC7

------------------------------------------------------

*/
Posts: 1380
Joined: Fri Oct 14, 2005 01:28 PM
Re: Multiarray en xBrowse
Posted: Mon Jul 18, 2011 04:56 PM
Pablo;
gracias por responder.
Por lo visto escribí mal mi consulta. Lo que no puedo hacer es definir el xbrowse.
Hice esto, usando la misma logica de wbrowse, pero me da error

Code (fw): Select all Collapse
oLst:= TXBrowse():New()
   oLst:SetArray( aDatos, .f. )

   WITH Object oLst
      :nMarqueeStyle      := MARQSTYLE_HIGHLROWMS     // barra señaladora
      :nColDividerStyle   := LINESTYLE_BLACK          // Linea Tipo
      :lColDividerComplete:= TRUE                     // Linea de columna hasta final de Brw
      :nStretchCol        := STRETCHCOL_LAST          // Ajustar ultima col, al margen derecho
      :l2007              := TRUE
   END

   WITH OBJECT oLst:AddCol()
      :cHeader:= "Columna1"
      :bStrData:= {|| aDatos[oLst:nAt,1] }
   END

   WITH OBJECT oLst:AddCol()
      :cHeader:= "Columna2"
      :bStrData:= {|| aDatos[oLst:nAt,2,1] }
   END

   oLst:CreateFromCode()

Cual sería la correcta forma de hacerlo (o que ej. me sugieren mirar)
Resistencia - "Ciudad de las Esculturas"

Chaco - Argentina
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Multiarray en xBrowse
Posted: Mon Jul 18, 2011 05:07 PM
Hola

Mario, cual es el error que te genera?

intenta de esta forma

Code (fw): Select all Collapse
WITH OBJECT oLst:AddCol()
      :cHeader:= "Columna1"
      :nArrayCol := 1  // aqui vas seleccionando las "columnas" del array
END


en ste caso no te haria falta bStrData
Posts: 1380
Joined: Fri Oct 14, 2005 01:28 PM
Re: Multiarray en xBrowse
Posted: Tue Jul 19, 2011 12:01 AM
Daniel;
gracias por responder
Si uso, segun tu sugerencia;
Code (fw): Select all Collapse
   WITH OBJECT oLst:AddCol()
      :cHeader:= "Version"
      :nArrayCol:= 1
      //:= {|| Decrypt( ::aSesamoIni[oLst:nAt,1] ) }
   END

obtengo el siguiente browse
Resistencia - "Ciudad de las Esculturas"

Chaco - Argentina
Posts: 1380
Joined: Fri Oct 14, 2005 01:28 PM
Re: Multiarray en xBrowse
Posted: Tue Jul 19, 2011 12:15 AM
diculpas; se me escapó Enviar en lugar de Vista Previa :-)

Explico un poco lo que se muestra
como expuse en el primer post el array tiene esta forma: aDatos:= { { dato1, {a1,b1,c1,d1} }, { dato2, {a2,b2,c2,g2} },....}; en el que, aclaro, todos los datos estan encriptados
Ahora bien, haciendo como me propoen Daniel, en la vista del browse me esta difieniendo dos columnas A y B, que ignoro que son, aunque puedo deducir que la columna A, muestra lo mismo que la columna "Version", o sea "dato1"..."datonn" (valores encritados) y, la colmuna B me estaría diciendo, correctamente, que la columna 2 contiene un array.
Y como de xBrowse entiendo poco, no se porque si le pido que me muestra solo la primer columna, me esta mostrando 3 (Solo para comentar lo propuesto por Daniel, ya que me faltaría saber como muestro el resto).

Por otro lado si codifico así:
Code (fw): Select all Collapse
   WITH OBJECT oLst:AddCol()
      :cHeader:= "Version"
      //:nArrayCol:= 1
      :bStrData:= {|| Decrypt( ::aSesamoIni[oLst:nAt,1] ) }
   END


entonces se produce el siguiente error:
Descripción de Error generado:
___________________________________________________

Error BASE/1111 Error de argumento: LEN
Args:
[ 1] = U


Llamadas al Stack:
___________________________________________________

Llamado desde: LEN(0)
Llamado desde: .\source\classes\XBROWSE.PRG (b)TXBROWSE:TXBROWSE(498)
Llamado desde: TXBROWSE:COLATPOS(0)
Llamado desde: .\source\classes\XBROWSE.PRG (b)TXBROWSE:TXBROWSE(500)
Llamado desde: TXBROWSE:SELECTEDCOL(0)
Llamado desde: .\source\classes\XBROWSE.PRG (b)TXBROWSE:TXBROWSE(331)
Llamado desde: TXBROWSE:NAT(0)
Llamado desde: D:\Fuen32\Temp\mgsesamo.prg (b)TSESAMO:LSTMGAPP(782)
Llamado desde: .\source\classes\XBROWSE.PRG TXBRWCOLUMN:ADJUST(8173)
Llamado desde: .\source\classes\XBROWSE.PRG TXBROWSE:ADJUST(943)
Llamado desde: .\source\classes\XBROWSE.PRG TXBROWSE:INITIATE(851)
Llamado desde: __OBJSENDMSG(0)
Llamado desde: HB_EXECFROMARRAY(0)
Llamado desde: .\source\function\HARBOUR.PRG OSEND(219)
Llamado desde: HB_EXECFROMARRAY(0)
Llamado desde: .\source\function\HARBOUR.PRG ASEND(197)
Llamado desde: .\source\classes\DIALOG.PRG TDIALOG:INITIATE(664)
Llamado desde: .\source\classes\DIALOG.PRG TDIALOG:HANDLEEVENT(928)
Llamado desde: DIALOGBOXINDIRECT(0)
Llamado desde: .\source\classes\DIALOG.PRG TDIALOG:ACTIVATE(273)
Llamado desde: D:\Fuen32\Temp\mgsesamo.prg TSESAMO:LSTMGAPP(830)
Resistencia - "Ciudad de las Esculturas"

Chaco - Argentina
Posts: 592
Joined: Tue Mar 14, 2006 11:34 PM
Re: Multiarray en xBrowse
Posted: Tue Jul 19, 2011 01:18 PM
Mario,

La estructura del array es como lo indica Pablo, { {....}, {....}, {....}, {....} } ya que cada subarray pasa a ser un "registro" y cada dato de ese subarray es un "campo".

Ignoro si existe alguna forma de mezclar diferentes tipos de datos y que se muestren correctamente.


Esta es la manera como defino mi xbrowse :

Code (fw): Select all Collapse
redefine xbrowse lbCstsFrc id 101 of oFldrCptSrc:aDialogs[3] ;
    columns 3,2,1 ;
    headers 'R.F.C.','RAZON SOCIAL','ID' ;
    pictures nil,nil,"999,999" ;
    colsizes 105,150,50 ;
    on change xxxxx() ;
    footers ;
    array { {0,"","",.f.,0,0,.f.,1} } ;
    font aSysFnts[1] autosort


Como puedes observar, en [ columns ] indicas cuales y en que orden quieres mostrar tus datos y [ array ] es la estructura de tus datos.


Saludos
FWH 10.6 + xHarbour + Borland 582
Posts: 1380
Joined: Fri Oct 14, 2005 01:28 PM
Re: Multiarray en xBrowse
Posted: Tue Jul 19, 2011 08:46 PM
Raimundo; gracias por participar de la consulta
No se porque Pablo indica ese tipo de estructura, pero no es mi caso. Quizas el lo que esta proponiendo es que cambie mi estructura y al primer campo lo ponga en un array, aunque eso implicaría bastantes cambios en el resto del fuente.
Mi caso es un array de este tipo: aDatos:= { { dato1, {a1,b1,c1,d1} }, { dato2, {a2,b2,c2,d2} },....}
Y con wBrowse lo puedo mostrar perfectamente de este modo:
Code (fw): Select all Collapse
      @0,0 LISTBOX oLst ;
           FIELDS  Decrypt( ::aSesamoIni[oLst:nAt,1] )                       , ; // dato1...datonn
                   Decrypt( ::aSesamoIni[oLst:nAt,_SUBARR,IniVersion] )      , ; // a1...ann            // _SUBARR = 2
                   Decrypt( ::aSesamoIni[oLst:nAt,_SUBARR,IniUsuario] )      , ; // b1...bnn
                   Decrypt( ::aSesamoIni[oLst:nAt,_SUBARR,IniFeCtrl ] )      , ; // c1...cnn
           SIZE    380,100 ;
           SIZES   65,130,185,70,70,100,120 ;
           OF      ::oDlg

      oLst:SetArray( ::aSesamoIni )


sera posible con xBrowse?
Resistencia - "Ciudad de las Esculturas"

Chaco - Argentina
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Multiarray en xBrowse
Posted: Wed Jul 20, 2011 04:03 AM
I am giving 4 methods. Choose any of the methods depending on the favorite programming style. All produce the same results.

Method 1 ( Syntax similar to TWBrowse, i.e., LISTBOX FIELDS command )
Method 2 ( Syntax similar to TCBrowse i.e., ADD TO oBrw command )
Method 3 ( Very old XBrowse syntax. Only way before XBrowse commands were available )
Method 4 ( New and recommended )

Method 4 works only with latest FWH.

Choose any method, programming with XBrowse is a lot more easier than other browses.

Code (fw): Select all Collapse
#include "fivewin.ch"
#include "xbrowse.ch"

//----------------------------------------------------------------------------//

function Main()

   Method3()

return nil

//----------------------------------------------------------------------------//

function Method1   // Similar to WBrowse syntax

   local aData := { { "One",   { 1, 2, 3, 4 } }, ;
                    { "Two",   { 5, 6, 7, 8 } }, ;
                    { "Three", { 9, 8, 7, 6 } }  }

   local oDlg, oBrw

   DEFINE DIALOG oDlg SIZE 300,200 PIXEL

   @ 10,10 XBROWSE oBrw SIZE -10,-10 PIXEL OF oDlg ;
      COLUMNS 1 ;
      FIELDS  { || oBrw:aRow[ 2 ][ 1 ] }, ;
              { || oBrw:aRow[ 2 ][ 2 ] }, ;
              { || oBrw:aRow[ 2 ][ 3 ] }, ;
              { || oBrw:aRow[ 2 ][ 4 ] }  ;
      HEADERS "Name", "A1", "A2", "A3", "A4" ;
      PICTURES nil, "999", "999", "999", "999" ;
      ARRAY aData CELL LINES NOBORDER

   oBrw:createFromCode()
   ACTIVATE DIALOG oDlg CENTERED

return nil

//----------------------------------------------------------------------------//

function Method2  // Similar to TCBrowse syntax

   local aData := { { "One",   { 1, 2, 3, 4 } }, ;
                    { "Two",   { 5, 6, 7, 8 } }, ;
                    { "Three", { 9, 8, 7, 6 } }  }

   local oDlg, oBrw

   method2()
   return nil

   DEFINE DIALOG oDlg SIZE 300,200 PIXEL

   @ 10,10 XBROWSE oBrw SIZE -10,-10 PIXEL OF oDlg ;
      COLUMNS 1 HEADERS "Name" ;
      ARRAY aData CELL LINES NOBORDER

   ADD TO oBrw DATA oBrw:aRow[ 2 ][ 1 ] PICTURE "999" HEADER "A1"
   ADD TO oBrw DATA oBrw:aRow[ 2 ][ 2 ] PICTURE "999" HEADER "A2"
   ADD TO oBrw DATA oBrw:aRow[ 2 ][ 3 ] PICTURE "999" HEADER "A3"
   ADD TO oBrw DATA oBrw:aRow[ 2 ][ 4 ] PICTURE "999" HEADER "A4"

   oBrw:createFromCode()
   ACTIVATE DIALOG oDlg CENTERED

return nil

//----------------------------------------------------------------------------//

function Method3  // Old XBrowse syntax, when commands were not available

   local aData := { { "One",   { 1, 2, 3, 4 } }, ;
                    { "Two",   { 5, 6, 7, 8 } }, ;
                    { "Three", { 9, 8, 7, 6 } }  }

   local oDlg, oBrw, n

   DEFINE DIALOG oDlg SIZE 300,200 PIXEL

   @ 10,10 XBROWSE oBrw SIZE -10,-10 PIXEL OF oDlg ;
      COLUMNS 1 HEADERS "Name" ;
      ARRAY aData CELL LINES NOBORDER

   for n := 1 to Len( aData[ 1 ][ 2 ] )
      WITH OBJECT oBrw:AddCol()
         :cHeader       := "A" + Str( n, 1 )
         :bEditValue    := SetColBlock( oBrw, n ) // Note: Please never use bStrData
         :cEditPicture  := "999"
      END
   next

   oBrw:createFromCode()
   ACTIVATE DIALOG oDlg CENTERED

return nil

static function SetColBlock( oBrw, nCol )
return { || oBrw:aRow[ 2 ][ nCol ] }

//----------------------------------------------------------------------------//

function Method4 // Present recommended but only with latest fwh

   local aData := { { "One",   { 1, 2, 3, 4 } }, ;
                    { "Two",   { 5, 6, 7, 8 } }, ;
                    { "Three", { 9, 8, 7, 6 } }  }

   local oDlg, oBrw

   // Works only with latest FWH

   DEFINE DIALOG oDlg SIZE 300,200 PIXEL

   @ 10,10 XBROWSE oBrw SIZE -10,-10 PIXEL OF oDlg ;
      COLUMNS 1, { || oBrw:aRow[ 2 ][ 1 ] }, ;
                 { || oBrw:aRow[ 2 ][ 2 ] }, ;
                 { || oBrw:aRow[ 2 ][ 3 ] }, ;
                 { || oBrw:aRow[ 2 ][ 4 ] }  ;
      HEADERS "Name", "A1", "A2", "A3", "A4" ;
      PICTURES nil, "999", "999", "999", "999" ;
      ARRAY aData CELL LINES NOBORDER

   oBrw:createFromCode()
   ACTIVATE DIALOG oDlg CENTERED

return nil

//----------------------------------------------------------------------------//


Regards



G. N. Rao.

Hyderabad, India
Posts: 1380
Joined: Fri Oct 14, 2005 01:28 PM
Re: Multiarray en xBrowse (SOLUCIONADO)
Posted: Wed Jul 20, 2011 11:20 PM

huge Rao!, it was what needed

Regards

Resistencia - "Ciudad de las Esculturas"

Chaco - Argentina

Continue the discussion