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