[RESUELTO] Group compuesto en Report

Post Reply
nlerdafehn
Posts: 8
Joined: Tue Feb 02, 2021 10:21 pm
Location: Buenos Aires, Argentina
Contact:

[RESUELTO] Group compuesto en Report

Post by nlerdafehn »

Hola Foro,

Estoy haciendo un sistema de "Casas de Cambio" - Foreign Exchange.

Estoy trabado hace horas, estuve buscando por aca y por el wiki y no lo encuentro.

En el report que trato de generar, tengo clientes y sus movimientos. Lo tengo que agrupar en el report por cliente y dentro del cliente las monedas que compro separadas. La función GROUP ON field->Cliente funciona perfecto. El problema se ve que esta en que no esta relacionada con la moneda.

Adjunto mi codigo de ejemplo:

Code: Select all

 report rep_per CAPTION n_empcort + ' - Imprimir ' ; 
                 font oFuentep, oFueREP , oFuenteS , oFuentbc, oFuenteM ;
       title n_empcort,;
       'Impreso el día '+DTOC(DATE())+ "-"+TIME(),;
       '' ,;
       'Reporte de Movimientos',;
       'Período: '+ dtoc(VNUM[1])+' - '+dtoc(vnum[2]) ,;
       '' LEFT;
       footer 'Pagina : '+str(rep_per:npage,3) center preview
    column title 'Fecha'     Data       field->fecha size 12   font 2
    column title 'Hora'        data       field->hora size 5      font 2 
    column title 'Cliente'       data       field->razon size 25   font 2
    column title 'Moneda'       data       field->moneda size 7   font 2
    column title 'Tipo'       data       if(field->tipo == 1, 'Vendió', 'Compró') size 8   font 2
    column title 'Historico'       data       field->hcoti size 10   font 2
    column title 'Cotizado'       data       field->coti size 10   font 2
    column title 'Monto'       data       field->cantidad TOTAL size 20 picture "@ 9,999,999,999.99"    font 2
    column title 'Pesos'        data       field->pesos  TOTAL size 20 picture "@ 9,999,999,999.99"    font 2
    column title 'Cajero'       data       field->name size 18   font 2
    
    group on field->razon  header 'Cliente: '+ rep_per:aGroups[1]:cValue footer 'Monto operado por ' + rep_per:aGroups[1]:cValue EJECT
    group on field->moneda header 'Moneda: '+ rep_per:aGroups[2]:cValue footer 'Total de cliente en ' + rep_per:aGroups[2]:cValue 

    Rep_per:bInit:= { || DbGoTop() }
    end report
    
    rep_per:otitle:afont[1]:={||3}
    rep_per:otitle:afont[2]:={||4}
    rep_per:otitle:afont[3]:={||4}
    rep_per:otitle:afont[4]:={||4}

    rep_per:nTitleUpLine := 1 
    rep_per:nTitleDnLine := 1 
    rep_per:nTotalLine   := 1 
    rep_per:cGrandTotal := "Total General"
    rep_per:cPageTotal  := "Total acumulado"
  
    activate report rep_per  ON STARTGROUP(rep_per:NewLine()) ON POSTEND(impcligen(rep_per))
    oFueREP:END()
    sysrefresh()
    return nil
Les doy un ejemplo:

TABLA:
Juan compra 100usd
Juan vende 50usd
Juan compra 100eur
Manuel vende 100usd


RESULTADO:
Cliente: Juan
Moneda: EUR

Juan compra 100eur
Total de Juan en EUR: 100

Moneda: USD
Juan compra 100usd
Juan vende 50usd
Total operado por Juan: 250 (No interesa este totalizador, ya que mezcla monedas y solo es valor nominal)

Cliente: Manuel
Manuel vende 100usd
Total de Manuel en USD: 250
Total operado por Manuel: 100


No sé si se logra entender del todo bien, pero lo que genera es que se agrupa por moneda indistintamente de que si cambia de cliente y se mezcla, el resultado esperado seria el siguiente

RESULTADO ESPERADO:
Cliente: Juan
Moneda: EUR

Juan compra 100eur
Total de Juan en EUR: 100

Moneda: USD
Juan compra 100usd
Juan vende 50usd
Total de Juan en USD: 150 // Este totalizador no lo genera
Total operado por Juan: 250


Cliente: Manuel
Moneda: USD

Manuel vende 100usd
Total de Manuel en USD: 100
Total operado por Manuel: 100


Por lo que pude observar, deseguro que la resolución se encuentra utilizando endgroup() con alguna función personal, pero la realidad es que estoy haciendo continuación de los sistemas de mi padre, y no estoy del todo canchero con este lenguaje aun.

Muchas gracias,
Nicolás
Last edited by nlerdafehn on Thu Feb 04, 2021 12:12 pm, edited 1 time in total.
Nicolás
nlerdafehn
Posts: 8
Joined: Tue Feb 02, 2021 10:21 pm
Location: Buenos Aires, Argentina
Contact:

Re: Group compuesto en Report

Post by nlerdafehn »

Pude resolverlo en gran parte con esto

Code: Select all

activate report rep_per  ON STARTGROUP(rep_per:NewLine()) ON POSTEND(impcligen(rep_per)) ON ENDGROUP( if(rep_per:aGroups[1]:cValue = field ->razon, , rep_per:Endgroup(2)  ))
Si el valor del agrupamiento "cliente" no es igual al siguiente campo de "cliente", entonces finalizo el segundo agrupamiento.

En gran parte esta resuelto y se ve como esperaba. Pero me genera agrupaciones inesperadas. Se ve que no es muy eficiente el IF que escribi. Si tienen alguna recomendación para un mejor codigo, se agradece.

EDIT: El problema que tengo, es que se dispara una vez más el endgroup y genera un cierre que no deberia. La solución estaria en detectar QUE activo el endgroup. En Javascript seria algo como el “trigger” existe algo similar?
Nicolás
nlerdafehn
Posts: 8
Joined: Tue Feb 02, 2021 10:21 pm
Location: Buenos Aires, Argentina
Contact:

Re: Group compuesto en Report

Post by nlerdafehn »

Ya esta resuelto!

El IF quedo de esta manera

Code: Select all

ON ENDGROUP( if( (rep_per:aGroups[1]:cValue != field -> razon .and. oGrp:nOrder = 1), rep_per:Endgroup(2), )
Busque en el codigo de la class Report y encontre que pasaba esa variable, asique ahi estaria el “trigger”
Nicolás
Post Reply