Help com For Each em uma Hash Table

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Help com For Each em uma Hash Table

Mensagem 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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Help com For Each em uma Hash Table

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Help com For Each em uma Hash Table

Mensagem por asimoes »

Quintas,

Funcionou, valeu!
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Help com For Each em uma Hash Table

Mensagem 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 )
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder