Skip to Content
Technical Articles
Author's profile photo Yasho Ratna Gupta

Printing Multiple Copies of the Adobe Form as a single document from SAP CRM Actions (in GUI/CRM WebUI)

Introduction: In my previous blog, I have demonstrated how to enable Adobe Form printing/preview in SAP CRM actions by creating a proxy to Smart Form.

Requirement: In this blog, I’ll explain how to deal with printing multiple copies of an Adobe form in CRM actions and turn on the functionality to preview and print from the CRM WEBUI screen.

We need to apply same config/code from previous article but will modify method EXEC_ADOBE_FORM to establish the solution.

To print multiple copies of the adobe form in a one spool job or combining all the copies in a single document, we will open the PDF JOB (by function module FP_JOB_OPEN), call the Adobe form in a loop (number of times required to print) and close the PDF JOB (by function module FP_JOB_CLOSE). Let’s outline the strategy step by step.

Step 1: Before invoking, FP_JOB_OPEN, we need to set some form processing output parameters as follows.

ls_fp_outputparamsdest        ls_output_optionstddest.
ls_fp_outputparamsnodialog is_control_parametersno_dialog.
ls_fp_outputparamsreqnew   ls_output_optionstdnewid.
ls_fp_outputparamspreview  is_control_parameterspreview.

Furthermore, if we want to print on a physical printer (in a spool), we’ll need to set the additional o/p parameter (reqimm) as shown below.

IF is_control_parameterspreview IS INITIAL.
ls_fp_outputparamsreqimm   ls_output_optionstdimmed.             ” To print on actuals
ENDIF.

Step 2: The Adobe Function Module must then be invoked repeatedly while being given the control parameters listed below.

ls_control_parameterslangu lv_sf_langu.
ls_control_parametersno_open abap_true.
ls_control_parametersno_close abap_true.
ls_control_parametersgetotf abap_true.

Step 3: To finish, execute FP JOB CLOSE to close down the spool job. Next, gather all of the results and give them through to the exporting parameter es job output info.

These three steps will complete the functionality, allowing us to view one document (one print/print preview) with multiple copies of the Adobe form in SAP GUI screen only, not on CRM WEBUI screen. Because WEBUI screen expects data in OTF format, and Adobe FM returns PDF data with type tfpcontent (Table with Multiple XFTs, XFDs, PDFs), so no luck in WEBUI.

In order to accomplish this feature, additional output parameters must be provided, and further steps must involve converting PDF data to OTF data (see to the link).

Step 4: Check first to see if it is not a GUI screen call, and then set two further parameters:

GETPDF as ‘M’ and BUMODE as ‘-‘

* GUI connection enabled ?
CALL FUNCTION ‘RFC_IS_GUI_ON’
EXPORTING
login_check abap_false
IMPORTING
on          lv_gui.

IF lv_gui NE ‘Y’ AND is_control_parameterspreview IS NOT INITIAL.
ls_fp_outputparamsgetpdf   ‘M’.
ls_fp_outputparamsbumode   ‘-‘.
ENDIF.

Step 5: Call function module FP_GET_PDF_TABLE to get all the PDF data.

IF lv_gui NE ‘Y’ AND is_control_parameterspreview IS NOT INITIAL.
  CALL FUNCTION ‘FP_GET_PDF_TABLE’
   IMPORTING
    e_pdf_table lt_pdf_table.
ENDIF.

Step 6:  Now transform the PDF data to OTF format, then send it as an exporting parameter. To view the code, please click on the method link.

IF lv_gui NE ‘Y’ AND is_control_parameterspreview IS NOT INITIAL.
LOOP AT lt_pdf_table ASSIGNING FIELDSYMBOL(<fs_pdf>).
CALL METHOD get_pdf_to_otf(
EXPORTING
iv_pdf      <fs_pdf>
IMPORTING
et_otf_data DATA(li_otf).
ENDLOOP.

es_job_output_infootfdata[] li_otf.
ENDIF.

For both GUI and WEBUI screens, kindly follow the whole code, which includes multiple copies of PDF in a single document.

DATA: lv_dummy(254)           TYPE c,
        ls_printer_profile_data TYPE tsppf_prpr_002,
        lv_adobe_fm_name        TYPE rs38l_fnam.  
TRY .
      DATA(lv_adobe_form) = ip_smart_form.
      CALL FUNCTION 'FP_FUNCTION_MODULE_NAME'
        EXPORTING
          i_name     = lv_adobe_form
        IMPORTING
          e_funcname = lv_adobe_fm_name.
    CATCH cx_fp_api_repository
          cx_fp_api_usage
          cx_fp_api_internal.
      IF sy-subrc <> 0.
*   add an error message to processing protocol
        MESSAGE i015(sppf_media) WITH lv_adobe_form INTO lv_dummy.
        CALL METHOD cl_log_ppf=>add_message
          EXPORTING
            ip_problemclass = '1'
            ip_handle       = ip_application_log.
        RETURN.
      ENDIF.
  ENDTRY.
*-----------fill archive parameters for archive link -------------------
  IF is_output_options-tdarmod = '2'
     OR is_output_options-tdarmod = '3'.

*   archive_index_tab
    ASSIGN ct_archive_index_tab[ 1 ] TO FIELD-SYMBOL(<fs_archive_index>).
    IF sy-subrc EQ 0 AND <fs_archive_index> IS ASSIGNED.
*   just fill the id of actual BOR object
      <fs_archive_index>-object_id = lv_bea_guid.
      IF <fs_archive_index>-object_id IS INITIAL.
        DELETE ct_archive_index_tab INDEX 1.
      ENDIF.
    ENDIF.
  ENDIF.
*-----------language of smart form--------------------------------------
* determin here the language of the smart form

  DATA(ls_control_parameters) = is_control_parameters.
  ls_control_parameters-langu = lv_sf_langu.
  ls_control_parameters-no_open = abap_true.
  ls_control_parameters-no_close = abap_true.
  ls_control_parameters-getotf = abap_true.

  DATA(ls_output_options) = is_output_options.

  IF NOT ls_printer_profile_data IS INITIAL.
    ls_output_options = CORRESPONDING #( ls_printer_profile_data ).
  ENDIF.

  DATA : ls_fp_outputparams TYPE sfpoutputparams,
         lt_pdf_table       TYPE tfpcontent,
         lv_gui             TYPE answer,
         ls_result          TYPE sfpjoboutput.

  ls_fp_outputparams-dest     = ls_output_options-tddest.
  ls_fp_outputparams-nodialog = is_control_parameters-no_dialog.
  ls_fp_outputparams-reqnew   = ls_output_options-tdnewid.
  ls_fp_outputparams-preview   = is_control_parameters-preview.

  IF is_control_parameters-preview IS INITIAL.
    ls_fp_outputparams-reqimm   = ls_output_options-tdimmed.             " To print on actuals
  ENDIF.

* GUI connection enabled?
  CALL FUNCTION 'RFC_IS_GUI_ON'
    EXPORTING
      login_check = abap_false
    IMPORTING
      on          = lv_gui.
  IF lv_gui NE 'Y' AND is_control_parameters-preview IS NOT INITIAL.
    ls_fp_outputparams-getpdf   = 'M'.
    ls_fp_outputparams-bumode   = '-'.
  ENDIF.

* Sets the output parameters and opens the spool job
  CALL FUNCTION 'FP_JOB_OPEN'                   "& Form Processing: Call Form
    CHANGING
      ie_outputparams = ls_fp_outputparams
    EXCEPTIONS
      cancel          = 1
      usage_error     = 2
      system_error    = 3
      internal_error  = 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.
    RETURN.
  ENDIF.

** Logic for all the required exporting parameters (Here bdh, bdi, bdh_cond, bdi_cond : related to CRM billing) will be filled up as per business functionality.

  DO ls_output_options-tdcopies TIMES.

    CALL FUNCTION lv_adobe_fm_name
      EXPORTING
        archive_index        = is_archive_index
        archive_index_tab    = ct_archive_index_tab
        archive_parameters   = is_archive_parameters
        control_parameters   = ls_control_parameters
        mail_appl_obj        = is_mail_appl_obj
        mail_recipient       = is_mail_recipient
        mail_sender          = is_mail_sender
        output_options       = ls_output_options
        user_settings        = ip_user_settings
        bdh                  = <s_bdh>
        bdi                  = <t_bdi>
        bdh_cond             = lt_bdh_cond
        bdi_cond             = lt_bdi_cond
      IMPORTING
        document_output_info = es_document_output_info
        job_output_info      = es_job_output_info
        job_output_options   = es_job_output_options
      EXCEPTIONS
        formatting_error     = 1
        internal_error       = 2
        send_error           = 3
        user_canceled        = 4
        OTHERS               = 5.
    IF sy-subrc <> 0.
*   add an error message to processing protocol
      CASE sy-subrc.
        WHEN 1.
          MESSAGE e016(sppf_media) INTO lv_dummy.
        WHEN 2.
          MESSAGE e017(sppf_media) WITH lv_adobe_fm_name INTO lv_dummy.
        WHEN 3.
          MESSAGE e018(sppf_media) WITH lv_adobe_fm_name INTO lv_dummy.
      ENDCASE.
      CALL METHOD cl_log_ppf=>add_message
        EXPORTING
          ip_problemclass = '1'
          ip_handle       = ip_application_log.
    ENDIF.
  ENDDO.

*&---- Close the spool job
  CALL FUNCTION 'FP_JOB_CLOSE'
    IMPORTING
      e_result       = ls_result
    EXCEPTIONS
      usage_error    = 1
      system_error   = 2
      internal_error = 3
      OTHERS         = 4.
  IF sy-subrc = 0.
    es_job_output_info = CORRESPONDING #( ls_result ).
  ENDIF.

  IF lv_gui NE 'Y' AND is_control_parameters-preview IS NOT INITIAL.
    CALL FUNCTION 'FP_GET_PDF_TABLE'
      IMPORTING
        e_pdf_table = lt_pdf_table.

    LOOP AT lt_pdf_table ASSIGNING FIELD-SYMBOL(<fs_pdf>).
      CALL METHOD get_pdf_to_otf(
        EXPORTING
          iv_pdf      = <fs_pdf>
        IMPORTING
          et_otf_data = DATA(li_otf) ).
    ENDLOOP.

    es_job_output_info-otfdata[] = li_otf.
  ENDIF.

* get error table
  CALL FUNCTION 'SSF_READ_ERRORS'
    IMPORTING
      errortab = et_error_tab.

 

Let’s see the print preview or process the action (Actions in Billing) to see the outcome with multiple copies (let’s say three copies) of the form (In the same way how, we execute smart form).

Here, we can see a printout that was created directly in PDF format with three copies (image showing as Document 1 of 3). To view each of the three copies separately, click Next Document.

And same document in WEBUI screen.

This brings the functionality to a close.

I appreciate you reading the content. I hope you enjoyed reading it. Please feel free to offer your insightful thoughts and recommendations.

Assigned Tags

      4 Comments
      You must be Logged on to comment or reply to a post.
      Author's profile photo MRA Viewonly
      MRA Viewonly

      Hi,

      I am trying to display a print preview of a smartform on the CRM WEB UI and I have used this code.

      However, the print preview is not displaying on the WEB UI. (Please see attached)

      Upon scheduling the form, the status is processed and the form appears in the spool in the SAP GUI but no print preview is appearing on the web ui.

      Can you please help?

      Author's profile photo Yasho Ratna Gupta
      Yasho Ratna Gupta
      Blog Post Author

      Hi,

      Generally, print preview option appears on top-of page as shown in images. If you have multiple actions, then you need to select it from Schedule Actions assignment block by doing edit list and then need to click Preview output/ Output Preview option.

      Author's profile photo MRA Viewonly
      MRA Viewonly

      Hello Yasho,

      Thank you for your feedback. However, I am using component S4CRM and I cannot find the Preview output button on the UI. The screen is as follows:

      I cannot find the More button also:

      Any advise on how to enable the preview output button ?

       

      Thank you.

      Author's profile photo Yasho Ratna Gupta
      Yasho Ratna Gupta
      Blog Post Author

      Hello,

      Can you make sure, if highlighted configuration are checked for action definition ?

      Set ( check) the checkboxes for Schedule Automatically, Changeable in Dialog, Executable in dialog and Display in Toolbox and Processed at Processing using Selection report.

      Print preview will happen only if you have scheduled (not processed) action in the list.