Hola, Pool.
Como te mencioné antes, tengo una solución y deseo compartirla.
Disclaimer:
---------
Amigos: tomen en cuenta que normalmente toda solución caza adeptos o desacuerdos.
Esta se ofrece como un inicio.
Cada uno puede (1) aportar otra --si lo desea-- o (2) mejorar la presentada --si lo desea--, o incluso (3) descartarla.
La ofrezco para que el colega Pool la use como un inicio para su solventar necesidad, y para que cualq otro la use y/o la mejore según lo considere manteniendo el altruismo del foro.
Primero: el Escenario:
----------------
Nos compartiste varios archivos: TEMPO_COMPRA2.DBF, RESU_COMPRA3.FRX y su .FRT y algunas imágenes con tu necesidad.
De ello se concluye que el ordenamiento necesario es el sgte:
Nombre del archivo de datos: TEMPO_COMPRA2.DBF
Nombre del Reporte: RESU_COMPRA3.FRX
Ordenamiento necesario:
|--------------|----------|-------------|
|Grupo | Campo | Campo |
| | Codigo | Descripcion |
|--------------|----------|-------------|
|ZONA | ZONA | NOM_ZONA |
|CLASIFICACION | | CLASE |
|ESPECIE | ESP_COD | ESPECIE |
|IDENT | IDENT | |
|--------------|----------|-------------|
el cual se puede lograr así:
index on ZONA+CLASE+ESP_COD+IDENT tag IndexadoTemporal
** y así tal vez --al terminar el reporte-- el indexado se borre junto con su cursor GROUPCLASIF
Segundo: Algunos ajustes:
---------------------
- Se ajustaron los campos Unid, Kilos y KBruto, que están superpuestos para poderlos ver bien en diseño.
- Se modificó el grupo Clasificacion: "starts new page if less than: 1cm".
- La columna "Precio x Kg" queda con el sgte expresión:
iif(KILOS=0,0,XPRECIO/KILOS)
- Se ajustaron los campos de los encabezados.
- No se ajustaron los campos de los Footers. Te lo dejo para que --didácticamente-- los desarrolles tú mismo, donde los requieras. Estos subtotales en los Footers se pueden hacer de la manera stándard como se hacen en VFP. No necesitan la solución que te planteo.
Lo que te planteo es sólo para que podamos los SubTotales ubicar en el Header (Encabezado) de cada Grupo.
- Debes analizar tú mismo los Format de los campos numéricos. No utilicé la partícula "Kg." para que no interfirieran con la amplitud de cada columna. En tiempo de diseño, quité la partícula "Kg." y los tres campos son visibles completamente
Tercero: La Solución:
-----------------
- Sólo te muestro los tres primeros campos en mi solución, las tres perimeras columnas, y el promedio.
- No modifiqué la zona "Detail".
- Cada uno de los "SubTotales" mostrados en los encabezados tienen la sgte definición; te la expreso inicialmente para el primero.
Veamos cómo se define el SubTotal para el campo UNID en el Header5(Encabezado5) que es IDENT.
1. Se agrega un Field de un reporte (o copia y pega el que pusiste en el Detail y modifica en la pestaña General la expresión para que quede así:
SubTotal ( 'UNID', 'S', 'ZONA+CLASE+ESP_COD+IDENT' )
2. En la pestaña Calculate, verifica que el "Tipo de Cálculo" sea Ninguno.
Otras pestañas y valores no son críticos para la solución. Puedes hacer ajutes en las otras pestañas que desees (Format por ejm) para que al copiar y pegar (ver el sgte paso), te quede la columna simétrica.
3. Copia y pega el campo que acabas de crear en los otros encabezados y haz que la expresión quede según te muestro en el sgte cuadro:
|---------|--------------|------------------------------------------------------|--------------------|
| Header | Grupo | Expresión | |
| | | Campo UNID | |
|---------|--------------|------------------------------------------------------|--------------------|
| Header1 | dtos(FECHA) | | |
| Header2 | ZONA | SubTotal ( 'UNID', 'S', 'ZONA' ) | |
| Header3 | CLASE | SubTotal ( 'UNID', 'S', 'ZONA+CLASE' ) | |
| Header4 | ESP_COD | SubTotal ( 'UNID', 'S', 'ZONA+CLASE+ESP_COD' ) | |
| Header5 | IDENT | SubTotal ( 'UNID', 'S', 'ZONA+CLASE+ESP_COD+IDENT' ) | |
|---------|--------------|------------------------------------------------------|--------------------|
4. Hablemos de la función SubTotal(). Es un .PRG (se adjunta) para que haga la labor que se requiere: obtener el total del subgrupo que se indique en el campo que se indique.
Entonces:
En el Header2 cuyo grupo es por ZONA escribimos:
SubTotal ( 'UNID', 'S', 'ZONA' )
que significa "obtenga el subtotal del campo UNID de acuerdo a la ZONA en que va el reporte".
En el primer parámetro se indica el campo sobre del que se va a obtener el SubTotal: UNID.
En el segundo parámetro se indica que lo que necesitamos es la SUMA; si deseamos CONTAR escribimos C; si deseamos el PROMEDIO, escribimos P. Esas son las tres operaciones que soporta la función.
En el tercer parámetro se indica el la expresión para el grupo. (((una imagen vale más que mil palabras: mira el cuadro que hay unas quince líneas arriba)))
5. La misma explicación para el resto de Headers.
6. Repite la operación con el resto de campos, por ejm para el tercer campo KBRUTO:
|---------|--------------|--------------------------------------------------------|--------------------|
| Header | Grupo | Expresión | |
| | | Campo KBRUTO | |
|---------|--------------|--------------------------------------------------------|--------------------|
| Header1 | dtos(FECHA) | | |
| Header2 | ZONA | SubTotal ( 'KBRUTO', 'S', 'ZONA' ) | |
| Header3 | CLASE | SubTotal ( 'KBRUTO', 'S', 'ZONA+CLASE' ) | |
| Header4 | ESP_COD | SubTotal ( 'KBRUTO', 'S', 'ZONA+CLASE+ESP_COD' ) | |
| Header5 | IDENT | SubTotal ( 'KBRUTO', 'S', 'ZONA+CLASE+ESP_COD+IDENT' ) | |
|---------|--------------|--------------------------------------------------------|--------------------|
Sólo cambiamos UNID por KBRUTO.
7. Repite la operación para el último campo "Precio x Kg.":
|---------|--------------|------------------------------------------------------------------------------|
| Header | Grupo | Expresión del Campo en el Header para |
| | | obtener el SubTotal ("Promedio") ¿o no es así lo que el cliente necesita? |
|---------|--------------|------------------------------------------------------------------------------|
| Header1 | dtos(FECHA) | |
| Header2 | ZONA | SubTotal ( 'iif(KILOS=0,0,XPRECIO/KILOS)', 'P', 'ZONA' ) |
| Header3 | CLASE | SubTotal ( 'iif(KILOS=0,0,XPRECIO/KILOS)', 'P', 'ZONA+CLASE' ) |
| Header4 | ESP_COD | SubTotal ( 'iif(KILOS=0,0,XPRECIO/KILOS)', 'P', 'ZONA+CLASE+ESP_COD' ) |
| Header5 | IDENT | SubTotal ( 'iif(KILOS=0,0,XPRECIO/KILOS)', 'P', 'ZONA+CLASE+ESP_COD+IDENT' ) |
|---------|--------------|------------------------------------------------------------------------------|
Sólo cambiamos UNID por iif(KILOS=0,0,XPRECIO/KILOS). Y observemos la P en el segundo parámetro.
8. Preview. Puedes ejecutar MAIN.PRG
-----------------------------
Es tarde... es largo... traté de ser consciente de todo lo que escribí..... Si hay fallas de ortografía o de sintaxis de programación.... sólo verifiquemos la idea y avancemos. Pueden consultar o informar cómo les va....
Hasta pronto, amigos.
HERNAN
La extensión del adjunto es .ZIP .