Tuesday, July 22, 2008

Smartform Example Program

*** To generate Bills for Each Sold-to-Party Separately
REPORT zbill_letter MESSAGE-ID zid no standard page heading.
**** tables ******************
TYPE-POOLS: vrm.
TABLES: jhtfp , jhtfk, tsp02 , itcpp.
****** constants *********
DATA: boolean(1) TYPE c.
CONSTANTS:
true LIKE boolean VALUE 'X',
false LIKE boolean VALUE space,
on LIKE boolean VALUE 'X',
off LIKE boolean VALUE space.
*---------------------------------------------------------------------*
* Internal tables Begin with IT_ *
*---------------------------------------------------------------------*
DATA it_final TYPE TABLE OF zsletter.
DATA it_final1 TYPE TABLE OF zsletter.
*---------------------------------------------------------------------*
* Data Begin with W_ *
*---------------------------------------------------------------------*

DATA w_final LIKE LINE OF it_final.
DATA control TYPE ssfctrlop. " to supress the dialog box of printer
DATA fm_name TYPE rs38l_fnam. " to get function module name of smartform
DATA output TYPE ssfcompop. " For output Parameters

DATA:
is_frontend(1) TYPE c,
is_mail(1) TYPE c,
no_choice(1) TYPE c,
frontend_mail TYPE ssfpp-rqposname,
match(1) TYPE c,
prdest LIKE itcpp-rqposname,
prlist TYPE STANDARD TABLE OF frprlist
WITH HEADER LINE,
pr_list TYPE vrm_values,
value LIKE LINE OF pr_list,
name type vrm_id.
*---------------------------------------------------------------------*
* Selection screen *
*---------------------------------------------------------------------*
SELECTION-SCREEN: BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
SELECT-OPTIONS: so_vkorg FOR jhtfk-vkorg NO INTERVALS NO-EXTENSION OBLIGATORY,
so_beinh FOR jhtfp-beinh,
so_kunag FOR jhtfp-kunag,
so_fkdat FOR jhtfk-fkdat OBLIGATORY,
so_vtweg FOR jhtfp-vtweg,
so_spart FOR jhtfp-spart.
SELECTION-SCREEN: END OF BLOCK b1.
****** for printer settings *****
PARAMETERS: pr_check as checkbox USER-COMMAND chk.
SELECTION-SCREEN: BEGIN OF BLOCK b2 WITH FRAME TITLE text-002.
PARAMETERS: pr_out LIKE itcpp-tddest DEFAULT 'LOCL',
pr_print LIKE itcpp-rqposname as listbox visible length 50.

PARAMETERS: pr_pre radiobutton group rad1 default 'X',
pr_pnt radiobutton group rad1.
SELECTION-SCREEN: END OF BLOCK b2.
*---------------------------------------------------------------------*
* At selection-screen *
*---------------------------------------------------------------------*
AT SELECTION-SCREEN output.
**to display the list of printers connected with SAP FontEnd
is_frontend = false.
no_choice = false.

CLEAR: prlist[], prlist, pr_print, prdest.

CALL FUNCTION 'RSPO_FRONTEND_PRINTERS_FOR_DEV'
EXPORTING
device = pr_out
IMPORTING
prdefault = prdest
is_frontend = is_frontend
no_choice = no_choice
TABLES
list = prlist
EXCEPTIONS
no_list = 1
list_truncated = 2
name_not_found = 3
OTHERS = 4.
IF sy-subrc <> 0.
is_frontend = false.
is_mail = false.
no_choice = false.
CLEAR: prlist[], pr_print, prdest.
ENDIF.

IF is_frontend = true AND no_choice = false.
CLEAR: pr_list, pr_list[], match.
READ TABLE prlist WITH KEY prname = pr_print.
IF sy-subrc <> 0.
pr_print = prdest.
ENDIF.

LOOP AT prlist.
value-key = prlist-prname.
IF prlist-prname = pr_print.
match = 'X'.
ENDIF.
APPEND value TO pr_list.
ENDLOOP.

IF match IS INITIAL.
value-key = pr_print.
APPEND value TO pr_list.
ENDIF.
name = 'PR_PRINT'.

*** for listbox
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = name
values = pr_list
EXCEPTIONS
id_illegal_name = 0
OTHERS = 0.
ENDIF.
** to change screen fields at runtime
if pr_check = 'X'.
loop at screen.
if screen-name = 'PR_OUT'.
screen-input = '1'.
modify screen.
endif.
if screen-name = 'PR_PRINT'.
screen-input = '1'.
modify screen.
endif.
if screen-name = 'PR_PRE'.
screen-input = '1'.
modify screen.
endif.
if screen-name = 'PR_PNT'.
screen-input = '1'.
modify screen.
endif.
endloop.
else.
loop at screen.
if screen-name = 'PR_OUT'.
screen-input = '0'.
modify screen.
endif.
if screen-name = 'PR_PRINT'.
screen-input = '0'.
modify screen.
endif.
if screen-name = 'PR_PRE'.
screen-input = '0'.
modify screen.
endif.
if screen-name = 'PR_PNT'.
screen-input = '0'.
modify screen.
endif.
endloop.
endif.

AT SELECTION-SCREEN ON so_kunag.
SELECT SINGLE * FROM jhtfp WHERE kunag IN so_kunag.
IF sy-subrc <> 0.
MESSAGE e001(zid) WITH 'No Records found for given Sold-to-Party'.
ENDIF.

AT SELECTION-SCREEN ON so_fkdat.
SELECT SINGLE * FROM jhtfk WHERE fkdat IN so_fkdat.
IF sy-subrc <> 0.
MESSAGE e002(zid) WITH 'No Records found for given Date'.
ENDIF.
***********************************************************************
* S T A R T O F S E L E C T I O N *
***********************************************************************

START-OF-SELECTION.

SELECT jhtfk~vbeln jhtfk~vkorg jhtfk~fkdat jhtfk~netwk
jhtfk~vbtyp jhak~bstnk jhak~bstdk jhak~man_vkbur
jhtfp~kunag jhtfp~inserent kna1~name1
INTO CORRESPONDING FIELDS OF TABLE it_final
FROM jhtfk
INNER JOIN jhtfp ON jhtfk~vbeln = jhtfp~vbeln
INNER JOIN kna1 ON jhtfp~inserent = kna1~kunnr
INNER JOIN jhak ON jhtfp~aubel = jhak~avm_nr
WHERE jhtfk~vkorg IN so_vkorg AND
jhtfk~fkdat IN so_fkdat AND
jhtfp~kunag IN so_kunag AND
jhtfp~beinh IN so_beinh AND
jhtfp~vtweg IN so_vtweg AND
jhtfp~spart IN so_spart AND
jhtfk~sfakn EQ ' '.

DELETE ADJACENT DUPLICATES FROM it_final COMPARING vbeln.
SORT it_final BY kunag.
***** to get function module name for smartform
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
formname = 'ZSMART_LETTER'
* VARIANT = ' '
* DIRECT_CALL = ' '
IMPORTING
fm_name = fm_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.

if pr_check = 'X'.
**** output parameters
output-rqposname = pr_print.
output-tddest = pr_out.
output-TDIMMED = 'X'.
output-TDNOPREV = 'X'.
**** control parameters
control-no_dialog = 'X'.
control-preview = pr_pre.
control-no_open = 'X'.
control-no_close = 'X'.
else.
**** control parameters
control-no_dialog = 'X'.
control-preview = 'X'.
control-no_open = 'X'.
control-no_close = 'X'.
endif.
** to use smartform within loop this function module is used
CALL FUNCTION 'SSF_OPEN'
EXPORTING
* ARCHIVE_PARAMETERS =
* USER_SETTINGS = 'X'
* MAIL_SENDER =
* MAIL_RECIPIENT =
* MAIL_APPL_OBJ =
output_options = output
control_parameters = control
* IMPORTING
* JOB_OUTPUT_OPTIONS =
* 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.

LOOP AT it_final INTO w_final.
ON CHANGE OF w_final-kunag.
REFRESH it_final1.
CLEAR it_final1.
it_final1[] = it_final[].
DELETE it_final1 WHERE kunag NE w_final-kunag.
* CALL FUNCTION MODULE FOR SMARTFORM
CALL FUNCTION fm_name "'/1BCDWB/SF00000213'
EXPORTING
control_parameters = control
output_options = output
billdate_low = so_fkdat-low
billdate_high = so_fkdat-high
* IMPORTING
** DOCUMENT_OUTPUT_INFO =
** JOB_OUTPUT_INFO =
TABLES
it_final1 = it_final1
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDON.
ENDLOOP.

CALL FUNCTION 'SSF_CLOSE'
* IMPORTING
* JOB_OUTPUT_INFO =
EXCEPTIONS
formatting_error = 1
internal_error = 2
send_error = 3
OTHERS = 4.

IF sy-subrc <> 0.
* error handling
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.