Quantcast
Channel: SCN: Message List
Viewing all articles
Browse latest Browse all 8950

Re: Using Smartforms with SAP ITS

$
0
0

So, here is the next test program (it will also require creating one dynpro with custom container in which html viewer has to run):


*----------------------------------------------------------------------*
*      Report SF_EXAMPLE_01
*----------------------------------------------------------------------*
*      Printing of documents using Smart Forms
*----------------------------------------------------------------------*
REPORT zsf_example_01.
TABLES: sscrfields .

INCLUDE icons.

DATA: carr_id TYPE sbook-carrid,
      fm_name TYPE rs38l_fnam.

SELECTION-SCREENFUNCTIONKEY1"Will have a function code of 'FC01'
PARAMETER:      p_custid TYPE scustom-id DEFAULT1.
SELECT-OPTIONS: s_carrid FOR carr_id    DEFAULT'LH'TO'LH'.
PARAMETER:      p_form  TYPE tdsfname  DEFAULT'SF_EXAMPLE_01'MODIFID oon .
PARAMETERS:    printpar LIKE eprintparams NO-DISPLAY.

DATA: customer    TYPE scustom,
      bookings    TYPE ty_bookings,
      connections TYPE ty_connections.

DATA: gs_sfcp TYPE ssfctrlop ,
      gs_sfoo TYPE ssfcompop,
      gs_job_output_info TYPE  ssfcrescl,
      g_pdf_len TYPE i,
      g_pdf_xstring TYPE xstring ,
      gc_html_viewer TYPEREFTO cl_gui_custom_container,
      go_html_viewer TYPEREFTO cl_gui_html_viewer,
      gt_pdf_raw TYPESTANDARDTABLEOF bin1024 ."raw255 ."or bin1024 or any type x.

* get data
SELECTSINGLE*FROM scustom INTO customer WHERE id = p_custid.
CHECK sy-subrc =0.
SELECT*FROM sbook INTOTABLE bookings
        WHERE customid = p_custid
        AND  carrid  IN s_carrid
        ORDERBYPRIMARYKEY.
SELECT*FROM spfli INTOTABLE connections
        FORALLENTRIESIN bookings
        WHERE carrid = bookings-carrid
        AND  connid = bookings-connid
        ORDERBYPRIMARYKEY.

INITIALIZATION .
  sscrfields-functxt_01 = icon_print_with_parameters &&'Options' .


ATSELECTION-SCREEN .
* force input of print options
  IF sy-ucomm EQ'FC01'OR
    ( ( sy-ucomm EQ'ONLI'OR sy-ucomm EQ'PRIN'OR sy-ucomm EQ'SJOB' ) AND
      printpar-tddest ISINITIAL ) .
    PERFORM get_printpar CHANGING printpar .
    IF printpar-tddest ISINITIAL .
      CLEAR sy-ucomm .
      LEAVETOSCREEN sy-dynnr .
    ENDIF.
  ENDIF .

START-OF-SELECTION .
* print data
  CALLFUNCTION 'SSF_FUNCTION_MODULE_NAME'
    EXPORTING
      formname          = p_form
    IMPORTING
      fm_name            = fm_name
    EXCEPTIONS
      no_form            =1
      no_function_module =2
      OTHERS            =3.

  IF sy-subrc <>0.
    MESSAGEID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

  MOVE-CORRESPONDING printpar TO gs_sfcp .
  MOVE-CORRESPONDING printpar TO gs_sfoo .
  gs_sfcp-no_dialog ='X'.
  IF sy-batch ISINITIAL . "get_otf in dialog
    gs_sfcp-getotf ='X' .
  ENDIF .

* now call the generated function module
  CALLFUNCTION fm_name
    EXPORTING
      control_parameters = gs_sfcp
      output_options    = gs_sfoo
      customer          = customer
      bookings          = bookings
      connections        = connections
    IMPORTING
      job_output_info    = gs_job_output_info
    EXCEPTIONS
      formatting_error  =1
      internal_error    =2
      send_error        =3
      user_canceled      =4
      OTHERS            =5.

  IF sy-subrc <>0.
    MESSAGEID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ELSE .

    CHECK sy-batch ISINITIAL . "Only online

    PERFORM get_pdf_as_rawtable
      USING
      gs_job_output_info-otfdata[]
      CHANGING
        gt_pdf_raw
        g_pdf_len .

    CALLSCREEN 100 .
  ENDIF.

ATSELECTION-SCREENOUTPUT .
  LOOPATSCREEN .
    IF screen-group1 ='OON' .
      screen-input =0 .
      MODIFYSCREEN .
    ENDIF .
  ENDLOOP.

*&---------------------------------------------------------------------*
*&      Module  CREATE_VIEWER  OUTPUT
*&---------------------------------------------------------------------*
*      text
*----------------------------------------------------------------------*
MODULE create_viewer OUTPUT.

  CHECK gc_html_viewer ISNOTBOUND .

  SETPF-STATUS'SIMPLE' .

  PERFORM create_pdf_viewer USING gt_pdf_raw g_pdf_len.

ENDMODULE.                " CREATE_VIEWER  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND  INPUT
*&---------------------------------------------------------------------*
*      text
*----------------------------------------------------------------------*
MODULE user_command INPUT.
  CASE sy-ucomm .
    WHEN'EXIT'OR 'CANC'OR'BACK' .
      go_html_viewer->free( ) .
      gc_html_viewer->free( ).
      LEAVEPROGRAM .
    WHENOTHERS .
      CLEAR sy-ucomm .
  ENDCASE .
ENDMODULE.                " USER_COMMAND  INPUT

FORM get_printpar CHANGING cs_printpar TYPE eprintparams.

  DATA: ls_printpar TYPE eprintparams .

  ls_printpar = cs_printpar .
  ls_printpar-device ='PRINTER'.

  CALLFUNCTION 'EFG_GET_PRINT_PARAMETERS'
    EXPORTING
      x_printparams  = ls_printpar
      x_no_preview  = abap_true
      x_no_archive  = abap_true
      x_no_last_doc  = abap_true
      x_only_printer = abap_true
    IMPORTING
      y_printparams  = ls_printpar
    EXCEPTIONS
      cancelled      =1
      input_error    =2
      failed        =3
      OTHERS        =4.
  IF sy-subrc EQ0 .
    cs_printpar = ls_printpar .
  ELSEIF sy-subrc EQ1OR
        sy-subrc EQ2 .
    MESSAGEID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ELSEIF sy-subrc GE3.
    MESSAGE e898(e9) WITH
    'sy-subrc' sy-subrc 'EFG_GET_PRINT_PARAMETERS' space.
  ENDIF.

ENDFORM .                    " DEFINE_PRINT_PAR

FORM create_pdf_viewer
  USING
  it_pdf_raw TYPESTANDARDTABLE
  i_pdf_len TYPE i .

  DATA:
    l_style TYPE i,
    l_pdf_alignment TYPE i,
    l_url TYPE w3url.

  l_style = cl_gui_control=>ws_child +
          cl_gui_control=>ws_visible.

* create custom container
  CREATEOBJECT gc_html_viewer
    EXPORTING
      container_name              ='GC_HTML_VIEWER'
      style                      = l_style
    EXCEPTIONS
      cntl_error                  =1
      cntl_system_error          =2
      create_error                =3
      lifetime_error              =4
      lifetime_dynpro_dynpro_link =5
      OTHERS                      =6.
  IF sy-subrc <>0.
    MESSAGEID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

* create HTML viewer object
  CREATEOBJECT go_html_viewer
    EXPORTING
      parent = gc_html_viewer.

  l_pdf_alignment = go_html_viewer->align_at_left  +
                    go_html_viewer->align_at_right +
                    go_html_viewer->align_at_top  +
                    go_html_viewer->align_at_bottom.

  go_html_viewer->set_alignment(
    EXPORTING
      alignment        = l_pdf_alignment    " Alignment
    EXCEPTIONS
      cntl_error        =1
      cntl_system_error =2
      OTHERS            =3
  ).
  IF sy-subrc <>0.
    MESSAGEID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

* load PDF data (get URL)
  go_html_viewer->load_data(
    EXPORTING
      type                  ='application'
      subtype                ='pdf'
      size                  = i_pdf_len
    IMPORTING
      assigned_url          = l_url
    CHANGING
      data_table            = it_pdf_raw
    EXCEPTIONS
      dp_invalid_parameter  =1
      dp_error_general      =2
      cntl_error            =3
      html_syntax_notcorrect =4
      OTHERS                =5
  ).
  IF sy-subrc <>0.
    MESSAGEID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

* show HTML object with PDF
  go_html_viewer->show_url(
    EXPORTING
      url = l_url
      in_place ='X'
    EXCEPTIONS
      cntl_error =1
      cnht_error_not_allowed =2
      cnht_error_parameter =3
      dp_error_general =4
      OTHERS=5
  ).
  IF sy-subrc <>0.
    MESSAGEID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM .

FORM get_pdf_as_rawtable
  USING
    it_otf TYPE tsfotf
  CHANGING
    ct_pdf_rawtable TYPESTANDARDTABLE
    c_pdf_size TYPE i.

  DATA: lt_dummylines TYPE tlinetab,
        l_pdf_xstring TYPE xstring.

  CALLFUNCTION 'CONVERT_OTF'
    EXPORTING
      format                ='PDF'
    IMPORTING
      bin_filesize          = c_pdf_size
      bin_file              = l_pdf_xstring
    TABLES
      otf                  = it_otf[]
      lines                = lt_dummylines[]
    EXCEPTIONS
      err_max_linewidth    =1
      err_format            =2
      err_conv_not_possible =3
      err_bad_otf          =4
      OTHERS                =5.
  IF sy-subrc <>0.
    MESSAGEID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy- msgv4.
  ELSE .
    PERFORM xstring_to_rawtable
      USING l_pdf_xstring ct_pdf_rawtable .
  ENDIF.

ENDFORM .

FORM xstring_to_rawtable
  USING
    i_xstring TYPE xstring
  CHANGING
    ct_rawtable TYPESTANDARDTABLE .

  FIELD-SYMBOLS: <l_raw> TYPE x .
  DATA: l_ref TYPEREFTO data .
  DATA: l_size TYPE i, l_offset TYPE i, l_len TYPE i .
  DATA: lo_table TYPEREFTO cl_abap_tabledescr .
  DATA: lo_line TYPEREFTO cl_abap_datadescr .

  l_size = xstrlen( i_xstring ) .

  "create table work area
  lo_table ?= cl_abap_tabledescr=>describe_by_data( ct_rawtable ) .
  lo_line ?= lo_table->get_table_line_type( ).
  CREATEDATA l_ref TYPEHANDLE lo_line .
  ASSIGN l_ref- >* TO<l_raw> .  "should dump if wrong table type passed

  "set data length
  l_len = cl_abap_typedescr=>describe_by_data( <l_raw> )->length .
  "limit data length
  IF l_offset + l_len GT l_size .
    l_len = l_size - l_offset .
  ENDIF.

  WHILE l_offset LT l_size.

    <l_raw> = i_xstring+l_offset(l_len) .
    APPEND<l_raw> TO ct_rawtable .

    "offset to next data line
    ADD l_len TO l_offset .
    "limit data length of last data line
    IF l_offset + l_len GT l_size .
      l_len = l_size - l_offset .
    ENDIF.

  ENDWHILE .

ENDFORM .

 

Create a dynpro 0100 for the program as follows:

ITS6.png

- add custom container named GC_HTML_VIEWER

- add flow logic as follows:


PROCESS BEFORE OUTPUT.
  MODULE create_viewer .
*
PROCESS AFTER INPUT.
  MODULE user_command.

 

Finally, create a GUI status named SIMPLE, with nothing but EXIT, BACK and CANC functions enabled:

ITS7.png

Activate everything and program should run. Then create a report transaction for it and test it under ICF services.

 

cheers

Jānis


Viewing all articles
Browse latest Browse all 8950

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>