Page 1 of 1

Como me refiero al total de una columna (SOLUCIONADO)

Posted: Fri Nov 13, 2020 4:45 am
by Armando
Hola amigos del foro:

En el siguiente trozo de código de un xBrowse con selección multiple

Code: Select all

                WITH OBJECT :Arriendo
                    :cOrder := "A"
               :bFooter      := { || Len( oBry:aSelected ) }
                END

            WITH OBJECT :Importe
               :nFooterType   := AGGR_SUM
               :bSumCondition := { || AScan( oBry:aSelected, oBry:BookMark ) > 0 }
               :cFooterPicture   := "@Z 9,999,999,999.99"
            END

            :bOnMultiSelect   := { || oBry:MakeTotals() }
            :bChange          := { || IF( LEN( oBry:aSelected ) <= 1,( oBry:oCol(05):nTotal := oBry:oCol(05):Value,;
                                            oBry:oCol(05):RefreshFooter() ),NIL ) }

            :MakeTotals()
 
Necesito condicionar la activación de un botón cuando el usuario haya seleccionado
al menos un renglón del xBrowse, puede ser en la cantidad de renglones seleccionados
o al importe total de la columna sumada, en este ejemplo la columna 05, cómo?

Muchas gracias

Re: Como me refiero al total de una columna

Posted: Fri Nov 13, 2020 9:28 am
by Ariel
Hola,

Podes probar :

1) el total de lo seleccionado con :

if LEN(oBrw:aSelected) > 0 // ya tenes al menos 1 reg seleccionado.

2) el total de la columna

if oBrw:importe:nTotal > 0 // ya tenes al menos 1 mov con importe mayor a 0

para esto tene en cuenta 2 cosas q no veo en tu code,
1) cuando definis el xbrowse tenes que ponerle FOOTERS o activar oBrw:lFooter:= .t.
2) cuando definis la columna
WITH OBJECT :Importe
:nFooterType := AGGR_SUM
:bSumCondition := { || AScan( oBry:aSelected, oBry:BookMark ) > 0 }
:cFooterPicture := "@Z 9,999,999,999.99"
// estas lineas
:nTotal := 0
:lTotal := .t.
END

Espero te sirva.
Saludos.

Re: Como me refiero al total de una columna

Posted: Fri Nov 13, 2020 2:37 pm
by Armando
Ariel y amigos:

Gracias por tu consejo pero no me funciona aún, adjunto trozo de código
por si ustedes ven algo que yo no
REDEFINE XBROWSE oBry ID 300 OF oDlg;
DATASOURCE oRsAde;
COLUMNS "ADE_ARR","ADE_AMO","ADE_MES","ADE_CPT","ADE_IMP";
HEADERS "Arriendo","Año","Mes","Cpt","Importe";
COLSIZES 65,40,40,20,90;
PICTURES "@Z 9999999","@Z 9999","@Z 99",NIL,"@Z 999,999.99";
JUSTIFY {AL_RIGHT,AL_RIGHT,AL_RIGHT};
FOOTERS AUTOSORT BACKGROUND oApp:cBrush

WITH OBJECT oBry
:l2007 := (.F.)
:lHScroll := (.F.)
:lVScroll := (.F.)
:lFooter := (.T.)
:nMarqueeStyle := MARQSTYLE_HIGHLROWMS
:nColDividerStyle := LINESTYLE_LIGHTGRAY
:nRowDividerStyle := LINESTYLE_LIGHTGRAY
:nStretchCol := STRETCHCOL_WIDEST
:nHeaderHeight := 25
:nRowHeight := 22
:nFooterHeight := 25
:bClrHeader := { || {CLR_WHITE,CLR_BLACK} }
:bClrFooter := { || {CLR_WHITE,CLR_BLACK} }
:bClrSel := { || IF( oBry:KeyNo % oApp:nRowsInt == 0 ,{ CLR_BLACK, oApp:nRowParClr },{ CLR_BLACK, oApp:nRowNonClr }) }
:bClrSelFocus := { || {oApp:nFClrFocus,oApp:nBClrFocus} }
:bClrStd := { || IF( oBry:KeyNo % oApp:nRowsInt == 0 ,{ CLR_BLACK, oApp:nRowParClr },{ CLR_BLACK, oApp:nRowNonClr }) }
:nRecSelColor := oApp:nRowParClr
:lDisplayZeros := (.F.)

WITH OBJECT :Arriendo
:cOrder := "A"
:bFooter := { || Len( oBry:aSelected ) }
END

WITH OBJECT :Importe
:nFooterType := AGGR_SUM
:bSumCondition := { || AScan( oBry:aSelected, oBry:BookMark ) > 0 }
:cFooterPicture:= "@Z 9,999,999,999.99"
:nTotal := 0.00
:lTotal := (.T.)
END

:bOnMultiSelect := { || oBry:MakeTotals() }
:bChange := { || IF( LEN( oBry:aSelected ) <= 1,( oBry:oCol(05):nTotal := oBry:oCol(05):Value,;
oBry:oCol(05):RefreshFooter() ),NIL ) }

:MakeTotals()
END

REDEFINE BUTTON oPasar ID 902 OF oDlg UPDATE CANCEL;
WHEN oBrw:Importe:nTotal > 0.00;
ACTION Pasalos(oDlg,oBrx,oBry);
MESSAGE "Pasa los adeudos seleccionados"
Me tira el error

Error description: Error BASE/1075 Error de argumento: >
Args:
[ 1] = U
[ 2] = N 0.00

Saludos

Re: Como me refiero al total de una columna

Posted: Fri Nov 13, 2020 5:51 pm
by FranciscoA
Armando.
En tu código parece que está de mas el bChange. ( bSumCondition y bOnMultiSelect se encargan de eso) Prueba y nos dices.
Por otra parte, ¿que version FWH estas usando?

Code: Select all

                WITH OBJECT :Arriendo
                    :cOrder := "A"
               :bFooter      := { || Len( oBry:aSelected ) }
                END

            WITH OBJECT :Importe
               :nFooterType   := AGGR_SUM
               :bSumCondition := { || AScan( oBry:aSelected, oBry:BookMark ) > 0 }
               :cFooterPicture   := "@Z 9,999,999,999.99"
            END

            :bOnMultiSelect   := { || oBry:MakeTotals() }

          //  :bChange          := { || IF( LEN( oBry:aSelected ) <= 1,( oBry:oCol(05):nTotal := oBry:oCol(05):Value,;
          //                                  oBry:oCol(05):RefreshFooter() ),NIL ) }

            :MakeTotals()
 
Saludos.

Re: Como me refiero al total de una columna

Posted: Fri Nov 13, 2020 9:32 pm
by FranciscoA
Este ejemplo puede ayudarte:

Code: Select all

//-------------------------------------------------//
Function xBrwArrVacio_3()
   LOCAL oDlg, oBrw, oCol, n := 0, aArray :={}, aReg

   DEFINE DIALOG oDlg SIZE 600,400 PIXEL TITLE "ARRAY VACIO / MULTISELEC / SUMA CONDIC / ENAB-DISAB BTN"

   @20, 10 XBROWSE oBrw SIZE -10, -60 PIXEL OF oDlg ;
           DATASOURCE aArray ;
           COLUMNS 1,2,3 ;
           HEADERS "HORA_GRABADO", "VALOR_RAMDOM", "VALOR_DEFINIDO" ;
           SIZES 120, 120, 120 ;
           FOOTERS LINES CELL

   WITH OBJECT oBrw
      :nHeadStrAligns   := AL_CENTER
      :nMarqueeStyle    := MARQSTYLE_HIGHLWIN7
      :bOnMultiSelect   := { || oBrw:MakeTotals() }

      :bKeyDown := {|nKey| if(nKey == VK_DOWN .and. GetKeyState(VK_CONTROL),,) }

      :MakeTotals()
      :CreateFromCode()

      WITH OBJECT :Hora_grabado
        :nEditType     := EDIT_GET
        :bFooter       := { || if( oBrw:nLen > 0, "Selected >  " + Str(Len( oBrw:aSelected ),4) ,"")}
        :nDataStrAlign := AL_CENTER 
      END

      WITH OBJECT :Valor_ramdom
        :nEditType      := EDIT_GET
        :cEditPicture   := "@Z 999,999,999.99"
        :nFooterType    := AGGR_SUM
        :cFooterPicture := "@Z 999,999,999.99"
        :nFootStrAlign := AL_RIGHT
      END

      WITH OBJECT :Valor_definido
        :nEditType      := EDIT_GET
        :cEditPicture   := "@Z 999,999,999.99"
        :nFooterType    := AGGR_SUM
        :bSumCondition  := { || AScan( oBrw:aSelected, oBrw:BookMark ) > 0 }  //solo suma las seleccionadas
        :cFooterPicture := "@Z 999,999,999.99"
        :nFootStrAlign := AL_RIGHT
      END
   END

   @05, 10  BUTTON "Agregar Itm"  OF oDlg  SIZE 60,12 PIXEL ;
            ACTION ( n += 10.00, aReg := { Time(), HB_Random(1,99), n } ,;
                     Aadd( oBrw:aArrayData, aReg ), oBrw:MakeTotals(), oBrw:Refresh() )

   @05, 80  BUTTON "Borrar todo"  OF oDlg  SIZE 60,12 PIXEL ;
            ACTION ( oBrw:aArrayData := {}, oBrw:MakeTotals(),oBrw:aSelected:={},oBrw:Select(1), oBrw:Refresh(), n := 0 ) WHEN oBrw:nLen > 0

   @05,150  BUTTON "Seleccionados"  OF oDlg  SIZE 60,12 PIXEL ;
            ACTION ( XBROWSER(oBrw:aSelected) ) WHEN oBrw:nLen > 0

   ACTIVATE DIALOG oDlg CENTERED 

RETURN NIL
 
Saludos.

Re: Como me refiero al total de una columna

Posted: Fri Nov 13, 2020 10:52 pm
by FranciscoA
Armando, he notado lo siguiente:
En el codigo que te puse de ejemplo, la multiseleccion trabaja con :nMarqueeStyle := MARQSTYLE_HIGHLWIN7.

Si se utiliza MARQSTYLE_HIGHLROWMS ( Multiselect ), la suma condicional en la columna 3 no funciona correctamente.
Sobre esto habría que preguntar a los gurus del xbrowse. Puede ser un pequeño bug al utilizar MARQSTYLE_HIGHLROWMS con sumas condicionales.

Re: Como me refiero al total de una columna

Posted: Fri Nov 13, 2020 10:57 pm
by FranciscoA
Al ejemplo le he modificado asi:
Esto,
@05, 80 BUTTON "Borrar todo" OF oDlg SIZE 60,12 PIXEL ;
ACTION ( oBrw:aArrayData := {}, oBrw:MakeTotals(),oBrw:aSelected:={},oBrw:Select(1), oBrw:Refresh(), n := 0 ) WHEN oBrw:nLen > 0

por esto:

Code: Select all

 @05, 80  BUTTON "Borrar todo"  OF oDlg  SIZE 60,12 PIXEL ;
            ACTION ( oBrw:Select(0), oBrw:Gotop(), oBrw:Select(1),;
                     oBrw:aArrayData := {}, oBrw:MakeTotals(), oBrw:Refresh(),;
                     n := 0 ) WHEN oBrw:nLen > 0
 

Re: Como me refiero al total de una columna

Posted: Sat Nov 14, 2020 12:38 am
by Armando
Francisco:

Gracias por el consejo, pruebo y aviso.

Saludos

Re: Como me refiero al total de una columna

Posted: Sat Nov 14, 2020 3:12 am
by Armando
Francisco y amigos del foro

Problema solucionado cambiando MARQSTYLE_HIGHLROWMS por MARQSTYLE_HIGHLWIN7.

Saludos y muchas gracias