Page 1 of 1

Multiarray en xBrowse

Posted: Mon Jul 18, 2011 2:57 pm
by MarioG
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

Re: Multiarray en xBrowse

Posted: Mon Jul 18, 2011 3:49 pm
by pablovidal

Code: Select all

aDatos := {{ dato1, a1,b1,c1,d1}, { dato1, a1,b1,c1,d1}, { dato1, a1,b1,c1,d1}, { dato1, a1,b1,c1,d1} }
 

Re: Multiarray en xBrowse

Posted: Mon Jul 18, 2011 4:56 pm
by MarioG
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: Select all

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)

Re: Multiarray en xBrowse

Posted: Mon Jul 18, 2011 5:07 pm
by Daniel Garcia-Gil
Hola

Mario, cual es el error que te genera?

intenta de esta forma

Code: Select all

WITH OBJECT oLst:AddCol()
      :cHeader:= "Columna1"
      :nArrayCol := 1  // aqui vas seleccionando las "columnas" del array
END
en ste caso no te haria falta bStrData

Re: Multiarray en xBrowse

Posted: Tue Jul 19, 2011 12:01 am
by MarioG
Daniel;
gracias por responder
Si uso, segun tu sugerencia;

Code: Select all

   WITH OBJECT oLst:AddCol()
      :cHeader:= "Version"
      :nArrayCol:= 1
      //:bStrData:= {|| Decrypt( ::aSesamoIni[oLst:nAt,1] ) }
   END
 
obtengo el siguiente browse
Image

Re: Multiarray en xBrowse

Posted: Tue Jul 19, 2011 12:15 am
by MarioG
diculpas; se me escapó Enviar en lugar de Vista Previa :oops:

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: Select all

   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)

Re: Multiarray en xBrowse

Posted: Tue Jul 19, 2011 1:18 pm
by Raymundo Islas M.
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: Select all

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

Re: Multiarray en xBrowse

Posted: Tue Jul 19, 2011 8:46 pm
by MarioG
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: Select all

      @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?

Re: Multiarray en xBrowse

Posted: Wed Jul 20, 2011 4:03 am
by nageswaragunupudi
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: Select all

#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

//----------------------------------------------------------------------------//
 
Image

Re: Multiarray en xBrowse (SOLUCIONADO)

Posted: Wed Jul 20, 2011 11:20 pm
by MarioG
huge Rao!, it was what needed

Regards