Escolar Documentos
Profissional Documentos
Cultura Documentos
Summary
ABAP Code Sample that uses dynamic programming techniques to build a dynamic select and internal table
for Load output conditions.
Created on: 6 March 2006
Author Bio
Venkat Lakshmikanth Tumu working as a Programmer Analyst with Intelligroup Asia Pvt Ltd.
From past 4+ years in the area of ABAP.
2006 SAP AG
code sample:
REPORT zsdb0010_output_conditions
NO STANDARD PAGE HEADING
LINE-SIZE 132
LINE-COUNT 65(0)
MESSAGE-ID zz.
TABLES: t685,
"Conditions: Types
t682i,
t682z,
dd03l.
*Work area for the inbound file for unix
DATA: BEGIN OF x_inrec,
line(1024) TYPE c,
END OF x_inrec.
fieldlen(3) TYPE n,
"Field lenght
offset(3) TYPE n,
"Field Offset
END OF it_vakey_fields.
*processing table for inbound file.
DATA: BEGIN OF x_comm,
parnr LIKE nach-parnr,
"Message partner
END OF x_comm.
2006 SAP AG
""Message partner
END OF it_data.
*populating t682z values.
DATA: it_t682z LIKE t682z OCCURS 0 WITH HEADER LINE.
*getting value of the radio button
DATA: v_access_step(2) TYPE n.
* check for the value
DATA: v_step_found TYPE c.
* Get field length
DATA: v_vakey_length TYPE i.
*get number of messages.
DATA: g_lines TYPE i,
* Message
g_msg(100).
* File name
DATA: v_filename TYPE string.
* Get the condition table
DATA: v_cond_table(4) TYPE c.
* Error for subrc checking
DATA: v_error LIKE sy-subrc.
*----------------------------------------------------------------------*
* data definition
*----------------------------------------------------------------------*
*
2006 SAP AG
Error table
"Message partner
message(100),
"Message
END OF it_error.
"Usage of the
"condition table
c_true(1) TYPE c VALUE 'X',
"Update mode
************************************************************************
*selection-screen
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK a01 WITH FRAME TITLE text-001.
PARAMETERS: p_kappl LIKE t685-kappl OBLIGATORY,
p_kschl LIKE nach-kschl OBLIGATORY,
"Condition type
"Application
"Condition table
"Partner function
"PC upload
"Unix Upload
"Communication
"Output Device
2006 SAP AG
"Print immediate
"Number of
"Messages
SELECTION-SCREEN POSITION 75.
PARAMETERS: p_delet AS CHECKBOX.
"Release after
"output
SELECTION-SCREEN COMMENT 78(20) text-s03 FOR FIELD p_delet.
SELECTION-SCREEN END OF LINE.
PARAMETERS: p_dsnam LIKE nach-dsnam,
"Spool request
"name
p_dsuf1 LIKE nach-dsuf1,
"Suffix1
"Suffix1
"Recipient
"Department on
"cover page
p_tdcov LIKE nach-tdcovtitle,
"Authorization
"Storage Mode
************************************************************************
*at selection-screen on field.
***********************************************************************
2006 SAP AG
AT SELECTION-SCREEN.
* check for the records in the database
PERFORM read_access_tables.
* Screen validations
PERFORM addl_screen_validations.
***********************************************************************
*
START-OF-SELECTION.
***********************************************************************
START-OF-SELECTION.
* Get the field name and field value.
PERFORM determine_variable_key.
* Get the fill from PC or Unix
PERFORM read_input_file.
* Upload records to the database
PERFORM upload_conditions.
************************************************************************
*
End of selection.
************************************************************************
END-OF-SELECTION.
* Error check
IF v_error <> 0.
STOP.
ENDIF.
* Get out put of the report
2006 SAP AG
PERFORM write_reoprt.
************************************************************************
*
Top-of-page.
************************************************************************
TOP-OF-PAGE.
* Standard header.
CALL FUNCTION 'Z_STEELCASE_HEADER'
* EXPORTING
* HEADING_1
* HEADING_2
.
*&---------------------------------------------------------------------*
*&
Form READ_ACCESS_TABLES
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
FORM read_access_tables .
* Get Data from t685
SELECT SINGLE * FROM t685
WHERE kvewe = c_usage
"B
"Application
"Condition type
IF sy-subrc <> 0.
MESSAGE e002 WITH 'Incorrect application or output type'(004).
ENDIF.
CLEAR v_access_step.
CLEAR v_step_found.
* Get value of kolnr
2006 SAP AG
ADD 1 TO v_access_step.
*
IF t682i-kolnr = p_kolnr.
IF t682i-kotabnr = p_kotab.
v_step_found = c_true.
EXIT.
ENDIF.
ENDSELECT.
IF sy-subrc <> 0 OR
v_step_found IS INITIAL.
MESSAGE e002 WITH 'Incorrect condition table'(005).
ENDIF.
v_cond_table+0(1) = 'B'.
v_cond_table+1(3) = t682i-kotabnr.
*
SELECT * FROM t682z
INTO TABLE it_t682z
WHERE kvewe = c_usage
AND kappl = p_kappl
AND kozgf = t685-kozgf
*
"Access number
IF sy-subrc <> 0.
MESSAGE e002 WITH 'Unable to find condition table'(006).
ENDIF.
ENDFORM.
" READ_ACCESS_TABLES
2006 SAP AG
*&---------------------------------------------------------------------*
*&
Form DETERMINE_VARIABLE_KEY
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
FORM determine_variable_key .
DATA: offset(3) TYPE n.
* Get the name of the field and the Length
CLEAR offset.
LOOP AT it_t682z INTO t682z.
SELECT SINGLE * FROM dd03l
WHERE tabname = t682z-qustr
IF sy-subrc <> 0.
EXIT.
ENDIF.
* Checking the lenght of the field and name
v_vakey_length = v_vakey_length + dd03l-intlen. "Internal Length
it_vakey_fields-fieldname = t682z-zifna.
it_vakey_fields-fieldlen = dd03l-intlen.
it_vakey_fields-offset = offset.
APPEND it_vakey_fields.
offset = offset + dd03l-intlen.
ENDLOOP.
ENDFORM.
" DETERMINE_VARIABLE_KEY
*&---------------------------------------------------------------------*
*&
Form READ_INPUT_FILE
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
2006 SAP AG
FORM read_input_file .
* From unix
IF pr_unix = 'X'.
PERFORM open_dataset.
ELSE.
* From PC
PERFORM gui_upload.
ENDIF.
ENDFORM.
" READ_INPUT_FILE
************************************************************************
*
Subroutines
************************************************************************
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
FORM bdc_dynpro USING program dynpro.
CLEAR bdcdata.
bdcdata-program = program.
bdcdata-dynpro = dynpro.
bdcdata-dynbegin = 'X'.
"Program name
"Screen number
"New Screen
APPEND bdcdata.
ENDFORM.
"BDC_DYNPRO
*----------------------------------------------------------------------*
*
Insert field
*----------------------------------------------------------------------*
FORM bdc_field USING fnam fval.
CLEAR bdcdata.
bdcdata-fnam = fnam.
"Field name
2006 SAP AG
10
bdcdata-fval = fval.
"Field Value
APPEND bdcdata.
ENDFORM.
"BDC_FIELD
*&--------------------------------------------------------------------*
*&
Form BDC_TRANSACTION
*&--------------------------------------------------------------------*
*
text
*---------------------------------------------------------------------*
*
-->TCODE
text
*---------------------------------------------------------------------*
FORM bdc_transaction USING tcode.
DATA: l_mstring(480).
REFRESH messtab.
CALL TRANSACTION tcode USING bdcdata
MODE c_n
UPDATE c_s
LOOP AT messtab.
2006 SAP AG
11
ENDIF.
ENDLOOP.
CLEAR bdcdata.
REFRESH bdcdata.
ENDFORM.
"BDC_TRANSACTION
*&---------------------------------------------------------------------*
*&
Form upload_conditions
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
FORM upload_conditions .
LOOP AT it_data.
* Checking if the Vakey is empty
CHECK NOT it_data-vakey IS INITIAL.
* Process BDC
2006 SAP AG
12
PERFORM process_bdc.
ENDLOOP.
ENDFORM.
" upload_conditions
*&---------------------------------------------------------------------*
*&
Form process_bdc
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
FORM process_bdc .
DATA: bdc_field_name(20).
DATA: vakey_fieldname(20).
DATA: vakey_fieldval(100).
DATA: field_count(3) TYPE n.
CONSTANTS: single_quote TYPE c VALUE ''''.
DATA: cond_rec_exists.
DATA: where_clause TYPE string.
DATA: kappl_temp LIKE nach-kappl.
"Application
"variable key
"variable key
LOOP AT it_vakey_fields.
*Get whear clause
CONCATENATE where_clause 'AND'
2006 SAP AG
13
INTO where_clause
SEPARATED BY space.
2006 SAP AG
14
PERFORM bdc_field
'RV130-KAPPL' p_kappl,
'RV13B-KSCHL' p_kschl.
PERFORM bdc_dynpro
PERFORM bdc_field
bdc_field_name c_true,
'BDC_OKCODE' '=WEIT'.
CLEAR field_count.
LOOP AT it_vakey_fields.
ADD 1 TO field_count.
CONCATENATE 'F' field_count '-LOW'
INTO vakey_fieldname.
vakey_fieldval =
it_data-vakey+it_vakey_fields-offset(it_vakey_fields-fieldlen).
PERFORM bdc_field
2006 SAP AG
15
ENDLOOP.
** Go to a new page
* PERFORM bdc_field
ENDIF.
IF NOT it_data-parnr IS INITIAL.
PERFORM bdc_field
ENDIF.
PERFORM bdc_field
IF cond_rec_exists IS INITIAL.
LOOP AT it_vakey_fields.
CONCATENATE 'KOMB-' it_vakey_fields-fieldname '(01)'
INTO vakey_fieldname.
vakey_fieldval =
it_data-vakey+it_vakey_fields-offset(it_vakey_fields-fieldlen).
PERFORM bdc_field
ENDLOOP.
ENDIF.
2006 SAP AG
16
PERFORM bdc_dynpro
PERFORM bdc_field
'=KOMM',
'RV130-SELKZ(01)' 'X'.
PERFORM bdc_dynpro
PERFORM bdc_field
'NACH-LDEST'
p_ldest,
'NACH-DIMME'
p_dimme,
'NACH-ANZAL'
p_anzal,
'NACH-DELET'
p_delet,
'NACH-DSNAM'
'=SICH',
p_dsnam,
'NACH-DSUF1'
p_dsuf1,
'NACH-DSUF2'
p_dsuf2,
'NACH-TDOCOVER'
p_tdoco,
'NACH-TDRECEIVER' p_tdrec,
'NACH-TDDIVISION' p_tddiv,
'NACH-TDCOVTITLE' p_tdcov,
'NACH-TDAUTORITY' p_tdaut.
USING: 'NACH-TDARMOD'
p_tdarm.
ENDIF.
ELSE.
PERFORM bdc_field
USING: 'BDC_OKCODE'
'=SICH'.
ENDIF.
* Call tranastction
PERFORM bdc_transaction USING 'NACR'.
ENDFORM.
" process_bdc
*&---------------------------------------------------------------------*
2006 SAP AG
17
*&
Form format_message
*&---------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
FORM format_message.
= messtab-msgid
lang
= sy-langu
no
= messtab-msgnr
v1
= messtab-msgv1
v2
= messtab-msgv2
v3
= messtab-msgv3
v4
= messtab-msgv4
IMPORTING
msg
= g_msg
EXCEPTIONS
not_found = 1
OTHERS
= 2.
IF sy-subrc <> 0.
g_msg = space.
ENDIF.
ENDFORM.
" format_message
*&---------------------------------------------------------------------*
*&
Form value_request_for_pc_file
*&---------------------------------------------------------------------*
* Description : Value Request Functionality for PC File
*----------------------------------------------------------------------*
2006 SAP AG
18
FORM value_request_for_pc_file.
CALL FUNCTION 'F4_FILENAME'
EXPORTING
program_name = sy-cprog
dynpro_number = sy-dynnr
field_name
=''
IMPORTING
file_name
= p_infile.
ENDFORM.
" value_request_for_pc_file
*&---------------------------------------------------------------------*
*&
Form gui_upload
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
* --> p1
text
* <-- p2
text
*----------------------------------------------------------------------*
FORM gui_upload .
v_filename = p_infile.
= v_filename
TABLES
data_tab
= it_xinrec
EXCEPTIONS
file_open_error
=1
file_read_error
=2
no_batch
=3
gui_refuse_filetransfer = 4
invalid_type
=5
2006 SAP AG
19
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
access_denied
= 12
= 13
dp_out_of_memory
disk_full
dp_timeout
OTHERS
= 14
= 15
= 16
= 17.
IF sy-subrc <> 0.
v_error = 4.
MESSAGE i002 WITH 'Cannot open input file'(007).
STOP.
ELSE.
LOOP AT it_xinrec INTO x_inrec.
IF sy-subrc <> 0.
EXIT.
ENDIF.
it_data-vakey = x_inrec+0(v_vakey_length).
x_comm = x_inrec+v_vakey_length.
it_data-parnr = x_comm-parnr.
APPEND it_data.
ENDLOOP.
ENDIF.
ENDFORM.
" gui_upload
*&---------------------------------------------------------------------*
*&
Form open_dataset
*&---------------------------------------------------------------------*
2006 SAP AG
20
text
*----------------------------------------------------------------------*
* --> p1
text
* <-- p2
text
*----------------------------------------------------------------------*
FORM open_dataset .
DO.
READ DATASET p_infile INTO x_inrec.
IF sy-subrc <> 0.
EXIT.
ENDIF.
it_data-vakey = x_inrec+0(v_vakey_length).
x_comm = x_inrec+v_vakey_length.
it_data-parnr = x_comm-parnr.
APPEND it_data.
ENDDO.
" open_dataset
*&---------------------------------------------------------------------*
*&
Form write_reoprt
*&---------------------------------------------------------------------*
*
text
2006 SAP AG
21
*----------------------------------------------------------------------*
* --> p1
text
* <-- p2
text
*----------------------------------------------------------------------*
FORM write_reoprt .
2006 SAP AG
22
ENDIF.
ENDFORM.
" write_reoprt
*&---------------------------------------------------------------------*
*&
Form addl_screen_validations
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
form addl_screen_validations .
DATA: parvw like tpar-parvw.
IF P_TDOCO IS INITIAL OR
P_TDOCO = 'X' OR
P_TDOCO = 'D'.
ELSE.
MESSAGE E002 WITH 'Invalid coverpage flag'(013).
ENDIF.
2006 SAP AG
23
endform.
" addl_screen_validations
2006 SAP AG
24