Showing posts with label Sample ABAP Code Programs. Show all posts
Showing posts with label Sample ABAP Code Programs. Show all posts

Tuesday, May 6, 2008

Sample ABAP Program to Upload table using new function GUI_UPLOAD

*& Report ZUPLOAD *
*& *
*&---------------------------------------------------------------------*
*& This program uses the new function GUI_UPLOAD *
*& Input must be TAB delimited with a blank column at the start *
*& to allow for MANDT. *
*& To use this program for any Database Table replace ZTEST with *
*& new table name. *
*&---------------------------------------------------------------------*
*& AUTHOR: Sheila Titchener - abap at iconet-ltd.co.uk *
*& Date: February 2004 *
*&---------------------------------------------------------------------*

REPORT zupload MESSAGE-ID bd.

DATA: w_tab TYPE ZTEST.
DATA: i_tab TYPE STANDARD TABLE OF ZTEST.

DATA: v_subrc(2),
v_recswritten(6).

PARAMETERS: p_file(80)
DEFAULT 'C:\Temp\ZTEST.TXT'.

DATA: filename TYPE string,
w_ans(1) TYPE c.

filename = p_file.


CALL FUNCTION 'POPUP_TO_CONFIRM'
EXPORTING
titlebar = 'Upload Confirmation'
* DIAGNOSE_OBJECT = ' '
text_question = p_file
text_button_1 = 'Yes'(001)
* ICON_BUTTON_1 = ' '
text_button_2 = 'No'(002)
* ICON_BUTTON_2 = ' '
default_button = '2'
* DISPLAY_CANCEL_BUTTON = 'X'
* USERDEFINED_F1_HELP = ' '
* START_COLUMN = 25
* START_ROW = 6
* POPUP_TYPE =
* IV_QUICKINFO_BUTTON_1 = ' '
* IV_QUICKINFO_BUTTON_2 = ' '
IMPORTING
answer = w_ans
* TABLES
* PARAMETER =
* EXCEPTIONS
* TEXT_NOT_FOUND = 1
* OTHERS = 2
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.


CHECK w_ans = 1.


CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = filename
* FILETYPE = 'ASC
has_field_separator = 'X'
* HEADER_LENGTH = 0
* READ_BY_LINE = 'X'
* IMPORTING
* FILELENGTH =
* HEADER =
TABLES
data_tab = i_tab
EXCEPTIONS
file_open_error = 1
file_read_error = 2
no_batch = 3
gui_refuse_filetransfer = 4
invalid_type = 5
no_authority = 6
unknown_error = 7
bad_data_format = 8
header_not_allowed = 9
separator_not_allowed = 10
header_too_long = 11
unknown_dp_error = 12
access_denied = 13
dp_out_of_memory = 14
disk_full = 15
dp_timeout = 16
OTHERS = 17.

* SYST FIELDS ARE NOT SET BY THIS FUNCTION SO DISPLAY THE ERROR CODE *

IF sy-subrc <> 0.
v_subrc = sy-subrc.
MESSAGE e899 WITH 'File Open Error' v_subrc.
ENDIF.


INSERT ZTEST FROM TABLE i_tab.

COMMIT WORK AND WAIT.

MESSAGE i899 WITH sy-dbcnt 'Records Written to ZTEST'.

Sample ABAP Program for Submitting report with selection table

REPORT submit_with_selection_table.
TABLES QMSM.
* Work area for internal table IQMSM
DATA: BEGIN OF WQMSM,
QMNUM LIKE QMSM-QMNUM,
MNGRP LIKE QMSM-MNGRP,
MNCOD LIKE QMSM-MNCOD,
ZZSTAT LIKE QMSM-ZZSTAT,
END OF WQMSM.

* WORK Area for internal table iseltab.
DATA: WSELTAB LIKE RSPARAMS.
*----------------------------------------------------------------------*
* Internal tables
*----------------------------------------------------------------------*
* selection table to pass to RIQMEL30
DATA: ISELTAB LIKE TABLE OF WSELTAB.
* Table of notification numbers selected - will be passed to riqmel30
DATA: IQMSM LIKE TABLE OF WQMSM.
*----------------------------------------------------------------------*
START-OF-SELECTION.
*----------------------------------------------------------------------*
REFRESH IQMSM.
SELECT QMNUM MNGRP MNCOD ZZSTAT
FROM QMSM INTO CORRESPONDING FIELDS OF TABLE IQMSM
WHERE MNGRP = 'ACTION'
AND MNCOD = 'CALL'
and ( zzqmart = 'ZE' or zzqmart = 'ZI' )
AND ZZSTAT = ' '.

* create selection table entries for field QMART

WSELTAB-SELNAME = 'QMART'.
WSELTAB-KIND = 'S'.
WSELTAB-SIGN = 'I'.
WSELTAB-OPTION = 'EQ'.
WSELTAB-LOW = 'ZE'.
APPEND WSELTAB TO ISELTAB.
WSELTAB-LOW = 'ZI'.
APPEND WSELTAB TO ISELTAB.

* Create selection table entries for QMNUM

CLEAR WSELTAB.
WSELTAB-SELNAME = 'QMNUM'.
WSELTAB-KIND = 'S'.
WSELTAB-SIGN = 'I'.
WSELTAB-OPTION = 'EQ'.
LOOP AT IQMSM INTO WQMSM.
WSELTAB-LOW = WQMSM-QMNUM.
APPEND WSELTAB TO ISELTAB.
ENDLOOP
*
* SUBMIT program with parameters passed in table ISELTAB
* Other parameters passed explicitly

SUBMIT RIQMEL30 WITH SELECTION-TABLE ISELTAB
WITH MNGRP = 'ACTION'
WITH MNCOD = 'CALL'
WITH DATUV = '00000000'
WITH DATUB = '99991231'
WITH STAI1 = 'TSRL'.

Sample ABAP Program for Submitting report with selection table

REPORT submit_with_selection_table.
TABLES QMSM.
* Work area for internal table IQMSM
DATA: BEGIN OF WQMSM,
QMNUM LIKE QMSM-QMNUM,
MNGRP LIKE QMSM-MNGRP,
MNCOD LIKE QMSM-MNCOD,
ZZSTAT LIKE QMSM-ZZSTAT,
END OF WQMSM.

* WORK Area for internal table iseltab.
DATA: WSELTAB LIKE RSPARAMS.
*----------------------------------------------------------------------*
* Internal tables
*----------------------------------------------------------------------*
* selection table to pass to RIQMEL30
DATA: ISELTAB LIKE TABLE OF WSELTAB.
* Table of notification numbers selected - will be passed to riqmel30
DATA: IQMSM LIKE TABLE OF WQMSM.
*----------------------------------------------------------------------*
START-OF-SELECTION.
*----------------------------------------------------------------------*
REFRESH IQMSM.
SELECT QMNUM MNGRP MNCOD ZZSTAT
FROM QMSM INTO CORRESPONDING FIELDS OF TABLE IQMSM
WHERE MNGRP = 'ACTION'
AND MNCOD = 'CALL'
and ( zzqmart = 'ZE' or zzqmart = 'ZI' )
AND ZZSTAT = ' '.

* create selection table entries for field QMART

WSELTAB-SELNAME = 'QMART'.
WSELTAB-KIND = 'S'.
WSELTAB-SIGN = 'I'.
WSELTAB-OPTION = 'EQ'.
WSELTAB-LOW = 'ZE'.
APPEND WSELTAB TO ISELTAB.
WSELTAB-LOW = 'ZI'.
APPEND WSELTAB TO ISELTAB.

* Create selection table entries for QMNUM

CLEAR WSELTAB.
WSELTAB-SELNAME = 'QMNUM'.
WSELTAB-KIND = 'S'.
WSELTAB-SIGN = 'I'.
WSELTAB-OPTION = 'EQ'.
LOOP AT IQMSM INTO WQMSM.
WSELTAB-LOW = WQMSM-QMNUM.
APPEND WSELTAB TO ISELTAB.
ENDLOOP
*
* SUBMIT program with parameters passed in table ISELTAB
* Other parameters passed explicitly

SUBMIT RIQMEL30 WITH SELECTION-TABLE ISELTAB
WITH MNGRP = 'ACTION'
WITH MNCOD = 'CALL'
WITH DATUV = '00000000'
WITH DATUB = '99991231'
WITH STAI1 = 'TSRL'.

Sample ABAP Program for Sending SAP Mail

*&---------------------------------------------------------------------*
*& Form SEND_MAIL
*&---------------------------------------------------------------------*
* send email to current user *
*----------------------------------------------------------------------*
FORM SEND_MAIL.

* PARAMETERS FOR SO_NEW_DOCUMENT_SEND_API1
DATA: W_OBJECT_ID LIKE SOODK,
W_SONV_FLAG LIKE SONV-FLAG.
DATA: T_RECEIVERS LIKE SOMLRECI1 OCCURS 1 WITH HEADER LINE,
W_OBJECT_CONTENT LIKE SOLISTI1 OCCURS 1 WITH HEADER LINE,
W_DOC_DATA LIKE SODOCCHGI1 OCCURS 0 WITH HEADER LINE.
*
DATA: W_DATE(10).
CLEAR T_RECEIVERS.
T_RECEIVERS-RECEIVER = SY-UNAME.
T_RECEIVERS-REC_TYPE = 'B'.
T_RECEIVERS-EXPRESS = ' '.
APPEND T_RECEIVERS.

W_DOC_DATA-OBJ_DESCR = 'Change Expiry date'.


* Delivery NO
CONCATENATE 'Delivery No' M_VMVMA-VBELN INTO W_OBJECT_CONTENT
SEPARATED BY ' '.
APPEND W_OBJECT_CONTENT.
* material Batch
CONCATENATE 'Material' ZGREC-MATNR 'Batch' ZGREC-CHARG
INTO W_OBJECT_CONTENT SEPARATED BY ' '.
APPEND W_OBJECT_CONTENT.
* Expiry date
WRITE B_VFDAT TO W_DATE DD/MM/YYYY.
CONCATENATE 'Change expiry date to' W_DATE
INTO W_OBJECT_CONTENT SEPARATED BY ' '.
APPEND W_OBJECT_CONTENT.
*
CALL FUNCTION 'SO_NEW_DOCUMENT_SEND_API1'
EXPORTING
DOCUMENT_DATA = W_DOC_DATA
PUT_IN_OUTBOX = ' '
TABLES
OBJECT_CONTENT = W_OBJECT_CONTENT
RECEIVERS = T_RECEIVERS
EXCEPTIONS
TOO_MANY_RECEIVERS = 1
DOCUMENT_NOT_SENT = 2
DOCUMENT_TYPE_NOT_EXIST = 3
OPERATION_NO_AUTHORIZATION = 4
PARAMETER_ERROR = 5
X_ERROR = 6
ENQUEUE_ERROR = 7
OTHERS = 8.
ENDFORM. " SEND_MAIL

Sample ABAP Program for Search Layout sets for given String

REPORT Ysearchl LINE-SIZE 132.

************************************************************************
*
* Program : Ysearchl
* Authors : Chris Harrop (chris.harrop@bigfoot.com)
* Date : March 1999
* Purpose : Searches all Y and Z layout sets for a given string
*
************************************************************************
*
* maintenance history
*
* date author purpose
*
************************************************************************

TABLES: STXL.

PARAMETERS:
STRING(128).

DATA: BEGIN OF TLINETAB OCCURS 0.
INCLUDE STRUCTURE TLINE.
DATA: END OF TLINETAB,
SUBRC LIKE SY-SUBRC.

SELECT TDNAME FROM STXL INTO (STXL-TDNAME)
WHERE TDOBJECT = 'FORM' AND ( TDNAME LIKE 'Y%' OR TDNAME LIKE 'Z%' )
AND TDID = 'TXT'.

PERFORM DISPLAY_STATUS_TEXT USING STXL-TDNAME.

REFRESH TLINETAB.
PERFORM GET_TEXT_TABLE
TABLES TLINETAB
USING 'FORM' 'TXT' STXL-TDNAME
CHANGING SUBRC.
LOOP AT TLINETAB.
IF TLINETAB-TDLINE CS STRING.
WRITE : / STXL-TDNAME, TLINETAB-TDLINE.
ENDIF.
ENDLOOP.
ENDSELECT.


* Display a message on the status bar
FORM DISPLAY_STATUS_TEXT USING VALUE(TEXT) TYPE C.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
TEXT = TEXT.
ENDFORM.
*
* Get the long texts for the object
*
FORM GET_TEXT_TABLE TABLES TLINETAB
USING VALUE(TDOBJECT) LIKE THEAD-TDOBJECT
VALUE(ID) LIKE THEAD-TDID
VALUE(TDNAME) LIKE THEAD-TDNAME
CHANGING SUBRC LIKE SY-SUBRC.

DATA: BEGIN OF XTHEAD OCCURS 0.
INCLUDE STRUCTURE THEAD.
DATA: END OF XTHEAD.

DATA: EINTRAEGE LIKE SY-TFILL.

DATA XTDNAME LIKE THEAD-TDNAME.
REFRESH XTHEAD.
CLEAR XTDNAME.
XTDNAME = TDNAME.

CALL FUNCTION 'SELECT_TEXT'
EXPORTING
ID = ID
LANGUAGE = SY-LANGU
NAME = TDNAME
OBJECT = TDOBJECT
IMPORTING
ENTRIES = EINTRAEGE
TABLES
SELECTIONS = XTHEAD.

REFRESH TLINETAB.

CALL FUNCTION 'READ_TEXT'
EXPORTING
ID = ID
LANGUAGE = SY-LANGU
NAME = TDNAME
OBJECT = TDOBJECT
IMPORTING
HEADER = XTHEAD
TABLES
LINES = TLINETAB
EXCEPTIONS
ID = 01
LANGUAGE = 02
NAME = 03
NOT_FOUND = 04
OBJECT = 05
REFERENCE_CHECK = 06.
SUBRC = SY-SUBRC.
ENDFORM. " FILL_ITEM_TEXT

Sample ABAP Program for Sapscript PerForm Module

REPORT YLSD999A.
DATA W_LENGTH TYPE I.
* GENERAL PURPOSE SUBROUTINES FOR CALLING FROM SAPSCRIPTS
*-----------------------------------------------------------------------
*----------------------------------------------------------------------
FORM DISPLAY_POUND TABLES IN_TAB STRUCTURE ITCSY
OUT_TAB STRUCTURE ITCSY.
DATA: COUNT TYPE P VALUE 16.
DATA: W_VALUE(17) TYPE C. "defined as 7 chars to remove pence
DATA: W_CHAR TYPE C.
DATA: W_DUMMY TYPE C.
DATA: W_CURR(3) TYPE C.
* Get first parameter in input table.
READ TABLE IN_TAB INDEX 1.
WRITE IN_TAB-VALUE TO W_VALUE .
* get second parameter in input table
READ TABLE IN_TAB INDEX 2.
MOVE IN_TAB-VALUE TO W_CURR.
IF W_CURR = 'GBP'.
W_CURR = '£'.
ENDIF.
W_LENGTH = STRLEN( W_CURR ).
* look for first space starting at right.
WHILE COUNT > -1.
W_CHAR = W_VALUE+COUNT(1).
* W_CHAR = IN_TAB-VALUE+COUNT(1).
IF W_CHAR = ' '.
COUNT = COUNT - W_LENGTH + 1.
W_VALUE+COUNT(W_LENGTH) = W_CURR.
COUNT = -1.
ELSE.
* W_VALUE+COUNT(1) = W_CHAR.
COUNT = COUNT - 1.
ENDIF.
ENDWHILE.
* read only parameter in output table
READ TABLE OUT_TAB INDEX 1.
OUT_TAB-VALUE = W_VALUE.
MODIFY OUT_TAB INDEX SY-TABIX.
ENDFORM.

Sample ABAP Program for Create IDOC

FUNCTION Y_ISSUE_ROCO_IDOC.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" VALUE(I_MODE) LIKE Z1ROCO-ZMODE
*" VALUE(I_ROUTE) LIKE Z1ROCO-ROUTE
*" VALUE(I_CUT_OFF) LIKE Z1ROCO-CUT_OFF OPTIONAL
*" VALUE(I_BEZEI) LIKE Z1ROCO-BEZEI OPTIONAL
*" VALUE(I_TROUTE_MON) LIKE Z1ROCO-TROUTE_MON OPTIONAL
*" VALUE(I_TROUTE_TUE) LIKE Z1ROCO-TROUTE_TUE OPTIONAL
*" VALUE(I_TROUTE_WED) LIKE Z1ROCO-TROUTE_WED OPTIONAL
*" VALUE(I_TROUTE_THU) LIKE Z1ROCO-TROUTE_THU OPTIONAL
*" VALUE(I_TROUTE_FRI) LIKE Z1ROCO-TROUTE_FRI OPTIONAL
*" VALUE(I_TROUTE_SAT) LIKE Z1ROCO-TROUTE_SAT OPTIONAL
*" VALUE(I_TROUTE_SUN) LIKE Z1ROCO-TROUTE_SUN OPTIONAL
*" VALUE(I_PGI_IND) LIKE Z1ROCO-PGI_IND OPTIONAL
*"----------------------------------------------------------------------

DATA: W_EDIDC LIKE EDIDC OCCURS 5 WITH HEADER LINE,
W_Z1ROCO LIKE EDIDC,
L_EDIDC LIKE EDIDC,
L_SEND_FLAG,
W_SDATA LIKE EDIDD-SDATA.
DATA: T_BDI_MODEL LIKE BDI_MODEL OCCURS 0 WITH HEADER LINE.
DATA: T_EDIDC LIKE EDIDC OCCURS 0 WITH HEADER LINE.
DATA: T_EDIDD LIKE EDIDD OCCURS 0 WITH HEADER LINE.

*- Call function module to determine if message is to be distributed

CALL FUNCTION 'ALE_MODEL_DETERMINE_IF_TO_SEND'
EXPORTING
MESSAGE_TYPE = 'ZZROCO'
IMPORTING
IDOC_MUST_BE_SENT = L_SEND_FLAG
EXCEPTIONS
OWN_SYSTEM_NOT_DEFINED = 1
OTHERS = 2.

*- Determine recipient systems

CALL FUNCTION 'ALE_MODEL_INFO_GET'
EXPORTING
MESSAGE_TYPE = 'ZZROCO'
* RECEIVING_SYSTEM = ' '
* SENDING_SYSTEM = ' '
* VALIDDATE = SY-DATUM
TABLES
MODEL_DATA = T_BDI_MODEL
EXCEPTIONS
NO_MODEL_INFO_FOUND = 1
OWN_SYSTEM_NOT_DEFINED = 2
OTHERS = 3.

* 3.2
*Call function 'L_IDOC_HEADER_CREATE'
* exporting
* i_mestyp = 'ZZROCO'
* i_mescod = ' '
* i_idoctp = 'ZSDROCO'
* i_rcvprn = 'Z_WMS'
* exceptions
* others = 1.
* 3.3
MOVE I_MODE TO Z1ROCO-ZMODE.
MOVE I_ROUTE TO Z1ROCO-ROUTE.
MOVE I_CUT_OFF TO Z1ROCO-CUT_OFF.
MOVE I_BEZEI TO Z1ROCO-BEZEI.
MOVE I_TROUTE_MON TO Z1ROCO-TROUTE_MON.
MOVE I_TROUTE_TUE TO Z1ROCO-TROUTE_TUE.
MOVE I_TROUTE_WED TO Z1ROCO-TROUTE_WED.
MOVE I_TROUTE_THU TO Z1ROCO-TROUTE_THU.
MOVE I_TROUTE_FRI TO Z1ROCO-TROUTE_FRI.
MOVE I_TROUTE_SAT TO Z1ROCO-TROUTE_SAT.
MOVE I_TROUTE_SUN TO Z1ROCO-TROUTE_SUN.
MOVE I_PGI_IND TO Z1ROCO-PGI_IND.

MOVE Z1ROCO TO: W_SDATA, T_EDIDD-SDATA.
MOVE 'Z1ROCO' TO T_EDIDD-SEGNAM.
APPEND T_EDIDD.

*call function 'L_IDOC_SEGMENT_CREATE'
* exporting
* i_segnam = 'Z1ROCO'
* i_sdata = w_sdata
* exceptions
* others = 1.

*call function 'L_IDOC_SEND'
* tables
* t_comm_idoc = w_edidc
* exceptions
* error_distribute_idoc = 1
* others = 2.

READ TABLE T_BDI_MODEL INDEX 1. " maximum 1 recipient
MOVE 'ZZROCO' TO L_EDIDC-MESTYP.
MOVE 'ZSDROCO' TO L_EDIDC-IDOCTP.
MOVE 'LS' TO L_EDIDC-RCVPRT.
MOVE T_BDI_MODEL-RCVSYSTEM TO L_EDIDC-RCVPRN.

*- Distribute the iDoc

CALL FUNCTION 'MASTER_IDOC_DISTRIBUTE' IN UPDATE TASK
EXPORTING
MASTER_IDOC_CONTROL = L_EDIDC
TABLES
COMMUNICATION_IDOC_CONTROL = W_EDIDC
MASTER_IDOC_DATA = T_EDIDD
EXCEPTIONS
ERROR_IN_IDOC_CONTROL = 01
ERROR_WRITING_IDOC_STATUS = 02
ERROR_IN_IDOC_DATA = 03
SENDING_LOGICAL_SYSTEM_UNKNOWN = 04.

COMMIT WORK.
*E_RESPONSE = SY-SUBRC.
ENDFUNCTION.

Sample ABAP Program for Output file to application server then send mail with Download details

*&---------------------------------------------------------------------*
*& Form download_to_application
*& download to application server, attach to mail and send to user
*&---------------------------------------------------------------------*
FORM download_to_application.

data: l_title type SO_OBJ_DES.

l_title = sy-repid.

CALL FUNCTION 'ZSEND_REPORT_MAIL'
EXPORTING
i_title = l_title
tables
it_text_data = it_download
EXCEPTIONS
INVALID_USER = 1
MAIL_SEND_ERROR = 2
OPEN_FILE = 3
FILE_GET_NAME = 4
OTHERS = 5
.
IF sy-subrc <> 0.
MESSAGE e368(00) with 'ZSEND_REPORT_MAIL fail -'
sy-subrc.
ENDIF.

ENDFORM. " download_to_application
===============================================================================

FUNCTION Zsend_report_mail.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" REFERENCE(I_UNAME) TYPE SYUNAME DEFAULT SY-UNAME
*" REFERENCE(I_TITLE) TYPE SO_OBJ_DES
*" TABLES
*" IT_TEXT_DATA
*" EXCEPTIONS
*" INVALID_USER
*" MAIL_SEND_ERROR
*" OPEN_FILE
*" FILE_GET_NAME
*"----------------------------------------------------------------------

* This function is used to store a file (report result) on the file
* system of the application server and to send an "active" SAP mail
* to the user.
* The "active" SAP mail calls function ZMAIL_DOWNLOAD to
* download the file to the presentation server.

DATA: ls_document_data LIKE sodocchgi1.
DATA: lt_object_para LIKE soparai1 OCCURS 5 WITH HEADER LINE.
DATA: lt_object_parb LIKE soparbi1 OCCURS 0 WITH HEADER LINE.
DATA: lt_object_cont LIKE solisti1 OCCURS 0 WITH HEADER LINE.
DATA: lt_reclist LIKE somlreci1 OCCURS 5 WITH HEADER LINE.

DATA: l_filename(200) TYPE c.

CHECK NOT it_text_data[] IS INITIAL.

* terminate if name not suitable.
IF i_uname IS INITIAL OR
i_uname = 'WF-BATCH' OR
i_uname = 'DDIC' OR
i_uname = 'SAP*'.
RAISE invalid_user.
ENDIF.

* get physical file from logical filename( optional)

CALL FUNCTION 'FILE_GET_NAME'
EXPORTING
logical_filename = 'MAILFILE'
parameter_1 = sy-uname
parameter_2 = sy-datum
parameter_3 = sy-uzeit
* USE_PRESENTATION_SERVER = ' '
* WITH_FILE_EXTENSION = ' '
* USE_BUFFER = ' '
* ELEMINATE_BLANKS = 'X'
IMPORTING
* EMERGENCY_FLAG =
* FILE_FORMAT =
file_name = l_filename
EXCEPTIONS
file_not_found = 1
OTHERS = 2.
IF sy-subrc NE 0.
RAISE file_get_name.
ENDIF.

* save file
OPEN DATASET l_filename FOR OUTPUT IN TEXT MODE.
IF sy-subrc NE 0.
RAISE open_file.
ENDIF.
LOOP AT it_text_data. " into l_text_data.
TRANSFER it_text_data TO l_filename.
ENDLOOP.
CLOSE DATASET l_filename.

* SAP mail header (execute function)
CLEAR: ls_document_data.
ls_document_data-obj_descr = i_title.
ls_document_data-proc_type = 'F'. " function call
ls_document_data-proc_name = 'ZMAIL_DOWNLOAD'.
ls_document_data-no_change = 'X'.
* SAP mail receiver
REFRESH lt_reclist.
CLEAR lt_reclist.
lt_reclist-receiver = i_uname.
lt_reclist-rec_type = 'B'.
* gt_reclist-express = 'X'.
APPEND lt_reclist.
* message text
REFRESH lt_object_cont.
CLEAR lt_object_cont.
lt_object_cont-line =
'The result of the following report has been saved.'.
APPEND lt_object_cont.
* report name
lt_object_cont-line = 'Report:'.
lt_object_cont-line+15 = sy-cprog.
CONDENSE lt_object_cont-line.
APPEND lt_object_cont.
* date & time
lt_object_cont-line = 'Date/Time:'.
WRITE sy-datum TO lt_object_cont-line+15.
WRITE sy-uzeit TO lt_object_cont-line+27.
CONDENSE lt_object_cont-line.
APPEND lt_object_cont.
*
lt_object_cont-line =
'Please execute (Ctrl-F6) this mail to download the result.'.
APPEND lt_object_cont.

* mail parameters
REFRESH lt_object_parb.
CLEAR lt_object_parb.
lt_object_parb-name = 'FUNCTION'. " mail identifier
lt_object_parb-value = 'FILE_DOWNLOAD'. " mail identifier
APPEND lt_object_parb.
lt_object_parb-name = 'FILENAME'.
lt_object_parb-value = l_filename.
APPEND lt_object_parb.

*call SAPOffice API
CALL FUNCTION 'SO_NEW_DOCUMENT_SEND_API1'
EXPORTING
document_data = ls_document_data
TABLES
object_content = lt_object_cont
object_para = lt_object_para
object_parb = lt_object_parb
receivers = lt_reclist
EXCEPTIONS
too_many_receivers = 1
document_not_sent = 2
document_type_not_exist = 3
operation_no_authorization = 4
parameter_error = 5
x_error = 6
enqueue_error = 7
OTHERS = 8.
IF sy-subrc NE 0.
RAISE mail_send_error.
ENDIF.

ENDFUNCTION.
===========================================================================
FUNCTION zmail_download.
*"----------------------------------------------------------------------
*"*"Local interface:
*" TABLES
*" MSGDIAL STRUCTURE SOPARBI1
*"----------------------------------------------------------------------
* This function is called in a SAP mail to download a file from the
* application server file system.
* Function ZSEND_REPORT_MAIL is used to save report result
* on application server file system and to send SAP mail to user.
* Based on UK COM solution by Damian Norton.

DATA: ls_msgdial TYPE soparbi1.
DATA: l_filename TYPE filep.
* DATA: l_filename_local TYPE filep.
DATA: l_operation(30) TYPE c.
DATA: BEGIN OF lt_text_data OCCURS 10,
line(2000),
END OF lt_text_data.

* read parameters
LOOP AT msgdial INTO ls_msgdial.
CASE ls_msgdial-name.
WHEN 'FUNCTION'.
l_operation = ls_msgdial-value.
WHEN 'FILENAME'.
l_filename = ls_msgdial-value.
WHEN OTHERS.
MESSAGE e368(00) WITH 'Invalid parameter' ls_msgdial-name.
ENDCASE. " ls_msgdial-name
ENDLOOP. " msgdial

IF l_operation = 'FILE_DOWNLOAD'.
* check, whether file exists on presentation server
REFRESH lt_text_data.
OPEN DATASET l_filename FOR INPUT IN TEXT MODE.
IF sy-subrc = 0.
DO.
READ DATASET l_filename INTO lt_text_data-line.
IF sy-subrc = 0.
APPEND lt_text_data.
ELSE.
EXIT.
ENDIF.
ENDDO.
CLOSE DATASET l_filename.
* request filename on presentation server - or GUI_DOWNLOAD??
CALL FUNCTION 'DOWNLOAD'
TABLES
data_tab = lt_text_data
EXCEPTIONS
invalid_filesize = 1
invalid_table_width = 2
invalid_type = 3
no_batch = 4
unknown_error = 5
gui_refuse_filetransfer = 6
customer_error = 7
OTHERS = 8.
IF sy-subrc NE 0.
MESSAGE e688(00) WITH 'File download error' sy-subrc.
ENDIF.
ELSE.
MESSAGE e398(00) WITH 'File open error' l_filename.
ENDIF. " sy-subrc = 0 (OPEN DATASET)
ENDIF. " l_operation = 'FILE_DOWNLOAD'

ENDFUNCTION.

Sample ABAP Program for Module Pool Skeleton

PROGRAM YMPSKEL MESSAGE-ID YL.
*-----------------------------------------------------------------------
* DESCRIPTION
* written by !
*-----------------------------------------------------------------------
* TABLES:

DATA: OK_CODE(4), " ok code - screen 1
OK_CODE2(4).
DATA C LIKE SY-INDEX. " Index for screen loop
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* process after input for screen 0100 *
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.

CASE OK_CODE.
WHEN 'SAVE'.
*
WHEN 'DISP'.
*
WHEN 'LIST'.
C = 0. "reset loop control
*
WHEN OTHERS.
*
ENDCASE.
CLEAR OK_CODE.
ENDMODULE. " USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* process before output for screen 0100 *
*----------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'AMEND'. " set gui status
SET TITLEBAR '100'. " set title
ENDMODULE. " STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*& Form SAVE data
*&---------------------------------------------------------------------*
* Save screen details
*&---------------------------------------------------------------------*
FORM SAVE.
*
CLEAR OK_CODE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form DISPLAY
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
FORM DISPLAY.
*
*

ENDFORM.
*&---------------------------------------------------------------------*
*& Module EXIT_COMMAND INPUT
*&---------------------------------------------------------------------*
* exit commands are processed before validation *
* defined by E against function in menu painter(function list)
*----------------------------------------------------------------------*
MODULE EXIT_COMMAND INPUT.

CASE OK_CODE.
WHEN 'EXIT'. CLEAR OK_CODE. SET SCREEN 0. LEAVE SCREEN.
WHEN 'CANC'. CLEAR OK_CODE. SET SCREEN 0. LEAVE SCREEN.
WHEN 'BACK'. CLEAR OK_CODE. SET SCREEN 0. LEAVE SCREEN.
ENDCASE.
ENDMODULE. " EXIT_COMMAND INPUT
*&---------------------------------------------------------------------*
*& Form list
*&---------------------------------------------------------------------*
* text *
*----------------------------------------------------------------------*
FORM LIST.


CLEAR OK_CODE. SET SCREEN 200. LEAVE SCREEN.

ENDFORM. " LIST
*&---------------------------------------------------------------------*
*& Module EXIT_COMMAND_200 INPUT
*&---------------------------------------------------------------------*
* exit command processing for screen 200 *
* defined by E against function in menu painter(function list)
*----------------------------------------------------------------------*
MODULE EXIT_COMMAND_200 INPUT.

CASE OK_CODE2.
WHEN 'EXIT'. CLEAR OK_CODE2. SET SCREEN 0. LEAVE SCREEN.
WHEN 'CANC'. CLEAR OK_CODE2. SET SCREEN 0. LEAVE SCREEN.
WHEN 'BACK'. CLEAR OK_CODE2. SET SCREEN 100. LEAVE SCREEN.
ENDCASE.
ENDMODULE. " EXIT_COMMAND_200 INPUT
*&---------------------------------------------------------------------*
*& Module STATUS_0200 OUTPUT
*&---------------------------------------------------------------------*
* process before output for screen 200 *
*----------------------------------------------------------------------*
MODULE STATUS_0200 OUTPUT.
SET PF-STATUS 'POPUP'.
* SET TITLEBAR 'xxx'.

ENDMODULE. " STATUS_0200 OUTPUT

Sample ABAP Program for Module Pool containing screen loop processing

PROGRAM YLSDM004.
TABLES: LTAP, "Transfer order item
LIPS, "SD doc delivery: item data
MAKT, "material description
VEPO, "SD Document: Shipping Unit Item
VEKP, "SD Document: Shipping Unit Header
USR01, "USER defaults
ZPACKMAT, "Packing material table
T646M, "hazard class descriptions
ZCASHAZLAB. "SCasehazardous label table
DATA: OK_CODE(4).

DATA: C LIKE SY-INDEX, " cursor for case labels
* C1 LIKE SY-INDEX, " cursor for storage class(haz)
C2 LIKE SY-INDEX. " cursor for text
* screen fields for selection screen 0100
DATA: S_ZZTRACKING LIKE LTAP-ZZTRACKING,
* S_VENUM LIKE VEKP-VENUM,
S_EXIDV LIKE VEKP-EXIDV.
*
DATA W_MAKTX LIKE MAKT-MAKTX.
* packaging materials
DATA: S_PACKMAT1 LIKE VEKP-ZZPACKMAT1,
S_BEZEI1 LIKE ZPACKMAT-BEZEI,
S_PACKMAT2 LIKE VEKP-ZZPACKMAT1,
S_BEZEI2 LIKE ZPACKMAT-BEZEI.
* Case label codes and descriptions
DATA: BEGIN OF LABELS OCCURS 5 ,
CODE LIKE VEKP-ZZCASELAB1,
TEXT LIKE ZCASHAZLAB-ZZCLB_TEXT,
END OF LABELS.
* hazard class and descriptions
DATA: BEGIN OF HAZ OCCURS 3,
CODE LIKE VEKP-ZZLAGKL,
TEXT LIKE T646M-LAGKT,
END OF HAZ.
DATA: W_HAZ_TEXT1 LIKE T646M-LAGKT,
W_HAZ_TEXT2 LIKE T646M-LAGKT,
W_HAZ_TEXT3 LIKE T646M-LAGKT.



DATA T_LINES LIKE TLINE OCCURS 1 WITH HEADER LINE.
DATA T_HEADER LIKE THEAD.
*DATA W_INDEX LIKE SY-INDEX.
* start line of the last screen of text lines
DATA W_MAX LIKE SY-INDEX.
DATA W_TIN_MAKTX LIKE MAKT-MAKTX.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* selection screen *
*----------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
CASE OK_CODE.
WHEN 'EXIT'. LEAVE TO SCREEN 0.
WHEN 'CANC'.

SELECT SINGLE * FROM USR01
WHERE BNAME = SY-UNAME .

LEAVE TO TRANSACTION USR01-STCOD.
ENDCASE.
SET PF-STATUS 'SELECT'.
CLEAR: VEKP,
LTAP.
SET TITLEBAR 'SEL'.

ENDMODULE. " STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text *
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
C2 = 0.
* Mandatory Fields
CHECK OK_CODE = 'EXEC'.
*
CALL SCREEN '0110'.
ENDMODULE. " USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
*& Module VAL_ZZTRACKING INPUT
*&---------------------------------------------------------------------*
* text *
*----------------------------------------------------------------------*
MODULE VAL_ZZTRACKING INPUT.
* MUST enter at least one value
* IF S_ZZTRACKING = ' ' AND S_VENUM = ' ' AND S_EXIDV = ' '.
IF S_ZZTRACKING = ' ' AND S_EXIDV = ' '.
MESSAGE E001(YL).
ENDIF.

* if tracking label entered other fields must be initial
IF S_ZZTRACKING NE ' '
* AND ( S_VENUM NE ' ' OR S_EXIDV NE ' ' ).
AND S_EXIDV NE ' ' .
MESSAGE E083(YL).
ENDIF.
* if tracking label number entered get record from LTAP

IF S_ZZTRACKING NE ' '.

SELECT SINGLE * FROM LTAP
WHERE ZZTRACKING = S_ZZTRACKING.
IF SY-SUBRC NE 0.
MESSAGE E022(YL) WITH S_ZZTRACKING.
ELSE.
*--------------------------------------------------------------------
*
* IF LTAP-VENUM NE ' '.
*
* SELECT SINGLE * FROM VEKP
* WHERE VENUM = LTAP-VENUM .
*
IF LTAP-EXIDV NE ' '.

SELECT SINGLE * FROM VEKP
WHERE EXIDV = LTAP-EXIDV .
*---------------------------------------------------------------------
IF SY-SUBRC NE 0.
MESSAGE E022(YL) WITH LTAP-EXIDV.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDMODULE. " VAL_ZZTRACKING INPUT
*&---------------------------------------------------------------------*
*& Module VAL_VENUM INPUT
*&---------------------------------------------------------------------*
* text *
*----------------------------------------------------------------------*
*MODULE VAL_VENUM INPUT.
* SET CURSOR FIELD S_VENUM.
* IF S_VENUM NE ' '
* AND S_EXIDV NE ' '.
* MESSAGE E083(YL).
* ENDIF.
* IF S_VENUM NE ' '.
*
* SELECT SINGLE * FROM VEKP
* WHERE VENUM = S_VENUM.
* IF SY-SUBRC NE 0.
* MESSAGE E022(YL) WITH S_VENUM.
* ENDIF.
* ENDIF.
*ENDMODULE. " VAL_VENUM INPUT
*&---------------------------------------------------------------------*
*& Module EXIT_COMMAND INPUT
*&---------------------------------------------------------------------*
* text *
*----------------------------------------------------------------------*
MODULE EXIT_COMMAND INPUT.
CASE OK_CODE.
WHEN 'EXIT'. LEAVE TO SCREEN 0.
WHEN 'CANC'.
SELECT SINGLE * FROM USR01
WHERE BNAME = SY-UNAME .

LEAVE TO TRANSACTION USR01-STCOD.
WHEN 'BACK'. LEAVE TO SCREEN 0.
ENDCASE.

ENDMODULE. " EXIT_COMMAND INPUT
*&---------------------------------------------------------------------*
*& Module VAL_EXIDV INPUT
*&---------------------------------------------------------------------*
* validate external shipping unit number exits on VEKP *
*----------------------------------------------------------------------*
MODULE VAL_EXIDV INPUT.
IF S_EXIDV NE ' '.
CONCATENATE '00' S_EXIDV INTO VEKP-EXIDV.
SELECT SINGLE * FROM VEKP
WHERE EXIDV = VEKP-EXIDV.
IF SY-SUBRC NE 0.
MESSAGE E022(YL) WITH S_EXIDV.
ENDIF.
ENDIF.
ENDMODULE. " VAL_EXIDV INPUT
*&---------------------------------------------------------------------*
*& Module STATUS_0110 OUTPUT
*&---------------------------------------------------------------------*
* Display screen *
*----------------------------------------------------------------------*
MODULE STATUS_0110 OUTPUT.
IF OK_CODE = 'P+ ' OR OK_CODE = 'P- ' OR OK_CODE = 'P++ '
OR OK_CODE = 'P-- '.
EXIT.
ENDIF.
IF VEKP-VENUM = ' '.
* processing mode b
PERFORM DISP_DELIVERY.
ELSE.
* processing mode a
PERFORM DISP_SHIP_UNIT.
ENDIF.
* common processing
* get mara details
CLEAR MAKT.
*SELECT SINGLE * FROM MARA
* WHERE MATNR = LIPS-MATNR .
*IF SY-SUBRC = 0.
* material description
SELECT SINGLE * FROM MAKT
WHERE MATNR = LIPS-MATNR
AND SPRAS = SY-LANGU .
DATA W_TDNAME LIKE THEAD-TDNAME.
W_TDNAME = LIPS-VBELN.
W_TDNAME+10 = LIPS-POSNR.
CLEAR T_LINES.
REFRESH T_LINES.
CALL FUNCTION 'READ_TEXT'
EXPORTING
ID = 'Z034'
LANGUAGE = SY-LANGU
NAME = W_TDNAME
OBJECT = 'VBBP'
IMPORTING
HEADER = T_HEADER
TABLES
LINES = T_LINES
EXCEPTIONS
ID = 1
LANGUAGE = 2
NAME = 3
NOT_FOUND = 4
OBJECT = 5
REFERENCE_CHECK = 6
WRONG_ACCESS_TO_ARCHIVE = 7
OTHERS = 8.
LOOP AT T_LINES.
EXIT.
ENDLOOP.
IF SY-TFILL > 1.
* W_MAX = SY-TFILL - 5.
W_MAX = SY-TFILL - 1.
ELSE.
W_MAX = 1.
ENDIF.
*
IF W_MAX > 3 .
SET PF-STATUS 'DELIVERY'.
ELSE.
SET PF-STATUS 'ONE'.
ENDIF.
ENDMODULE. " STATUS_0110 OUTPUT

*&---------------------------------------------------------------------*
*& Form DISP_DELIVERY
*&---------------------------------------------------------------------*
* Diplay delivery title - Read delivery item from LIPS
* processing mode B
*----------------------------------------------------------------------*
FORM DISP_DELIVERY.
* SET PF-STATUS 'DELIVERY'.
SET TITLEBAR 'DEL'.
CLEAR LIPS.
SELECT SINGLE * FROM LIPS
WHERE VBELN = LTAP-VBELN_VL
AND POSNR = LTAP-POSNR_VL .

ENDFORM. " DISP_DELIVERY

*&---------------------------------------------------------------------*
*& Form DISP_SHIP_UNIT
*&---------------------------------------------------------------------*
* Display Shipping unit title and read shipping details
*----------------------------------------------------------------------*
* Processing MODE a
*----------------------------------------------------------------------*
FORM DISP_SHIP_UNIT.

* SET PF-STATUS 'DELIVERY'.
SET TITLEBAR 'SHP'.
* vekp already read
* read vepo
* only one line per case
CLEAR VEPO.
CLEAR LIPS.
CLEAR W_MAKTX.
CLEAR W_TIN_MAKTX.
CLEAR ZPACKMAT.
CLEAR S_PACKMAT1.
CLEAR S_PACKMAT2.
CLEAR S_BEZEI1.
CLEAR S_BEZEI2.
CLEAR LABELS.
REFRESH LABELS.
SELECT SINGLE * FROM VEPO
WHERE VENUM = VEKP-VENUM.
IF SY-SUBRC = 0.
SELECT SINGLE * FROM LIPS
WHERE VBELN = VEPO-VBELN
AND POSNR = VEPO-POSNR .
ENDIF.
* packaging material
IF VEKP-ZZPACKMAT1 NE ' '.
SELECT SINGLE * FROM ZPACKMAT
WHERE ZZPACKMAT = VEKP-ZZPACKMAT1.
IF SY-SUBRC = 0.
S_PACKMAT1 = VEKP-ZZPACKMAT1.
S_BEZEI1 = ZPACKMAT-BEZEI.
ENDIF.
ENDIF.

IF VEKP-ZZPACKMAT2 NE ' '.
SELECT SINGLE * FROM ZPACKMAT
WHERE ZZPACKMAT = VEKP-ZZPACKMAT2.
IF SY-SUBRC = 0.
S_PACKMAT2 = VEKP-ZZPACKMAT2.
S_BEZEI2 = ZPACKMAT-BEZEI.
ENDIF.
ENDIF.
* hazard class x 3
CLEAR: W_HAZ_TEXT1, W_HAZ_TEXT2, W_HAZ_TEXT3.
* REFRESH HAZ.
IF VEKP-ZZLAGKL NE ' '.
* HAZ-CODE = VEKP-ZZLAGKL.

SELECT SINGLE * FROM T646M
WHERE SPRAS = SY-LANGU
AND LAGKL = VEKP-ZZLAGKL .
IF SY-SUBRC = 0.
W_HAZ_TEXT1 = T646M-LAGKT.
ENDIF.
* APPEND HAZ.
ENDIF.
IF VEKP-ZZLAGKL2 NE ' '.
* HAZ-CODE = VEKP-ZZLAGKL2.

SELECT SINGLE * FROM T646M
WHERE SPRAS = SY-LANGU
AND LAGKL = VEKP-ZZLAGKL2 .
IF SY-SUBRC = 0.
W_HAZ_TEXT2 = T646M-LAGKT.
ENDIF.
* APPEND HAZ.
ENDIF.
IF VEKP-ZZLAGKL3 NE ' '.
* CLEAR HAZ.
* HAZ-CODE = VEKP-ZZLAGKL3.

SELECT SINGLE * FROM T646M
WHERE SPRAS = SY-LANGU
AND LAGKL = VEKP-ZZLAGKL3 .
IF SY-SUBRC = 0.
W_HAZ_TEXT3 = T646M-LAGKT.
ENDIF.
* APPEND HAZ.
ENDIF.
* LOOP AT HAZ.
* EXIT.
* ENDLOOP.

* case label details
IF VEKP-ZZCASELAB1 NE ' '.
LABELS-CODE = VEKP-ZZCASELAB1.
APPEND LABELS.
ENDIF.
IF VEKP-ZZCASELAB2 NE ' '.
LABELS-CODE = VEKP-ZZCASELAB2.
APPEND LABELS.
ENDIF.
IF VEKP-ZZCASELAB3 NE ' '.
LABELS-CODE = VEKP-ZZCASELAB3.
APPEND LABELS.
ENDIF.
IF VEKP-ZZCASELAB4 NE ' '.
LABELS-CODE = VEKP-ZZCASELAB4.
APPEND LABELS.
ENDIF.
IF VEKP-ZZCASELAB5 NE ' '.
LABELS-CODE = VEKP-ZZCASELAB5.
APPEND LABELS.
ENDIF.

LOOP AT LABELS.

SELECT SINGLE * FROM ZCASHAZLAB
WHERE ZZCASELAB = LABELS-CODE .
LABELS-TEXT = ZCASHAZLAB-ZZCLB_TEXT.
MODIFY LABELS.
ENDLOOP.
* tin material description
IF VEPO-ZZTINNR NE ' '.
SELECT SINGLE * FROM MAKT
WHERE MATNR = VEPO-ZZTINNR
AND SPRAS = SY-LANGU .


IF SY-SUBRC = 0.
W_TIN_MAKTX = MAKT-MAKTX.
ENDIF.
ENDIF.


* case material description
IF VEKP-VHILM NE ' '.
SELECT SINGLE * FROM MAKT
WHERE MATNR = VEKP-VHILM
AND SPRAS = SY-LANGU .


IF SY-SUBRC = 0.
W_MAKTX = MAKT-MAKTX.
ENDIF.
ENDIF.

ENDFORM. " DISP_SHIP_UNIT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0110 INPUT
*&---------------------------------------------------------------------*
* text *
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0110 INPUT.
* position text line cursor
CASE OK_CODE.
WHEN 'P+ '.
C2 = C2 + 3.
IF C2 > W_MAX.
C2 = W_MAX.
ENDIF.
WHEN 'P- '.
C2 = C2 - 3.
IF C2 < 1.
C2 = 1.
ENDIF.
WHEN 'P++ '.
C2 = W_MAX.
WHEN 'P-- '.
C2 = 1.
WHEN 'VL02'.
SET PARAMETER ID 'VL ' FIELD LIPS-VBELN.
CALL TRANSACTION 'VL02'.

ENDCASE.
ENDMODULE. " USER_COMMAND_0110 INPUT

Sample ABAP Program for MB1B Call Transaction

REPORT YMBIE096 LINE-SIZE 80.

*----------------------------------------------------------------------*
* Program: YMBIE096
* Author: Sheila Titchener
* Date: Mar 1999
* Purpose: To move stock to new plant
*----------------------------------------------------------------------*
TABLES: MCHB.

* internal table
DATA: BEGIN OF I_MCHB OCCURS 0,
MATNR LIKE MCHB-MATNR,
LGORT LIKE MCHB-LGORT,
CHARG LIKE MCHB-CHARG,
J_2CTRNR LIKE MCHB-J_2CTRNR,
J_2CELNG LIKE MCHB-J_2CELNG,
CLABS LIKE MCHB-CLABS,
END OF I_MCHB.

*-----------------------new code smt nov 98-----------------------------
* batch input tables
DATA BEGIN OF BDCDATA OCCURS 100.
INCLUDE STRUCTURE BDCDATA.
DATA END OF BDCDATA.

DATA BEGIN OF MESSTAB OCCURS 10.
INCLUDE STRUCTURE BDCMSGCOLL.
DATA END OF MESSTAB.
*

SELECT-OPTIONS S_MATNR FOR MCHB-MATNR.
PARAMETERS: P_DISP AS CHECKBOX.
DATA W_MODE.
DATA W_MESSAGE LIKE MESSAGE.
*----------------------------------------------------------------------*
START-OF-SELECTION.
*----------------------------------------------------------------------*

SELECT MATNR LGORT J_2CELNG CHARG CLABS J_2CTRNR FROM MCHB
INTO CORRESPONDING FIELDS OF TABLE I_MCHB
WHERE MATNR IN S_MATNR
AND WERKS = 'BT'.

*----------------------------------------------------------------------*
END-OF-SELECTION.
*----------------------------------------------------------------------*

LOOP AT I_MCHB.
CHECK I_MCHB-J_2CELNG NE 0.
CHECK I_MCHB-J_2CELNG = I_MCHB-CLABS.
PERFORM MOVE_STOCK.
ENDLOOP.


*&---------------------------------------------------------------------*
*& Form MOVE_STOCK
*&---------------------------------------------------------------------*
* Call transaction MB1B to transfer stock
*----------------------------------------------------------------------*
FORM MOVE_STOCK.
DATA: W_QTY(10).
WRITE I_MCHB-J_2CELNG TO W_QTY DECIMALS 0.


REFRESH: BDCDATA, MESSTAB.

PERFORM DYNPRO USING:
'X' 'SAPMM07M' '0400',
' ' 'RM07M-BWARTWA' '301',
' ' 'RM07M-WERKS' 'BT',
' ' 'RM07M-LGORT' I_MCHB-LGORT,
' ' 'BDC_OKCODE' '/0',

'X' 'SAPMM07M' '0421',
' ' 'MSEGK-UMWRK' '94',
' ' 'MSEGK-UMLGO' I_MCHB-LGORT,
' ' 'BDC_OKCODE' 'NLE',
*CODING BLOCK
'X' 'SAPLKACB' '0002',
' ' 'BDC_OKCODE' '/0',


'X' 'SAPMM07M' '0421',
' ' 'MSEG-MATNR(1)' I_MCHB-MATNR,
' ' 'MSEG-ERFMG(1)' W_QTY,
' ' 'MSEG-CHARG(1)' I_MCHB-CHARG,
' ' 'BDC_OKCODE' '/0',
*CODING BLOCK
'X' 'SAPLKACB' '0002',
' ' 'BDC_OKCODE' '/0',

*CODING BLOCK
'X' 'SAPLKACB' '0002',
' ' 'BDC_OKCODE' '/0',


* 'X' 'SAPMM07M' '0410',
* ' ' 'BDC_OKCODE' '/0',
*CODING BLOCK
* 'X' 'SAPLKACB' '0002',
* ' ' 'BDC_OKCODE' '/8',

*CODING BLOCK
* 'X' 'SAPLKACB' '0002',
* ' ' 'BDC_OKCODE' '/8',

'X' 'SAPLJ2CW' '0190',
' ' 'J_5C7-UMCHA' I_MCHB-CHARG,
' ' 'BDC_OKCODE' '/7',

'X' 'SAPMM07M' '0421',
' ' 'BDC_OKCODE' '/11',
*CODING BLOCK
'X' 'SAPLKACB' '0002',
' ' 'BDC_OKCODE' '/0'.
IF P_DISP = 'X'.
W_MODE = 'A'.
ELSE.
W_MODE = 'N'.
ENDIF.
CALL TRANSACTION 'MB1B' USING BDCDATA MODE W_MODE UPDATE 'S'
MESSAGES INTO MESSTAB.

WRITE: / I_MCHB-MATNR, I_MCHB-CHARG, I_MCHB-LGORT,
I_MCHB-J_2CTRNR, I_MCHB-J_2CELNG.

IF SY-SUBRC NE 0.
* what to do if there's an error????
LOOP AT MESSTAB.
SY-MSGNO = MESSTAB-MSGNR.
CALL FUNCTION 'WRITE_MESSAGE'
EXPORTING
MSGID = MESSTAB-MSGID
MSGNO = SY-MSGNO
MSGTY = MESSTAB-MSGTYP
MSGV1 = MESSTAB-MSGV1
MSGV2 = MESSTAB-MSGV2
MSGV3 = MESSTAB-MSGV3
MSGV4 = MESSTAB-MSGV4
MSGV5 = MESSTAB-MSGV4
IMPORTING
* error =
MESSG = W_MESSAGE
* msgln =
EXCEPTIONS
OTHERS = 1.
WRITE: / W_MESSAGE.
* message id messtab-msgid type 'I' number messtab-msgnr.
ENDLOOP.

ENDIF.


ENDFORM. " CHANGE_BILLING_TYPE

*-----------------------------------------------------------------------
* FORM DYNPRO - new form smt nov 1998
*-----------------------------------------------------------------------
* > DYNBEGIN
* > NAME
* > VALUE
*-----------------------------------------------------------------------
*
FORM DYNPRO USING DYNBEGIN NAME VALUE.

IF DYNBEGIN = 'X'.
CLEAR BDCDATA.
MOVE: NAME TO BDCDATA-PROGRAM,
VALUE TO BDCDATA-DYNPRO,
'X' TO BDCDATA-DYNBEGIN.
APPEND BDCDATA.
ELSE.
CLEAR BDCDATA.
MOVE: NAME TO BDCDATA-FNAM,
VALUE TO BDCDATA-FVAL.
APPEND BDCDATA.
ENDIF.

ENDFORM.
*

Sample ABAP Program of Function Module to Convert Work Center into Personnel Number

FUNCTION z_get_pernr_from_wc.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" VALUE(I_WORK_CENTRE) TYPE ARBPL
*" EXPORTING
*" VALUE(E_PERSONNEL_NO) TYPE PERNR
*"----------------------------------------------------------------------
* Author: Sheila Titchener - www.iconet-ltd.co.uk
* Date: July 2005
* Description: Convert Work Centre into Personnel Number
*"----------------------------------------------------------------------
DATA: l_hroid TYPE hrobjid,
l_sobid TYPE sobid.

SELECT SINGLE hroid FROM crhd
INTO l_hroid
WHERE objty = 'A'
AND arbpl = i_work_centre.

CHECK sy-subrc = 0.

SELECT SINGLE sobid FROM hrp1001
INTO l_sobid
WHERE objid = l_hroid
AND sclas = 'S'.

CHECK sy-subrc = 0.

SELECT SINGLE sobid FROM hrp1001
INTO l_sobid
WHERE otype = 'S'
AND objid = l_sobid
AND sclas = 'P'.

CHECK sy-subrc = 0.

e_personnel_no = l_sobid.

ENDFUNCTION.

Sample ABAP Program of FTP Function Module

FUNCTION Y_FTP.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" VALUE(USER)
*" VALUE(PWD)
*" VALUE(HOST)
*" TABLES
*" COMMANDS
*" EXCEPTIONS
*" NO_SUCH_FILE
*"----------------------------------------------------------------------

DATA: W_USER(12) TYPE C ,
W_PWD(20) TYPE C ,
W_HOST(64) TYPE C.

DATA: HDL TYPE I,
KEY TYPE I VALUE 26101957,
DSTLEN TYPE I.

DATA: BEGIN OF RESULT OCCURS 0,
LINE(100) TYPE C,
END OF RESULT.

DESCRIBE FIELD PWD LENGTH DSTLEN.

CALL 'AB_RFC_X_SCRAMBLE_STRING'
ID 'SOURCE' FIELD PWD ID 'KEY' FIELD KEY
ID 'SCR' FIELD 'X' ID 'DESTINATION' FIELD PWD
ID 'DSTLEN' FIELD DSTLEN.

CALL FUNCTION 'FTP_CONNECT'
EXPORTING
USER = USER
PASSWORD = PWD
HOST = HOST
RFC_DESTINATION = 'SAPFTP'
IMPORTING
HANDLE = HDL.

LOOP AT COMMANDS.
IF COMMANDS NE ' '.
CALL FUNCTION 'FTP_COMMAND'
EXPORTING
HANDLE = HDL
COMMAND = COMMANDS
TABLES
DATA = RESULT
EXCEPTIONS
COMMAND_ERROR = 1
TCPIP_ERROR = 2.
LOOP AT RESULT.
WRITE AT / RESULT-LINE.
IF RESULT CS 'error'.
RAISE NO_SUCH_FILE.
ENDIF.
ENDLOOP.
REFRESH RESULT.
ENDIF.
ENDLOOP.

CALL FUNCTION 'FTP_DISCONNECT'
EXPORTING
HANDLE = HDL.




ENDFUNCTION.

Sample ABAP Program to EXPORT LIST TO MEMORY

************************************************************************
* Author - Sheila Titchener *
* Program - Report of orders with billing/delivery blocks
* Date - October 1998 *
* Company - IconeT Services *
************************************************************************
************************************************************************

REPORT YVREE024 LINE-SIZE 185 LINE-COUNT 63 NO STANDARD PAGE HEADING.

*---------------------------------------------------------------------*
* DATA DECLARATIONS *
*---------------------------------------------------------------------*

TABLES: VBAK, VBAP, VBEP, KNA1, TVFST, TVLST.

* Selection screens.
*-----------------------------------------------------------------------
* mandatory parameters
SELECTION-SCREEN BEGIN OF BLOCK PARAMETERS
WITH FRAME
TITLE TEXT-020 .
PARAMETERS: P_VKORG LIKE VBAK-VKORG OBLIGATORY ,
P_VTWEG LIKE VBAK-VTWEG OBLIGATORY ,
P_SPART LIKE VBAK-SPART OBLIGATORY .

SELECTION-SCREEN END OF BLOCK PARAMETERS.
*-----------------------------------------------------------------------
* optional selection ranges
SELECTION-SCREEN BEGIN OF BLOCK SELECT_CRITERIA
WITH FRAME
TITLE TEXT-010 .
SELECT-OPTIONS:
S_VKBUR FOR VBAK-VKBUR,
S_VKGRP FOR VBAK-VKGRP,
S_KUNNR FOR VBAK-KUNNR.

SELECTION-SCREEN END OF BLOCK SELECT_CRITERIA .


* Order header table.
DATA: BEGIN OF I_VBAK OCCURS 0,
VBELN LIKE VBAK-VBELN,
KUNNR LIKE VBAK-KUNNR,
FAKSK LIKE VBAK-FAKSK, "billing block
LIFSK LIKE VBAK-LIFSK, "delivery block
END OF I_VBAK.
* report table
DATA: BEGIN OF ITAB OCCURS 0,
VBELN LIKE VBAP-VBELN, " Order Number
KUNNR LIKE VBAK-KUNNR, " Customer Number
NAME1 LIKE KNA1-NAME1, " Customer Name
ERNAM LIKE VBAK-ERNAM, " User created
POSNR LIKE VBAP-POSNR, " Line Item
MATNR LIKE VBAP-MATNR, " Material Number
KWMENG LIKE VBAP-KWMENG, " Quantity
MEINS LIKE VBAP-MEINS, " Unit of measure
NETWR LIKE VBAP-NETWR, " value
FAKSP LIKE VBAP-FAKSP, " billing block
LIFSP LIKE VBEP-LIFSP, " delivery block
END OF ITAB.


*---------------------------------------------------------------------*
INITIALIZATION .
GET PARAMETER ID 'VKO' FIELD P_VKORG.
GET PARAMETER ID 'VTW' FIELD P_VTWEG.
GET PARAMETER ID 'SPA' FIELD P_SPART.

*---------------------------------------------------------------------*
START-OF-SELECTION .
*---------------------------------------------------------------------*
* populate vbak table from selection criteria with headers that have
* billing or delivery blocks
PERFORM SELECT_DOCUMENTS.
* select blocked items from documents selected from vbak
PERFORM SELECT_BLOCKED_ITEMS.
*---------------------------------------------------------------------*
END-OF-SELECTION.
*---------------------------------------------------------------------*

SORT ITAB BY VBELN POSNR.

* print report from internal table
PERFORM PRINT_REPORT.

* run report of orders with payment block on customer
SUBMIT YVREE025 EXPORTING LIST TO MEMORY
AND RETURN
WITH P_VKORG = P_VKORG
WITH P_VTWEG = P_VTWEG
WITH P_SPART = P_SPART
WITH S_VKBUR IN S_VKBUR
WITH S_VKGRP IN S_VKGRP
WITH S_KUNNR IN S_KUNNR.

DATA: ABAPLIST LIKE ABAPLIST OCCURS 0.
* recover YVREE025 report and display
CALL FUNCTION 'LIST_FROM_MEMORY'
TABLES
LISTOBJECT = ABAPLIST
EXCEPTIONS
NOT_FOUND = 1
OTHERS = 2.

*if sy-batch = space.
CALL FUNCTION 'DISPLAY_LIST'
EXPORTING
FULLSCREEN = 'X'
* CALLER_HANDLES_EVENTS =
IMPORTING
USER_COMMAND = SY-UCOMM
TABLES
LISTOBJECT = ABAPLIST
EXCEPTIONS
EMPTY_LIST = 1
OTHERS = 2.
*else.
* using write_list duplicates yvree024 headings on yvree025 list
* display_list prints ok in background as long as print immediately is
* NOT switched off

*call function 'WRITE_LIST'
* tables
* listobject = abaplist
* exceptions
* empty_list = 1
* others = 2.
*endif.
*---------------------------------------------------------------------*
TOP-OF-PAGE.
*---------------------------------------------------------------------*
* write top of page title.
PERFORM WRITE_TITLE .
* write column headings.
PERFORM WRITE_HEADER.


*&---------------------------------------------------------------------*
*& Form SELECT_DOCUMENTS
*&---------------------------------------------------------------------*
* select order header details from vbak depending on selection
* criteria entered
*----------------------------------------------------------------------*
FORM SELECT_DOCUMENTS.

SELECT VBELN KUNNR LIFSK FAKSK
FROM VBAK INTO CORRESPONDING FIELDS OF TABLE I_VBAK
WHERE VKORG = P_VKORG
AND VTWEG = P_VTWEG
AND SPART = P_SPART
AND VKGRP IN S_VKGRP
AND VKBUR IN S_VKBUR
AND KUNNR IN S_KUNNR.
ENDFORM. " SELECT_DOCUMENTS

*&---------------------------------------------------------------------*
*& Form SELECT_BLOCKED_ITEMS
*&---------------------------------------------------------------------*
* check extracted documents for blocks *
*----------------------------------------------------------------------*
FORM SELECT_BLOCKED_ITEMS.
* process oders selected
LOOP AT I_VBAK.
* if order blocked at header level select all items
IF I_VBAK-FAKSK NE SPACE OR I_VBAK-LIFSK NE SPACE.
PERFORM SELECT_ALL_ITEMS.
ELSE.
* check for block at item level
SELECT VBELN POSNR MATNR KWMENG MEINS NETWR FAKSP ERNAM
FROM VBAP INTO
(VBAP-VBELN, VBAP-POSNR, VBAP-MATNR, VBAP-KWMENG, VBAP-MEINS,
VBAP-NETWR, VBAP-FAKSP, VBAP-ERNAM)
WHERE VBELN = I_VBAK-VBELN.
IF VBAP-FAKSP NE SPACE.
CLEAR ITAB.
MOVE-CORRESPONDING VBAP TO ITAB.
MOVE I_VBAK-KUNNR TO ITAB-KUNNR.
APPEND ITAB.
ELSE.
* check for block at delivery level
SELECT LIFSP WMENG FROM VBEP INTO
(VBEP-LIFSP, VBEP-WMENG)
WHERE VBELN = I_VBAK-VBELN
AND POSNR = VBAP-POSNR.
IF VBEP-LIFSP NE SPACE.
CLEAR ITAB.
MOVE-CORRESPONDING VBAP TO ITAB.
MOVE I_VBAK-KUNNR TO ITAB-KUNNR.
* use schedule qty
MOVE VBEP-WMENG TO ITAB-KWMENG.
* and reason
MOVE VBEP-LIFSP TO ITAB-LIFSP.
* recalculate value
ITAB-NETWR = ITAB-NETWR / VBAP-KWMENG * VBEP-WMENG.
APPEND ITAB.
ENDIF.
ENDSELECT.
ENDIF.
ENDSELECT.

ENDIF.
ENDLOOP.


ENDFORM. " SELECT_BLOCKED_ITEMS

*&---------------------------------------------------------------------*
*& Form PRINT_REPORT
*&---------------------------------------------------------------------*
* text *
*----------------------------------------------------------------------*
FORM PRINT_REPORT.

DATA: W_REASON_TEXT(25).

LOOP AT ITAB.
* get name
SELECT SINGLE NAME1 FROM KNA1 INTO KNA1-NAME1
WHERE KUNNR = ITAB-KUNNR .
* get reason text
IF ITAB-FAKSP NE SPACE.
SELECT SINGLE VTEXT FROM TVFST INTO W_REASON_TEXT
WHERE SPRAS = SY-LANGU
AND FAKSP = ITAB-FAKSP .
ELSE.

SELECT SINGLE VTEXT FROM TVLST INTO W_REASON_TEXT
WHERE SPRAS = SY-LANGU
AND LIFSP = ITAB-LIFSP.
ENDIF.
*
WRITE: / SY-VLINE , (10) ITAB-VBELN,
SY-VLINE , (10) ITAB-KUNNR,
SY-VLINE , (35) KNA1-NAME1,
SY-VLINE , (12) ITAB-ERNAM,
SY-VLINE , (6) ITAB-POSNR,
SY-VLINE , (18) ITAB-MATNR,
SY-VLINE , (10) ITAB-KWMENG DECIMALS 0,
SY-VLINE , (3) ITAB-MEINS,
SY-VLINE , (15) ITAB-NETWR,
SY-VLINE , (02) ITAB-LIFSP,
SY-VLINE , (02) ITAB-FAKSP,
SY-VLINE , (25) W_REASON_TEXT,
SY-VLINE .
ENDLOOP.

WRITE:/1(185) SY-ULINE.
ENDFORM. " PRINT_REPORT

*---------------------------------------------------------------------*
* FORM WRITE_TITLE *
*---------------------------------------------------------------------*
* Form to write top of page title. *
*---------------------------------------------------------------------*
FORM WRITE_TITLE.

WRITE:/1(185) SY-ULINE.
WRITE:/ 'Pirelli Cables Limited' ,
40 SY-TITLE , " Report title
120 'Date :' , 130 SY-DATUM .

WRITE:/120 'Page :' ,
130 SY-PAGNO , " Page number of the report
160 'YV24 / YVREE024 /', SY-MANDT.
WRITE:/160 'Report 2 of 2'.
WRITE:/1(185) SY-ULINE.

* format color col_heading intensified off.

WRITE:/(25) 'Report generated for; ',
'Sales Organisation:',
P_VKORG ,
' Distribution Channel:',
P_VTWEG,
' Division:',
P_SPART.
WRITE: /27
'Sales Office:',
S_VKBUR-LOW.
IF S_VKBUR-HIGH NE SPACE.
WRITE: ' - ', S_VKBUR-HIGH.
ENDIF.
WRITE: 59 ' Sales Group:',
S_VKGRP-LOW.
IF S_VKGRP-HIGH NE SPACE.
WRITE: ' - ', S_VKGRP-HIGH.
ENDIF.
WRITE: 92 ' Customer:',
S_KUNNR-LOW.
IF S_KUNNR-HIGH NE SPACE.
WRITE: ' - ', S_KUNNR-HIGH.
ENDIF.
WRITE:/1(185) SY-ULINE.

ENDFORM.

*---------------------------------------------------------------------*
* FORM WRITE-HEADER *
*---------------------------------------------------------------------*
* Form to write Column headings *
*---------------------------------------------------------------------*
FORM WRITE_HEADER.

SKIP.

FORMAT COLOR COL_HEADING INTENSIFIED.

WRITE:/1(185) SY-ULINE.
WRITE:/
SY-VLINE , (10) ' Order ' ,
SY-VLINE , (10) ' Customer ' ,
SY-VLINE , (35) ' Name ' ,
SY-VLINE , (12) ' User created',
SY-VLINE , (06) ' Item ' ,
SY-VLINE , (18) ' Material',
SY-VLINE , (10) 'Quantity' CENTERED DECIMALS 0,
SY-VLINE , (03) 'UOM' ,
SY-VLINE , (15) ' Value ',
SY-VLINE , (02) 'DB',
SY-VLINE , (02) 'BB',
SY-VLINE , (25) ' Reason',
SY-VLINE .


ENDFORM.

*&---------------------------------------------------------------------*
*& Form SELECT_ALL_ITEMS
*&---------------------------------------------------------------------*
* select all items for this header when blocked at header level *
*----------------------------------------------------------------------*
FORM SELECT_ALL_ITEMS.

SELECT VBELN POSNR MATNR KWMENG MEINS NETWR ERNAM
FROM VBAP INTO
(VBAP-VBELN, VBAP-POSNR, VBAP-MATNR, VBAP-KWMENG, VBAP-MEINS,
VBAP-NETWR, VBAP-ERNAM)
* REMOVED appending corresponding fields of table itab
WHERE VBELN = I_VBAK-VBELN.
MOVE-CORRESPONDING VBAP TO ITAB.
MOVE I_VBAK-FAKSK TO ITAB-FAKSP.
MOVE I_VBAK-LIFSK TO ITAB-LIFSP.
MOVE I_VBAK-KUNNR TO ITAB-KUNNR.
APPEND ITAB.
ENDSELECT.

ENDFORM. " SELECT_ALL_ITEMS

Sample ABAP Program to Execute Unix command from within SAP

REPORT YSMT018A
MESSAGE-ID YL.
* ABAP to append ribesnsl to ribes
* and remove input file using sxpg_command_execute

DATA: FILE1(25) VALUE '/vmedata/???/file1nsl'.
DATA: FILE2(25) VALUE '/vmedata/???/file2'.
DATA: W_MESSAGE(50).
DATA: RLBES LIKE RLBES.
FILE1+9(3) = SY-SYSID.
FILE2+9(3) = SY-SYSID.
* sxpg_command_execute parameters
DATA: REMOVE_FILE LIKE SXPGCOLIST-PARAMETERS.
DATA: PROTOCOL LIKE BTCXPM OCCURS 0.
*
OPEN DATASET FILE2 FOR APPENDING IN TEXT MODE MESSAGE W_MESSAGE.
IF SY-SUBRC NE 0 .
MESSAGE E114 WITH FILE2 W_MESSAGE.
ENDIF.
OPEN DATASET FILE1 FOR INPUT IN TEXT MODE MESSAGE W_MESSAGE.
IF SY-SUBRC NE 0.
MESSAGE E114 WITH FILE1 W_MESSAGE.
ENDIF.

DO.
READ DATASET FILE1 INTO RLBES.
IF SY-SUBRC NE 0.
EXIT.
ENDIF.
TRANSFER RLBES TO FILE2.
IF SY-SUBRC NE 0.
MESSAGE E009 WITH FILE2 SY-SUBRC.
ENDIF.
ENDDO.

MESSAGE I114 WITH FILE1 'appended'.
***----------------------------------------------------------------****

DATA: COMMAND3(60)
* VALUE 'rm /vmedata/???/rlbesnsl' .
VALUE 'rm /vmedata/???/file1nsl' .

COMMAND3+12(3) = SY-SYSID.


*submit the unix command remove file1
REMOVE_FILE = COMMAND3+3.
* create y_remove command in sm69
CALL FUNCTION 'SXPG_COMMAND_EXECUTE'
EXPORTING
COMMANDNAME = 'Y_REMOVE'
* OPERATINGSYSTEM = SY-OPSYS
* TARGETSYSTEM = SY-HOST
* STDOUT = 'X'
* STDERR = 'X'
* TERMINATIONWAIT = 'X'
* TRACE = ' '
ADDITIONAL_PARAMETERS = REMOVE_FILE
* IMPORTING
* STATUS =
TABLES
EXEC_PROTOCOL = PROTOCOL
EXCEPTIONS
NO_PERMISSION = 1
COMMAND_NOT_FOUND = 2
PARAMETERS_TOO_LONG = 3
SECURITY_RISK = 4
WRONG_CHECK_CALL_INTERFACE = 5
PROGRAM_START_ERROR = 6
PROGRAM_TERMINATION_ERROR = 7
X_ERROR = 8
PARAMETER_EXPECTED = 9
TOO_MANY_PARAMETERS = 10
ILLEGAL_COMMAND = 11
WRONG_ASYNCHRONOUS_PARAMETERS = 12
CANT_ENQ_TBTCO_ENTRY = 13
JOBCOUNT_GENERATION_ERROR = 14
OTHERS = 15.

IF SY-SUBRC = 0.
MESSAGE I114 WITH FILE1 'deleted'.
ENDIF.

Sample ABAP Program to Get Output in EXCEL

REPORT YLMM015A

MESSAGE-ID YL.

*-----------------------------------------------------------------------

*

* EDI FORECASTING INTERFACE - SHEILA TITCHENER JAN 1998

* L_IDOC_HEADER_CREATE, L_IDOC_SEGMENT_CREATE & L_IDOC_SEND

* left idoc ready to send but did not send automatically.

* these were replaced by ALE_MODEL_DETERMINE_IF_TO_SEND

* ALE_MODEL_INFO_GET & MASTER_IDOC_DISTRIBUTE

* 'in update task'. This solved the problem. Records are set up in table

* t_edidd.

*-----------------------------------------------------------------------

* TABLES - Database *

*-----------------------------------------------------------------------

TABLES: EORD,

MARC,

MARM,

EINA,

PLAF,

EBAN,

EDIDD.

*-----------------------------------------------------------------------

* DATA - Work Fields

*-----------------------------------------------------------------------

DATA: W_START_MONTH LIKE SY-DATUM.

DATA: W_NEXT_MONTH LIKE SY-DATUM.

DATA: W_THIRD_MONTH LIKE SY-DATUM.

DATA: W_END_DATE LIKE SY-DATUM.

DATA: W_COMP_DATE LIKE SY-DATUM.

DATA: W_BEG_DATE LIKE SY-DATUM.

DATA: W_DESP_DATE LIKE SY-DATUM.

DATA: W_DAY LIKE HRVSCHED-DAYNR.

DATA: W_DAY_TXT LIKE HRVSCHED-DAYTXT.

DATA: W_INDEX LIKE SY-TABIX.

DATA: W_TOTAL LIKE EBAN-MENGE.

DATA: W_ITEM_NUMBER TYPE I.

* IDOC DATA

DATA: W_E1EDK01_DATA LIKE E1EDK01.

DATA: W_E1EDK03_DATA LIKE E1EDK03.

DATA: W_E1EDKA1_DATA LIKE E1EDKA1.

DATA: W_E1EDP01_DATA LIKE E1EDP01.

DATA: W_E1EDP20_DATA LIKE E1EDP20.

DATA: W_E1EDP19_DATA LIKE E1EDP19.

* DATA - INTERNAL TABLES

*-----------------------------------------------------------------------

* forecast buckets - 8/9 weekly for first 2 months then 10 monthly

DATA: BEGIN OF FORECAST OCCURS 19,

DATE TYPE D, "start date of bucket

WEEK_MON, "weekly or monthly indicator

QTY LIKE EBAN-MENGE. "accumulated qty

DATA: END OF FORECAST.

*DATA: PRODUCTS LIKE EORD OCCURS 10 WITH HEADER LINE.

DATA: BEGIN OF PRODUCTS OCCURS 10,

MATNR LIKE EORD-MATNR,

WERKS LIKE EORD-WERKS,

LIFNR LIKE EORD-LIFNR.

DATA: END OF PRODUCTS.

* planned orders table PLAF

DATA: BEGIN OF T_PLAF OCCURS 10,

GSMNG LIKE PLAF-GSMNG,

PEDTR LIKE PLAF-PEDTR.

DATA: END OF T_PLAF.

* planned orders table EBAN

DATA: BEGIN OF T_EBAN OCCURS 10,

MENGE LIKE EBAN-MENGE,

LFDAT LIKE EBAN-LFDAT.

DATA: END OF T_EBAN.

* IDOC _SEND parameter

DATA: COMM_IDOC_CONTROL LIKE EDIDC OCCURS 1 WITH HEADER LINE.

*-----------------------------------------------------------------------

* new fields for new way of sending IDOC



DATA: W_EDIDC LIKE EDIDC OCCURS 5 WITH HEADER LINE,

L_EDIDC LIKE EDIDC,

L_SEND_FLAG,

W_SDATA LIKE EDIDD-SDATA.

DATA: T_BDI_MODEL LIKE BDI_MODEL OCCURS 0 WITH HEADER LINE.

DATA: T_EDIDC LIKE EDIDC OCCURS 0 WITH HEADER LINE.

DATA: T_EDIDD LIKE EDIDD OCCURS 0 WITH HEADER LINE.

*--------------------------------------------------------------------











* OUTPUT file layout

DATA: BEGIN OF OUTREC,

MATNR LIKE EBAN-MATNR,

D1 VALUE '$',

IDNLF LIKE EINA-IDNLF,

D2 VALUE '$',

WEEK_MON,

D3 VALUE '$',

PERIOD LIKE SY-DATUM,

D4 VALUE '$',

QTY(8),

ENDOFLINE TYPE X VALUE '0D',

END OF OUTREC.

*-----------------------------------------------------------------------

* SELECT-OPTIONS

*-----------------------------------------------------------------------



SELECT-OPTIONS P_LIFNR FOR EORD-LIFNR.



*-----------------------------------------------------------------------

* PARAMETERS *

*-----------------------------------------------------------------------

PARAMETERS: P_PART LIKE EDIDC-RCVPRN DEFAULT 'EDIFCAST',

P_FILE(30) DEFAULT '/vmedata/XXX/mdafcstddmmyy' LOWER CASE.





*-----------------------------------------------------------------------

* INITIALIZATION.

*-----------------------------------------------------------------------

INITIALIZATION.

* move hoot name to output file name

P_FILE+9(3) = SY-SYSID.

* move todays date to output file name

P_FILE+20(2) = SY-DATUM+6(2).

P_FILE+22(2) = SY-DATUM+4(2).

P_FILE+24(2) = SY-DATUM+2(2).

*-----------------------------------------------------------------------

START-OF-SELECTION.

*-----------------------------------------------------------------------

* OPEN $ delimited file

OPEN DATASET P_FILE FOR OUTPUT IN TEXT MODE.



* 4.1 create header idoc

* REPLACE function with alternative

* CALL FUNCTION 'L_IDOC_HEADER_CREATE'

* EXPORTING

* I_MESTYP = 'ORDERS'

* I_MESCOD = ' '

* I_IDOCTP = 'ORDERS01'

* I_RCVPRN = P_PART

* EXCEPTIONS

* OTHERS = 1.

*- Call function module to determine if message is to be distributed



CALL FUNCTION 'ALE_MODEL_DETERMINE_IF_TO_SEND'

EXPORTING

MESSAGE_TYPE = 'ORDERS'

IMPORTING

IDOC_MUST_BE_SENT = L_SEND_FLAG

EXCEPTIONS

OWN_SYSTEM_NOT_DEFINED = 1

OTHERS = 2.



*- Determine recipient systems



CALL FUNCTION 'ALE_MODEL_INFO_GET'

EXPORTING

MESSAGE_TYPE = 'ORDERS'

* RECEIVING_SYSTEM = ' '

* SENDING_SYSTEM = ' '

* VALIDDATE = SY-DATUM

TABLES

MODEL_DATA = T_BDI_MODEL

EXCEPTIONS

NO_MODEL_INFO_FOUND = 1

OWN_SYSTEM_NOT_DEFINED = 2

OTHERS = 3.





* 4.2 - 4.5 create idoc segments



PERFORM IDOC_CREATE.



* 4.6 Set up forecast bucket dates



* determine start of the next forecast month

W_START_MONTH = SY-DATUM.

* 12 months ago

*_LAST_12_MTH = SY-DATUM - 365.



IF W_START_MONTH+4(2) = '12'.

W_START_MONTH+4(2) = '01'.

W_START_MONTH(4) = W_START_MONTH(4) + '0001'.

ELSE.

W_START_MONTH+4(2) = W_START_MONTH+4(2) + '01'.

ENDIF.

W_START_MONTH+6 = '01'.

CALL FUNCTION 'RH_GET_DATE_DAYNAME'

EXPORTING

LANGU = 'E'

DATE = W_START_MONTH

* CHECK =

IMPORTING

DAYNR = W_DAY

DAYTXT = W_DAY_TXT

EXCEPTIONS

NO_LANGU = 1

NO_DATE = 2

NO_DAYTXT_FOR_LANGU = 3

INVALID_DATE = 4

OTHERS = 5.

CASE W_DAY.

WHEN 1.

WHEN 2.

W_START_MONTH = W_START_MONTH - 1.

WHEN 3.

W_START_MONTH = W_START_MONTH - 2.

WHEN 4.

W_START_MONTH = W_START_MONTH + 4.

WHEN 5.

W_START_MONTH = W_START_MONTH + 3.

WHEN 6.

W_START_MONTH = W_START_MONTH + 2.

WHEN 7.

W_START_MONTH = W_START_MONTH + 1.

ENDCASE.

* date of start of monthly forecasting

W_THIRD_MONTH = W_START_MONTH.



IF W_START_MONTH+4(2) < '11'. W_THIRD_MONTH+4(2) = W_THIRD_MONTH+4(2) + '02'. ELSE. W_THIRD_MONTH+4(2) = W_THIRD_MONTH+4(2) - '10'. W_THIRD_MONTH(4) = W_THIRD_MONTH(4) + '0001'. ENDIF. * day will be the first W_THIRD_MONTH+6 = '01'. * find nearest monday - removed *CALL FUNCTION 'RH_GET_DATE_DAYNAME' * EXPORTING * LANGU = 'E' * DATE = W_THIRD_MONTH ** CHECK = * IMPORTING * DAYNR = W_DAY * DAYTXT = W_DAY_TXT * EXCEPTIONS * NO_LANGU = 1 * NO_DATE = 2 * NO_DAYTXT_FOR_LANGU = 3 * INVALID_DATE = 4 * OTHERS = 5. *CASE W_DAY. * WHEN 1. * WHEN 2. * W_THIRD_MONTH = W_THIRD_MONTH - 1. * WHEN 3. * W_THIRD_MONTH = W_THIRD_MONTH - 2. * WHEN 4. * W_THIRD_MONTH = W_THIRD_MONTH + 4. * WHEN 5. * W_THIRD_MONTH = W_THIRD_MONTH + 3. * WHEN 6. * W_THIRD_MONTH = W_THIRD_MONTH + 2. * WHEN 7. * W_THIRD_MONTH = W_THIRD_MONTH + 1. *ENDCASE. * set up all dates in table DO. IF SY-INDEX = 1. FORECAST-DATE = W_START_MONTH. W_NEXT_MONTH = W_START_MONTH. ELSE. * if this takes us into the third month set to monthly IF W_NEXT_MONTH GE W_THIRD_MONTH. IF W_NEXT_MONTH+4(2) = '12'. " add 1 month W_NEXT_MONTH+4(2) = '01'. W_NEXT_MONTH(4) = W_NEXT_MONTH(4) + '0001'. ELSE. W_NEXT_MONTH+4(2) = W_NEXT_MONTH+4(2) + '01'. ENDIF. * W_NEXT_MONTH = W_NEXT_MONTH + 28. * IF W_NEXT_MONTH+4(2) = FORECAST-DATE+4(2). * W_NEXT_MONTH = W_NEXT_MONTH + 7. * ENDIF. ELSE. * add 1 week W_NEXT_MONTH = W_NEXT_MONTH + 7. ENDIF. FORECAST-DATE = W_NEXT_MONTH. ENDIF. IF FORECAST-DATE GE W_THIRD_MONTH. FORECAST-DATE+6(2) = '01'. "set start day to 1 FORECAST-WEEK_MON = '2'. ELSE. FORECAST-WEEK_MON = '1'. ENDIF. * year complete? IF FORECAST-DATE+4(2) = W_START_MONTH+4(2) AND FORECAST-DATE(4) > W_START_MONTH(4).

W_END_DATE = FORECAST-DATE.

EXIT.

ENDIF.



APPEND FORECAST.



ENDDO.

*-----------------------------------------------------------------------

* Start of selection processing

*-----------------------------------------------------------------------

* 4.7 select records from Purchasing Source list

*-----------------------------------------------------------------------

SELECT MATNR WERKS LIFNR FROM EORD INTO TABLE PRODUCTS

WHERE LIFNR IN P_LIFNR

AND FLIFN = 'X'

AND VDATU LE SY-DATUM

AND BDATU GE SY-DATUM.

* check within selection range

* CHECK P_LIFNR.

* add to table

* APPEND PRODUCTS.

*ENDSELECT.

* delete duplicates products

* table already in product code sequence

DELETE ADJACENT DUPLICATES FROM PRODUCTS COMPARING MATNR.

*-----------------------------------------------------------------------

* process selected vendors materials

*-----------------------------------------------------------------------

LOOP AT PRODUCTS.

*--------------------------------------

* 4.7 access material master

*--------------------------------------

SELECT SINGLE * FROM MARC

WHERE MATNR = PRODUCTS-MATNR

AND WERKS = PRODUCTS-WERKS .



CHECK MARC-DISMM = 'PD' OR MARC-DISMM = 'P3'

OR MARC-DISMM = 'ZD' OR MARC-DISMM = 'Z3'.



*--------------------------------------

* 4.8 access purchasing info record

*--------------------------------------

SELECT SINGLE * FROM EINA

WHERE MATNR = PRODUCTS-MATNR

AND LIFNR = PRODUCTS-LIFNR.

* record found?

CHECK SY-SUBRC = 0.

* vendor's material number begins with 45?

CHECK EINA-IDNLF(2) = '45'.

*--------------------------------------

* 4.10 clear forecast quantities

*--------------------------------------

LOOP AT FORECAST.

FORECAST-QTY = 0.

MODIFY FORECAST TRANSPORTING QTY.

ENDLOOP.

*--------------------------------------

* 4.10

*--------------------------------------

* calculate start & end dates

W_COMP_DATE = W_END_DATE + 9.

* W_BEG_DATE = W_START_MONTH + MARC-WEBAZ + 9.

* read all matching material records from planned orders table PLAF

SELECT GSMNG PEDTR FROM PLAF INTO CORRESPONDING FIELDS OF TABLE T_PLAF

WHERE MATNR = PRODUCTS-MATNR

AND PEDTR <> W_BEG_DATE.

*--------------------------------------

* 4.11 process any records found

*--------------------------------------

IF SY-SUBRC = 0.

LOOP AT T_PLAF.

W_DESP_DATE = T_PLAF-PEDTR - 9.

* IF date is < w_index =" 1."> despatch date.

LOOP AT FORECAST

WHERE DATE GE W_DESP_DATE.

W_INDEX = SY-TABIX.

EXIT.

ENDLOOP.

* read previous entry.

W_INDEX = W_INDEX - 1.

READ TABLE FORECAST INDEX W_INDEX.

ENDIF.

* convert to purchasing unit of measure

IF EINA-UMREZ NE 0.

T_PLAF-GSMNG = T_PLAF-GSMNG * EINA-UMREN / EINA-UMREZ.

ENDIF.

*

FORECAST-QTY = FORECAST-QTY + T_PLAF-GSMNG.

MODIFY FORECAST INDEX W_INDEX.

ENDLOOP.

ENDIF.



*--------------------------------------

* 4.12 read all matching material records from planned orders table EBAN

*--------------------------------------

SELECT MENGE LFDAT FROM EBAN INTO CORRESPONDING FIELDS OF TABLE T_EBAN

WHERE MATNR = PRODUCTS-MATNR

AND LFDAT <> W_BEG_DATE.

*--------------------------------------

* 4.13 process any records found

*--------------------------------------

IF SY-SUBRC = 0.

LOOP AT T_EBAN.

W_DESP_DATE = T_EBAN-LFDAT - 9.

* IF date is < w_index =" 1."> despatch date.

LOOP AT FORECAST

WHERE DATE GE W_DESP_DATE.

W_INDEX = SY-TABIX.

EXIT.

ENDLOOP.

* read previous entry.

W_INDEX = W_INDEX - 1.

READ TABLE FORECAST INDEX W_INDEX.

ENDIF.

* convert to purchasing unit of measure

IF EINA-UMREZ NE 0.

T_EBAN-MENGE = T_EBAN-MENGE * EINA-UMREN / EINA-UMREZ.

ENDIF.

* add to table

FORECAST-QTY = FORECAST-QTY + T_EBAN-MENGE.

MODIFY FORECAST INDEX W_INDEX.

ENDLOOP.

ENDIF.

*-----------------------------------------------------------------------

* 4.14 total all forecast buckets

*--------------------------------------

W_TOTAL = 0.

LOOP AT FORECAST.

W_TOTAL = W_TOTAL + FORECAST-QTY.

ENDLOOP.

CHECK W_TOTAL NE 0.

*--------------------------------------

* create idocs for material forecast

*--------------------------------------

W_ITEM_NUMBER = W_ITEM_NUMBER + 1.

IF W_ITEM_NUMBER > 80.

W_ITEM_NUMBER = 1.

PERFORM IDOC_CREATE.

ENDIF.

*--------------------------------------

* 4.14.3 create idoc E1EDP01

*--------------------------------------

W_E1EDP01_DATA-POSEX = W_ITEM_NUMBER.

WRITE W_TOTAL TO W_E1EDP01_DATA-MENGE DECIMALS 0.

* EDIDD-SDATA = W_E1EDP01_DATA.

T_EDIDD-SDATA = W_E1EDP01_DATA.

W_SDATA = W_E1EDP01_DATA. "????

T_EDIDD-SEGNAM = 'E1EDP01'.

APPEND T_EDIDD.

* CALL FUNCTION 'L_IDOC_SEGMENT_CREATE'

* EXPORTING

* I_SEGNAM = 'E1EDP01'

* I_SDATA = EDIDD-SDATA

* EXCEPTIONS

* OTHERS = 1.



*--------------------------------------

* 4.14.4 create idoc E1EDP20

*--------------------------------------

LOOP AT FORECAST.

IF FORECAST-QTY NE 0.

WRITE FORECAST-QTY TO W_E1EDP20_DATA-WMENG DECIMALS 0.

W_E1EDP20_DATA-AMENG = FORECAST-WEEK_MON.

W_E1EDP20_DATA-EDATU = FORECAST-DATE.

* EDIDD-SDATA = W_E1EDP20_DATA.

T_EDIDD-SDATA = W_E1EDP20_DATA.

W_SDATA = W_E1EDP20_DATA. "????

T_EDIDD-SEGNAM = 'E1EDP20'.

APPEND T_EDIDD.

* CALL FUNCTION 'L_IDOC_SEGMENT_CREATE'

* EXPORTING

* I_SEGNAM = 'E1EDP20'

* I_SDATA = EDIDD-SDATA

* EXCEPTIONS

* OTHERS = 1.

*--------------------------------------

* write record to $ delimited file

*--------------------------------------

OUTREC-MATNR = PRODUCTS-MATNR.

OUTREC-IDNLF = EINA-IDNLF.

OUTREC-WEEK_MON = FORECAST-WEEK_MON.

OUTREC-PERIOD = FORECAST-DATE.

WRITE FORECAST-QTY TO OUTREC-QTY DECIMALS 0.

TRANSFER OUTREC TO P_FILE.





ENDIF.

ENDLOOP.

* 4.14.5 End of this product

*--------------------------------------



W_E1EDP19_DATA-IDTNR = EINA-IDNLF.

* EDIDD-SDATA = W_E1EDP19_DATA.

T_EDIDD-SDATA = W_E1EDP19_DATA.

W_SDATA = W_E1EDP19_DATA. "????

T_EDIDD-SEGNAM = 'E1EDP19'.

APPEND T_EDIDD.

* CALL FUNCTION 'L_IDOC_SEGMENT_CREATE'

* EXPORTING

* I_SEGNAM = 'E1EDP19'

* I_SDATA = EDIDD-SDATA

* EXCEPTIONS

* OTHERS = 1.

ENDLOOP.

*--------------------------------------

* end of all products

*-----------------------------------------------------------------------

* REPLACE WITH MASTER_IDOC_DISTRIBUTE

* CALL FUNCTION 'L_IDOC_SEND'

* TABLES

* T_COMM_IDOC = COMM_IDOC_CONTROL

* EXCEPTIONS

* ERROR_DISTRIBUTE_IDOC = 1

* OTHERS = 2.



READ TABLE T_BDI_MODEL INDEX 1. " maximum 1 recipient

MOVE 'ORDERS' TO L_EDIDC-MESTYP.

MOVE 'ORDERS01' TO L_EDIDC-IDOCTP.

MOVE 'LS' TO L_EDIDC-RCVPRT.

* MOVE T_BDI_MODEL-RCVSYSTEM TO L_EDIDC-RCVPRN.

* partner profile parameter

MOVE P_PART TO L_EDIDC-RCVPRN.



*- Distribute the iDoc



CALL FUNCTION 'MASTER_IDOC_DISTRIBUTE' IN UPDATE TASK

EXPORTING

MASTER_IDOC_CONTROL = L_EDIDC

TABLES

COMMUNICATION_IDOC_CONTROL = COMM_IDOC_CONTROL

MASTER_IDOC_DATA = T_EDIDD

EXCEPTIONS

ERROR_IN_IDOC_CONTROL = 01

ERROR_WRITING_IDOC_STATUS = 02

ERROR_IN_IDOC_DATA = 03

SENDING_LOGICAL_SYSTEM_UNKNOWN = 04.



COMMIT WORK.



*-----------------------------------------------------------------------

END-OF-SELECTION.



CLOSE DATASET P_FILE.



*-----------------------------------------------------------------------

FORM IDOC_CREATE.

*-----------------------------------------------------------------------



* 4.2 Create idoc segment E1EDK01

W_E1EDK01_DATA-BELNR = 'EDI FORECAST'.

* EDIDD-SDATA = W_E1EDK01_DATA.

T_EDIDD-SDATA = W_E1EDK01_DATA.

W_SDATA = W_E1EDK01_DATA. "????

T_EDIDD-SEGNAM = 'E1EDK01'.

APPEND T_EDIDD.

* CALL FUNCTION 'L_IDOC_SEGMENT_CREATE'

* EXPORTING

* I_SEGNAM = 'E1EDK01'

* I_SDATA = EDIDD-SDATA

* EXCEPTIONS

* OTHERS = 1.

*--------------------------------------

* 4.3 Create idoc segments E1EDK03

*--------------------------------------

W_E1EDK03_DATA-IDDAT = '002'.

W_E1EDK03_DATA-DATUM = SY-DATUM.

* EDIDD-SDATA = W_E1EDK03_DATA.

T_EDIDD-SDATA = W_E1EDK03_DATA.

W_SDATA = W_E1EDK03_DATA. "????

T_EDIDD-SEGNAM = 'E1EDK03'.

APPEND T_EDIDD.

* CALL FUNCTION 'L_IDOC_SEGMENT_CREATE'

* EXPORTING

* I_SEGNAM = 'E1EDK03'

* I_SDATA = EDIDD-SDATA

* EXCEPTIONS

* OTHERS = 1.

*--------------------------------------

* 4.4 Create idco E1EDKA1

*--------------------------------------

W_E1EDKA1_DATA-PARVW = 'LI'.

W_E1EDKA1_DATA-PARTN = P_PART.

* EDIDD-SDATA = W_E1EDKA1_DATA.

T_EDIDD-SDATA = W_E1EDKA1_DATA.

W_SDATA = W_E1EDKA1_DATA. "????

T_EDIDD-SEGNAM = 'E1EDKA1'.

APPEND T_EDIDD.

* CALL FUNCTION 'L_IDOC_SEGMENT_CREATE'

* EXPORTING

* I_SEGNAM = 'E1EDKA1'

* I_SDATA = EDIDD-SDATA

* EXCEPTIONS

* OTHERS = 1.



ENDFORM.

Blog Archive