grabar smartforms en pdf

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • zebalia
    Member
    • dic
    • 30

    #1

    grabar smartforms en pdf

    Hola, tengo creado un smartform y me piden que en vez de salir los parámetros de impresión, se genere directamente un pdf.

    Como puedo hacerlo?

    Tengo entendido que tengo que poner en FORM ATTRIBUTES, la opción de Output Format: XSF Output, pero no tengo ni idea.

    Alguien me puede echar una mano?

    Gracias
  • ppchico
    Senior Member
    • oct
    • 144

    #2
    Creo que puedes generar un documento PDF con el SMARTFORMS... hay unas funciones especificas para ello, y generas una tabla con formato XSTRING, que puedes descargar al PC. Busca *PDF* en la transacción SE37, y busca el módulo de función que te interese. Suerte!

    Comentario

    • Neo_25
      Member
      • jun
      • 51

      #3
      A ver si te sirve. Yo es lo q uso.

      ************************************************** *********** S M A R T F O R M
      ************************************************** ********
      ***---------------------------------------------------------
      *** Configuración y creación del smartform
      ***---------------------------------------------------------
      **-------------------
      ** variables para sacar los datos del smartform
      **-------------------
      *DATA:
      * lfm_name TYPE rs38l_fnam,
      * lw_ctrlop TYPE ssfctrlop,
      * lw_compop TYPE ssfcompop,
      * lw_return TYPE ssfcrescl,
      * li_otf TYPE itcoo OCCURS 0 WITH HEADER LINE,
      * lv_len_in TYPE i,
      * li_tline TYPE TABLE OF tline WITH HEADER LINE.
      *
      *
      ******
      ** OBTENEMOS LOS DATOS DEL SMARTFORM
      ******
      ** llamo a mi smartform ZSGCF0001
      *CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
      * EXPORTING
      * formname = 'ZSGCF0001' "nombre del smartform
      * IMPORTING
      * fm_name = lfm_name
      * EXCEPTIONS
      * no_form = 1
      * no_function_module = 2
      * OTHERS = 3.
      *IF sy-subrc <> 0.
      * MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
      * WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      *ENDIF.
      *
      ** para no verlo y que se marquen solos algunos botones
      ** para que se mande imprimir directamente
      *lw_ctrlop-getotf = 'X'. "Retorno tab.OTF. Sin imprimir, visualizar
      *lw_ctrlop-no_dialog = 'X'.
      *lw_compop-tddest = 'LOCA'. "impresora local
      *
      ** variables de entrada y salida para el smartform
      *CALL FUNCTION lfm_name
      * EXPORTING
      * control_parameters = lw_ctrlop
      * output_options = lw_compop
      * user_settings = ' ' "tiene q estar con el espacio para q no salga la ventanita de impresión
      * e_task = pi_e_task
      * e_object = pi_e_object
      * i_estimation = pi_i_estimation
      * i_text_detail = pi_i_text_detail
      * IMPORTING
      * job_output_info = lw_return
      * EXCEPTIONS
      * formatting_error = 1
      * internal_error = 2
      * send_error = 3
      * user_canceled = 4
      * OTHERS = 5.
      *IF sy-subrc <> 0.
      * MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
      * WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      *ENDIF.
      *
      *li_otf[] = lw_return-otfdata[].
      *
      *
      ******
      ** Obtengo el PDF en una tabla interna
      ******
      *CALL FUNCTION 'CONVERT_OTF'
      * EXPORTING
      * format = 'PDF'
      * max_linewidth = 132
      * IMPORTING
      * bin_filesize = lv_len_in
      * TABLES
      * otf = li_otf[]
      * lines = li_tline
      * EXCEPTIONS
      * err_max_linewidth = 1
      * err_format = 2
      * err_conv_not_possible = 3
      * err_bad_otf = 4
      * OTHERS = 5.
      *IF sy-subrc <> 0.
      * MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
      * WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      *ENDIF.

      Comentario

      • zebalia
        Member
        • dic
        • 30

        #4
        Originalmente publicado por Neo_25
        A ver si te sirve. Yo es lo q uso.

        ************************************************** *********** S M A R T F O R M
        ************************************************** ********
        ***---------------------------------------------------------
        *** Configuración y creación del smartform
        ***---------------------------------------------------------
        **-------------------
        ** variables para sacar los datos del smartform
        **-------------------
        *DATA:
        * lfm_name TYPE rs38l_fnam,
        * lw_ctrlop TYPE ssfctrlop,
        * lw_compop TYPE ssfcompop,
        * lw_return TYPE ssfcrescl,
        * li_otf TYPE itcoo OCCURS 0 WITH HEADER LINE,
        * lv_len_in TYPE i,
        * li_tline TYPE TABLE OF tline WITH HEADER LINE.
        *
        *
        ******
        ** OBTENEMOS LOS DATOS DEL SMARTFORM
        ******
        ** llamo a mi smartform ZSGCF0001
        *CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
        * EXPORTING
        * formname = 'ZSGCF0001' "nombre del smartform
        * IMPORTING
        * fm_name = lfm_name
        * EXCEPTIONS
        * no_form = 1
        * no_function_module = 2
        * OTHERS = 3.
        *IF sy-subrc <> 0.
        * MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
        * WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
        *ENDIF.
        *
        ** para no verlo y que se marquen solos algunos botones
        ** para que se mande imprimir directamente
        *lw_ctrlop-getotf = 'X'. "Retorno tab.OTF. Sin imprimir, visualizar
        *lw_ctrlop-no_dialog = 'X'.
        *lw_compop-tddest = 'LOCA'. "impresora local
        *
        ** variables de entrada y salida para el smartform
        *CALL FUNCTION lfm_name
        * EXPORTING
        * control_parameters = lw_ctrlop
        * output_options = lw_compop
        * user_settings = ' ' "tiene q estar con el espacio para q no salga la ventanita de impresión
        * e_task = pi_e_task
        * e_object = pi_e_object
        * i_estimation = pi_i_estimation
        * i_text_detail = pi_i_text_detail
        * IMPORTING
        * job_output_info = lw_return
        * EXCEPTIONS
        * formatting_error = 1
        * internal_error = 2
        * send_error = 3
        * user_canceled = 4
        * OTHERS = 5.
        *IF sy-subrc <> 0.
        * MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
        * WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
        *ENDIF.
        *
        *li_otf[] = lw_return-otfdata[].
        *
        *
        ******
        ** Obtengo el PDF en una tabla interna
        ******
        *CALL FUNCTION 'CONVERT_OTF'
        * EXPORTING
        * format = 'PDF'
        * max_linewidth = 132
        * IMPORTING
        * bin_filesize = lv_len_in
        * TABLES
        * otf = li_otf[]
        * lines = li_tline
        * EXCEPTIONS
        * err_max_linewidth = 1
        * err_format = 2
        * err_conv_not_possible = 3
        * err_bad_otf = 4
        * OTHERS = 5.
        *IF sy-subrc <> 0.
        * MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
        * WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
        *ENDIF.
        Y donde me genera el fichero?

        Gracias muy util!

        Comentario

        • ppchico
          Senior Member
          • oct
          • 144

          #5
          En este caso, tienes la tabla con el fichero, solo tendrías que descargarlo al PC, con el módulo de funciones GUI_DOWNLOAD. Puedes mirar el REPORT ESTÁNDAR RSTXPDFT que pasa los textos estándar a PDF y los descargas.
          Editado por última vez por ppchico; 12/02/2010, 12:20:47.

          Comentario

          • Neo_25
            Member
            • jun
            • 51

            #6
            Bueno, ya completo.
            Lo bajarías así:

            *****
            * LO BAJAMOS AL PC --> C:\TEMP\
            *****
            ** convierto la tabla interna del PDF a PDF en el disco duro "C:\TEMP\PDFEMAIL.PDF"
            * CALL FUNCTION 'GUI_DOWNLOAD'
            * EXPORTING
            * bin_filesize = lv_len_in
            * filename = lv_ruta_fich
            * filetype = 'BIN'
            * TABLES
            * data_tab = li_tline
            * 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.

            Comentario

            • zebalia
              Member
              • dic
              • 30

              #7
              Originalmente publicado por Neo_25
              Bueno, ya completo.
              Lo bajarías así:

              *****
              * LO BAJAMOS AL PC --> C:\TEMP\
              *****
              ** convierto la tabla interna del PDF a PDF en el disco duro "C:\TEMP\PDFEMAIL.PDF"
              * CALL FUNCTION 'GUI_DOWNLOAD'
              * EXPORTING
              * bin_filesize = lv_len_in
              * filename = lv_ruta_fich
              * filetype = 'BIN'
              * TABLES
              * data_tab = li_tline
              * 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.

              Chicos, os debo una, muchas gracias.

              El lunes lo pruebo en el curro y os cuento.

              Saludos

              Comentario

              • zebalia
                Member
                • dic
                • 30

                #8
                Gracias de nuevo, lo acabo de probar y funciona perfectamente.

                Solo tengo un pequeño problemilla. Me gustaría que el fichero lo guardase en un directorio de sap, en concreto un directorio que se llama DIR_INFORMES. Si me fijo en la ruta de este directorio, se llama /usr/sap/blablabla/blablabla.

                Como puedo hacer para pasarle ese directorio de SAP ?

                Muchisimas gracias

                Comentario

                • Neo_25
                  Member
                  • jun
                  • 51

                  #9
                  La variable local lv_ruta_fich es del tipo q sea filename.
                  Y le metes a lv_ruta_fich = '/usr/sap/blablabla/blablabla'.

                  * filename = lv_ruta_fich 'C:\temp\Sentencias.pdf' "R U T A

                  prueba a ver así.

                  Comentario

                  • zebalia
                    Member
                    • dic
                    • 30

                    #10
                    Si, es lo que hice, pero esa ruta no me la reconoce, ya que no está en mi ordenador, sino que es una ruta de SAP que a saber donde está realmente.

                    De todos modos, lo he hablado con mi jefe y me ha dicho que puedo grabar el fichero en local, siempre que se le de la posibilidad al usuario de elegir la ruta (una especie de explorador vamos...).

                    Sabeis si hay alguna propiedad o matchcode que permita abrir el explorador y seleccionar una ruta? Si no, le diré que ponga la ruta a pelo, aunque es un poco feo...

                    Gracias por vuestra ayuda.

                    Comentario

                    • Neo_25
                      Member
                      • jun
                      • 51

                      #11
                      Prueba esto:

                      *En P_FILE va a quedar guardada la ruta del archivo
                      PARAMETERS: p_file TYPE LOCALFILE. "Fichero local para upload/download

                      *Llamamos a la función que abre el browser apretando el matchcode
                      AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
                      CALL FUNCTION 'F4_FILENAME'
                      EXPORTING
                      program_name = sy-repid
                      dynpro_number = sy-dynnr
                      field_name = 'path'
                      IMPORTING
                      file_name = p_file.

                      Comentario

                      • Neo_25
                        Member
                        • jun
                        • 51

                        #12
                        Donde lo tienes q subir es una ruta del servidor?

                        Comentario

                        • zebalia
                          Member
                          • dic
                          • 30

                          #13
                          Originalmente publicado por Neo_25
                          Donde lo tienes q subir es una ruta del servidor?

                          Eso mismo le he preguntado pero no me ha sabido responder. Me dice que es un directorio de SAP pero no se donde está fisicamente. Solo se que con la transacción AL11 puedo ver dicho directorio y tiene esa ruta "usr/sap/blablabla...."

                          De todos modos, voy a probar eso del machtcode que me has puesto, que además tengo que hacer unos cuantos para ciertos campos...a ver si investigo porque no he hecho uno en mi vida

                          Gracias por tu tiempo Neo

                          Comentario

                          • Neo_25
                            Member
                            • jun
                            • 51

                            #14
                            Me pillas q tengo poca cosa q hacer, y q lo q estás haciendo lo he hecho más o menos, porque yo llevo poco tiempo con SAP.

                            Eso de la AL11 lo hice yo y es subirlo al servidor de SAP, te pongo el código q yo usé:

                            * Tabla interna donde guardaremos el fichero txt
                            DATA: i_txt TYPE ty_tab_txt.
                            DATA: w_ruta TYPE localfile.

                            PERFORM f_subir_txt_a_servidor USING i_txt
                            w_ruta.

                            *&---------------------------------------------------------------------*
                            *& Form F_SUBIR_TXT_A_SERVIDOR
                            *&---------------------------------------------------------------------*
                            * Subimos el fichero txt al servidor
                            *----------------------------------------------------------------------*
                            * -->PI_TXT Tabla que contiene todas las líneas a subir
                            * -->PI_RUTA Ruta donde guardar el fichero txt
                            *----------------------------------------------------------------------*
                            FORM f_subir_txt_a_servidor USING pi_txt TYPE ty_tab_txt
                            pi_ruta TYPE localfile.

                            FIELD-SYMBOLS: <fs_txt> TYPE ty_tyl_txt.

                            * si el fichero no existe lo crea
                            * con el appending añadimos al fichero más líneas, es decir
                            * la 1ª vez se meten 50 líneas,
                            * la 2ª vez habría 100 (50 + 50)
                            * no crea otro fichero nuevo, ni machaca al q ya existe

                            OPEN DATASET pi_ruta FOR APPENDING IN TEXT MODE ENCODING DEFAULT.
                            IF sy-subrc = 0.
                            LOOP AT pi_txt ASSIGNING <fs_txt>.
                            TRANSFER <fs_txt> TO pi_ruta.
                            ENDLOOP.
                            CLOSE DATASET pi_ruta.
                            IF sy-subrc <> 0.
                            MESSAGE e999(pp) WITH text-003 pi_ruta. "mal cerrado
                            ENDIF.
                            ELSE.
                            MESSAGE e999(pp) WITH text-002 pi_ruta. "mal abierto
                            ENDIF.

                            ENDFORM. " F_SUBIR_TXT_A_SERVIDOR

                            Comentario

                            • zebalia
                              Member
                              • dic
                              • 30

                              #15
                              Pero mi fichero es un pdf...me dejará igualmente?? Es que lo de escritura por el final en un pdf... dudo mucho que me deje

                              Voy a probar

                              Comentario

                              Trabajando...