Página 1 de 1

Help com For Each em uma Hash Table

Enviado: 12 Dez 2017 16:17
por asimoes
Pessoal,

Preciso de um help nesse For..Each não sei se é possível, a ideia é fazer a cada fim de NUMPROC um subtotal , é possível da forma que eu fiz ?
Tem uma incrementar o oElemento ?, tentei oElemento := oElemento:__EnumIndex() + 1 mas não funcionou
Criei essa função PSAY porque a Hwgui não deixa usar @Prow(),... em uma janela GUI, a função PSAY fica em uma lib externa

Código: Selecionar todos

For EACH oElemento IN ::hFatura_Concessionaria_Fin
    ::cLastProc := oElemento["NUMPROC"]
    Do While ! oElemento:__enumIsLast() .AND. oElemento["NUMPROC"] = ::cLastProc
       nRec := hb_HScan( ::hConcessionarias, {| nKey, cChave | cChave["CODEFEBRABAN"] = oElemento["CODCON"] } )
       PSAY( ::nLin++,01, Transform( oElemento["NUMPROC"], "@R 99.999.999/99-!!" ) + " " + ;
                          SubStr( ::hConcessionarias[hb_NtoS( nRec ), "NOME"], 1, 30) + " " + ;
                          Transform( oElemento["DT_VENCIMENTO"], "@D" ) + " " + ;
                          Transform( oElemento["VALOR"], "@E 999,999,999,999.99" ) )
       If ::nLin + 1 > 55
          Eject()
          ::CabecRelDataPgto()
       End                                    
       nTotOps += oElemento["VALOR"]       
       oElemento := oElemento:__EnumIndex() + 1             
    Enddo
 Next   
 
 
  Processo         Empresa                        Vencimento Valor              Total Ops
  ------------------------------------------------------------------------------------------------
  26.500.742/17-!! CEDAE                          01/12/2017             851,75 
                   CEDAE                          01/12/2017           1.120,64           1.972,39 
  26.500.761/17-!! CEDAE                          10/12/2017             603,12
                   CEDAE                          10/12/2017           1.384,49           1.987,61
  ------------------------------------------------------------------------------------------------
                                                                   Total Geral:           3.960,00

Código: Selecionar todos

FUNCTION PSAY( nRow, nCol, cString )

   hb_Default(@nRow, 0 )
   hb_Default(@nCol, 0 )
   hb_Default(@cString, "" )
   
   @ nRow, nCol SAY cString
   
RETURN Nil

Help com For Each em uma Hash Table

Enviado: 12 Dez 2017 18:28
por JoséQuintas
Uma idéia....

Código: Selecionar todos

aTotaliza := Array( Len( ::hFatura_Concessionaria_Fin ) )
FOR EACH oElemento IN ::hFatura_Concessionaria_Fin DESCEND
   IF oElement:__EnumIsLast
      aTotaliza[ oElement:__EnumIndex  ] := .T.
      xQuebra := oElement[ NUMPROC ]
   ELSE
      aTotaliza[ oElement:__EnumIndex ] := ( oElement[ NUMPROC ] != xQuebra )
      xQuebra := oELement[ NUMPROC ]
   ENDIF
NEXT   

nTotal := 0
nSubTotal := 0

FOR EACH oElemento IN ::hFatura_Concessionaria_Fin
    nRec := hb_HScan( ::hConcessionarias, {| nKey, cChave | cChave["CODEFEBRABAN"] = oElemento["CODCON"] } )
    nSubTotal += oElemento[ "VALOR" ]
    nTotal    += oElemento[ "VALOR" ]
    PSAY( ::nLin++,01, Transform( oElemento["NUMPROC"], "@R 99.999.999/99-!!" ) + " " + ;
                       SubStr( ::hConcessionarias[hb_NtoS( nRec ), "NOME"], 1, 30) + " " + ;
                       Transform( oElemento["DT_VENCIMENTO"], "@D" ) + " " + ;
                       Transform( oElemento["VALOR"], "@E 999,999,999,999.99" ) + ;
                       iif( aTotaliza[ oElemento:__EnumIndex ], Transform( nSubTotal, "@E 999,999,999,999.99" ), "" ) )
    IF aTotaliza[ oElemento:__EnumIndex ]
       nSubTotal := 0
    ENDIF
    IF ::nLin + 1 > 55
       Eject()
       ::CabecRelDataPgto()
    ENDIF
NEXT

Help com For Each em uma Hash Table

Enviado: 12 Dez 2017 19:41
por asimoes
Quintas,

Funcionou, valeu!

Help com For Each em uma Hash Table

Enviado: 12 Dez 2017 19:47
por JoséQuintas
Talvez melhor garantir esta parte:

Código: Selecionar todos

( oElement[ NUMPROC ] != xQuebra )
trocar para

Código: Selecionar todos

( ! oElement[ NUMPROC ] == xQuebra )
aquela diferença entre a = b, a == b, sendo os opostos a != b ou ! ( a = b ), ! ( a == b )