No mostrar ceros en Xbrowse y Report (Solucionados)

No mostrar ceros en Xbrowse y Report (Solucionados)

Postby sjingo » Tue Apr 21, 2009 4:18 am

Un saludo

Tengo un array que lo visualizo con XBrowse y mando a imprimir con Report, Hasta aquí todo OK. Lo que quiero es que no se visualice en pantalla ni se imprima en el reporte las celdas que contienen valores como "ceros" o fechas vacías. En definitiva comprobar si es empty() a cada celda. Hay que tomar en cuenta que el número de columnas puede variar.

El siguiente es parte del código que empleo para generar cada columna en el Report y pienso que es aquí donde se debería preguntar sobre el valor de la celda, en su parámetro {bdata}:
Code: Select all  Expand view
    oCol := RptAddColumn( { { || oXCol:cHeader } }, nil ,;
                            { bData }, nil, { cPic } ,;
                            nil,.f., nil ,;
                            cAlign, .F., .t., nil )


Pero no sé cómo iría la condición.

lo mismo quiero hacer pero en el Xbrowse, cómo sería en los dos casos. Por favor una ayuda

Marcelo Jingo
Last edited by sjingo on Fri Apr 24, 2009 3:06 am, edited 1 time in total.
Marcelo Jingo
User avatar
sjingo
 
Posts: 229
Joined: Sat Mar 18, 2006 3:42 pm
Location: Ibarra-Ecuador

Re: No mostrar ceros en Xbrowse y Report

Postby jrestojeda » Tue Apr 21, 2009 5:54 pm

Hola amigo...
Prueba lo siguiente:

Code: Select all  Expand view

// VecFec contiene fechas.
// VecImp contiene valores numéricos.

oBrow:AddCol():bEditValue:={||IF(EMPTY(VecFec[nItem1]),SPACE(10),DTOC(VecFec[nItem1]))}  

oBrow:AddCol():bEditValue:={||IF(VecImp[nItem1]=0,SPACE(10),TRAN(VecImp[nItem1],"#######.##"))}

 


Espero te sirva.
Saludos.
Ojeda Esteban Eduardo.
Buenos Aires - Argentina.
FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport
Skype: jreduojeda
User avatar
jrestojeda
 
Posts: 583
Joined: Wed Jul 04, 2007 3:51 pm
Location: Buenos Aires - Argentina

Re: No mostrar ceros en Xbrowse y Report

Postby sjingo » Wed Apr 22, 2009 4:23 am

Gracias Esteban

El código que uso para generar el Xbrowse es el siguiente:

Code: Select all  Expand view
 
Listr := TXBrowse():New( Dg_cro )
Listr:nleft:=1
Listr:ntop:=15
Listr:Setarray(acrono)
Listr:nColDividerStyle := LINESTYLE_BLACK
Listr:nRowDividerStyle := LINESTYLE_BLACK
   
for i:=1 to len(atit)
    Listr:aCols[i]:cHeader       := atit[i]
    Listr:aCols[i]:nDataStrAlign := alin[i]
    listr:aCols[i]:nHeadStrAlign := AL_CENTER
next

//Por probar, con esta linea se pone toda la columna en blanco
listr:aCols[1]:bStrData:=Listr:aCols[1]:bEditValue:={||space(10)}  

//Con esta linea intento condicionar pero obtengo error
//de acceso al array
//listr:aCols[1]:bStrData:=Listr:aCols[1]:bEditValue:={|n|if(acrono[n,1]==0,space(10),)}  

Listr:nMarqueeStyle   := MARQSTYLE_HIGHLCELL
Listr:CreateFromCode()


Cómo debería hacerlo?

Gracias de Antemano

Marcelo Jingo
Marcelo Jingo
User avatar
sjingo
 
Posts: 229
Joined: Sat Mar 18, 2006 3:42 pm
Location: Ibarra-Ecuador

Re: No mostrar ceros en Xbrowse y Report

Postby Daniel Garcia-Gil » Wed Apr 22, 2009 1:59 pm

Hola sjingo...

Te prengunto

Lo que quieres es que cuando incluyas un valor en el xbrowse si este es cero aparezca en blanco?

De ser asi puedes usar bOnPostEdit
1) llena tus array de data con espacios en blanco en las columnas respectivas
2) Puedes usar cEditPicture para que solo te acepte numeros
3) bOnPostEdit seria algo como esto oBrw:aCols[ 1 ]:bOnPostEdit := {| oCol, uValue, nKey | if( uValue == 0, space( 10 ), uValue ) }

No lo he probado... culaquier cosa comentas

Nota:
bEditValue recibe como parametro el valor en la celda, ese valor no te como indice para tu array de data
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: No mostrar ceros en Xbrowse y Report

Postby sjingo » Thu Apr 23, 2009 4:46 am

Luego de revisar cómo se crean las columnas en el código fuente del Txbrowse, pude encontrar la SOLUCION:

Modifiqué la función GenArrayBlock( bBlock, nCol, lAsString ) llamada desde el método SetArray(tabla) y que devuelve el codeblock para oCol:bstrData y para oCol:bEditvalue, asignados durante la generación de las columnas con ocol:=obrw:Addcol(). Quedando finalmente la función así:
Code: Select all  Expand view

STATIC FUNCTION GenArrayBlock( bBlock, nCol, lAsString )
   local block

   if lAsString
      block:= {||if(!empty(Eval(bBlock)[nCol ]),cValToChar(Eval(bBlock)[nCol]),space(20))} //Este es el cambio
     //block :=  {|| cValToChar( Eval( bBlock )[ nCol ] ) }  //así es la original
   else
      block :=  {|| Eval( bBlock )[ nCol ] }
   endif

RETURN block
 


Para no modificar el método Setarray() de la clase Txbrowse original, la he copiado como una función con los cambios mencionados y funciona ok tanto con los campos numéricos como fecha. Para mejorarla quisiera en lugar de asignar espacios fijos, llenar con la cantidad de espacios dependiendo del tamaño del campo; lo que no pude lograrlo, si alguien puede darme una mano bienbenida sea. De todas formas hace lo que necesito.

Ahora me falta hacerlo con el Report, que supongo debe tener el mismo principio, ya mismo lo reviso y les cuento.

Saludos a todos

Marcelo Jingo
Marcelo Jingo
User avatar
sjingo
 
Posts: 229
Joined: Sat Mar 18, 2006 3:42 pm
Location: Ibarra-Ecuador

Re: No mostrar ceros en Xbrowse y Report

Postby sjingo » Fri Apr 24, 2009 3:02 am

Les saludo sólo para informar que también he solucionado lo de los ceros y fechas vacías en el Report, seguí el ejemplo del método Report() de la clase txbrowse modificando la función MakeRepCol( oRep, oXCol ) asÍ:

Code: Select all  Expand view

static function MakeRepCol( oRep, oXCol )
   local oCol, bData, cPic //, lTotal := .F.
   local cAlign

//if ( bData := oXCol:bEditValue ) == nil //version orig de fw9.02
    ////////bData := oXCol:bStrData
    ///////////////////////////////////////////////////////////////////

if ( bData := oXCol:bStrData ) == nil
      bData := oXCol:bEditValue
   else
      cPic := oXCol:cEditPicture
endif

if bData != nil
      cAlign   := If( oXCol:nDataStrAlign  == AL_RIGHT, "RIGHT", ;
                  If( oXCol:nDataStrAlign  == AL_CENTER, "CENTER", "LEFT" ))

      oCol := RptAddColumn( { { || oXCol:cHeader } }, nil ,;
                            { bData }, nil, { cPic } ,;
                            nil,.f., nil ,;
                            cAlign, .F., .t., nil )
endif

return oCol

 


Aquí en lugar de preguntar primero por el bloque :bEditvalue como lo hace la original, pregunto por el :bStrData cargándose primero este, y si es nil se cargara otro.

Hata pronto

Marcelo Jingo
Marcelo Jingo
User avatar
sjingo
 
Posts: 229
Joined: Sat Mar 18, 2006 3:42 pm
Location: Ibarra-Ecuador


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 97 guests