0% found this document useful (0 votes)
55 views

Function Modules

This document contains source code for reading file records, validating the file format and contents, and handling any errors. It includes: 1) Defining data types and variables for reading the file, storing records and errors. 2) Opening the file, reading each record into a structure, and appending valid records to a table. 3) Checking for errors like invalid file format or scenario values and appending error messages to a table. 4) Closing the file and appending any error records to the output log table. 5) Clearing memory after processing is complete.

Uploaded by

manika
Copyright
© © All Rights Reserved
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
55 views

Function Modules

This document contains source code for reading file records, validating the file format and contents, and handling any errors. It includes: 1) Defining data types and variables for reading the file, storing records and errors. 2) Opening the file, reading each record into a structure, and appending valid records to a table. 3) Checking for errors like invalid file format or scenario values and appending error messages to a table. 4) Closing the file and appending any error records to the output log table. 5) Clearing memory after processing is complete.

Uploaded by

manika
Copyright
© © All Rights Reserved
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 21

FM - ZXXX_READ_FILE_RECORD

Source code

TYPES : BEGIN OF types_tvarvc,


low TYPE tvarvc-low,
END OF types_tvarvc.

DATA: s_data TYPE zpts2_data, "


v_filedir TYPE char120,
v_file TYPE string,
v_msg TYPE string,
v_exit TYPE char1,
v_text TYPE string, "
v_count TYPE i,
v_count1 TYPE i, " File Header)
v_no_record TYPE char8,
v_count2 TYPE i,
v_len_name TYPE i,
v_action TYPE char6,
v_pos TYPE i,
v_dummy TYPE char4,
v_scenario TYPE char6,
v_scenario_val TYPE char9,
v_error_txt TYPE string,
v_pos1 TYPE i, "
v_plant TYPE werks_d, "
v_matkl TYPE matkl,
v_error TYPE c,
v_scenario1 TYPE char6,
v_scenario_val1 TYPE char9, "
s_error_log TYPE zpts2_data,
t_error_temp TYPE zpts2_t_data.

DATA: v_ref TYPE REF TO cx_root. DATA: v_error1 TYPE char1,


v_lines TYPE char20,

tb_data1 TYPE STANDARD TABLE OF zpts2_data,


s_data1 TYPE zpts2_data,
v_string TYPE char6,
v_string1 TYPE char20,

v_string2 TYPE char20,


v_total TYPE char20.

DATA : t_tvarvc TYPE TABLE OF types_tvarvc,


v_var TYPE xstring,
v_col_head TYPE string,
v_head_file TYPE string,
v_space TYPE string,
v_flag TYPE c.

FIELD-SYMBOLS : <fs_tvarvc> TYPE types_tvarvc.

CONSTANTS : c_pchg1 TYPE tvarvc-name VALUE 'ZXXX_CHANGE_PLNORD1',


c_pchg2 TYPE tvarvc-name VALUE 'ZXXX_CHANGE_PLNORD2',
c_pcrt1 TYPE tvarvc-name VALUE 'ZXXX_CREATE_PLNORD1',
c_pcrt2 TYPE tvarvc-name VALUE 'ZXXX_CREATE_PLNORD2',
c_pr_crt1 TYPE tvarvc-name VALUE 'ZXXX_CREATE_PREQ1',
c_pr_crt2 TYPE tvarvc-name VALUE 'ZXXX_CREATE_PREQ2',
c_cplnord TYPE char15 VALUE 'CHANGE_PLNORD',
c_crplnord TYPE char15 VALUE 'CREATE_PLNORD',
c_prplnord TYPE char15 VALUE 'CREATE_PREQ',
c_hash TYPE char1 VALUE '#'.

CONSTANTS: c_global TYPE char6 VALUE 'GLOBAL',


c_all TYPE char3 VALUE 'ALL'.

IF NOT im_file_dir IS INITIAL AND


NOT im_filename IS INITIAL.

CLEAR v_count.

v_len_name = strlen( im_filename ).


v_count2 = v_len_name - 4.

SPLIT im_filename+0(v_count2) AT c_sep1 INTO v_action v_dummy v_scenari


o v_scenario_val.

v_filedir = im_file_dir.
CONCATENATE v_filedir im_filename INTO v_file.

OPEN DATASET v_file FOR INPUT IN TEXT MODE


ENCODING UTF-8
MESSAGE v_msg.

IF sy-subrc <> 0.

s_error_log-data = v_msg. "Message

APPEND s_error_log TO t_error_temp.


CLEAR: s_error_log.

ELSE.

DO.

TRY.

READ DATASET v_file INTO s_data-data.

IF sy-subrc EQ c_0
AND s_data-data IS NOT INITIAL.

IF v_flag IS INITIAL.
v_flag = c_x.
MOVE s_data-data TO v_head_file.
IF im_filename CS c_cplnord.
SELECT low
FROM tvarvc
INTO TABLE t_tvarvc
WHERE name = c_pchg1
OR name = c_pchg2.
ELSEIF im_filename CS c_crplnord.
SELECT low
FROM tvarvc
INTO TABLE t_tvarvc
WHERE name = c_pcrt1
OR name = c_pcrt2.
ELSEIF im_filename CS c_prplnord.
SELECT low
FROM tvarvc
INTO TABLE t_tvarvc
WHERE name = c_pr_crt1
OR name = c_pr_crt2.
ENDIF.
IF t_tvarvc IS NOT INITIAL.

LOOP AT t_tvarvc ASSIGNING <fs_tvarvc>.


CONCATENATE v_col_head <fs_tvarvc>-low INTO v_col_head.
CONDENSE v_col_head NO-GAPS.
ENDLOOP.
CONDENSE v_head_file NO-GAPS.
IF v_head_file+0(1) NE v_col_head+0(1).
v_space = v_head_file+0(1).
SHIFT v_head_file BY 1 PLACES LEFT.
ENDIF.

IF sy-subrc EQ 0 AND v_head_file IS NOT INITIAL.


REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>horizo
ntal_tab IN v_head_file WITH c_space.
CONDENSE v_head_file NO-GAPS.
REPLACE ALL OCCURRENCES OF c_hash IN v_col_head WITH c_sp
ace.
CONDENSE v_col_head NO-GAPS.
IF v_head_file NE v_col_head.

s_error_log-data = text-009.
APPEND s_error_log TO t_error_temp.
CLEAR: s_error_log.
EXIT.
ENDIF.
ENDIF.
ENDIF.
ENDIF.

IF im_rr_opt = c_pur_req AND sy-index = c_1.


IF s_data-data CA '0123456789'.
v_error1 = c_x.
EXIT.
ENDIF.

ELSEIF im_rr_opt = c_pln_ord AND sy-index = c_1.


IF s_data-data CA '0123456789'.
v_error1 = c_x.
EXIT.
ENDIF.

ENDIF.

IF im_rr_opt = c_pur_req AND sy-index GT '1'.


v_count = v_count + 1.
APPEND s_data TO tb_data.
CLEAR s_data.

ELSEIF im_rr_opt = c_pln_ord AND sy-index GT '1'.


v_count = v_count + 1.
APPEND s_data TO tb_data.
CLEAR s_data.

ENDIF.

ELSE.

IF sy-subrc EQ c_0.
v_error = c_x.
ENDIF.

EXIT.

ENDIF.

CATCH cx_sy_file_authority INTO v_ref.

v_text = v_ref->get_text( ).

CATCH cx_sy_file_io INTO v_ref.

v_text = v_ref->get_text( ).

IF NOT v_text IS INITIAL.


v_exit = c_x.
EXIT.

ENDIF.

ENDTRY.
ENDDO.

CLOSE DATASET v_file.

IF im_rr_opt = c_pur_req
OR im_rr_opt = c_pln_ord.

tb_data1[] = tb_data[].
DESCRIBE TABLE tb_data1 LINES v_lines.

READ TABLE tb_data1 INTO s_data1 INDEX v_lines.


IF sy-subrc = 0.

CONDENSE v_lines NO-GAPS.

SPLIT s_data1-data AT c_tab INTO v_string1 v_string2.

v_total = v_lines - 1.
CONDENSE v_total NO-GAPS.
CONDENSE v_string1 NO-GAPS.
IF v_total <> v_string1.
v_error_txt = 'Record count mismatch'(010).
s_error_log-data = v_error_txt.

APPEND s_error_log TO t_error_temp.


CLEAR: v_error_txt,
s_error_log.

REFRESH: tb_data[].

ENDIF.

ENDIF.

IF v_error1 IS NOT INITIAL.

v_error_txt = 'Incorrect File Format'(009).

s_error_log-data = v_error_txt.

APPEND s_error_log TO t_error_temp.


CLEAR: v_error_txt,
s_error_log.

REFRESH: tb_data[].
ELSE.
IF ( v_scenario <> c_plant AND v_scenario <> c_matgp AND v_scenario
<> c_global ).

s_error_log-data = text-008.
APPEND s_error_log TO t_error_temp.
CLEAR: s_error_log.

REFRESH: tb_data[].

ELSEIF ( v_scenario EQ c_global AND v_scenario_val <> c_all )


s_error_log-data = text-008.
APPEND s_error_log TO t_error_temp.
CLEAR: s_error_log.

REFRESH: tb_data[].

ENDIF.
IF v_scenario = c_matgp.

SELECT SINGLE matkl


FROM t023 INTO v_matkl
WHERE matkl = v_scenario_val.

IF sy-subrc NE c_0.

s_error_log-data = text-008.

APPEND s_error_log TO t_error_temp.


CLEAR: s_error_log.

REFRESH: tb_data[].

ENDIF.
ENDIF.
ENDIF.

ENDIF.

ENDIF

IF v_exit = c_x.

s_error_log-data = v_text.

APPEND s_error_log TO t_error_temp.


CLEAR: s_error_log.

ENDIF.
ENDIF.

IF NOT t_error_temp[] IS INITIAL.

APPEND LINES OF t_error_temp TO tb_error_log.

ENDIF.

CLEAR: s_data,
v_filedir,
v_file,
v_msg,
v_exit,
v_text,
v_count,
v_count1,
v_no_record,
v_count2,
v_len_name,
v_action,
v_dummy,
v_scenario,
v_scenario_val,
v_error_txt,
v_pos1,
v_plant,
v_matkl,
v_error, "
v_scenario1, "
v_scenario_val1, "
s_error_log.

REFRESH: t_error_temp.

ENDFUNCTION.
FM - ZXXX_DELETE_PR_RECORD

Code

DATA: v_preq_no TYPE banfn,


s_delete_preq TYPE zpts2_eban,
s_item_delete TYPE zpts2_item_delete,
s_return TYPE zpts2_return,
s_error_log TYPE zpts2_data,
t_delete_preq TYPE zpts2_t_eban,
t_item_delete TYPE zpts2_t_item_delete,
t_return TYPE zpts2_t_return.

t_delete_preq[] = tb_delete_preq[].

LOOP AT t_delete_preq INTO s_delete_preq.

v_preq_no = s_delete_preq-banfn.

s_item_delete-preq_item = s_delete_preq-bnfpo.
s_item_delete-delete_ind = c_x.

APPEND s_item_delete TO t_item_delete.

CALL FUNCTION 'BAPI_REQUISITION_DELETE'


EXPORTING
number = v_preq_no
TABLES
requisition_items_to_delete = t_item_delete
return = t_return.

CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.

IF NOT t_return[] IS INITIAL.

LOOP AT t_return INTO s_return.

IF s_return-type = c_e. "Message Type -> Error


CONCATENATE s_return-message v_preq_no
INTO s_error_log-data SEPARATED BY c_space.

APPEND s_error_log TO tb_error_log.

ENDIF.
ENDLOOP.
ENDIF.

CLEAR: v_preq_no,
s_error_log,
s_delete_preq,
s_item_delete,
s_return,
t_item_delete[],
t_return[].

ENDLOOP.

FM - ZXXX_VALIDATION_PR_LOAD

Code

DATA: v_name TYPE rvari_vnam,


v_name1 TYPE rvari_vnam,
v_name2 TYPE rvari_vnam,
v_error_txt TYPE string,
s_record TYPE zpts2_data,
s_error_log TYPE zpts2_data,
t_error_log TYPE zpts2_t_data,
t_var_value TYPE zpts2_t_rr_var,
t_create_preq TYPE zpts2_t_create_preq.

IF NOT tb_create_preq[] IS INITIAL .

t_create_preq[] = tb_create_preq[].
t_var_value[] = tb_var_value[].

SORT t_create_preq BY material


rec_plant
sup_plant.

v_name = c_mmsta.
v_name1 = c_dismm.
v_name2 = c_beskz.

PERFORM check_data_create USING v_name


v_name1
v_name2
t_var_value
CHANGING t_create_preq
t_error_log.

IF NOT t_create_preq[] IS INITIAL.

tb_create_preq[] = t_create_preq[].
ELSE.

REFRESH: tb_create_preq[].

ENDIF.

IF NOT t_error_log[] IS INITIAL.

APPEND LINES OF t_error_log TO tb_error_log.

ENDIF.
ENDIF.

CLEAR: v_name,
v_name1,
v_name2,
v_error_txt,
s_record,
s_error_log.

REFRESH: t_error_log[],
t_var_value[],
t_create_preq[].

FM - ZXXX_LOAD_PR_RECORD
Source code:

DATA: v_preq_no TYPE banfn,


s_create_preq TYPE zpts2_create_preq,
s_req_item TYPE zpts2_req_item,
s_return TYPE zpts2_return,
s_error_log TYPE zpts2_data,
t_create_preq TYPE zpts2_t_create_preq,
t_req_item TYPE zpts2_t_req_item,
t_return TYPE zpts2_t_return.

DATA: v_int TYPE c,


v_revlv TYPE revlv.

DATA : s_pr_head TYPE bapimereqheader,


s_pr_headx TYPE bapimereqheaderx,
s_pr_item TYPE bapimereqitemimp,
s_pr_itemx TYPE bapimereqitemx,
s_pr_outpt TYPE bapimereqheader,
t_pr_item TYPE TABLE OF bapimereqitemimp,
t_pr_itemx TYPE TABLE OF bapimereqitemx,
t_retrn TYPE TABLE OF bapiret2.
FIELD-SYMBOLS : <fs_retrn> TYPE bapiret2.

DATA: v_check TYPE c.


CONSTANTS: c_x TYPE c VALUE 'X',
c_memory TYPE char7 VALUE 'ZINT311'.

t_create_preq[] = tb_create_preq[].

LOOP AT t_create_preq INTO s_create_preq.

CLEAR : t_retrn,
t_pr_item,
t_pr_itemx,
s_pr_head,
s_pr_headx,
s_pr_outpt.

s_pr_head-pr_type = c_nb.
s_pr_headx-pr_type = c_x.

s_pr_item-material = s_create_preq-material. "Material Number


s_pr_item-plant = s_create_preq-rec_plant. "Plant
s_pr_item-store_loc = s_create_preq-loc. "Storage location
s_pr_item-suppl_plnt = s_create_preq-
sup_plant. "Supplying (issuing) plant
s_pr_item-quantity = s_create_preq-
quantity. "Purchase requisition quantity
s_pr_item-unit = s_create_preq-
uom. "Purchase requisition unit of measure
s_pr_item-deliv_date = s_create_preq-req_date. "Item delivery date
s_pr_item-preq_name = sy-uname. "User Name
s_pr_item-gr_ind = c_x.
APPEND s_pr_item TO t_pr_item.

s_pr_itemx-material = c_x.
s_pr_itemx-plant = c_x.
s_pr_itemx-store_loc = c_x.
s_pr_itemx-suppl_plnt = c_x.
s_pr_itemx-quantity = c_x.
s_pr_itemx-unit = c_x.
s_pr_itemx-deliv_date = c_x.
s_pr_itemx-preq_name = c_x.
s_pr_itemx-gr_ind = c_x.
APPEND s_pr_itemx TO t_pr_itemx.

CLEAR: v_check.
v_check = c_x.
FREE MEMORY ID c_memory.

EXPORT v_check FROM v_check TO MEMORY ID c_memory.

CALL FUNCTION 'BAPI_PR_CREATE'


EXPORTING
prheader = s_pr_head
prheaderx = s_pr_headx
IMPORTING
number = s_pr_outpt-preq_no
prheaderexp = s_pr_outpt
TABLES
return = t_retrn
pritem = t_pr_item
pritemx = t_pr_itemx.
IF sy-subrc EQ 0 AND s_pr_outpt-preq_no IS NOT INITIAL.

CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.

IF NOT t_retrn[] IS INITIAL.


LOOP AT t_retrn ASSIGNING <fs_retrn>.
IF <fs_retrn>-type = c_e.
s_error_log-data = <fs_retrn>-message.
APPEND s_error_log TO tb_error_log.
ENDIF.
ENDLOOP.

ENDIF.

ENDIF.

FREE MEMORY ID c_memory.


CLEAR: v_preq_no,
s_error_log,
s_create_preq,
s_req_item,
s_return,
t_return[],
t_req_item[].

ENDLOOP.

FM - Z_PTS_GET_VARIANT_TVARVC

Code :

IF NOT im_name IS INITIAL.

SELECT name
type
numb
sign
opti
low
high

FROM tvarvc
INTO TABLE tb_variant_values
WHERE name IN im_name
AND type = c_s.

IF sy-subrc = 0.

SORT tb_variant_values BY name


numb
low.

ENDIF.
ENDIF.

FM - ZXXX_MOVE_FILES
Code

DATA : v_params TYPE btcxpgpar,

CONSTANTS : c_cmd_value TYPE sxpglogcmd VALUE 'ZSSPMOVE'.

CONCATENATE src_file_path orig_file_name INTO v_src_file_path.


CONDENSE v_src_file_path.

CONCATENATE dest_file_path copy_file_name INTO v_dest_file_path.


CONDENSE v_dest_file_path.

CONCATENATE v_src_file_path v_dest_file_path INTO v_params SEPARATED BY spa


ce.

CALL FUNCTION 'SXPG_COMMAND_EXECUTE'


EXPORTING
commandname = c_cmd_value
additional_parameters = v_params
TABLES
exec_protocol = err_message
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.

ENDIF.

FM- ZXXX_WRITE_ERROR_LOG
Code:

DATA: s_error_data TYPE zpts2_data, "Work area for file data


s_logtab TYPE zpts2_data, "Error log during processing
v_filedir TYPE char120, "File path
v_file TYPE string, "File path + file name
v_msg TYPE string, "Message during accessing a file
v_exit TYPE char1, "Flag variable
v_text TYPE string. "Messages for exceptions

DATA: v_ref TYPE REF TO cx_root.

IF NOT tb_error_data[] IS INITIAL AND


NOT im_file_dir IS INITIAL AND
NOT im_filename IS INITIAL.

v_filedir = im_file_dir.

CONCATENATE v_filedir im_filename INTO v_file.

OPEN DATASET v_file FOR OUTPUT IN TEXT MODE


ENCODING UTF-8
MESSAGE v_msg.

IF sy-subrc <> 0.

CONCATENATE v_msg im_filename INTO s_logtab-data


SEPARATED BY c_tab.

ELSE.

LOOP AT tb_error_data INTO s_error_data.

TRY.
TRANSFER s_error_data-data TO v_file.

CATCH cx_sy_file_authority INTO v_ref.

v_text = v_ref->get_text( ).

CATCH cx_sy_file_io INTO v_ref.

v_text = v_ref->get_text( ).

IF NOT v_text IS INITIAL.


v_exit = c_x.
EXIT.
ENDIF.

ENDTRY.

CLEAR s_error_data.

ENDLOOP.

CLOSE DATASET v_file.

IF v_exit = c_x.
CONCATENATE v_text im_filename INTO s_logtab-data
SEPARATED BY c_tab.
ENDIF.

ENDIF.
ENDIF.

CLEAR: s_error_data,
s_logtab,
v_filedir,
v_file,
v_msg,
v_exit,
v_text.

FM- ZXXX_MAIL_TO_DIST_LIST
DATA: t_mailid TYPE zpts2_t_mailid,
t_receiver TYPE STANDARD TABLE OF somlreci1,
t_content TYPE STANDARD TABLE OF solisti1,
t_packlst TYPE STANDARD TABLE OF sopcklsti1,
t_objhead TYPE STANDARD TABLE OF solisti1,
s_mailid TYPE zpts2_mailid,
s_receiver TYPE somlreci1,
s_content TYPE solisti1,
s_packlst TYPE sopcklsti1,
s_objhead TYPE solisti1,
s_docdata TYPE sodocchgi1.

DATA: v_email TYPE so_recname,


v_line TYPE char255,
v_des TYPE char50,
v_lines_txt TYPE i.

CONSTANTS: c_name TYPE rvari_vnam VALUE 'ZPTS_RR_INBOUND',


c_raw TYPE char3 VALUE 'RAW',
c_255 TYPE char3 VALUE '255',
c_s TYPE char1 VALUE 'S',
c_o TYPE char1 VALUE 'O',
c_1 TYPE char1 VALUE '1',
c_0 TYPE char1 VALUE '0',
c_x TYPE char1 VALUE 'X',
c_u TYPE char1 VALUE 'U'.

IF NOT im_file_dir IS INITIAL AND


NOT im_filename IS INITIAL.

SELECT low

FROM tvarvc INTO TABLE t_mailid


WHERE name = c_name
AND type = c_s.

IF sy-subrc EQ c_0.

LOOP AT t_mailid INTO s_mailid.

v_email = s_mailid-val.
s_receiver-receiver = v_email.
s_receiver-rec_type = c_u.

APPEND s_receiver TO t_receiver.


CLEAR: v_email,
s_mailid,
s_receiver.

ENDLOOP.
REFRESH: t_content.

CLEAR: v_line,
s_content.
CONCATENATE text-006 im_file_dir INTO v_line SEPARATED BY space.
s_content-line = v_line.
APPEND s_content TO t_content.

IF NOT t_content IS INITIAL.

DESCRIBE TABLE t_content LINES v_lines_txt.


READ TABLE t_content INTO s_content INDEX v_lines_txt.

CONCATENATE text-007 im_filename INTO v_des SEPARATED BY space.

s_docdata-obj_descr = v_des.
s_docdata-
sensitivty = c_o. " 'O' : Standard, normal sensitivity
s_docdata-doc_size = ( v_lines_txt -
c_1 ) * c_255 + STRLEN( s_content ).

CLEAR s_packlst-transf_bin.
s_packlst-head_start = c_1.
s_packlst-head_num = c_0.
s_packlst-body_start = c_1.
s_packlst-body_num = v_lines_txt.
s_packlst-doc_type = c_raw.
APPEND s_packlst TO t_packlst.
CLEAR s_packlst.

s_objhead-line = text-007.
APPEND s_objhead TO t_objhead.
CLEAR s_objhead.

CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'


EXPORTING
document_data = s_docdata
put_in_outbox = c_x
commit_work = c_x
TABLES
packing_list = t_packlst
object_header = t_objhead
contents_txt = t_content
receivers = t_receiver
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.

ENDIF.
ENDIF.
ENDIF.

CLEAR: s_mailid,
s_receiver,
s_content,
s_packlst,
s_objhead,
s_docdata,
v_email,
v_line,
v_des,
v_lines_txt.

REFRESH: t_mailid,
t_receiver,
t_content,
t_packlst,
t_objhead.

You might also like