Menu Painter - Crear Opción para Exportar a Excel

Disculpa @smota,

SapScripts si no me equivoco. Me corrijes de igual forma.

Estas son las algunas de las rutinas que se ejecutan al momento de imprimir por pantalla los resultados


form imprime_data.
* Rutina del indicador de progreso del reporte
  perform indicador_registro using 85
          'Imprimiendo la Data de Facturación ...'.
* Rutina de Generación de Rango de Facturas para Calculo de Montos
  perform genera_rango_facturas_cal_mont.
  loop at zfactura.
*   Nueva Organización de Ventas
    at new vkorg.
*     Rutina de Busqueda de la Denominación de la Org. Ventas
      perform busca_org_ventas.
    endat.
*   Rutina de Calculo de los Montos de la Factura
    perform calcula_factura.
*   Rutina de Busqueda de la Denominación del Cliente
    perform busca_denom_cliente.
    write: /2 sy-vline.
*   Rutina que Define el color del item en el Listado
    perform color_item_listado.
    write: 3 zfactura-vtweg, sy-vline, zfactura-vbeln, sy-vline,
             zfactura-fkart, sy-vline, zfactura-fkdat, sy-vline,
             zfactura-vkbur, sy-vline, zfactura-bzirk, sy-vline,
             zfactura-kunag, zcliente-name1, sy-vline,
             monto_b,  sy-vline, zfactura-netwr, sy-vline,
             desc_pro, sy-vline, iva, sy-vline, desc_nod, sy-vline.
    format color col_background.
*   Ultima Organización de Ventas
    at end of vkorg.
*     Rutina de Impresión de Totales por Organización de Ventas
      perform imprime_total_org_vent.
    endat.
  endloop.

form imprime_total_org_vent.
  read table ztotales index 1.
  reserve 6 lines.
  write: /2 sy-uline(212).
  write: /2 sy-vline.
  format color 3 intensified off.
  write:  3 text-030, zfactura-vkorg, zorganiza-vtext, 104 sy-vline,
            ztotales-monto_b,  sy-vline,
            ztotales-monto_n,  sy-vline,
            ztotales-desc_pro, sy-vline,
            ztotales-iva,      sy-vline,
            ztotales-desc_nod, sy-vline.
  format color col_background.
  write: /2 sy-uline(212).
endform.

form imprime_total_general.
  read table ztot_gen index 1.
  write: /2 sy-uline(212).
  write: /2 sy-vline.
  format color 3 intensified on.
  write:  3 text-030, text-250,
            sociedad, zsociedades-butxt, 104 sy-vline,
            ztot_gen-monto_b,  sy-vline,
            ztot_gen-monto_n,  sy-vline,
            ztot_gen-desc_pro, sy-vline,
            ztot_gen-iva,      sy-vline,
            ztot_gen-desc_nod, sy-vline.
  format color col_background.
  write: /2 sy-uline(212).
endform.

form imprime_encabezado_listado.
  read table zsociedades with key bukrs = sociedad.
  write:   2 text-035, 193 text-190, 202 sy-datum,
          /2 text-040, 193 text-200, 204 sy-uzeit,
          /2 text-050,  14 fechar-low, 28 fechar-high,
         193 text-210, 200 sy-uname right-justified,
        /193 text-220, 208 sy-pagno right-justified.
  skip.
  write: /2 text-080, sociedad, zsociedades-butxt.
  skip.
endform.

1 me gusta

Me parece que es tiempo de llamar a los:
@abapers

Ya es mucho código para mi. :stuck_out_tongue:

no no es sapscript. es write.
Es una sentencia abap con la cual puedes escribir reportes, asi se hacia antes de aparecer los alv.
Es una manera clasica de realizar el reporte.
Si no me equivoco estas usando un menu estandar que sale al crear este tipo de presentacion, de igual manera se puede tocar, creando tu propio menu. Pero con el write no se donde agregarlo. ya investigo.

El Sapscript es similar al smartforms por asi decirlo, una version previa de mostrar formularios.

1 me gusta

Interesante… nunca me había planteado agregarle botones a la pantalla de un reporte generado con WRITE.

La verdad cuando lo vi pensé que era un ALV LIST por el diseño del reporte, es casi igual.

Oye @smota en caso de que no consigas una forma de hacerlo allí, tal vez le puede servir cambiarlo de WRITE a un ALV LIST, lo que tendría que hacer es crear la tabla principal, y en vez de Imprimir los valores directamente con el WRITE, guardarlos en la tabla y generar el ALV LIST con esa tabla. Y en ese caso ya por ser ALV tendría la función estándar de descargarlo a un Excel.

Y así de una vez modernizas el reporte @johnny282. Claro está, que todo esto tendrías que acordarlo con tu funcional o tu usuario.

Porque la otra cosa es que en caso de agregar el botón luego toca averiguar como hacer para descargar lo que se imprimió en pantalla con el WRITE a un EXCEL.

2 Me gusta

definitivamente tendra mucho trabajo, pero en caso de que decida cambiarlo para el ALV se le podria salir de control, y debe entregar, ya luego con calma que le haga una copia y se entretenga haciendo el cambio, por el momento esto es lo que debes usar.

Justamente despues del evento start-of-selection.

SET PF-STATUS ‘NOMBRE_STATUS’.

Nombre del estatus colocale menu, o como gustes, y dale doble click.
Listo ahi podras agregar todos los botnes que gustes, pero pierdes los que son standard.

Entonces para no perder todo, te recomiendo te copies un menu estandar a uno Z, y ya luego lo personalizas.
Nota: a este tipo de presentacion se le llama “Listas”.

Para copiar un menu con muchas funciones, entra en un programa y busca la carpeta que puse en la imagen le das a copiar al menu y te pedira el destino de la copia, y ahi le espesificas tu programa. y listo, entonces donde te puse nombre de status, colocas el nombre de la nueva copia y te saldra con todas esas funcionalidas, e igual podras modificar como gustes.

3 Me gusta

Gracias @smota,

Como siempre un gran conocedor de la materia.

Primero voy a copiar todo al objeto local para ver como funciona esto que me indicas sin generar transporte.

Lo que me hizo llegar el funcional, es que necesitan la nueva opción en un item del Menú y no un botón, pero puedo hacer llegar la opción de crear el botón, para ver si dan el visto bueno.

Ahora que función se debería utilizar para Exportar el contenido del reporte a Excel??? Me comentaron que existe un estándar que hace esta tarea, pero la verdad no me hicieron llegar el nombre.

@johnny282 listo listo, en los PF-Status puedes agregar botones y opciones de menu, ah como se le llama, creo que menu bar, bueno, el caso que mira te dejo un ejemplo mas paso a paso para que te guies.

PASO 1: CODIGO

&---------------------------------------------------------------------

*& Report ZTEST_REPORT

&---------------------------------------------------------------------

REPORT ztest_report.

TABLES mara.

PARAMETERS: p_matnr LIKE mara-matnr.

START-OF-SELECTION.

  SET PF-STATUS 'TEST_STATUS'.

  WRITE p_matnr.

AT USER-COMMAND.

  CASE sy-ucomm.

    WHEN 'MAS'.

      MESSAGE 'Pulsaste MAS' TYPE 'I'.

    WHEN 'MENOS'.

      MESSAGE 'Pulsaste MENOS' TYPE 'I'.

  ENDCASE.

Entonces el status lo manejas asi. En este caso use barra de pulsadores pero el que necesitas es barra de menu.





Ahora si, espero te sea de utilidad.

4 Me gusta

Que tal @smota,

Una duda, ya te capte la idea, sin embargo hice una prueba en la copia del programa y algo no anda bien y quiero que me corrijas si hice algo mal o no.

  1. Copie un Status Gui estandar, específicamente el que esta en el Function Group SALV - Status Gui Standard. Lo asocie a mi programa z y le coloque el status zexport.
  2. Luego modifique status gui copiado y borre algunos botones. Solamente agregue uno nuevo que le coloque como nombre de funcion EXL, que se supone lo utilizare para exportar la data del reporte en excel.
  3. Aplique el use command tal y como me indicaste y no tuve ningun mensaje de error.
    start-of-selection.
  • Rutina de busqueda de la Data
    perform busca_data.
    set pf-status ‘ZEXPORT’.
    at user-command.
    case sy-ucomm.
    when ‘EXL’.
    call function 'GUI_DOWNLOAD’
    exporting

  •     BIN_FILESIZE                    =
        filename                        = 'C:\prueba.xls'
        filetype                        = 'ASC'
    
  •     APPEND                          = ' '
    
  •     WRITE_FIELD_SEPARATOR           = ' '
    
  •     HEADER                          = '00'
    
  •     TRUNC_TRAILING_BLANKS           = ' '
    
  •     WRITE_LF                        = 'X'
    
  •     COL_SELECT                      = ' '
    
  •     COL_SELECT_MASK                 = ' '
    
  •     DAT_MODE                        = ' '
    
  •     CONFIRM_OVERWRITE               = ' '
    
  •     NO_AUTH_CHECK                   = ' '
    
  •     CODEPAGE                        = ' '
    
  •     IGNORE_CERR                     = ABAP_TRUE
    
  •     REPLACEMENT                     = '#'
    
  •     WRITE_BOM                       = ' '
    
  •     TRUNC_TRAILING_BLANKS_EOL       = 'X'
    
  •     WK1_N_FORMAT                    = ' '
    
  •     WK1_N_SIZE                      = ' '
    
  •     WK1_T_FORMAT                    = ' '
    
  •     WK1_T_SIZE                      = ' '
    
  •     WRITE_LF_AFTER_LAST_LINE        = ABAP_TRUE
    
  •     SHOW_TRANSFER_STATUS            = ABAP_TRUE
    
  •     VIRUS_SCAN_PROFILE              = '/SCET/GUI_DOWNLOAD'
    
  •   IMPORTING
    
  •     FILELENGTH                      =
      tables
        data_tab                        = zfactura
    
  •     FIELDNAMES                      =
     exceptions
       file_write_error                = 1
       no_batch                        = 2
       gui_refuse_filetransfer         = 3
       invalid_type                    = 4
       no_authority                    = 5
       unknown_error                   = 6
       header_not_allowed              = 7
       separator_not_allowed           = 8
       filesize_not_allowed            = 9
       header_too_long                 = 10
       dp_error_create                 = 11
       dp_error_send                   = 12
       dp_error_write                  = 13
       unknown_dp_error                = 14
       access_denied                   = 15
       dp_out_of_memory                = 16
       disk_full                       = 17
       dp_timeout                      = 18
       file_not_found                  = 19
       dataprovider_exception          = 20
       control_flush_error             = 21
       others                          = 22.
              .
    if sy-subrc <> 0.
      message id sy-msgid type sy-msgty number sy-msgno
        with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    endif.
    

    endcase.

  1. Lamentablemente cuando ejecuto el programa, no me aparece el botón nuevo y aparte ninguno de las opciones del menú funcionan.
    Cuando copias el menú de un standard, no se copia su funcionalidad automáticamente???
    tengo que hacer algo adicional en la dynpro???

Cuando lo copias para el ALV las funcionalidades bajan por defecto, pero en este caso estamos hablando de listas. Prueba colocando un mensaje en pantalla un message 'Menu Function Z' type 'I'.
Entonces las funciones que tenias antes, ahora mismo no recuerdo si las pierdes o debes configurarlas manualmente, porque recuerda que ahora todos los eventos iran al user comman personalizado que tienes.
Hare unas pruebas y te dejo saber. Al laboratorio ->

Que tal @smota!!!

:sob: De verdad que pense que este sería el ajuste mas sencillo de todo lo que he atendido hasta ahora.

Creo que me toca programar opción por opción. :disappointed:.

Aunque hay unos que si funcionan a partir de la copia estandar, bastante raro esto…

El que me digiste, es una copia para un ALV, si ese menu que copiaste lo pasas a un ALV todo seguira funcionando igual, pero con las listas no es lo mismo, porque en el momento que te haces dueño del menu, la lista te deja toda la responsabilidad.

Si me lo estaba sospechando…

Ahora el temaso es como puedo exportar a Excel todo el contenido de lo que aparece en pantalla, porque según lo que observo en el programa, no todo esta en una misma tabla interna. el detalle de los encabezados se manejan por rutinas, los encabezados de cada columna se maneja en un Write y así otras cosas mas. :confounded:

Bueno creo que me toca trabajar hasta tarde hoy.:wink:

Lo bueno es que aprenderé muchas cosas mas, que es lo importante. :+1:

Para la data te toca meter logica.
Pero oye como yo lo haria, la funcion que descarga el excel, pide una tabla.

Esa tabla tu la declaras en las declaraciones globales, y declara uan work area, y entra en todos los form que usan para mostrar la data, entonces pasa las lineas a tu tabla global, y justo cuando se muestre la lista, ya tendras la tabla interna con toda la data, cuando le den a descargar, listo, pasas esa tabla a la funcion y mision cumplida.

Nota: tomalo en serio, en SAP no hay nada facil. Si alguien dice lo contrario que pongan un boton de color Rojo O_O.

Lo que si hay es personas con basta experiencia que hacen que lo dificil parezca facil ^^

2 Me gusta

Buen Día @smota espero estes bien!!!

Estuve ausente por temas personales y no pude concluir con este tema que lo estoy retomando el día de hoy.

La verdad no se como hacer esto que comentas, sera que puedes darme algún ejemplo sencillo de esto que me tratas de explicar para ver si te entiendo…

Saludos…

por su puesto, el codigo que copiaste arriba es todo el codigo?

@johnny282 pasa por aca y explicanos como termina el caso, y si una respuesta te sirvio para solucionar marcala como mejor solucion. xD, soy un asote jeje.

Buenas @johnny282, estaba revisando el foro y me encontré con este caso.

La guía que usé en mis inicios para el caso de agregar nuevas funcionalidades a través de botones la saqué de aquí: ALV development (ALV_GRID)

En esa página mencionan lo siguiente en el paso 3:

Step 3. Create pf_status (i.e. ‘ZNEWSTATUS’).

  • It is recommend that you copy standard status ‘STANDARD’ from function group SALV or ‘STANDARD_FULLSCREEN’ from function group SLVC_FULLSCREEN which is what I tend to use, and then modify it accordingly. ALV standard function codes always start with ‘&’. i.e. &VGRID calls your ALV grid

Inicialmente usé una copia del status GUI ‘STANDARD’ del grupo de funciones SALV como lo hiciste, pero me pasaba el mismo problema que se te presentó, no se mostraban los elementos del menú. Lo que hice más bien fue tomar una copia del ‘STANDARD_FULLSCREEN’ del grupo de funciones ‘SLVC_FULLSCREEN’ como lo mencionan allí, y con ese status GUI sí se mostraban los botones y demás.

Has la prueba y escribe cualquier cosa.

Saludos!

2 Me gusta

Que tal Chicos,

Bueno finalmente pude culminar el requerimiento. Un agradecimiento a todos los que me han apoyado en este post y en especial a @smota que con mucha paciencia a estado de la mano apoyando últimamente.

Bueno a continuación les resumo lo que se hizo para agregar la opción de Exportar en Excel:

  1. En primer lugar era necesario crear una nueva tabla interna que me permitiera almacenar tanto los datos de facturas (Canal de Distribución, Numero de Factura, Tipo de Factura, etc) como los cálculos realizados para sacar el Monto Bruto y Monto Neto entre otros. Esto con la finalidad de posteriormente utilizar dicha tabla en la Función GUI_DOWNLOAD que explicare en los siguientes puntos.

  2. Una vez creada la tabla interna y almacenada la información correspondiente, se procedió a realizar una copia de un Status Gui Estandar, específicamente el contenido en el grupo de funciones SALV - Status GUI STANDARD. Una vez generada la copia procedí a eliminar aquellos botones que no fueron requeridos, solamente dejando el botón Hoja de Calculo y Fichero Local. En este punto quiero dejar claro para aquellos que están empezando como yo, que la copia de estos status no funciona con aquellos reportes creados en base a sentencias Write, es decir, que se deben programar tanto las opción de Menú como los botones. Por lo que estuve investigando estas copias funcionan correctamente con reportes tipo ALV.

  3. Una vez ajustado el status gui, realice la modificación al programa para añadir la funcionalidad de los menú y botones a través del PF-STATUS - USER-COMMAND.
    4.En el caso particular del Botón de Hoja de Calculo utilice la función GUI_DOWNLOAD que me permite exportar directamente la información en un directorio en formato xls u otro. En esta función coloque como parámetros tanto la tabla interna que comente en el primer punto y tuve que diseñar otra tabla que almacenaría la cabecera de cada columna. A continuación coloco como use la función:

    CALL FUNCTION ‘GUI_DOWNLOAD’
    EXPORTING
    filename = ‘C:\archivo.xls’
    TABLES
    data_tab = IT_tablaconlosdatos
    filename = IT_cabeceradecolumnas
    EXCEPTIONS
    FILE_WRITE_ERROR = 1
    NO_BATCH = 2
    GUI_REFUSE_FILETRANSFER = 3
    INVALID_TYPE = 4
    NO_AUTHORITY = 5
    UNKNOWN_ERROR = 6.

Bueno espero haberme explicado con claridad, pero si tienen alguna duda me la hacen llegar y con gusto les respondo.

Les deseo una Feliz Navidad a Todos los que integran esta comunidad, un fuerte abrazo para todos…

5 Me gusta

Saludos @johnny282,

Llegué tarde pero me alega que @smota se hizo cargo de este caso. En hora buena :smile:

Nota: Trata de no usar más listas con write de ahora en adelante, utiliza el ALV OOP

1 me gusta

Este tema se cerró automáticamente 7 días después del último post. No se permiten nuevas respuestas.