FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Edicion de un ARRAY con xBrowse
Posts: 1088
Joined: Fri Oct 07, 2005 03:33 PM
Edicion de un ARRAY con xBrowse
Posted: Wed Oct 13, 2010 04: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 (fw): Select all Collapse
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
Posts: 593
Joined: Sat May 12, 2007 11:47 AM
Re: Edicion de un ARRAY con xBrowse
Posted: Wed Oct 13, 2010 04:53 PM
Marcelo,

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

Code (fw): Select all Collapse
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 :-)
Posts: 1088
Joined: Fri Oct 07, 2005 03:33 PM
Re: Edicion de un ARRAY con xBrowse
Posted: Wed Oct 13, 2010 08:28 PM
Rolando,

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

Code (fw): Select all Collapse
#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
Posts: 1088
Joined: Fri Oct 07, 2005 03:33 PM
Re: Edicion de un ARRAY con xBrowse
Posted: 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

Posts: 593
Joined: Sat May 12, 2007 11:47 AM
Re: Edicion de un ARRAY con xBrowse
Posted: 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 :-)
Code (fw): Select all Collapse
#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
聽
聽// ------------------------------------------------------------------------------------
Posts: 537
Joined: Mon Jan 16, 2006 03:42 PM
Re: Edicion de un ARRAY con xBrowse
Posted: Thu Oct 14, 2010 01: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)

Posts: 537
Joined: Mon Jan 16, 2006 03:42 PM
Re: Edicion de un ARRAY con xBrowse
Posted: Thu Oct 14, 2010 01: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)
Posts: 1088
Joined: Fri Oct 07, 2005 03:33 PM
Re: Edicion de un ARRAY con xBrowse
Posted: Thu Oct 14, 2010 02: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

Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Edicion de un ARRAY con xBrowse
Posted: Thu Oct 14, 2010 02:47 PM
Marcelo

No es tan complicado...

Te presento 3 formas de hacerlo

1) dejar a xbrowse hacer el trabajo

Code (fw): Select all Collapse
 聽 @ 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 (fw): Select all Collapse
 聽 @ 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 (fw): Select all Collapse
 聽 @ 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"
Posts: 1088
Joined: Fri Oct 07, 2005 03:33 PM
Re: Edicion de un ARRAY con xBrowse
Posted: Thu Oct 14, 2010 03:57 PM

Daniel,

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

gracias

Marcelo

Posts: 593
Joined: Sat May 12, 2007 11:47 AM
Re: Edicion de un ARRAY con xBrowse
Posted: Thu Oct 14, 2010 04: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

Continue the discussion