Friday, 3 February 2023

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

Introduction:  In SAP CRM actions, we don’t have any option to configure, develop and print Adobe form. It allows printing of Smart Forms only.

But we can tweak system to make this feature possible, by doing some config/coding changes.

In SPRO, we have Actions available which gets configured with all the required business functionality. For the purposes of this explanation, I’ll use Actions in Billing as an illustration, and I’ll assume that we are aware of the fundamental criteria for developing action profiles and definitions. I’m going to skip right to maintaining Processing Types.

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_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.

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_parameters–preview IS INITIAL.
ls_fp_outputparams–reqimm   = ls_output_options–tdimmed.             ” 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_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.

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.

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_parameters–preview IS NOT INITIAL.
ls_fp_outputparams–getpdf   = ‘M’.
ls_fp_outputparams–bumode   = ‘-‘.
ENDIF.

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

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.
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_parameters–preview IS NOT INITIAL.
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.

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).

SAP ABAP Career, SAP ABAP Career Exam, SAP ABAP Skills, SAP ABAP Tutorial and Materials, SAP ABAP Certification, SAP ABAP Guides, SAP ABAP Learning

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.

SAP ABAP Career, SAP ABAP Career Exam, SAP ABAP Skills, SAP ABAP Tutorial and Materials, SAP ABAP Certification, SAP ABAP Guides, SAP ABAP Learning

SAP ABAP Career, SAP ABAP Career Exam, SAP ABAP Skills, SAP ABAP Tutorial and Materials, SAP ABAP Certification, SAP ABAP Guides, SAP ABAP Learning

SAP ABAP Career, SAP ABAP Career Exam, SAP ABAP Skills, SAP ABAP Tutorial and Materials, SAP ABAP Certification, SAP ABAP Guides, SAP ABAP Learning

And same document in WEBUI screen.

SAP ABAP Career, SAP ABAP Career Exam, SAP ABAP Skills, SAP ABAP Tutorial and Materials, SAP ABAP Certification, SAP ABAP Guides, SAP ABAP Learning

This brings the functionality to a close.

No comments:

Post a Comment