Page 1 of 1

UNA DE BROWSE

Posted: Sun Feb 12, 2006 10:21 pm
by Marco Augusto
Como puedo hacer para "convertir" un browse de detalle a otro que se muestre en forma de resumen

Por ejemplo si tengo el siguiente browse:

cliente fecha factura importe
==== ==== ===== ======
CIA AAA 10/O5 000100 2,500
CIA AAA 12/05 000108 3,500
CIA AAA 14/05 000110 8,000
CIA VVV 05/05 000099 12,000
CIA VVV 10/05 000105 14,000


quisiera pasar a otro browse (resumen por cliente con totales):

cliente fecha factura importe
==== ==== ===== ======
CIA AAA ------ --------- 14,500
CIA VVV ------ --------- 26,500


Si alguien ya se ha enfrentado a algo similar
mucho les agradecere sus sugerencias

Gracias

Posted: Mon Feb 13, 2006 2:10 am
by DanielPuente
Marco:

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

Saludos,