Pasar SmartForm a PDF

4
Es común que nos pidan hacer un resguardo de un formulario. Y probablemente tengamos que mostrarlo en PDF. 



En las siguientes líneas vamos a poder hacerlo.
*Declaración de variables
lf_formname TYPE tdsfname VALUE 'ZFIF_FORMATO_LIQER'.

*Función que devuelve el modulo de función del SmartForm 
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
 *Nombre del formulario SmartForm 
 formname            = lf_formname
IMPORTING
 fm_name             = lf_fm_name
EXCEPTIONS
 no_form             = 1
 no_function_module  = 2
 OTHERS              = 3.


*Traemos los valores del programa a las variables del smartforms que va imprimir el PDF
DATA: ls_ssfctrlop TYPE ssfctrlop. " Control Parameters
DATA: ls_output_options TYPE ssfcompop. " Output Options
DATA: ls_job_output_info TYPE ssfcrescl. " Job Output Info
DATA: ls_job_output_options TYPE ssfcresop. " Job Output Options

*Llama al modulo de función del SF 
ls_ssfctrlop-no_dialog = 'X'.
ls_ssfctrlop-getotf    = 'X'.
ls_ssfctrlop-preview   = 'X'.

*No funciona, se debe asignar una impresora x default al usuario
ls_output_options-tddest   = 'ZLOCAL'.
ls_output_options-tdnoprev = 'X'.
ls_output_options-tdtitle  = sy-title.
ls_output_options-tdnewid  = 'X'.


CALL FUNCTION lf_fm_name

EXPORTING
 ip_vuser           = lv_vuser     "Aprobador 
 ip_aprob           = lv_aprob     "Aprobador 
 ip_feapr           = lv_feapr     "Fecha de Aprob. Liq.
 ip_feren           = lv_feren     "Fecha de Liquidación
 ip_name1           = lv_name1     "Nombre de Personal
 ip_kostl           = lv_kostl     "Centro de Costo
 ip_bktxt           = lv_bktxt     "Motivo de Solicitud
 ip_fefin           = lv_fefin     "Duración Solicitud - Fec.Fin
 ip_feini           = lv_feini     "Duración Solicitud - Fec.Inicio
 ip_lifnr           = lv_lifnr     "Código de Personal
 ip_stcd1           = lv_stcd1     "Identificación
 ip_importe         = lv_importe   ""Importe de Solicitud 
 ip_wrbtr           = lv_wrbtr     "Importe de Solicitud 
 ip_dmbtr           = lv_dmbtr     "Importe de Solicitud 
 ip_mon_local       = lv_mon_local "En Mon. Local
 ip_mon_sgiro       = lv_mon_sgiro "Monto sobregiro
 ip_sociedad        = lv_sociedad  "Sociedad
 ip_sobregiro       = lv_sobregiro "Sobregiro
 ip_statu_solicitud = lv_statu_txt "Estado de la solicitud
 ip_belnr           = lv_belnr     "Nro de Solicitud
 ip_aufnr           = lv_aufnr     "Orden Interna
 ip_ttotal          = lv_ttotal    "Total - importe total
 ip_tsoles          = lv_tsoles    "Total - importe soles
 ip_tdolar          = lv_tdolar    "Total - importe dolar
 control_parameters = ls_ssfctrlop
 output_options     = ls_output_options
 *user_settings     = ' '

IMPORTING
 fm_name            = lf_fm_name
 job_output_info    = ls_job_output_info
 job_output_options = ls_job_output_options
TABLES
 t_detail           = lt_detail.

IF sy-subrc = 0.

 DATA: lv_bytecount TYPE i.
 DATA: lt_lines TYPE TABLE OF tline.
 DATA: ls_line TYPE tline.

*Convierte a PDF

CALL FUNCTION 'CONVERT_OTF'

 EXPORTING
  format       = 'PDF'

 IMPORTING
  bin_filesize = lv_bytecount
 TABLES
  otf          = ls_job_output_info-otfdata
  lines        = lt_lines.

IF sy-subrc = 0.

 DATA l_pdfstring TYPE xstring.
 DATA lv_string TYPE string.
 DATA lv_buffer TYPE xstring.
 DATA l_xline TYPE xstring.

LOOP AT lt_lines INTO ls_line. "into l_line.

 lv_string = ls_line.

 EXPORT my_data = lv_string TO DATA BUFFER lv_buffer.
 IMPORT my_data TO l_xline FROM DATA BUFFER lv_buffer IN CHAR-TO-HEX  MODE.
 CONCATENATE l_pdfstring l_xline INTO l_pdfstring IN BYTE MODE.

ENDLOOP.


DATA lv_filename TYPE string.

*Creo nombre a mi archivo PDF para este ejemplo colocamos 'er'

CONCATENATE 'formato_' 'er' '.pdf' INTO lv_filename.

*Genero a la impresión

  cl_wd_runtime_services=>attach_file_to_response(
  i_filename      = lv_filename "'OC.pdf'
  i_content       = l_pdfstring
  i_mime_type     = 'application/pdf'
  i_in_new_window = abap_false
  i_inplace       = abap_false

  ).

    ENDIF.

ENDIF.
Listo con este ejemplo puedes imprimir los datos de tu smartforms a PDF 
Tags

Publicar un comentario

4Comentarios
  1. Hola. Tengo una salida de smartforms en un LOOP para obtener el OTF (cuenta por cobrar) pero la primera salida se pega con la siguiente ¿como puedo independizar cada salida ¿limpiar la memoria del SMARTFORMS para la siguiente?

    ResponderBorrar
    Respuestas
    1. Exacto!! porque se queda en memoria los datos anteriores. Me avisas sino te paso un ejemplo

      Borrar
    2. Estimado Luis. Gracias por la pronta respuesta, como te comente no he logrado solucionar el problema, entonces si tienes una ejemplo te lo agradecería.

      Borrar
  2. Estimado Luis. Gracias por la pronta respuesta, como te comente no he logrado solucionar el problema, entonces si tienes una ejemplo te lo agradecería.

    ResponderBorrar
Publicar un comentario