Menu Painter - Crear Opción para Exportar a Excel

Que tal @Abapers,

En esta oportunidad les consulto lo siguiente:

Necesito crear una opción en el menú de una programa Z que permita al usuario exportar directamente a Excel el reporte que ejecuta dicho Z, algo así como les envío en imagen.

Estuve revisando el programa, específicamente la Dynpro y me surgió una duda, porque según lo que he revisado en manuales, los módulos de los PBO y PAI generalmente se colocan dentro de un Include, pero en el programa no tengo ningún Include. Adicionalmente al tratar de acceder directamente al código de dichos módulos, me aparece el mensaje como si el objeto no estuviera creado???.

Me da un poco de temor empezar a modificar algo y pueda afectar otra cosa por desconocimiento porque el reporte ya tiene un menú creado y no logro ubicarlo por la SE41.

Agradecido de antemano, de igual forma sigo investigando porque en este tema ando algo Verde jajajaja.

Un abrazo a todos!!!

@johnny282 buenisimo, iniciaremos tu vida en dynpros jajaj dale hermano, saldras siendo un pro despues de esto.
Ok comencemos.

El programa que intentas modificar, es una Z (Z o Y ) o es un standard?
Segundo, fijate que esos includes no contienen el menu, claro uno de esos lo llama pero el menu esta en una carpeta del arbol del programa que se llama menu(STATUS_GUI).

Entonces si es standar necesitaras un menu_exit, no recuerdo su nombre con exactitud.
y si es uno particular podras modificarlo mucho mas rapido ubicando la carpeta del menu.

Que tal @smota!!!

Gracias por responder tan rapido :bullettrain_side:.
Respondo a tus preguntas:

Es un Z para el manejo de Facturacion diaria SD.

Ese es mi duda, el programa no tiene Includes ni Status_GUI. Existe otra manera de configurar esto???

Saludos…

Ese menu que estas viendo debe de ser el menu del alv que usan para mostrar la data, ahi tendras que amarrar tu menu.
Entonces que ALV usan para mostrar la DATA?
esa es la siguiente pregunta que nos llevara a tu solucion.

Que tal @smota,

jajajaj tampoco es un ALV, es un script.

Saludos…

Yo de ABAP cero, pero si es un script, cuando ejecutas ese reporte, en la parte del código de transacción, prueba poner %pc y darle enter.

Lo toma?

Puedes mostrar el codigo que levanta esa pantalla? asi veo de que se trata. Un Script? es nuevo para mi. Ahora tendras que educarme. -_-

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