1
Programación ABAP / Re: Ayuda con Creacion de Reporte.
« en: 24 de Noviembre de 2010, 06:52:43 pm »
Saludos,
En este caso, entiendo que te falta sacar el total etc. Lo único que deberías hacer, sería acumular en unas variables los datos de suma. Te pongo un código que he realizado y que hace lo que pides.. en este caso se sacan las medias de los precios... si fuese otro campo, tendrías que adaptarlo... Ten cuidado con el tamaño de línea del report y si ves que sale descuadrado, dale más longitud para que se vea bien..
En este caso, entiendo que te falta sacar el total etc. Lo único que deberías hacer, sería acumular en unas variables los datos de suma. Te pongo un código que he realizado y que hace lo que pides.. en este caso se sacan las medias de los precios... si fuese otro campo, tendrías que adaptarlo... Ten cuidado con el tamaño de línea del report y si ves que sale descuadrado, dale más longitud para que se vea bien..
Código: [Seleccionar]
REPORT z_fjcm2 LINE-SIZE 71.
TYPES: BEGIN OF t_datos_aux,
quotdate TYPE oicqp-quotdate ,
price TYPE oicqp-price.
TYPES: END OF t_datos_aux.
TYPES: BEGIN OF t_datos,
quotdate TYPE oicqp-quotdate ,
min TYPE oicqp-price,
media TYPE oicqp-price,
max TYPE oicqp-price.
TYPES: END OF t_datos.
DATA: li_tabla TYPE STANDARD TABLE OF t_datos,
li_data_aux TYPE STANDARD TABLE OF t_datos_aux.
DATA: l_fecha_ini TYPE sy-datum,
l_fecha_fin TYPE sy-datum,
l_max_total TYPE oicqp-price,
l_min_total TYPE oicqp-price,
l_media_total TYPE oicqp-price,
l_max_aux TYPE oicqp-price,
l_min_aux TYPE oicqp-price,
l_media_aux TYPE oicqp-price,
l_mes TYPE char10,
l_es_primero TYPE boolean.
DATA: ls_tabla TYPE t_datos,
ls_data_aux TYPE t_datos_aux.
START-OF-SELECTION.
REFRESH li_tabla.
DO 12 TIMES.
CLEAR: l_fecha_ini,
l_fecha_fin.
* Obtenemos la fecha del mes
PERFORM f_obtener_fecha USING sy-index
CHANGING l_fecha_ini
l_fecha_fin.
REFRESH li_data_aux.
SELECT quotdate price
FROM oicqp
INTO TABLE li_data_aux
WHERE quotdate GE l_fecha_ini AND
quotdate LE l_fecha_fin.
IF sy-subrc NE 0.
* Mostramos error si es necesario.
ELSE.
CLEAR: l_max_aux,
l_media_aux,
l_min_aux.
l_es_primero = 'X'.
LOOP AT li_data_aux INTO ls_data_aux.
IF l_es_primero IS NOT INITIAL.
l_max_aux = ls_data_aux-price.
l_min_aux = ls_data_aux-price.
CLEAR l_es_primero.
ENDIF.
IF ls_data_aux-price GT l_max_aux.
l_max_aux = ls_data_aux-price.
ENDIF.
IF ls_data_aux-price LT l_min_aux.
l_min_aux = ls_data_aux-price.
ENDIF.
ENDLOOP.
l_media_aux = ( l_min_aux + l_max_aux ) / 2.
CLEAR ls_tabla.
ls_tabla-quotdate = l_fecha_fin.
ls_tabla-min = l_min_aux.
ls_tabla-media = l_media_aux.
ls_tabla-max = l_max_aux.
APPEND ls_tabla TO li_tabla.
ENDIF.
ENDDO.
END-OF-SELECTION.
IF li_tabla[] IS NOT INITIAL.
WRITE: sy-uline,
sy-vline,
'Mes ',
sy-vline,
'Mínimo ',
sy-vline,
'Máximo ',
sy-vline,
'Media ',
sy-vline,
sy-uline.
LOOP AT li_tabla INTO ls_tabla.
PERFORM f_calcular_mes USING ls_tabla-quotdate
CHANGING l_mes.
WRITE: sy-vline,
l_mes,
sy-vline,
ls_tabla-min,
sy-vline,
ls_tabla-max,
sy-vline,
ls_tabla-media,
sy-vline,
sy-uline.
l_min_total = l_min_total + ls_tabla-min.
l_media_total = l_media_total + ls_tabla-max.
l_max_total = l_max_total + ls_tabla-media.
ENDLOOP.
WRITE: sy-vline,
'TOTAL ',
sy-vline,
l_min_total,
sy-vline,
l_media_total,
sy-vline,
l_max_total,
sy-vline,
sy-uline.
ELSE.
* Mostramos el error de que no hay datos.
ENDIF.
*&---------------------------------------------------------------------*
*& Form F_OBTENER_FECHA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_SY_TABIX text
*----------------------------------------------------------------------*
FORM f_obtener_fecha USING p_indice TYPE sy-tabix
CHANGING p_fecha_ini TYPE sy-datum
p_fecha_fin TYPE sy-datum.
DATA: l_mes TYPE char2.
CASE p_indice.
WHEN 1.
l_mes = '01'.
WHEN 2.
l_mes = '02'.
WHEN 3.
l_mes = '03'.
WHEN 4.
l_mes = '04'.
WHEN 5.
l_mes = '05'.
WHEN 6.
l_mes = '06'.
WHEN 7.
l_mes = '07'.
WHEN 8.
l_mes = '08'.
WHEN 9.
l_mes = '09'.
WHEN 10.
l_mes = '10'.
WHEN 11.
l_mes = '11'.
WHEN 12.
l_mes = '12'.
WHEN OTHERS.
ENDCASE.
CONCATENATE sy-datum(4) l_mes '01' INTO p_fecha_ini.
IF p_fecha_ini IS NOT INITIAL.
CALL FUNCTION 'SG_PS_GET_LAST_DAY_OF_MONTH'
EXPORTING
day_in = p_fecha_ini
IMPORTING
last_day_of_month = p_fecha_fin
EXCEPTIONS
day_in_not_valid = 1
OTHERS = 2.
IF sy-subrc NE 0.
CLEAR p_fecha_ini.
CLEAR p_fecha_fin.
ENDIF.
ENDIF.
ENDFORM. " F_OBTENER_FECHA
*&---------------------------------------------------------------------*
*& Form F_CALCULAR_MES
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_LS_TABLA_QUOTDATE text
* <--P_L_MES text
*----------------------------------------------------------------------*
FORM f_calcular_mes USING p_fecha TYPE sy-datum
CHANGING p_mes TYPE char10.
CASE p_fecha+4(2).
WHEN '01'.
CONCATENATE sy-datum(4) '-Ene' INTO p_mes.
WHEN '02'.
CONCATENATE sy-datum(4) '-Feb' INTO p_mes.
WHEN '03'.
CONCATENATE sy-datum(4) '-Mar' INTO p_mes.
WHEN '04'.
CONCATENATE sy-datum(4) '-Abr' INTO p_mes.
WHEN '05'.
CONCATENATE sy-datum(4) '-May' INTO p_mes.
WHEN '06'.
CONCATENATE sy-datum(4) '-Jun' INTO p_mes.
WHEN '07'.
CONCATENATE sy-datum(4) '-Jul' INTO p_mes.
WHEN '08'.
CONCATENATE sy-datum(4) '-Ago' INTO p_mes.
WHEN '09'.
CONCATENATE sy-datum(4) '-Sep' INTO p_mes.
WHEN '10'.
CONCATENATE sy-datum(4) '-Oct' INTO p_mes.
WHEN '11'.
CONCATENATE sy-datum(4) '-Nov' INTO p_mes.
WHEN '12'.
CONCATENATE sy-datum(4) '-Dic' INTO p_mes.
ENDCASE.
ENDFORM. " F_CALCULAR_MES