Edicion de un ARRAY con xBrowse

Edicion de un ARRAY con xBrowse

Postby Marcelo Via Giglio » Wed Oct 13, 2010 4:07 pm

Buenos dias,

siendo nuevo con xBrowse he buscado la manera de hacer una edicion de un array directamente en el Browse


(Parte del codigo)
Code: Select all  Expand view


REDEFINE XBROWSE oBrw ID 103 OF oDlg ;
              ARRAY oData:aData ;
                    CELL FASTEDIT

       oCol                   := oBrw:AddCol()
       oCol:bStrData      := aData[ oBrw:nArrayAt, 5 ]
       oCol:cHeader       := "Cantidad"
       oCol:nWidth         := 70
       oCol:nDataStrAlign := 1
       oCol:nHeadStrAlign := 2

   oBrw:aCols[5]:nEditType    := EDIT_GET
   oBrw:aCols[5]:cEditPicture := "999,999.99"
   oBrw:aCols[5]:bOnPostEdit  := {|o, v, n| aData[ oBrw:nArrayAt, 5 ] := v,;
                                                           aData[ oBrw:nArrayAt, 7 ] := aData[ oBrw:nArrayAt, 5 ] * 10 }

 


Tengo algo asi, pero tengo problemas con el picture de edicion y la presentacion de la informacion (numero 999,999.99 )en el browse, he utilizado TRANSFORM ( TRANSFORM(oCol:bStrData := aData[ oBrw:nArrayAt, 5 ]) ), pero no funciona bien, ademas de darme errores al momento del bOnPostEdit referente al tipo de dato.

Hay algun ejemplo que pueda consultar con algo similar?

saludos

Marcelo
Marcelo Via Giglio
 
Posts: 1064
Joined: Fri Oct 07, 2005 3:33 pm
Location: Cochabamba - Bolivia

Re: Edicion de un ARRAY con xBrowse

Postby rolando » Wed Oct 13, 2010 4:53 pm

Marcelo,

Copio parte de código de como lo implemento. Es usando la Tdatabase pero se puede aplicar a Array.

Code: Select all  Expand view
oCol                                            := oBrw:AddCol()
oCol:cHeader                    := "DEBE"
oCol:bStrData                   := { || Transform(oDbf:DEBE,"99999.99") }
oCol:nHeadStrAlign              := AL_CENTER
oCol:nDataStrAlign              := AL_RIGHT
oCol:nWidth                     := 60
oBrw:aCols[3]:nEditType     := EDIT_GET
oBrw:aCols[3]:bOnPostEdit := {|oCol, xVal, nKey| iif( nKey != VK_ESCAPE, ;
              (oDbf:DEBE:=val(Transformo(xVal,5)) , oDbf:save() , ;
                            ActualizoCols(oDbf,oBrw,@cSaySaldo,oSaySaldo) ,;
                          oBrw:refresh() ) , ) }
oBrw:aCols[3]:cEditPicture := "@B"

 


Saludos

Rolando :D
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: Edicion de un ARRAY con xBrowse

Postby Marcelo Via Giglio » Wed Oct 13, 2010 8:28 pm

Rolando,

gracias por responder, modifique un ejemplo del directorio sample para mostrar mi problema

Code: Select all  Expand view
#include "fivewin.ch"
#include "xbrowse.ch"

function Main()

   local aData, oDlg, oBrw, oCol


   aData := { { 1,1}, ;
              { 2,2}, ;
              { 3,3}, ;
              { 4,4} }

   DEFINE DIALOG oDlg SIZE 600,300 PIXEL TITLE 'XBROWSE RAGGED ARRAYS'

   @ 10,10 XBROWSE oBrw ;
      ARRAY aData ;
      SIZE 180,100 PIXEL OF oDlg ;
      FASTEDIT CELL

   oCol = oBrw:AddCol()
   oCol:bStrData    = { || TRANSFORM( aData[obrw:nArrayAt,1],"999,999.99") }
   oCol:cHeader     = "First"
   oCol:nEditType   = EDIT_GET
   oCol:cEditPicture = "999,999.99"
   oCol:bOnPostEdit = { | oCol, xVal, nKey | aData[obrw:nArrayAt,1] := VAL(xVal) }

   oCol = oBrw:AddCol()
   oCol:bStrData    = { || TRANSFORM( aData[obrw:nArrayAt,2],"999,999.99") }
   oCol:cHeader     = "second"
   oCol:nEditType   = EDIT_GET
   oCol:cEditPicture = "999,999.99"
   oCol:bOnPostEdit = { | oCol, xVal, nKey | aData[obrw:nArrayAt,2] := VAL(xVal) }


   oBrw:CreateFromCode()

   @ 130,10 BUTTON "Next" OF oDlg ACTION oBrw:goDown() PIXEL
 
   ACTIVATE DIALOG oDlg CENTERED

return nil
 


si introduces por ejemplo "12345.67" obtienes "123.00" y yo esperaria obtener "12,345.67", vengo de utilizar le tWbrose de HDC y me estoy adaptando al xB por eso no se sus mañas :-), alguna idea

saludos y gracias

Marcelo
Marcelo Via Giglio
 
Posts: 1064
Joined: Fri Oct 07, 2005 3:33 pm
Location: Cochabamba - Bolivia

Re: Edicion de un ARRAY con xBrowse

Postby Marcelo Via Giglio » Thu Oct 14, 2010 12:34 pm

Rolando,

tal parece que las unicas opciones son no utilizar cEditPicture o cEditPicture = "@B" y dejar que al final solo en la visualizacion se acomode el dato con TRANSFORM.

Ya buscaremos tiempo para darnos una vuelta por el fuente de xBrowse

gracias y saludos

Marcelo
Marcelo Via Giglio
 
Posts: 1064
Joined: Fri Oct 07, 2005 3:33 pm
Location: Cochabamba - Bolivia

Re: Edicion de un ARRAY con xBrowse

Postby rolando » Thu Oct 14, 2010 12:52 pm

Marcelo,

Te adjunto una pequeña reforma a tu código agregando una columna más para que veas como lo uso.

Le agregue una función para que al tomar un dato "lo acomode" al formato que uso. Lo que sucede es que no uso la coma como vos, solamente el punto decimal. Miralo y quizás ayude en algo.

Saludos.

Rolando :D
Code: Select all  Expand view
#include "fivewin.ch"
#include "xbrowse.ch"

function Main()

   local aData, oDlg, oBrw, oCol


   aData := { { 1,1,1}, ;
              { 2,2,2}, ;
              { 3,3,3}, ;
              { 4,4,4} }

   DEFINE DIALOG oDlg SIZE 600,300 PIXEL TITLE 'XBROWSE RAGGED ARRAYS'

   @ 10,10 XBROWSE oBrw ;
      ARRAY aData ;
      SIZE 180,100 PIXEL OF oDlg ;
      FASTEDIT CELL

   oCol = oBrw:AddCol()
   oCol:bStrData    = { || TRANSFORM( aData[obrw:nArrayAt,1],"999,999.99") }
   oCol:cHeader     = "First"
   oCol:nEditType   = EDIT_GET
   oCol:cEditPicture = "999,999.99"
   oCol:bOnPostEdit = { | oCol, xVal, nKey | aData[obrw:nArrayAt,1] := VAL(xVal) }

   oCol = oBrw:AddCol()
   oCol:bStrData    = { || TRANSFORM( aData[obrw:nArrayAt,2],"999,999.99") }
   oCol:cHeader     = "second"
   oCol:nEditType   = EDIT_GET
   oCol:cEditPicture = "999,999.99"
   oCol:bOnPostEdit = { | oCol, xVal, nKey | aData[obrw:nArrayAt,2] := VAL(xVal) }

                        //-----------------------------------------//
   oCol                                := oBrw:AddCol()
   oCol:cHeader        := "DEBE"
   oCol:bStrData       := { || Transform(aData[obrw:nArrayAt,3],"99999.99") }            
   oCol:nHeadStrAlign  := AL_CENTER
   oCol:nDataStrAlign  := AL_RIGHT   // AL_LEFT
   oCol:nWidth         := 60
   oBrw:aCols[3]:nEditType := EDIT_GET
   oBrw:aCols[3]:bOnPostEdit := {|oCol, xVal, nKey| iif( nKey != VK_ESCAPE, ;
                     (aData[obrw:nArrayAt,3]:=val(Transformo(xVal,5)) ,;
                     oBrw:refresh() ) , ) }
   oBrw:aCols[3]:cEditPicture := "@B"

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


   oBrw:CreateFromCode()

   @ 130,10 BUTTON "Next" OF oDlg ACTION oBrw:goDown() PIXEL
 
   ACTIVATE DIALOG oDlg CENTERED

return nil



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

 Function Transformo(cValor,nDigitos)   // nDigitos es cant numeros permitidos antes del punto

     local cTransformada , nPunto , nLen , cCifra , cDecimales



     nLen:=len(cValor)
     nPunto:=at(".",cValor)       // en nPunto tengo el lugar del punto o cero si no tiene punto

     if nPunto > 1 .and. nPunto <> nLen
         if nPunto < (nDigitos+1)
           cCifra       := substr(cValor,1,(nPunto-1))
             cDecimales := substr(cValor,(nPunto+1),(nLen-nPunto))
             if len(cDecimales) = 1
                 cDecimales:=cDecimales+"0"
             endif
             cTransformada:=cCifra+"."+cDecimales
             Return cTransformada
         endif
     endif

     if nPunto = 0    // si no tiene punto
         if len(cValor) > nDigitos           //3
             cCifra         :=  substr(cValor,1,nDigitos) // extraigo cifra sin punto decimal
             cDecimales :=  substr(cValor,(nDigitos+1),(len(cValor)-(nDigitos+1)))
             if len(cDecimales) = 1
                cDecimales:=cDecimales+"0"
             endif
             if len(cDecimales) > 2
                cDecimales:=str(round(val(cCifra+cDecimales),2))
                cDecimales:=substr(cDecimales,(len(cDecimales)-2))
             endif
         endif
         if len(cValor) < nDigitos
             cCifra         :=  alltrim(cValor)  
             cDecimales :=  "00"
         endif
         cTransformada:=cCifra+"."+cDecimales
         Return cTransformada
     endif

     cTransformada := cValor
 Return cTransformada
 
 // ------------------------------------------------------------------------------------
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: Edicion de un ARRAY con xBrowse

Postby jbrita » Thu Oct 14, 2010 1:21 pm

Tambien se puede ocupar asi, yo de esta manera lo ocupos para los browse y listados

Coma_Pto(TRANSFORM((x_total1-neto_x),"99,999,999")
Coma_Pto(TRANSFORM((x_total1-neto_x),"99,999,999.99")


*---------------------------------------------
*
* Cambia las Comas por Puntos y los Puntos por Coma
*----------------------------------------------------
FUNCTION Coma_Pto
*----------------
PARAMETERS tira

long = LEN(tira)
tira = SPACE(01) + tira + SPACE(01)
posz = long + 1
DO WHILE SUBSTR(tira,posz,1) <> SPACE(01)
IF SUBSTR(tira,posz,1) = ","
tira = SUBSTR(tira,1,posz - 1) + "." + SUBSTR(tira,posz + 1,long - posz + 2)
ELSE
IF SUBSTR(tira,posz,1) = "."
tira = SUBSTR(tira,1,posz - 1) + "," + SUBSTR(tira,posz + 1,long - posz + 2)
ENDIF
ENDIF
posz = posz - 1
ENDDO
RETURN SUBSTR(tira,2,long)
jbrita
 
Posts: 502
Joined: Mon Jan 16, 2006 3:42 pm

Re: Edicion de un ARRAY con xBrowse

Postby jbrita » Thu Oct 14, 2010 1:22 pm

jbrita wrote:Tambien se puede ocupar asi, yo de esta manera lo ocupos para los browse y listados

Coma_Pto(TRANSFORM((x_total1-neto_x),"99,999,999")
Coma_Pto(TRANSFORM((x_total1-neto_x),"99,999,999.99")


*---------------------------------------------
*
* Cambia las Comas por Puntos y los Puntos por Coma
*----------------------------------------------------
FUNCTION Coma_Pto*----------------
PARAMETERS tira

long = LEN(tira)
tira = SPACE(01) + tira + SPACE(01)
posz = long + 1
DO WHILE SUBSTR(tira,posz,1) <> SPACE(01)
IF SUBSTR(tira,posz,1) = ","
tira = SUBSTR(tira,1,posz - 1) + "." + SUBSTR(tira,posz + 1,long - posz + 2)
ELSE
IF SUBSTR(tira,posz,1) = "."
tira = SUBSTR(tira,1,posz - 1) + "," + SUBSTR(tira,posz + 1,long - posz + 2)
ENDIF
ENDIF
posz = posz - 1
ENDDO
RETURN SUBSTR(tira,2,long)
jbrita
 
Posts: 502
Joined: Mon Jan 16, 2006 3:42 pm

Re: Edicion de un ARRAY con xBrowse

Postby Marcelo Via Giglio » Thu Oct 14, 2010 2:20 pm

Gracias por las respuestas,

tal parece que el cPictureEdit no es tomado en cuenta, ya que si pruebas en tu ejemplo Rolando, tu puedes digitar letras y no solo numeros como deberia ser, pero bueno supongo que sobrevivire con esto :-)

Gracias Rolando y jBrita

Marcelo
Marcelo Via Giglio
 
Posts: 1064
Joined: Fri Oct 07, 2005 3:33 pm
Location: Cochabamba - Bolivia

Re: Edicion de un ARRAY con xBrowse

Postby Daniel Garcia-Gil » Thu Oct 14, 2010 2:47 pm

Marcelo

No es tan complicado...

Te presento 3 formas de hacerlo

1) dejar a xbrowse hacer el trabajo

Code: Select all  Expand view
  @ 10,10 XBROWSE oBrw ;
      ARRAY aData ;
      COLUMNS 1, 2;      
      COLSIZES 100, 100;
      SIZE 180,100 PIXEL OF oDlg ;
      FASTEDIT CELL;
      PICTURE "999,999.99", "999,999.99"
     
   AEval( oBrw:aCols, {| oCol | oCol:nEditType := EDIT_GET  })  


2) Haces tu el trabajo

Code: Select all  Expand view
  @ 10,10 XBROWSE oBrw ;
      ARRAY aData ;
      SIZE 180,100 PIXEL OF oDlg ;
      FASTEDIT CELL

   oCol = oBrw:AddCol()
   oCol:cHeader     = "First"
   oCol:nEditType   = EDIT_GET
   oCol:cEditPicture = "999,999.99"
   oCol:nArrayCol    = 1

   oCol = oBrw:AddCol()
   oCol:cHeader     = "second"
   oCol:nEditType   = EDIT_GET
   oCol:cEditPicture = "999,999.99"
   oCol:nArrayCol    = 2


3) combinado

Code: Select all  Expand view
  @ 10,10 XBROWSE oBrw ;
      ARRAY aData ;
      SIZE 180,100 PIXEL OF oDlg ;
      FASTEDIT CELL
   
   ADD TO oBrw ARRAY ELEMENT 1 TITLE "First"  EDITABLE PICTURE "999,999.99"
   
   ADD TO oBrw ARRAY ELEMENT 2  TITLE "Second" EDITABLE PICTURE "999,999.99"
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: Edicion de un ARRAY con xBrowse

Postby Marcelo Via Giglio » Thu Oct 14, 2010 3:57 pm

Daniel,

muchas gracias, lo has planteado de una manera muy sencilla, ahora a probar

gracias

Marcelo
Marcelo Via Giglio
 
Posts: 1064
Joined: Fri Oct 07, 2005 3:33 pm
Location: Cochabamba - Bolivia

Re: Edicion de un ARRAY con xBrowse

Postby rolando » Thu Oct 14, 2010 4:52 pm

Marcelo,

Tienes razón. Lo que pasa es que yo lo uso editando directamente la DBF, no un array y los campos en los que aplico esto son del tipo Numérico (no aceptan letras).

Saludos.

Rolando :D
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: FiveWiDi and 48 guests