Suponiendo que tenes un dialogo donde mostras el browse completo, pones un boton que diga ver totales o algo asi y ahi abris otro dialogo, haces el calculo de totales y en ese dialogo haces el browse, que puede estar hecho sobre una matriz o sobre una dbf transitoria donde grabas los totales antes de activar el dialogo:
El siguiente ejemplo hace eso sobre un browse de autorizaciones de practicas medicas y saca los totales x practica en un browse sobre una matriz (todo con wbrowse de hernan), parte pertinente para que no se haga tan largo:
Code: Select all
FUNCTION Valoriza()
LOCAL aNcampos:={ {|| PADL(AUTORIZA->NUMERO,5,0)},;
{|| " "+BUS_DES("PRACTICA",1,AUTORIZA->PRACTICA,"NOMBRE") },;
{|| " "+AUTORIZA->PRESTADOR } ,;
{|| TRANS(AUTORIZA->APAGAR,"@E 99,999.99")+" " } ,;
{|| " "+AUTORIZA->TIPOPRES },;
{|| " "+AUTORIZA->RUBRO },;
{|| AUTORIZA->APEYNOMB },;
{|| AUTORIZA->NROBENEF } ,;
{|| DTOC(AUTORIZA->FECHA) },;
{|| AUTORIZA->ESTADO },;
{|| " "+AUTORIZA->PARTIDO },;
{|| " "+AUTORIZA->RESPUESTA } ,;
{|| DTOC(AUTORIZA->FECHAEMAIL) } ,;
{|| AUTORIZA->HORAEMAIL },;
{|| " "+BUS_DES("SOLICITA",1,AUTORIZA->SOLICITA,"NOMBRE") },;
{|| AUTORIZA->DIREMAIL }},;
REDEFINE SENSITIVE SAY PROMPT "» Tot. x Práctica «" ID 126 ;
OF oFld:aDialogs[1] ;
FONT oFont4 ;
COLOR CLR_BLUE COLOROVER CLR_RED ;
ON MOUSEOVER SndPlaySound("Select.Wav") ;
RIGHT ACTION TotPractica(wAlias,oBrw)
Static Function TotPractica(cAlias,oBrw)
Local oDlg, aBrw, RET:=0, nItem:=1
Local X:=390,Y:=200,ANCHO:=454,ALTO:=140,cTitulo:=oemtoansi("Totales por Pr ctica")
Local nReg
Local aPractica:={},cCodPra:=(cAlias)->PRACTICA,largo:=0,I:=1,cTipo,cRecno:=(cAlias)->(RECNO())
Local aOrdenado:={}
DEFAULT cTitulo:="Seleccione..."
(cAlias)->(DBGOTOP())
DO WHILE ! (cAlias)->(EOF())
IF LEN(aPractica)==0
aadd(aPractica,{BUS_DES("PRACTICA",1,(cAlias)->PRACTICA,"NOMBRE"),1,(cAlias)->APAGAR})
ELSE
cTipo:=BUS_DES("PRACTICA",1,(cAlias)->PRACTICA,"NOMBRE")
nReg:=ASCAN( aPractica, { |aField| aField[1]==cTipo } )
IF nReg == 0
aadd(aPractica,{BUS_DES("PRACTICA",1,(cAlias)->PRACTICA,"NOMBRE"),1,(cAlias)->APAGAR})
ELSE
aPractica[nReg,2]+=1
aPractica[nReg,3]+=(cAlias)->APAGAR
ENDIF
ENDIF
(cAlias)->(DBSKIP())
ENDDO
(cAlias)->(DBGOTO(cRecno))
oBrw:Refresh()
FOR I:=1 TO LEN(aPractica)
aPractica[i,2]:=TRANS(aPractica[i,2],"@E 9,999")
aPractica[i,3]:=TRANS(aPractica[i,3],"@E 999,999.99")+" "
NEXT
IF LEN(aPractica)==0
Aadd(aPractica,{SPAC(30),SPAC(9),SPAC(10)})
ENDIF
DEFINE DIALOG oDlg RESOURCE "MCHOICE" TITLE cTitulo
oDlg:lHelpIcon:=.f.
aOrdenado:=ASORT(aPractica,,,{|x,y| x[1] < y[1]})
REDEFINE LISTBOX aBrw FIELDS aOrdenado[NITEM,1],aOrdenado[NITEM,2],aOrdenado[NITEM,3] ;
HEADER oemtoansi("Descripci¢n")," Cant."," Importe ";
id 999 of odlg;
FIELDSIZES 269,59,96 ON DBLCLICK (Ret:=nItem,oDlg:End()) //COLORS CLR_BLUE
aBrw:cAlias = "Array" // Just put something
aBrw:bLogicLen = { || Len( aOrdenado ) }
aBrw:SetArray(aOrdenado)
aBrw:bGoTop = { || nItem := 1 }
aBrw:bGoBottom = { || nItem := Eval( aBrw:bLogicLen ) }
aBrw:bGoBottom = { || nItem := Eval( aBrw:bLogicLen ) }
aBrw:bSkip = { | nWant, nOld | nOld := nItem, nItem += nWant,;
nItem := Max( 1, Min( nItem, Eval( aBrw:bLogicLen ) ) ),;
nItem - nOld }
aBrw:bKeyChar = { | nK | if( nK==VK_RETURN,(Ret:=nItem,oDlg:End()),) } // Controlling keystrokes
aBrw:lcellstyle := .t.
aBrw:nlinestyle := 2
aBrw:aJustify:={0,2,1}
aBrw:nclrpane:= {|| iif( (nItem/2)-INT(nItem/2) > 0, CLR_LBLUE, CLR_LGRAY) }
aBrw:lAdjLastcol:=.F.
aBrw:GoTop()
oDlg:SetControl(aBrw)
ALTO:=50+16.0*LEN(aOrdenado)
IF(ALTO > 550,ALTO:=550,)
IF LEN(aOrdenado) < 15
ACTIVATE DIALOG oDlg ON INIT (oDlg:Move(X,Y),oDlg:setsize(ANCHO,ALTO))
ELSE
ACTIVATE DIALOG oDlg ON INIT (oDlg:Move(X,Y),oDlg:setsize(ANCHO,ALTO),oDlg:Center())
ENDIF
Return nil