ABAP Program Tips v3
ABAP Program Tips v3
K. Wilson
http://www.sapgenie.com/abap
Table of Contents
3.3.4 REPORT HEADINGS ................................. 19
CHAPTER 1 USEFUL TRANSACTIONS 3 3.3.5 POPUP SELECTION GET FILENAME ........ 20
3.3.6 CHECKBOXES IN REPORTS ....................... 20
1.1 EDI SPECIFIC TRANSACTIONS---------------3 3.3.7 LIST BOXES ON SELECTION SCREENS ...... 20
1.1.1 SCHEDULING AGREEMENTS ....................... 3 3.3.8 AT LINE SELECTION ................................. 21
3.3.9 TABSTRIPS ON A SELECTION SCREEN ....... 21
1.2 MESSAGE CONTROL ----------------------------3 3.3.10 DYNAMIC SELECTION SCREENS ................ 22
1.2.1 DELIVERY ................................................. 3
1.2.2 INVOICE .................................................... 3 3.4 FILE PROCESSING ----------------------------- 23
1.2.3 ORDER RESPONSE .................................... 3 3.4.1 DOWNLOADING TO EXCEL ....................... 23
3.4.2 FTP A FILE TO ANOTHER SERVER ............. 24
1.3 IDOC ADMINISTRATION-------------------------3 3.4.3 DATASET ............................................. 25
1.4 IDOC DEVELOPMENT----------------------------4 3.4.4 WS_DOWNLOAD................................. 26
3.4.5 GUI_DOWNLOAD WITH POPUP FILENAME
1.5 REQUIREMENTS CODING ----------------------4 REQUEST 27
1.6 SALES-------------------------------------------------4 3.5 MACROS ------------------------------------------- 28
1.7 GENERAL --------------------------------------------4 3.6 SELECT STATEMENTS ----------------------- 29
1.7.1 COMMON TABLES ...................................... 5 3.6.1 JOINS ..................................................... 29
CHAPTER 2 USEFUL PROGRAMS 7 3.7 SAPSCRIPT --------------------------------------- 30
3.7.1 CHANGING THE SUBJECT FOR EMAIL ORDER
2.1 FUNCTION MODULES ---------------------------7 CONFIRMATIONS .................................................... 30
2.1.1 USEREXIT_KOMKBV1_FILL. ................ 7 3.8 GENERAL------------------------------------------ 30
2.1.2 MASTER_IDOC_DISTRIBUTE .............. 7 3.8.1 RETRIEVING THE EMAIL ADDRESS OF AN SAP
2.1.3 IDOC_STATUS_WRITE_TO_DATABASE USER 30
7 3.8.2 EXECUTING A PROGRAM .......................... 31
2.1.4 IDOC_TYPE_COMPLETE_READ ......... 7 3.8.3 CHANGING \ CREATING REQUIREMENTS ... 31
2.2 PROGRAMS --------------------------------------- 11 3.8.4 DISPLAYING TRANSACTION ...................... 31
2.2.1 RHSOBJCH FIXES PD CONTROL TABLES 3.8.5 GUI-STATUS .......................................... 31
MISSING IN TX SWU3............................................. 11 3.8.6 DOCUMENT FLOW ................................... 32
2.2.2 RV80HGEN .......................................... 11 3.8.7 MAINTAINING TRAILING SPACES WHEN
2.2.3 SCHEDULING OF SYSTEM MAINTENANCE JOBS .... 12 DOWNLOADING TO PC ........................................... 32
3.8.8 HIDING ABAP SOURCE CODE ................. 32
2.3 INCLUDES ----------------------------------------- 12 3.8.9 WHERE IN IMG IS A TABLE CONFIGURED .. 32
2.3.1 MBDCONWF IDOC DEFINITIONS ......... 12 3.8.10 EDITOR TIPS (*EJECT AND *$*$) ............ 32
2.4 FIELDS ---------------------------------------------- 12 3.8.11 LIST OF WAYS TO TRANSPORT VARIANTS .. 33
3.8.12 CHECKING FOR BACKGROUND PROCESSING33
CHAPTER 3 GENERAL PROGRAMMING 14
CHAPTER 4 WORKFLOW PROGRAMS 34
3.1 BAPIS ----------------------------------------------- 14
4.1 VIEWING PARTICULAR USERS INBOX-- 34
3.2 DIALOG PROGRAMMING --------------------- 14
3.2.1 PROCESS ON VALUE REQUEST F4 ......... 14 CHAPTER 5 ALV GRID CONTROL 36
3.3 REPORTS ------------------------------------------ 15
3.3.1 REFRESHING DATA ON REPORTS ............. 15 5.1 TOP-OF-PAGE --------------------------------- 36
3.3.2 TREE REPORTS ...................................... 16
3.3.3 INITIALIZING DATE RANGES ON SELECTION- CHAPTER 6 OBJECT PROGRAMMING 38
OPTIONS 19
1.2.1 Delivery
V/36 Maintain output determination for deliveries (Output determination procedures)
V10000 (Header output) has condition type LAVA (usually with requirement 1
NB: Use V/84 V7ALLE SHAD for grouped ASNs. I.e. Group deliveries into shipments
VV21 Create output condition records for shipping.
LAVA WE (Partner function) - We must add each new partner with VV21
VL71 Reissue output for deliveries
1.2.2 Invoice
V/54 Maintain access sequence for billing documents
VV31 Create condition records for billing documents. (RD00 RE Billing party)
VF31 Reissue output for billing documents
1.6 SALES
VA05 List of sales orders
VA02 Sales order change
VA32 Scheduling agreement change
VA42 Contract change
VA22 Quotation change
VF02 Change billing document
VL02N Change delivery document
VF11 Cancel Billing document
VF04 Billing due list
VL04 Delivery due list
VKM3, VKM4 List of sales documents
VKM1 List of blocked SD documents
VKM5 List of deliveries
VL06G List of outbound deliveries for goods issue
VL06P List of outbound deliveries for picking
VL09 Cancel goods issue
VT02N Change shipment
VT70 Output for shipments
1.7 GENERAL
The following section provides detail on other useful SAP areas.
VL04 Delivery due list. Run the delivery due with your order number to create the delivery.
LT03 Create Transfer Order. EG. Warehouse: 101 and enter. Picking background. Save
VL02N Delivery change.
MD04 Material Requirements. Shows material requirements and releases against materials.
SE38 ABAP Editor. Used to modify ABAP programs.
SM01 Transaction list. Lock transactions in the system. Also a good tool to see what transactions are
available.
ABAP Programming Tips Page 4 of 157
SHDB Transaction recorder (BDC).
CMOD User exit \ project tool. Coordinates your changes into projects for the purpose of activating all user
exits for a particular project. A user exit needs to be modified before it will work.
SE16 Table contents display
search_sap_menu Displays path to a transaction
VBAP
Line item LIPS VBRP
VBELN - SO
PSONR - Line Line item Line item
VBELN - Delivery VBELN - Invoice
PSONR - Line POSNR - Line
VBEP AUBEL/AUPOS - SO/line
VGBEL/VGBEL - Delivery/line
Schedule lines
M_VMVAA
PO -> SO View table
1.7.1.1 Basis
TSTCT Transaction list
1.7.1.3 Invoicing
VBRL Invoice list
VBRK Header data
VBRP Item data
1.7.1.4 Accounting
BKPF Header
BSEG Line item
2.1.1 USEREXIT_KOMKBV1_FILL.
User exit to update communication structure at header level. In function module KOMKBV1_FILL called from SAPMV45A.
2.1.2 MASTER_IDOC_DISTRIBUTE
2.1.3 IDOC_STATUS_WRITE_TO_DATABASE
2.1.4 IDOC_TYPE_COMPLETE_READ
Reads full IDoc structure and field documentation. Offsets, types, etc..
ABAP_DOCU_DOWNLOAD - Download ABAP documentation in HTML format.
ARFC_GET_TID - will return the IP address of the terminal in hex.
BAL_* - All function modules used for SAP's application logging can be found here.
BP_EVENT_RAISE - Trigger an event from ABAP/4 program
BP_JOBLOG_READ - Fetch job log executions
CLOI_PUT_SIGN_IN_FRONT - Place the negative sign after a number. SAP default is place the negative sign after the
number.
CLPB_EXPORT - Export a text table to the clipboard (on presentation server)
CLPB_IMPORT - Import a Text Table from the Clipboard (on presentation server)
COMMIT_TEXT - To load long text into SAP
CONVERSION_EXIT_ALPHA_INPUT - converts any number into a string fill with zeroes-right
example:
input = 123
output = 0000000000000...000000000000123
RPR_ABAP_SOURCE_SCAN - Search ABAP code for a string. Has many more options for selecting the
ABAPs to search than RSRSCAN1 or RKCTSEAR.
RSBDCDRU - Prints the contents of a Batch Input session. No options for error transactions only.
RSBDCOS0 - Execute UNIX commands. Looks similar to the old SAPMSOS0 program that disappeared in 3.0
RSWBO060 - put objects into a request and transport it to any other system
RPUAUD00 - HR Report to list all logged changes for an employee. Uses the PCL4 Audit Cluster.
RPUAUDDL - HR Report to delete audit data from the PCL4 Audit Cluster.
RPDTRA00 - List all HR transactions.
RHGRENZ0 - Delimit IT1000 and related 1001s. Program will delete any 1001 infotypes whose start date is
after the delimit date.
RHGRENZ2 - Delimit IT1001 only.
RHGRENZ1 - Extend the end date on delimited records. Very useful when you delimit a bunch of records
incorrectly, and need to change the end date.
Notes on HRGRENZ0/HRBRENZ2: RHGRENZ0/2 will abend if there are any inconsistencies between PD and PA (i.e.
people in a different controlling area than the position they belong to).
Controlling area of a person is determined by the cost centre that a person's position is assigned to. When assigning a
person to a position, SAP checks to make sure that the Controlling area of the company that the person belongs to is the
same as that of the Cost centre that their position belongs to.
RKCTSEAR - Search source code for up to two strings. Also see RSRSCAN1 and
RPR_ABAP_SOURCE_SCAN.
RPUP1D00/10 - View/Delete data from PCL1 Cluster
RPUP2D00/10 - View/Delete data from PCL2 Cluster
RPUP3D00/10 - View/Delete data from PCL3 Cluster
RPUP4D00/10 - View/Delete data from PCL4 Cluster
RSTXSCRP Save a SAPScript layout set to disk, and load it back into SAP.
RPUDELPN Delete all info for an employee number, including cluster data and infotypes.
RSABAPIV Mass print/display of ABAP/4 help text
RSBDCSUB Release batch-input sessions automatically
RSBDCBTC - Submit a BDC job with an internal batch number and wait for the end of the batch-input session.
2.3 INCLUDES
2.4 FIELDS
Field Description
SPART Division
VTWEG Distribution Channel
VKORG Sales Organization
VKGRP Sales Group
AUART Order Type
VKBUR Sales Office
EKORG Purchasing Organization
WERKS Plant
BUKRS Company Code
VBAK-VBELN Order Number
LIKP-VBELN Delivery Number
t_dynumb = sy-dynnr.
t_dyname = sy-repid.
LOOP AT itab_dynpfields.
CASE itab_dynpfields-fieldname.
WHEN 'ZSOURCE-SOURCE_DESC'.
itab_dynpfields-fieldvalue = zsource-source_desc.
MODIFY itab_dynpfields.
ENDCASE.
ENDLOOP.
3.3 REPORTS
LO_REPID = SY-REPID.
CALL FUNCTION
'RS_REFRESH_FROM_SELECTOPTIONS'
EXPORTING
CURR_REPORT = LO_REPID
TABLES
SELECTION_TABLE = LO_SELTAB
ABAP Programming Tips Page 15 of 157
EXCEPTIONS
NOT_FOUND = 1
NO_REPORT = 2
OTHERS = 3
.
IF SY-SUBRC <> 0.
MESSAGE ID
SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
SUBMIT (SY-REPID)
WITH SELECTION-TABLE LO_SELTAB.
STEP TWO ADD THESE LINES OF CODE TO POPULATE THE INTERNAL TABLE
**** POPULATE DATA
REFRESH parent_stack. current = 0.
parent_stack = 0. APPEND parent_stack.
LOOP AT itab_data.
CASE itab_data-qualf.
WHEN 1. New parent
current = current + 1.
PERFORM read_from_parent_stack CHANGING t_parent.
parent_stack = current. APPEND parent_stack.
PERFORM append_item USING current
t_parent
itab_xml_data.
WHEN 2. End of current leg
current = current + 1.
PERFORM append_item USING current
t_parent
itab_xml_data.
perform delete_parent_stack.
WHEN 3. Same level
current = current + 1.
PERFORM read_from_parent_stack CHANGING t_parent.
PERFORM append_item USING current
t_parent
itab_xml_data.
ENDCASE.
ENDLOOP.
STEP FOUR ADD THESE LINES OF CODE TO EXPAND \ COLLAPSE THE TREE
* at line-selection - when the node is opened/closed or item double-clk
AT LINE-SELECTION.
READ TABLE items WITH KEY parent_id = items_show-id. "see 'hide'
* form read_from_stack
FORM read_from_stack CHANGING tabix LIKE sy-tabix.
DESCRIBE TABLE tabix_stack.
CHECK sy-tfill NE 0.
READ TABLE tabix_stack INDEX sy-tfill.
tabix = tabix_stack.
DELETE tabix_stack INDEX sy-tfill.
ENDFORM.
* form expand_collapse
FORM expand_collapse USING value(v_id).
DATA: v_no_more_orphans,
items_temp LIKE items OCCURS 100 WITH HEADER LINE.
DELETE items_show WHERE parent_id = v_id. "try to collapse
IF sy-subrc = 0. "succesfull first collapse
DO. "cascade collapse - delete 'orphans' that are left
REFRESH items_temp.
MOVE items_show[] TO items_temp[].
SORT items_temp BY id.
v_no_more_orphans = 'X'.
LOOP AT items_show WHERE parent_id NE ''.
READ TABLE items_temp WITH KEY id = items_show-parent_id
BINARY SEARCH TRANSPORTING NO FIELDS.
IF sy-subrc NE 0. "no parent - it's an orphan
CLEAR v_no_more_orphans.
ABAP Programming Tips Page 18 of 157
DELETE items_show.
ENDIF.
ENDLOOP.
IF v_no_more_orphans = 'X'. EXIT. ENDIF.
ENDDO.
items_show-symbol = '+'.
MODIFY items_show TRANSPORTING symbol WHERE id = v_id.
ELSE. "unsuccessfull collapse - expand
items_show-symbol = '-'.
MODIFY items_show TRANSPORTING symbol WHERE id = v_id.
LOOP AT items WHERE parent_id = v_id. "show children
APPEND items TO items_show.
ENDLOOP.
LOOP AT items_show WHERE parent_id = v_id. "check grandchildren
READ TABLE items WITH KEY parent_id = items_show-id.
IF sy-subrc = 0.
items_show-symbol = '+'.
ELSE.
items_show-symbol = ''.
ENDIF.
MODIFY items_show.
ENDLOOP.
ENDIF.
ENDFORM.
* form read_from_parent_stack
FORM read_from_parent_stack CHANGING tabix LIKE sy-tabix.
DESCRIBE TABLE parent_stack.
CHECK sy-tfill NE 0.
READ TABLE parent_stack INDEX sy-tfill.
tabix = parent_stack.
* DELETE tabix_stack INDEX sy-tfill.
ENDFORM.
* Initialization *
*----------------------------------------------------------------------*
initialization.
* Default dates to dsel screen
move 'I' to s_docdat-sign.
move 'BT' to s_docdat-option.
move sy-datum to s_docdat-high.
subtract 7 from sy-datum.
move sy-datum to s_docdat-low.
append s_docdat.
form top.
uline.
write: / sy-vline no-gap,
(79) text-001 color col_heading intensified,
80 sy-vline,
/ sy-vline no-gap,
(79) text-002 color col_heading intensified off,
80 sy-vline,
/ sy-vline no-gap,
(79) text-003 color col_heading intensified off,
80 sy-vline.
ABAP Programming Tips Page 19 of 157
uline.
endform.
CLEAR fields.
fields-tabname = 'RLGRAP'.
fields-fieldname = 'FILENAME'.
fields-value = 'C:\TEST.XLS'.
fields-field_attr = '00'.
APPEND fields.
form write_report.
select * from .
write: / pick as checkbox,
hide: .
endselect.
counter = sy-dbcnt + 7. Cater for header lines
endform. " WRITE_REPORT
start-of-selection.
set pf-status 'STD'.
perform write_report.
*---------------------------------------------------------------------*
* selection screen *
*---------------------------------------------------------------------*
* Define screen 101 as subscreen
SELECTION-SCREEN BEGIN OF SCREEN 101 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-t00.
SELECT-OPTIONS matnr FOR mara-matnr.
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN END OF SCREEN 101.
INITIALIZATION.
START-OF-SELECTION.
MC_PASSWORD = 'password'.
CHECK SY-SUBRC = 0.
IF SY-SUBRC = 0.
LOOP AT MTAB_DATA.
WRITE: / MTAB_DATA.
ENDLOOP.
ELSE.
* do some error checking.
ENDIF.
CALL FUNCTION 'FTP_DISCONNECT'
EXPORTING
HANDLE = MI_HANDLE
EXCEPTIONS
OTHERS = 1.
%&%& TEXPZKBTST32
R FTP from SAP {{{
%&%& HEADZKBTST32
00000 00000000000000 0000000000000000000000 0
%&%& DOKLZKBTST32
3.4.3 DATASET
3.4.3.1 Example 1
*&---------------------------------------------------------------------*
*& Form SENDTO_UNIX
*&---------------------------------------------------------------------*
FORM SENDTO_UNIX.
IF SY-SUBRC NE 0.
* File could not be opened for writing
WRITE: / TEXT-006.
LI_WRITE_ERROR = 1.
EXIT.
ENDIF.
LOOP AT IT_PAYR.
TRANSFER IT_PAYR TO Z_FILE_NAME.
ENDLOOP.
* close dataset
CLOSE DATASET Z_FILE_NAME.
3.4.3.2 Example 2
OPEN DATASET OUTFILE FOR OUTPUT IN TEXT MODE.
* if the timestamped file cannot be created, do not process the
* input file, because the input file is deleted after processing,
* and there would be no record of the data.
if not sy-subrc is initial.
*'ERROR opening file & for output'
close dataset infile.
message i033 with outfile.
continue. "process next vendor's file
endif.
do.
read dataset infile into izss7b20.
case sy-subrc.
when 0.
transfer izss7b20 to outfile.
if izss7b20-datacode = 'T'. "trailer rec
perform process_one_vendor using infile.
exit. "process next vendor's file
endif.
check izss7b20-datacode = 'D'. "data rec
move-corresponding uty_vendors to ie020.
move-corresponding izss7b20 to ie020.
when 4. "EOF
perform process_one_vendor using infile.
exit. "process next vendor's file
when others.
*ERROR reading dataset & on &
message w015 with infile sy-datum.
exit. "discontinue file reads
endcase.
enddo.
close dataset: infile, outfile.
delete dataset infile.
3.4.4 WS_DOWNLOAD
*** Internal table to be downloaded
data: begin of z_sales occurs 10000,
kunnr like kna1-kunnr, "Customer number
name1 like kna1-name1, "Name
end of z_sales.
data: begin of t_colnames occurs 10,
name(15), "Column names for download
end of t_colnames.
*----------------------------------------------------------------------*
* Selection Screen processing *
*----------------------------------------------------------------------*
at selection-screen on p_file.
* If download is checked, but no file name is entered, error
if p_down eq 'X' and p_file eq space.
message e000 with
'Please enter file name for download.'.
endif.
* Data
move vbak-kunnr to zsales-kunnr.
move kna1-name1 to zsales-name1.
append zsales.
CLEAR fields.
fields-tabname = 'RLGRAP'.
fields-fieldname = 'FILENAME'.
fields-value = p_file.
fields-field_attr = '00'.
APPEND fields.
filestring = fields-value.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
filename = filestring
write_field_separator = ','
TABLES
data_tab = itab_data
EXCEPTIONS
file_write_error = 1
no_batch = 2
gui_refuse_filetransfer = 3
invalid_type = 4
no_authority = 5
unknown_error = 6
header_not_allowed = 7
separator_not_allowed = 8
filesize_not_allowed = 9
header_too_long = 10
dp_error_create = 11
dp_error_send = 12
dp_error_write = 13
unknown_dp_error = 14
access_denied = 15
dp_out_of_memory = 16
disk_full = 17
ABAP Programming Tips Page 27 of 157
dp_timeout = 18
file_not_found = 19
dataprovider_exception = 20
control_flush_error = 21
OTHERS = 22.
IF sy-subrc <> 0.
MESSAGE s999(b1) WITH 'File ' filestring
' NOT created!'.
ELSE.
MESSAGE s999(b1) WITH 'File ' filestring
' Created successfully!'.
ENDIF. "Check on download success
3.5 MACROS
See section 7.10.8 for an example.
DEFINE:
define add_comma.
* add comma for selection criteria output string
if offset > 0.
&1_string_&2+offset(1) = ','.
offset = offset + 2.
endif.
DEFINE:
DEFINE create_string.
* loop for inclusions
loop at s_&1.
offset = strlen( &1_string_&2 ).
c_low = s_&1-low.
c_high = s_&1-high.
shift c_low left deleting leading '0'.
shift c_high left deleting leading '0'.
shift c_low left deleting leading space.
shift c_high left deleting leading space.
if '&1' = 'date'.
concatenate c_low+4(2) '/' c_low+6(2) '/'
c_low+2(2) into c_low.
if not c_high is initial.
concatenate c_high+4(2) '/' c_high+6(2) '/'
c_high+2(2) into c_high.
endif.
endif.
case s_&1-option.
when 'EQ'.
check s_&1-sign = '&2'.
add_comma &1 &2.
&1_string_&2+offset = c_low.
when 'NE'.
check s_&1-sign = '&3'.
add_comma &1 &2.
&1_string_&2+offset = c_low.
when 'GT'.
check s_&1-sign = '&2'.
add_comma &1 &2.
&1_string_&2+offset = 'Greater than'.
offset = offset + 13.
&1_string_&2+offset = c_low.
when 'LE'.
check s_&1-sign = '&2'.
add_comma &1 &2.
&1_string_&2+offset = 'Less than or equal to'.
offset = offset + 22.
&1_string_&2+offset = c_low.
when 'LT'.
check s_&1-sign = '&2'.
add_comma &1 &2.
&1_string_&2+offset = 'Less than'.
offset = offset + 10.
&1_string_&2+offset = c_low.
ABAP Programming Tips Page 28 of 157
when 'BT'.
check s_&1-sign = '&2'.
add_comma &1 &2.
concatenate &1_string_&2 c_low '-' c_high
into &1_string_&2 separated by space.
when 'NB'.
check s_&1-sign = '&3'.
add_comma &1 &2.
concatenate &1_string_&2 c_low '-' c_high
into &1_string_&2 separated by space.
endcase.
endloop.
END-OF-DEFINITION. " create_string
USAGE: create_string date I E.
DEFINE:
DEFINE WRITE_STRING.
3.6.1 Joins
See section 7.10.8 for an example.
START-OF-SELECTION.
* ASSUMPTION: All quantities are in sales units. Since quantities
* are summed to the material group level, it is assumed that all
* materials within a material group have the same sales unit of
* measure.
select a~kunag a~vbeln a~fkdat a~bukrs a~vbtyp
b~matkl b~matnr b~arktx b~fkimg b~kzwi2 b~wavwr
c~name1
d~kunn2
into corresponding fields of table replines
from vbrk as a
inner join vbrp as b
on a~vbeln = b~vbeln
inner join kna1 as c
on a~kunag = c~kunnr
left outer join knvp as d
on a~kunag = d~kunnr and
a~vkorg = d~vkorg and
a~vtweg = d~vtweg and
d~spart = '71' and
d~parvw = 'CO' and
d~parza = '000'
where a~vkorg = '7100' and
a~vbtyp in r_vtyp and
a~fkdat in s_date and
a~kunag in s_cust and
b~matkl in s_mgrp and
b~autyp in r_atyp.
END-OF-SELECTION.
Condition Record
Using VV12 you need to add a condition record as applicable. Note that the Communication record must point to your
ZMAIL output device and has the following entry as Text for Cover Page: &KUNNR&(&VBELN&)
LOOP AT xtlines.
move snast-objky to t_vbeln.
replace '&VBELN&' with t_vbeln into xtlines-tdline.
select single name1 into kna1-name1
from kna1
where kunnr = snast-parnr.
replace '&KUNNR&' with kna1-name1 into xtlines-tdline.
condense xtlines-tdline.
modify xtlines.
ENDLOOP.
ENDFORM.
3.8 GENERAL
if sy-subrc = 0.
describe table in_email lines l_tfill.
if l_tfill = 0.
message i140(qm).
raise action_stopped.
Else.
***** HERES EMAIL ADDRESS in_email-smtp
endif.
endif.
endif.
3.8.5 GUI-Status
ABAP Programming Tips Page 31 of 157
BACK %EX RW PRI %SC %SC+ P-- P- P+ P++
ENDLOOP.
LOOP AT XLIKP.
WRITE: /5 XLIKP-VBELN.
SELECT SINGLE * FROM LIKP WHERE VBELN EQ XLIKP-VBELN.
CHECK SY-SUBRC IS INITIAL.
WRITE: 'found'.
ENDLOOP.
ENDSELECT.
To set the length of each record including your blanks add this code: perform SET_FIXLEN(saplgrap) using
'0' '100'
*$*$* - By placing *$*$ at the beginning of a comment line will lock the line for editing. You
are able to edit the line until you hit the enter key.
3.8.12.1 Example
* Display the GUI status if run in foreground otherwise dont
if sy-subty = 4.
set pf-status 'GH'.
endif.
* 'User ID Selection'
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-002.
PARAMETERS:
p_uname LIKE USR02-BNAME DEFAULT sy-uname OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b1.
* Sort Criteria
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-003.
PARAMETERS:
p_sort1 RADIOBUTTON GROUP sor1,
p_sort2 RADIOBUTTON GROUP sor1,
p_sort3 RADIOBUTTON GROUP sor1,
p_sort4 RADIOBUTTON GROUP sor1,
p_sort5 RADIOBUTTON GROUP sor1,
p_sort6 RADIOBUTTON GROUP sor1.
SELECTION-SCREEN END OF BLOCK b2.
*----------------------------------------------------------------------*
* Initialization
*----------------------------------------------------------------------*
INITIALIZATION.
PERFORM update_sel_screen_attributes.
TOP-OF-PAGE.
FORMAT COLOR COL_HEADING.
WRITE 'Woritem ID'.
WRITE AT 15 'Description'.
WRITE AT 135 'Date'.
WRITE AT 146 'Time'.
WRITE AT 155 'Parent ID'.
WRITE AT 168 'Task'.
WRITE AT 183 'Status'.
FORMAT COLOR OFF.
*----------------------------------------------------------------------*
* Start of Selection
*----------------------------------------------------------------------*
START-OF-SELECTION.
REFRESH itab_list.
t_uname = p_uname.
CALL FUNCTION 'SWK_LOCAL_INBOX_GET'
EXPORTING
user_id = t_uname
user_langu = 'E'
TABLES
wi_list = itab_list.
LOOP AT itab_list.
WRITE: / itab_list-wi_id,
itab_list-wi_text,
itab_list-wi_cd,
itab_list-wi_ct,
itab_list-wi_chckwi,
itab_list-wi_rh_task,
itab_list-wi_stat.
HIDE itab_list-wi_id.
HIDE itab_list-wi_rh_task.
ENDLOOP.
IF sy-subrc <> 0.
MESSAGE i999(b1) WITH 'No Workflow items found in the inbox of '
p_uname.
ELSE.
WRITE: / '***', sy-tfill, 'entries ***'.
ENDIF.
END-OF-SELECTION.
AT LINE-SELECTION.
* Return the field that the user clicked on
GET CURSOR FIELD field_name.
CASE field_name.
WHEN 'ITAB_LIST-WI_ID'.
IF itab_list-wi_id IS INITIAL.
MESSAGE i999(b1)
WITH 'Please double click a line on the report!'.
ELSE.
t_wi_id = itab_list-wi_id.
CALL FUNCTION 'SWL_WI_DISPLAY'
EXPORTING
wi_id = t_wi_id
extended_display ='X'
EXCEPTIONS
read_failed = 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.
ENDIF.
WHEN 'ITAB_LIST-WI_RH_TASK'.
IF itab_list-wi_rh_task IS INITIAL.
MESSAGE i999(b1)
WITH 'Please double click a line on the report!'.
ELSE.
CALL FUNCTION 'SWL_WI_DISPLAY_TASK'
EXPORTING
wi_id = itab_list-wi_id.
CLEAR itab_list-wi_rh_task.
ENDIF.
WHEN OTHERS.
MESSAGE i999(b1) WITH 'Field not selectable!'.
ENDCASE.
CLEAR: itab_list-wi_id, itab_list-wi_rh_task.
*&---------------------------------------------------------------------*
*& Form update_sel_screen_attributes
*&---------------------------------------------------------------------*
FORM update_sel_screen_attributes.
LOOP AT SCREEN.
IF screen-group1 = 'SC1'.
screen-intensified = '1'.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
ENDFORM. " update_sel_screen_attributes
Take a look at this alv-sample-code. It defines the event TOP-OF-PAGE in which you can print anything you want, including SO_...-low to SO_...-high, which you can insert at *()*
REPORT ZALV_SAMPLE.
* NO STANDARD PAGE HEADING
* LINE-COUNT 58
* LINE-SIZE 220.
TYPE-POOLS: SLIS. "for 'REUSE_ALV...list&grids'
*----------------------------------------------------------------------*
* TABLES *
*----------------------------------------------------------------------*
TABLES: KNA1. "General Data in Customer Master
.
*----------------------------------------------------------------------*
* Internal data *
*----------------------------------------------------------------------*
DATA: BEGIN OF LT_ALVTABLE OCCURS 0,
KUNNR LIKE KNA1-KUNNR,
NAME1 LIKE KNA1-NAME1,
NAME2 LIKE KNA1-NAME2,
STRAS LIKE KNA1-STRAS,
PSTLZ LIKE KNA1-PSTLZ,
ORT01 LIKE KNA1-ORT01,
UMSA1 LIKE KNA1-UMSA1,
KTOKD LIKE KNA1-KTOKD,
END OF LT_ALVTABLE.
*----------------------------------------------------------------------*
* Initialization *
*----------------------------------------------------------------------*
INITIALIZATION.
*----------------------------------------------------------------------*
* Parameters and select-options *
*----------------------------------------------------------------------*
SELECT-OPTIONS SO_KUNNR FOR KNA1-KUNNR DEFAULT '2000' TO '2300'.
SELECT-OPTIONS SO_NAME FOR KNA1-NAME1.
PARAMETERS: PA_PSTCD AS CHECKBOX DEFAULT 'X'.
PARAMETERS: PA_VAR AS CHECKBOX DEFAULT 'X'.
*----------------------------------------------------------------------*
* Start of main program *
*----------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM SELECT_RECORDS.
PERFORM PRINT_ALVLIST.
END-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Form select_records
*&---------------------------------------------------------------------*
FORM SELECT_RECORDS.
REPID = SY-REPID.
LO_ITABNAME = 'LT_ALVTABLE'. "NB: ONLY USE CAPITALS HERE!
XS_EVENT-NAME = SLIS_EV_TOP_OF_LIST.
XS_EVENT-FORM = 'XTOP_OF_LIST'.
XS_EVENT-NAME = SLIS_EV_END_OF_LIST.
XS_EVENT-FORM = 'XEND_OF_LIST'.
APPEND XS_EVENT TO PA_EVENTS.
XS_EVENT-NAME = SLIS_EV_TOP_OF_PAGE.
XS_EVENT-FORM = 'XTOP_OF_PAGE'.
APPEND XS_EVENT TO PA_EVENTS.
XS_EVENT-NAME = SLIS_EV_END_OF_PAGE.
XS_EVENT-FORM = 'XEND_OF_PAGE'.
APPEND XS_EVENT TO PA_EVENTS.
ENDFORM.
*&--------------------------------------------------------------------*
*& Form XTOP_OF_LIST
*&--------------------------------------------------------------------*
FORM XTOP_OF_LIST.
DATA LO_DATE(8).
CONCATENATE SY-DATUM+6(2) '.'
SY-DATUM+4(2) '.'
SY-DATUM+2(2)
INTO LO_DATE.
METHOD handle_node_double_click.
" this method handles the node double click event of the tree
" control instance
" show the key of the double clicked node in a dynpro field
READ TABLE itab_data WITH KEY node_key = node_key INTO wa_data.
* You now have the data to do anything you wish
* .
ENDMETHOD.
METHOD handle_item_double_click.
" this method handles the item double click event of the tree
" control instance. You have variables node_key and item_name
" show the key of the node and the name of the item
" of the double clicked item in a dynpro field
READ TABLE itab_data WITH KEY node_key = node_key INTO wa_data.
* You now have the data to do anything you wish
* .
ENDMETHOD.
METHOD handle_link_click.
" this method handles the link click event of the tree
" control instance
ABAP Programming Tips Page 38 of 157
" show the key of the node and the name of the item
" of the clicked link in a dynpro field
g_node_key = node_key.
g_item_name = item_name.
ENDMETHOD.
METHOD handle_button_click.
" this method handles the button click event of the tree
" control instance
" show the key of the node and the name of the item
" of the clicked button in a dynpro field
g_node_key = node_key.
g_item_name = item_name.
ENDMETHOD.
METHOD handle_checkbox_change.
" this method handles the checkbox_change event of the tree
" control instance
" show the key of the node and the name of the item
" of the clicked checkbox in a dynpro field
g_node_key = node_key.
g_item_name = item_name.
ENDMETHOD.
METHOD handle_expand_no_children.
DATA: node_table TYPE treev_ntab,
node TYPE treev_node,
item_table TYPE item_table_type,
item TYPE mtreeitm.
CLEAR item.
item-node_key = 'New3'.
item-item_name = '2'.
item-class = cl_gui_list_tree=>item_class_text.
item-alignment = cl_gui_list_tree=>align_auto.
ABAP Programming Tips Page 39 of 157
item-font = cl_gui_list_tree=>item_font_prop.
item-text = 'Comment to SAPTROX1'. "#EC NOTEXT
APPEND item TO item_table.
CLEAR item.
item-node_key = 'New4'.
item-item_name = '2'.
item-class = cl_gui_list_tree=>item_class_text.
item-alignment = cl_gui_list_tree=>align_auto.
item-font = cl_gui_list_tree=>item_font_prop.
item-text = 'Comment to SAPTRIXTROX'. "#EC NOTEXT
APPEND item TO item_table.
ENDIF.
ENDCLASS.
DATA DEFINITIONS
* Type definitions
types: begin of itab_type,
folder type flag,
node_key type mtreeitm,
relatkey type tv_nodekey,
type like qmel-QMART,
qmnum like qmel-qmnum,
qwrnum like qmel-qwrnum,
end of itab_type.
* Data Definitions
data: okcode like sy-ucomm,
itab_data type itab_type occurs 0,
wa_data type itab_type.
REFRESH: itab_data.
PERFORM create_input_table TABLES itab_data.
END-OF-SELECTION.
SUBROUTINES
*&---------------------------------------------------------------------*
*& Form update_sel_screen_attributes
*&---------------------------------------------------------------------*
FORM update_sel_screen_attributes.
LOOP AT SCREEN.
IF screen-group1 = 'SC1'.
screen-intensified = '1'.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
ENDFORM. " update_sel_screen_attributes
*&---------------------------------------------------------------------*
*& Form create_and_init_tree
*&---------------------------------------------------------------------*
FORM create_and_init_tree.
DATA: node_table TYPE treev_ntab,
item_table TYPE item_table_type,
events TYPE cntl_simple_events,
event TYPE cntl_simple_event.
node-node_key = wa_data-node_key.
node-relatkey = wa_data-relatkey.
node-isfolder = 'X'.
IF wa_data-relatkey IS INITIAL.
CLEAR: node-relatship,
node-exp_image,
node-expander.
node-hidden = ' '.
node-disabled = ' '.
ELSE.
node-relatship = cl_gui_list_tree=>relat_last_child.
ENDIF.
APPEND node TO node_table.
* Update Items
CLEAR item.
item-node_key = wa_data-node_key.
item-item_name = '1'.
item-length = 4.
item-class = cl_gui_list_tree=>item_class_text. " Text Item
item-alignment = cl_gui_list_tree=>align_auto.
item-font = cl_gui_list_tree=>item_font_prop.
item-usebgcolor = 'X'.
item-text = wa_data-type.
APPEND item TO item_table.
CLEAR item.
item-node_key = wa_data-node_key.
item-item_name = '2'.
item-length = 20.
item-class = cl_gui_list_tree=>item_class_text. " Text Item
item-alignment = cl_gui_list_tree=>align_auto.
item-font = cl_gui_list_tree=>item_font_prop.
item-text = wa_data-qmnum.
APPEND item TO item_table.
ENDLOOP.
t_counter = 1.
CLEAR: t_parent, t_parent1.
CLEAR: wa_data.
wa_data-folder = 'X'.
wa_data-node_key = t_counter.
wa_data-relatkey = t_parent.
wa_data-type = qmel-qmart.
wa_data-qmnum = qmel-qmnum.
wa_data-qwrnum = qmel-qwrnum.
APPEND wa_data TO p_itab_data.
t_parent = t_counter.
ADD 1 TO t_counter.
CLEAR: wa_data.
wa_data-folder = 'X'.
wa_data-node_key = t_counter.
wa_data-relatkey = t_parent.
wa_data-type = qmel-qmart.
wa_data-qmnum = qmel-qmnum.
wa_data-qwrnum = qmel-qwrnum.
APPEND wa_data TO p_itab_data.
t_parent1 = t_counter.
ADD 1 TO t_counter.
CLEAR: wa_data.
wa_data-folder = 'X'.
wa_data-node_key = t_counter.
wa_data-relatkey = t_parent1.
wa_data-type = qmel-qmart.
wa_data-qmnum = qmel-qmnum.
wa_data-qwrnum = qmel-qwrnum.
APPEND wa_data TO p_itab_data.
ADD 1 TO t_counter.
ENDSELECT.
CLEAR: t_parent1.
ENDSELECT.
CLEAR: t_parent.
ENDSELECT.
CLEAR: t_parent, t_parent1.
ABAP Programming Tips Page 44 of 157
ENDIF.
CLEAR: wa_data.
wa_data-folder = 'X'.
wa_data-node_key = t_counter.
wa_data-relatkey = t_parent1.
wa_data-type = qmel-qmart.
wa_data-qmnum = qmel-qmnum.
wa_data-qwrnum = qmel-qwrnum.
APPEND wa_data TO p_itab_data.
t_parent1 = t_counter.
ADD 1 TO t_counter.
t_qmnum = qmel-qmnum.
* Is an ECR attached?
IF NOT qmel-qwrnum IS INITIAL.
SELECT SINGLE qmnum qmart qwrnum
INTO (qmel-qmnum, qmel-qmart, qmel-qwrnum)
FROM qmel
WHERE qmnum = qmel-qwrnum.
IF sy-subrc = 0.
CLEAR: wa_data.
wa_data-folder = 'X'.
wa_data-node_key = t_counter.
wa_data-relatkey = t_parent1.
wa_data-type = qmel-qmart.
wa_data-qmnum = qmel-qmnum.
wa_data-qwrnum = qmel-qwrnum.
APPEND wa_data TO p_itab_data.
ADD 1 TO t_counter.
ENDIF.
ENDIF.
qmel-qmnum = t_qmnum.
CLEAR: wa_data.
wa_data-folder = 'X'.
wa_data-node_key = t_counter.
wa_data-relatkey = t_parent1.
wa_data-type = qmel-qmart.
wa_data-qmnum = qmel-qmnum.
wa_data-qwrnum = qmel-qwrnum.
APPEND wa_data TO p_itab_data.
ADD 1 TO t_counter.
ENDSELECT.
CLEAR: t_parent1.
ENDSELECT.
CLEAR: t_parent, t_parent1.
ENDIF.
CLEAR: wa_data.
wa_data-folder = 'X'.
wa_data-node_key = t_counter.
wa_data-relatkey = t_parent.
wa_data-type = qmel-qmart.
wa_data-qmnum = qmel-qmnum.
wa_data-qwrnum = qmel-qwrnum.
APPEND wa_data TO p_itab_data.
t_parent = t_counter.
ADD 1 TO t_counter.
t_qmnum = qmel-qmnum.
IF NOT qmel-qwrnum IS INITIAL.
* Check for ECNs attached to this ECO
SELECT qmnum qmart qwrnum
INTO (qmel-qmnum, qmel-qmart, qmel-qwrnum)
FROM qmel
WHERE qmnum = qmel-qwrnum AND
qmart = 'C4'.
CLEAR: wa_data.
wa_data-folder = 'X'.
wa_data-node_key = t_counter.
wa_data-relatkey = t_parent.
wa_data-type = qmel-qmart.
wa_data-qmnum = qmel-qmnum.
wa_data-qwrnum = qmel-qwrnum.
APPEND wa_data TO p_itab_data.
t_parent1 = t_counter.
ADD 1 TO t_counter.
t_qmnum1 = qmel-qmnum.
IF NOT qmel-qwrnum IS INITIAL.
* Check for ECRs attached to this ECN
SELECT qmnum qmart qwrnum
INTO (qmel-qmnum, qmel-qmart, qmel-qwrnum)
FROM qmel
WHERE qmnum = qmel-qwrnum AND
qmart = 'C3'.
CLEAR: wa_data.
wa_data-folder = 'X'.
wa_data-node_key = t_counter.
wa_data-relatkey = t_parent1.
wa_data-type = qmel-qmart.
wa_data-qmnum = qmel-qmnum.
wa_data-qwrnum = qmel-qwrnum.
APPEND wa_data TO p_itab_data.
ADD 1 TO t_counter.
ENDSELECT.
qmel-qmnum = t_qmnum1.
CLEAR: t_parent1.
ENDIF.
ENDSELECT.
qmel-qmnum = t_qmnum.
CLEAR: t_parent1.
ENDIF.
ENDSELECT.
CLEAR: t_parent, t_parent1.
ENDIF.
case okcode.
when 'RETURN'. " Finish program
if not g_custom_container is initial.
" destroy tree container (detroys contained tree control, too)
call method g_custom_container->free
exceptions
cntl_system_error = 1
cntl_error = 2.
if sy-subrc <> 0.
message a000(TREE_CONTROL_MSG).
endif.
clear g_custom_container.
clear g_tree.
endif.
leave to screen 0.
endcase.
clear okcode.
****************************************************************
* LOCAL CLASSES: Definition
****************************************************************
*===============================================================
* class lcl_event_receiver: local class to
* define and handle own functions.
*
* Definition:
* ~~~~~~~~~~~
CLASS lcl_event_receiver DEFINITION.
PUBLIC SECTION.
METHODS:
handle_toolbar
FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING e_object e_interactive,
handle_user_command
FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm.
PRIVATE SECTION.
ENDCLASS.
****************************************************************
* LOCAL CLASSES: Implementation
****************************************************************
*===============================================================
* class lcl_event_receiver (Implementation)
*
*
CLASS lcl_event_receiver IMPLEMENTATION.
METHOD handle_toolbar.
* 2.In event handler method for event TOOLBAR: Append own functions
* by using event parameter E_OBJECT.
DATA: ls_toolbar TYPE stb_button.
*....................................................................
* E_OBJECT of event TOOLBAR is of type REF TO CL_ALV_EVENT_TOOLBAR_SET.
* This class has got one attribute, namly MT_TOOLBAR, which
* is a table of type TTB_BUTTON. One line of this table is
* defined by the Structure STB_BUTTON (see data deklaration above).
*
ENDMETHOD.
*-------------------------------------------------------------------
METHOD handle_user_command.
* 3.In event handler method for event USER_COMMAND: Query your
* function codes defined in step 2 and react accordingly.
CASE e_ucomm.
WHEN 'COMMENT'.
CALL METHOD grid1->get_selected_rows
IMPORTING et_index_rows = lt_rows.
IF sy-subrc NE 0.
* add your handling, for example
CALL FUNCTION 'POPUP_TO_INFORM'
EXPORTING
titel = g_repid
txt2 = sy-subrc
txt1 = 'Error in Flush'(500).
ELSE.
PERFORM get_comment TABLES lt_rows. Perform action
ENDIF.
WHEN 'MATNR'.
CALL METHOD grid1->get_selected_rows
IMPORTING et_index_rows = lt_rows.
IF sy-subrc NE 0.
* add your handling, for example
CALL FUNCTION 'POPUP_TO_INFORM'
EXPORTING
titel = g_repid
txt2 = sy-subrc
txt1 = 'Error in Flush'(500).
ELSE.
READ TABLE lt_rows INDEX 1.
IF sy-subrc = 0.
READ TABLE t_out INTO t_out_wa INDEX lt_rows-index.
IF sy-subrc = 0.
SET PARAMETER ID 'MAT' FIELD t_out_wa-matnr.
CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN. "View Material
ELSE.
MESSAGE i999(b1) WITH 'Entry not found!'.
ENDIF.
ELSE.
MESSAGE i999(b1) WITH 'Please select a line first!'.
ENDIF.
ENDIF.
ENDCASE.
ENDMETHOD. "handle_user_command
ABAP Programming Tips Page 50 of 157
*-----------------------------------------------------------------
ENDCLASS.
*
* lcl_event_receiver (Implementation)
*===================================================================
PBO
process before output.
MODULE STATUS_2000.
module init_data.
module create_container.
*&---------------------------------------------------------------------*
*& Module create_container OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
module create_container output.
if custom_container1 is initial.
* create a custom container control for our ALV Control
create object custom_container1
exporting
container_name = cont_on_main
exceptions
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5.
if sy-subrc ne 0.
* add your handling, for example
call function 'POPUP_TO_INFORM'
exporting
titel = g_repid
txt2 = sy-subrc
txt1 = 'The control could not be created'(001).
endif.
t_out[] = t_out_mat[].
gt_fieldcat1[] = gt_fieldcat[].
gs_layout2-report = sy-repid.
PAI on SAVE
refresh: mytable1.
CALL METHOD editor1->get_text_as_r3table
IMPORTING
table = mytable1
EXCEPTIONS
OTHERS = 1.
DATA
constants: line_length type i value 52.
*** Variables
data: editor1 type ref to cl_gui_textedit,
* reference to custom container: necessary to bind TextEdit Control
textedit_custom_container1 type ref to cl_gui_custom_container.
idocdata-tabnam = idocdata-segnam.
seg_num = seg_num + 1.
idocdata-segnum = seg_num.
shift idocdata-segnum left deleting leading space.
append idocdata.
clear idocdata.
commit work.
IF sy-subrc <> 0.
return_code = 2.
WRITE: /1 'ZORDRSP IDoc not created'.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
WRITE: /1 'IDoc: ', itab_zordrsp_edidc-docnum, ' created'.
HIDE itab_zordrsp_edidc-docnum.
ENDIF.
PERFORM analyzing_event_create
TABLES
t_couple_to_process
USING
l_commit_counter
inbsync.
if sy-subrc is initial.
MESS-MSGID = 'ZS7'.
MESS-MSGTY = 'E'.
MESS-MSGNO = i_msgno.
MESS-MSGV1 = i_msgv1.
MESS-MSGV2 = i_msgv2.
CALL FUNCTION 'IDOC_ERROR_WORKFLOW_START'
EXPORTING
DOCNUM = 0
EVENTCODE = 'EDIM'
MESS = mess
STATUSMESS = mess
EXCEPTIONS
NO_ENTRY_IN_TEDE5 = 1
ERROR_IN_START_WORKFLOW = 2
OTHERS = 3.
COMMIT WORK.
endif. "link created
FORM analyzing_event_create
TABLES
t_couple_to_process_in STRUCTURE ediinbound
USING
commit_counter_in LIKE ediglodata-comcount
start_recfb_synchron_in LIKE ediglodata-inbsync.
* local variables
DATA:
* instance that is created
l_object TYPE swc_object,
* object key, e.g IDoc number
l_object_key LIKE swotobjid-objkey,
* id of wf event
l_event_id LIKE swedumevid-evtid,
* status record for case of error
l_status_record TYPE tidoc_status_record_ext,
* flag indicating whether subscribed task is started synchronously
ABAP Programming Tips Page 57 of 157
l_start_recfb_synchron LIKE sweflags-syncflag VALUE ' ',
* idoc number (needed because of type checking)
l_idoc_number LIKE edidc-docnum.
* local constants
CONSTANTS:
* object type 'IDOC'
c_object_type LIKE swetypecou-objtype VALUE 'IDOCINVOIC',
* name of event to be created
c_idc_evt LIKE swetypecou-event VALUE 'INPUTERROROCCURREDMM'
.
if t_couple_to_process_in[] is initial.
COMMIT WORK.
CALL FUNCTION 'DEQUEUE_ALL'.
CLEAR commit_counter_in.
exit.
endif.
* cast
l_start_recfb_synchron = start_recfb_synchron_in.
* declaration of container
swc_container l_t_ev_container.
* initialize container
swc_clear_container l_t_ev_container.
IF ( sy-subrc <> 0 )
* event was not created => error handling for this idoc (EDIM)
OR ( l_event_id = 0 ).
* stop processing, no commit
MESSAGE ID 'E0'
TYPE 'A'
NUMBER '374'
t_object-objkey = itab_data-objky.
t_object-objtype = 'BUS2035'. Scheduling Agreements
EXPORTING
OBJECT = object1
* ROLETYPE =
RELATIONTYPE = 'IDC4'
* MAX_HOPS = 1
* INCL_APPLRELS = ' '
* EXCL_ROLES =
* EXCL_RELATIONS =
TABLES
LINKS = links
* ROLES =
* APPLLINKS =
EXCEPTIONS
ABAP Programming Tips Page 60 of 157
OTHERS = 4.
7.10 EXAMPLES
IF p_statxt IS INITIAL.
SELECT SINGLE text FROM t100 INTO t_status
WHERE sprsl = 'EN' AND
arbgb = p_stamid AND
msgnr = p_stamno.
ELSE.
MOVE p_statxt TO t_status.
ENDIF.
IF t_status CS '&1' OR
t_status CS '&2' OR
t_status CS '&3' OR
t_status CS '&4'.
ELSE.
ENDIF.
**********************************************************************
*--- Call transaction with errors to BDC -----------------------------
REFRESH MESSTAB.
CALL TRANSACTION C_TCODE USING BDCDATA MODE 'N' UPDATE 'S'
MESSAGES INTO MESSTAB.
RETURN_CODE = SY-SUBRC.
IF RETURN_CODE = 0.
LOOP AT MESSTAB.
IF MESSTAB-MSGTYP = 'E'.
RETURN_CODE = MESSTAB-MSGNR.
SY-MSGID = 'B1'.
SY-MSGNO = 999.
SY-MSGV1 = 'Error: Check BDC'.
ENDIF.
ENDLOOP.
ENDIF.
*--- Here we check the return code, if there was an error, we put the
* transaction in a BDC session for the user to review and correct.
IF RETURN_CODE NE 0.
CALL FUNCTION 'BDC_OPEN_GROUP'
EXPORTING
CLIENT = SY-MANDT
GROUP = 'ZKJW'
USER = SY-UNAME
KEEP = 'X'.
CALL FUNCTION 'BDC_INSERT'
EXPORTING
TCODE = C_TCODE
TABLES
DYNPROTAB = BDCDATA.
CALL FUNCTION 'BDC_CLOSE_GROUP'
EXCEPTIONS
NOT_OPEN = 1
QUEUE_ERROR = 2
OTHERS = 3.
ENDIF.
**********************************************************************
*--- Append BDCDATA internal table ------------------------------------
FORM APPEND_BDC USING VALUE(P_PROG)
VALUE(P_SCREEN)
VALUE(P_NAM)
VALUE(P_VAL).
CLEAR BDCDATA.
IF P_PROG NE SPACE.
BDCDATA-PROGRAM = P_PROG.
BDCDATA-DYNPRO = P_SCREEN.
BDCDATA-DYNBEGIN = 'X'.
BDCDATA-FNAM = P_NAM.
BDCDATA-FVAL = P_VAL.
ELSE.
BDCDATA-FNAM = P_NAM.
BDCDATA-FVAL = P_VAL.
ENDIF.
APPEND BDCDATA.
*&---------------------------------------------------------------------*
*& Form UPDATE_IDOC_STATUS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM UPDATE_IDOC_STATUS.
*--- Now we check the CALL TRANSACTION return code and set IDOC status
CLEAR IDOC_STATUS.
IF RETURN_CODE = 0.
WORKFLOW_RESULT = '0'.
IDOC_STATUS-DOCNUM = IDOC_CONTRL-DOCNUM.
IDOC_STATUS-STATUS = '53'.
IDOC_STATUS-UNAME = SY-UNAME.
IDOC_STATUS-REPID = SY-REPID.
IDOC_STATUS-MSGTY = SY-MSGTY.
IDOC_STATUS-MSGID = SY-MSGID.
IDOC_STATUS-MSGNO = SY-MSGNO.
IDOC_STATUS-MSGV1 = SY-MSGV1.
IDOC_STATUS-MSGV2 = SY-MSGV2.
IDOC_STATUS-MSGV3 = SY-MSGV3.
IDOC_STATUS-MSGV4 = SY-MSGV4.
RETURN_VARIABLES-WF_PARAM = 'Processed_IDOCs'.
RETURN_VARIABLES-DOC_NUMBER = IDOC_CONTRL-DOCNUM.
APPEND RETURN_VARIABLES.
ELSE.
WORKFLOW_RESULT = '99999'.
IDOC_STATUS-DOCNUM = IDOC_CONTRL-DOCNUM.
IDOC_STATUS-STATUS = '51'.
IDOC_STATUS-UNAME = SY-UNAME.
IDOC_STATUS-REPID = SY-REPID.
IDOC_STATUS-MSGTY = SY-MSGTY.
IDOC_STATUS-MSGID = SY-MSGID.
IDOC_STATUS-MSGNO = SY-MSGNO.
IDOC_STATUS-MSGV1 = SY-MSGV1.
IDOC_STATUS-MSGV2 = SY-MSGV2.
IDOC_STATUS-MSGV3 = SY-MSGV3.
IDOC_STATUS-MSGV4 = SY-MSGV4.
RETURN_VARIABLES-WF_PARAM = 'Error_IDOCs'.
RETURN_VARIABLES-DOC_NUMBER = IDOC_CONTRL-DOCNUM.
APPEND RETURN_VARIABLES.
ENDIF.
APPEND IDOC_STATUS.
ENDFORM. " UPDATE_IDOC_STATUS
T_IDOC_CONTROL[] = IDOC_CONTRL[].
T_IDOC_DATA[] = IDOC_DATA[].
LOOP AT T_IDOC_DATA.
CASE T_IDOC_DATA-SEGNAM.
WHEN 'E1ADHDR'.
IF ZTAUD-MESTYP <> SPACE AND NOT T_ALE_ERR[] IS INITIAL.
* send SAP mail
CLEAR SUBRC.
PERFORM SEND_SAP_MAIL
TABLES T_ALE_ERR
USING RECEIVING_SYSTEM
SENDING_SYSTEM
ZTAUD
SUBRC.
IF SUBRC <> 0.
GLOBAL_SUBRC = SUBRC.
IDOC_STATUS-DOCNUM = T_IDOC_CONTROL-DOCNUM.
IDOC_STATUS-STATUS = '51'.
IDOC_STATUS-MSGTY = 'E'.
IDOC_STATUS-MSGID = 'B1'.
IDOC_STATUS-MSGNO = '999'.
IDOC_STATUS-MSGV1 = TEXT-013.
IDOC_STATUS-MSGV2 = ZTAUD-MESTYP.
IDOC_STATUS-MSGV3 = 'SO_OBJECT_SEND RC ='.
IDOC_STATUS-MSGV4 = SUBRC.
APPEND IDOC_STATUS.
ENDIF.
CLEAR T_ALE_ERR.
REFRESH T_ALE_ERR.
ENDIF.
W_E1ADHDR = T_IDOC_DATA-SDATA.
CLEAR ZTAUD.
SELECT SINGLE * FROM ZTAUD WHERE MESTYP = W_E1ADHDR-MESTYP.
WHEN 'E1STATE'.
IF ZTAUD-MESTYP = SPACE.
CONTINUE.
ELSE.
W_E1STATE = T_IDOC_DATA-SDATA.
CLEAR T_ALE_ERR.
IF W_E1STATE-STATUS = '51'
OR W_E1STATE-STATUS = '56'
OR W_E1STATE-STATUS = '61'
OR W_E1STATE-STATUS = '63'
OR W_E1STATE-STATUS = '65'
OR W_E1STATE-STATUS = '60'.
T_ALE_ERR-STATUS = W_E1STATE-STATUS.
T_ALE_ERR-DOCNUMSND = W_E1STATE-DOCNUM.
ENDIF.
ENDIF.
WHEN 'E1PRTOB'.
IF GLOBAL_SUBRC <> 0.
WORKFLOW_RESULT = 99999.
RETURN_VARIABLES-DOC_NUMBER = T_IDOC_CONTROL-DOCNUM.
RETURN_VARIABLES-WF_PARAM = 'Error_IDOCs'.
APPEND RETURN_VARIABLES.
ELSE.
WORKFLOW_RESULT = 0.
CLEAR IDOC_STATUS.
IDOC_STATUS-DOCNUM = T_IDOC_CONTROL-DOCNUM.
IDOC_STATUS-STATUS = '53'.
IDOC_STATUS-MSGTY = 'E'.
IDOC_STATUS-MSGID = 'B1'.
IDOC_STATUS-MSGNO = '999'.
IDOC_STATUS-MSGV1 = TEXT-014.
APPEND IDOC_STATUS.
CLEAR RETURN_VARIABLES.
RETURN_VARIABLES-WF_PARAM = 'Processed_IDOCs'.
RETURN_VARIABLES-DOC_NUMBER = T_IDOC_CONTROL-DOCNUM.
APPEND RETURN_VARIABLES.
ENDIF.
ENDFUNCTION.
DATA:
X_OBJECT_HD_CHANGE LIKE SOOD1,
H_TEXT LIKE SOLI-LINE,
H_STATUS LIKE EDIDC-STATUS,
X_OBJECT_TYPE LIKE SOOD-OBJTP.
* clear x_objhead.
* refresh x_objhead.
* move 6 to raw_head-rawsiz.
* move raw_head to x_objhead.
* append x_objhead.
REFRESH X_OBJCONT.
CLEAR X_OBJCONT.
MOVE H_TEXT TO X_OBJCONT.
APPEND X_OBJCONT.
CLEAR X_OBJCONT.
APPEND X_OBJCONT.
SORT T_ALE_ERR.
LOOP AT T_ALE_ERR.
IF H_STATUS <> T_ALE_ERR-STATUS.
IF H_STATUS <> SPACE.
PERFORM ERROR_REPORT
TABLES X_OBJCONT
T_ALE_ERR_WA
USING H_STATUS
RECEIVING_SYSTEM
SENDING_SYSTEM.
CLEAR T_ALE_ERR_WA.
REFRESH T_ALE_ERR_WA.
ENDIF.
H_STATUS = T_ALE_ERR-STATUS.
ENDIF.
T_ALE_ERR_WA = T_ALE_ERR.
APPEND T_ALE_ERR_WA.
ENDLOOP.
IF SY-SUBRC = 0.
PERFORM ERROR_REPORT
TABLES X_OBJCONT
T_ALE_ERR_WA
USING H_STATUS
RECEIVING_SYSTEM
SENDING_SYSTEM.
CLEAR T_ALE_ERR_WA.
REFRESH T_ALE_ERR_WA.
ENDIF.
CLEAR X_RECEIVERS.
REFRESH X_RECEIVERS.
MOVE ZTAUD-DLINAM TO X_RECEIVERS-RECNAM. " Distribution list
MOVE 'X' TO X_RECEIVERS-SNDEX.
MOVE 'C' TO X_RECEIVERS-RECESC.
APPEND X_RECEIVERS.
CLEAR: SY-MSGID.
CALL FUNCTION 'SO_OBJECT_SEND'
SUBRC = SY-SUBRC.
*&---------------------------------------------------------------------*
*& Form ERROR_REPORT
*&---------------------------------------------------------------------*
FORM ERROR_REPORT
TABLES X_OBJCONT STRUCTURE SOLI
T_ALE_ERR_WA STRUCTURE ALE_ERR_MESSAGE
USING H_STATUS LIKE EDIDC-STATUS
RECEIVING_SYSTEM LIKE EDIDC-SNDPRN
SENDING_SYSTEM LIKE EDIDC-RCVPRN.
CLEAR X_OBJCONT.
APPEND X_OBJCONT.
CLEAR H_TEXT.
CASE H_STATUS.
WHEN '51'.
H_TEXT = TEXT-004.
WHEN '56'.
H_TEXT = TEXT-005.
WHEN '61'.
H_TEXT = TEXT-006.
WHEN '63'.
H_TEXT = TEXT-007.
WHEN '65'.
H_TEXT = TEXT-008.
WHEN '60'.
H_TEXT = TEXT-009.
WHEN OTHERS.
H_TEXT = H_STATUS.
ENDCASE.
CLEAR X_OBJCONT.
X_OBJCONT = H_TEXT.
APPEND X_OBJCONT.
H_TEXT = TEXT-010.
REPLACE '&' WITH H_LINES INTO H_TEXT.
H_TEXT = TEXT-011.
REPLACE '&' WITH RECEIVING_SYSTEM INTO H_TEXT.
REPLACE '&' WITH SENDING_SYSTEM INTO H_TEXT.
X_OBJCONT = H_TEXT.
APPEND X_OBJCONT.
LOOP AT T_ALE_ERR_WA.
H_TEXT = TEXT-012.
REPLACE '&' WITH T_ALE_ERR_WA-DOCNUMRCV INTO H_TEXT.
REPLACE '&' WITH T_ALE_ERR_WA-DOCNUMSND INTO H_TEXT.
X_OBJCONT = H_TEXT.
APPEND X_OBJCONT.
ENDLOOP.
AT SELECTION-SCREEN ON P_FILE.
* If download is checked, but no file name is entered, error
IF P_DOWN EQ 'X' AND P_FILE EQ SPACE.
MESSAGE E999(B1) WITH TEXT-014.
ENDIF.
* Loop through the internal table set up to store the invoice numbers
* of those invoices that do not have INVOIC Idocs attached to them.
PERFORM SAVE_BILLING_DOC TABLES TITAB.
END-OF-SELECTION.
Include: ZFORMS
*----------------------------------------------------------------------*
***INCLUDE Z_FORMS .
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form UPDATE_ITAB_SO
*&---------------------------------------------------------------------*
* Initialization
CLEAR: ITAB_SO, ITAB_SO_EXTRA.
*&---------------------------------------------------------------------*
*& Form SAVE_BILLING_DOC
*&---------------------------------------------------------------------*
* Loop through the internal table set up to store the invoice numbers
* of those invoices that do not have INVOIC Idocs attached to them.
* i.e. The ZD01 output was not created for some reason.
* By saving the invoice (which is what this program does) the output
LOOP AT TITAB.
SUBMIT ZVF02SAVE WITH BILLING = TITAB-O810 AND RETURN.
MESSAGE I009(Z4) WITH TITAB-O810.
ENDLOOP.
IF SY-SUBRC = 0.
DESCRIBE TABLE TITAB LINES N.
MESSAGE I008(Z4) WITH N.
ENDIF.
ENDFORM. " SAVE_BILLING_DOC
*------------------------------------------------------------------
* MAIN PROCESSING LOOP
*------------------------------------------------------------------
START-OF-SELECTION.
today = sy-datlo.
append iedidc.
e1edk01-action = '000'.
loop at uty_vendors.
*&---------------------------------------------------------------------*
*& Form process_one_vendor
*&---------------------------------------------------------------------*
* Records from one vendor file are now in the internal table
* ie020.
*----------------------------------------------------------------------*
FORM process_one_vendor using value(infile).
*&---------------------------------------------------------------------*
*& Form convert_po_no
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM convert_po_no using value(infield)
changing po_number like ie020-po_number
po_line like ie020-po_lineno.
* Put out a warning in the job log, but create the IDoc to save the data
if ( po_number is initial or
po_line is initial ).
* PO number - line item conversion failed: &
message w016 with infield.
endif.
*&---------------------------------------------------------------------*
*& Form convert_date
*&---------------------------------------------------------------------*
* Convert yymmdd to ccyymmdd for SAP and
* convert ship date to delivery date
*----------------------------------------------------------------------*
FORM convert_date USING value(DATE6)
value(DATE_TYPE)
value(i_ship_code)
*&---------------------------------------------------------------------*
*& Form quantity_conversion
*&---------------------------------------------------------------------*
* The quantities in the input file are implied 3-decimal,
* so need to be converted into a "real" number.
* Also, the unit of measure may be 'KP' indicating that the qty
* is given in thousands.
*----------------------------------------------------------------------*
FORM convert_quantities USING value(i_UOM)
value(i_confirm_qty)
value(i_QTY_ORDERED)
CHANGING o_uom like iE020-UOM
o_confirm_qty like IE020-SCHED_QTY
o_qty_ordered like IE020-QTY_ORDERED.
if i_uom = 'KP'.
n_confirm_qty = n_confirm_qty / thou.
n_qty_ordered = n_qty_ordered / thou.
endif.
o_uom = 'PCE'.
if not n_confirm_qty is initial.
*&---------------------------------------------------------------------*
*& Form idoc_header_segs
*&---------------------------------------------------------------------*
* create internal table entries for PO header segments:
* E1EDK01
* E1EDK02
*----------------------------------------------------------------------*
FORM idoc_header_segs.
clear seg_num.
idocdata-segnam = 'E1EDK01'.
idocdata-sdata = e1edk01.
perform append_idoc_rec.
clear e1edk02.
idocdata-segnam = 'E1EDK02'.
e1edk02-qualf = '001'.
e1edk02-belnr = ie020-po_number.
idocdata-sdata = e1edk02.
perform append_idoc_rec.
*&---------------------------------------------------------------------*
*& Form idoc_item_segs
*&---------------------------------------------------------------------*
* create internal table entries for PO item header segments:
* E1EDP01
* E1EDP02
*----------------------------------------------------------------------*
FORM idoc_item_segs.
clear e1edp01.
idocdata-segnam = 'E1EDP01'.
e1edp01-menee = ie020-uom.
e1edp01-menge = ie020-qty_ordered.
idocdata-sdata = e1edp01.
perform append_idoc_rec.
clear e1edp02.
idocdata-segnam = 'E1EDP02'.
e1edp02-qualf = '001'.
e1edp02-belnr = ie020-po_number.
e1edp02-zeile = ie020-po_lineno.
idocdata-sdata = e1edp02.
perform append_idoc_rec.
idocdata-segnam = 'E1EDP02'.
clear e1edp02.
e1edp02-qualf = '002'.
e1edp02-belnr = ie020-slip_number.
e1edp02-datum = ie020-sched_date.
idocdata-sdata = e1edp02.
perform append_idoc_rec.
p01_ctr = p01_ctr + 1.
ENDFORM. " idoc_item_segs
*&---------------------------------------------------------------------*
*& Form idoc_sched_segs
*&---------------------------------------------------------------------*
* create internal table entries for PO item schedule segments:
* E1EDP20
clear e1edp20.
idocdata-segnam = 'E1EDP20'.
e1edp20-edatu = ie020-sched_deliv_date.
e1edp20-wmeng = ie020-sched_qty.
idocdata-sdata = e1edp20.
perform append_idoc_rec.
*&---------------------------------------------------------------------*
*& Form idoc_mat_seg
*&---------------------------------------------------------------------*
* create internal table entries for PO item material no. segments:
* E1EDP19
*----------------------------------------------------------------------*
FORM idoc_mat_seg.
tables: ekpo.
clear e1edp19.
idocdata-segnam = 'E1EDP19'.
e1edp19-qualf = '002'.
e1edp19-idtnr = save_vend_part.
e1edp19-mfrpn = save_cust_part.
idocdata-sdata = e1edp19.
perform append_idoc_rec.
clear e1edp19.
select single matnr from ekpo into e1edp19-idtnr
where ebeln = save_po and
ebelp = save_line.
if not e1edp19-idtnr is initial.
idocdata-segnam = 'E1EDP19'.
e1edp19-qualf = '001'.
idocdata-sdata = e1edp19.
perform append_idoc_rec.
endif.
***********************************************************************
*& Form post_prev_idoc
*&---------------------------------------------------------------------*
* create a database idoc from the idocdata table and clear table.
*----------------------------------------------------------------------*
FORM post_prev_idoc.
clear e1eds01.
idocdata-segnam = 'E1EDS01'.
e1eds01-sumid = '001'.
e1eds01-summe = p01_ctr.
shift e1eds01-summe left deleting leading space.
idocdata-sdata = e1eds01.
perform append_idoc_rec.
commit work.
refresh idocdata.
clear:
idocdata,
p01_ctr,
save_po,
save_line,
save_vend_part,
save_cust_part.
*&---------------------------------------------------------------------*
idocdata-tabnam = idocdata-segnam.
seg_num = seg_num + 1.
idocdata-segnum = seg_num.
shift idocdata-segnum left deleting leading space.
append idocdata.
clear idocdata.
*/ Program Name: Creation of DESADV & INVOIC IDocs from file E021
*/ Description : This program reads in external file E021 containing
* shipping and invoice data from internal vendors and
* creates one DESADV and one INVOIC IDoc per invoice.
*/ Transaction : n/a - run from job Z_ccc_S7B_Annnnn, where
* 'ccc' = 3-digit client and 'nnnnn' = zero-filled
* sequence number matching the scheduled job for E020.
*______________________________________________________________________
tables: lfa1,
lfm1,
ekpo,
eine,
e1edk01,
e1edk02,
e1edk07,
e1edk08,
e1edk06,
e1edk03,
e1edka1,
e1edka2,
e1edp07,
e1edp09,
e1edp19,
e1edp01,
e1edp02,
e1edp26,
e1edp04,
e1eds01,
e1eds02,
zst7f_ty_vendors.
*&---------------------------------------------------------------------*
*& DEFINITION: append_idoc_rec
*&---------------------------------------------------------------------*
* add a data record to the IDoc internal table
*----------------------------------------------------------------------*
define append_idoc_rec.
&1-tabnam = &1-segnam.
&2_seg_num = &2_seg_num + 1.
&1-segnum = &2_seg_num.
shift &1-segnum left deleting leading space.
append &1.
clear &1.
*------------------------------------------------------------------
* MAIN PROCESSING LOOP
*------------------------------------------------------------------
START-OF-SELECTION.
today = sy-datum.
perform init_desadv.
loop at uty_vendors.
*&---------------------------------------------------------------------*
*& Form process_one_vendor
*&---------------------------------------------------------------------*
* Pre-processed records from one vendor file are now in the
* internal table ie021 - ready to create IDocs
*----------------------------------------------------------------------*
FORM process_one_vendor using value(infile).
*&---------------------------------------------------------------------*
*& Form convert_po_no
*&---------------------------------------------------------------------*
* Break the PO number & line field into separate fields
*----------------------------------------------------------------------*
FORM convert_po_no using value(infield)
changing po_number like ie021-po_number
* Put out a warning in the job log, but create the IDoc to save the data
if ( po_number is initial or
po_line is initial ).
* PO number - line item conversion failed: &
message i034 with infield.
endif.
ENDFORM. " convert_po_no
*&---------------------------------------------------------------------*
*& Form convert_dates
*&---------------------------------------------------------------------*
* Convert ship date to delivery date, if necessary
*----------------------------------------------------------------------*
FORM convert_dates using value(vendor_no)
value(i_ship_date)
value(i_delivery_date)
value(i_ship_code)
value(i_create_date)
changing o_delivery_date
ship_days.
*&---------------------------------------------------------------------*
*& Form quantity_conversion
*&---------------------------------------------------------------------*
* The quantities in the input file are implied 3-decimal,
* so need to be converted into a "real" number.
* Also, the unit of measure may be 'KP' indicating that the qty
* is given in thousands.
*----------------------------------------------------------------------*
FORM quantity_conversion USING value(i_UOM)
value(i_invoice_qty)
value(i_unit_price)
CHANGING o_uom like iE021-qty_UOM
o_invoice_qty like IE021-INVOICE_QTY
c_LINE_AMOUNT like izss7b21-line_amount.
o_uom = 'PCE'.
*&---------------------------------------------------------------------*
*& Form money_conversion
*&---------------------------------------------------------------------*
* Add the implied decimals and store price-per qty, if
* price per 1,000 is sent.
*----------------------------------------------------------------------*
FORM money_conversion USING value(I_CURR)
value(i_UNIT_PRICE)
* not all of the vendors send the currency code, so use the vendor
* master default
case i_curr(2).
when 'US'.
o_currency = 'USD'.
when 'JP'.
o_currency = 'JPY'.
when others.
o_currency = uty_vendors-waers.
endcase.
o_price_uom = 'PCE'.
*&---------------------------------------------------------------------*
*& Form SAP_vendor_partno
*&---------------------------------------------------------------------*
* replace UTY part number sent by vendor with SAP material no.
* from PO line item.
*----------------------------------------------------------------------*
FORM SAP_vendor_partno changing cust_partno like ie021-cust_partno.
tables: makt.
partno_sent = cust_partno.
clear: makt, cust_partno.
select single matnr from ekpo into cust_partno
where ebeln = ie021-po_number and
ebelp = ie021-po_lineno.
*&---------------------------------------------------------------------*
*& Form idoc_header_segs
*&---------------------------------------------------------------------*
* create internal table entries for header segments.
* DESADV:
* E1EDK07
* E1EDKA1
* E1EDK03
* E1EDK08
* E1EDKA2
* E1EDK06
* INVOIC:
* E1EDK01
* E1EDKA1(s)
* E1EDK02
* E1EDK03(s)
*----------------------------------------------------------------------*
FORM idoc_header_segs using value(desadv_ok).
* INVOIC
clear i_seg_num.
invoicdata-segnam = 'E1EDK01'.
e1edk01-action = ie021-stat.
if ie021-currency(2) = 'US'.
e1edk01-curcy = 'USD'.
else.
e1edk01-curcy = 'JPY'.
endif.
invoicdata-sdata = e1edk01.
append_idoc_rec invoicdata i.
clear e1edka1.
invoicdata-segnam = 'E1EDKA1'.
e1edka1-parvw = 'RE'.
e1edka1-partn = ie021-shipto_id.
invoicdata-sdata = e1edka1.
append_idoc_rec invoicdata i.
clear e1edka1.
invoicdata-segnam = 'E1EDKA1'.
e1edka1-parvw = 'LF'.
e1edka1-partn = ie021-lifnr.
e1edka1-lifnr = ie021-shipto_id.
invoicdata-sdata = e1edka1.
append_idoc_rec invoicdata i.
clear e1edk03.
invoicdata-segnam = 'E1EDK03'.
e1edk03-iddat = '012'.
e1edk03-datum = ie021-create_date.
invoicdata-sdata = e1edk03.
append_idoc_rec invoicdata i.
invoicdata-segnam = 'E1EDK03'.
e1edk03-iddat = '024'.
invoicdata-sdata = e1edk03.
append_idoc_rec invoicdata i.
* DESADV
clear d_seg_num.
desadvdata-segnam = 'E1EDK07'.
e1edk07-action = ie021-stat.
e1edk07-bolnr = ie021-invoice_no.
desadvdata-sdata = e1edk07.
append_idoc_rec desadvdata d.
clear e1edka1.
desadvdata-segnam = 'E1EDKA1'.
desadvdata-sdata = e1edka1.
append_idoc_rec desadvdata d.
clear e1edk03.
desadvdata-segnam = 'E1EDK03'.
desadvdata-sdata = e1edk03.
append_idoc_rec desadvdata d.
clear e1edk08.
desadvdata-segnam = 'E1EDK08'.
e1edk08-vbeln = ie021-invoice_no.
e1edk08-traid = ie021-ship_id.
e1edk08-traty = ie021-ship_method.
desadvdata-sdata = e1edk08.
append_idoc_rec desadvdata d.
clear e1edka2.
desadvdata-segnam = 'E1EDKA2'.
desadvdata-sdata = e1edka2.
append_idoc_rec desadvdata d.
clear e1edk06.
desadvdata-segnam = 'E1EDK06'.
e1edk06-iddat = '025'. "document date
e1edk06-datum = ie021-create_date.
desadvdata-sdata = e1edk06.
append_idoc_rec desadvdata d.
*DESADV
clear e1edp07.
desadvdata-segnam = 'E1EDP07'.
e1edp07-bstnk = ie021-po_number.
e1edp07-posex = ie021-po_lineno.
desadvdata-sdata = e1edp07.
append_idoc_rec desadvdata d.
p07_ctr = p07_ctr + 1.
*&---------------------------------------------------------------------*
*& Form idoc_item_segs
*&---------------------------------------------------------------------*
* create internal table entries for PO item segments:
* DESADV: E1EDP09
* INVOIC: E1EDP01 Qtys
* E1EDP02 ref nos. (PO number / line)
* E1EDP19 part numbers
* E1EDP26 amounts
* E1EDP04 taxes
*----------------------------------------------------------------------*
FORM idoc_item_segs using value(desadv_ok).
*INVOIC
clear e1edp01.
invoicdata-segnam = 'E1EDP01'.
e1edp01-menee = ie021-qty_uom.
e1edp01-menge = ie021-invoice_qty.
e1edp01-vprei = ie021-unit_price.
e1edp01-pmene = ie021-price_uom.
e1edp01-peinh = ie021-price_qty.
e1edp01-netwr = ie021-line_amount.
invoicdata-sdata = e1edp01.
append_idoc_rec invoicdata i.
clear e1edp02.
invoicdata-segnam = 'E1EDP02'.
e1edp02-qualf = '001'.
e1edp02-belnr = ie021-po_number.
e1edp02-zeile = ie021-po_lineno.
invoicdata-sdata = e1edp02.
append_idoc_rec invoicdata i.
clear e1edp19.
invoicdata-segnam = 'E1EDP19'.
e1edp19-qualf = '001'.
e1edp19-idtnr = ie021-cust_partno.
invoicdata-sdata = e1edp19.
append_idoc_rec invoicdata i.
clear e1edp19.
invoicdata-segnam = 'E1EDP19'.
e1edp19-qualf = '002'.
e1edp19-idtnr = ie021-vendor_partno.
invoicdata-sdata = e1edp19.
append_idoc_rec invoicdata i.
clear e1edp26.
invoicdata-segnam = 'E1EDP26'.
e1edp26-qualf = '003'.
e1edp26-betrg = ie021-line_amount.
invoicdata-sdata = e1edp26.
append_idoc_rec invoicdata i.
n_line_amt = ie021-line_amount.
invoice_total = invoice_total + n_line_amt.
*DESADV
clear e1edp09.
desadvdata-segnam = 'E1EDP09'.
e1edp09-vbeln = ie021-slip_number.
e1edp09-matnr = ie021-vendor_partno.
e1edp09-vrkme = ie021-qty_uom.
e1edp09-lfimg = ie021-invoice_qty.
desadvdata-sdata = e1edp09.
append_idoc_rec desadvdata d.
***********************************************************************
*& Form post_idocs
*&---------------------------------------------------------------------*
* create database IDocs from the idocdata tables and clear tables.
*----------------------------------------------------------------------*
FORM post_idocs using value(desadv_ok).
*INVOIC
clear e1eds01.
invoicdata-segnam = 'E1EDS01'.
e1eds01-sumid = '010'.
e1eds01-summe = invoice_total.
e1eds01-waerq = ie021-currency.
shift e1eds01-summe left deleting leading space.
invoicdata-sdata = e1eds01.
append_idoc_rec invoicdata i.
commit work.
*DESADV
if desadv_ok = '000'.
clear e1eds02.
desadvdata-segnam = 'E1EDS02'.
e1eds02-sumid = '001'.
e1eds02-summe = p07_ctr.
shift e1eds02-summe left deleting leading space.
desadvdata-sdata = e1eds02.
append_idoc_rec desadvdata d.
commit work.
endif.
refresh: desadvdata,
invoicdata.
clear:
desadvdata,
invoicdata,
p07_ctr,
invoice_total,
save_stat,
save_po,
save_line,
*&---------------------------------------------------------------------*
*& Form init_desadv
*&---------------------------------------------------------------------*
* add a DESDAV control record and initialize fields
*----------------------------------------------------------------------*
FORM init_desadv.
append dedidc.
*&---------------------------------------------------------------------*
*& Form init_invoic
*&---------------------------------------------------------------------*
* add a INVOIC control record and initialize fields
*----------------------------------------------------------------------*
FORM init_invoic.
append iedidc.
TABLES: tstct.
ABAP Programming Tips Page 99 of 157
TYPES: BEGIN OF itab_tx,
tcode LIKE tstct-tcode,
ttext LIKE tstct-ttext,
END OF itab_tx.
AT SELECTION-SCREEN OUTPUT.
p_file = 'C:\SAPTXlist.xls'.
p_dnld = 'X'.
MOVE 'I' TO s_sprsl-sign.
MOVE 'EQ' TO s_sprsl-option.
MOVE 'EN' TO s_sprsl-low.
APPEND s_sprsl.
START-OF-SELECTION.
REFRESH itab_tx.
IF sy-subrc <> 0.
MESSAGE s265(sf).
ELSE.
SORT itab_tx BY tcode.
LOOP AT itab_tx.
WRITE: /1 itab_tx-tcode(20),
AT 20 itab_tx-ttext.
ENDLOOP.
IF p_dnld = 'X'.
CLEAR fields.
fields-tabname = 'RLGRAP'.
fields-fieldname = 'FILENAME'.
fields-value = p_file.
fields-field_attr = '00'.
APPEND fields.
CALL FUNCTION 'POPUP_GET_VALUES'
EXPORTING
popup_title = text-003
IMPORTING
returncode = returncode
TABLES
fields = fields
EXCEPTIONS
error_in_fields = 1
OTHERS = 2.
filestring = fields-value.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
filename = filestring
tables: vbrk,
vbrp,
knvp,
kna1,
T100,
BHDGD.
*________________________________________________________
* DEFINITIONS
*________________________________________________________
define add_comma.
* add comma for selection criteria output string
if offset > 0.
&1_string_&2+offset(1) = ','.
offset = offset + 2.
endif.
DEFINE create_string.
* loop for inclusions
loop at s_&1.
offset = strlen( &1_string_&2 ).
c_low = s_&1-low.
c_high = s_&1-high.
shift c_low left deleting leading '0'.
shift c_high left deleting leading '0'.
shift c_low left deleting leading space.
shift c_high left deleting leading space.
if '&1' = 'date'.
concatenate c_low+4(2) '/' c_low+6(2) '/'
c_low+2(2) into c_low.
if not c_high is initial.
concatenate c_high+4(2) '/' c_high+6(2) '/'
c_high+2(2) into c_high.
endif.
endif.
case s_&1-option.
when 'EQ'.
check s_&1-sign = '&2'.
add_comma &1 &2.
&1_string_&2+offset = c_low.
when 'NE'.
check s_&1-sign = '&3'.
add_comma &1 &2.
&1_string_&2+offset = c_low.
when 'GT'.
check s_&1-sign = '&2'.
add_comma &1 &2.
&1_string_&2+offset = 'Greater than'.
offset = offset + 13.
&1_string_&2+offset = c_low.
when 'LE'.
check s_&1-sign = '&2'.
DEFINE WRITE_STRING.
INITIALIZATION.
r_atyp-SIGN = 'I'.
r_atyp-OPTION = 'EQ'.
r_atyp-LOW = 'C'. "order
APPEND r_atyp.
r_atyp-LOW = 'E'. "sched. agree.
APPEND r_atyp.
r_atyp-LOW = 'F'. "sched. agree. w/ext.agent
APPEND r_atyp.
r_atyp-LOW = 'H'. "returns
APPEND r_atyp.
r_vtyp-SIGN = 'I'.
r_vtyp-OPTION = 'EQ'.
r_vtyp-LOW = 'M'. "invoice
APPEND r_vtyp.
r_vtyp-LOW = 'N'. "invoice cancellation
APPEND r_vtyp.
r_vtyp-LOW = 'O'. "credit memo
APPEND r_vtyp.
r_vtyp-LOW = 'S'. "credit memo cancellation
APPEND r_vtyp.
AT SELECTION-SCREEN.
create_string date I E.
create_string date E I.
create_string cust I E.
create_string cust E I.
create_string srep I E.
create_string srep E I.
create_string mgrp I E.
create_string mgrp E I.
create_string gpct I E.
create_string gpct E I.
START-OF-SELECTION.
* ASSUMPTION: All quantities are in sales units. Since quantities
* are summed to the material group level, it is assumed that all
* materials within a material group have the same sales unit of
* measure.
END-OF-SELECTION.
PERFORM INIT_BATCH_HEADING.
PERFORM LIST_DISPLAY.
AT LINE-SELECTION.
* run transaction to display invoice document
* passing parameter values via memory
SET PARAMETER ID 'VF' FIELD REPLINES-VBELN.
CALL TRANSACTION 'VF03' AND SKIP FIRST SCREEN.
*******************************************
TOP-OF-PAGE DURING LINE-SELECTION.
PERFORM HEADING_DISPLAY.
*******************************************
TOP-OF-PAGE.
PERFORM HEADING_DISPLAY.
data: invoice_no(10).
LOOP AT REPLINES.
FORMAT COLOR COL_NORMAL INTENSIFIED ON INVERSE OFF.
check ( replines-fkimg > 0 or
replines-KZWI2 > 0 or
replines-WAVWR > 0 ).
* change sign on cancellations
if ( replines-vbtyp = 'N' or
replines-vbtyp = 'S' ).
replines-fkimg = replines-fkimg * neg.
replines-KZWI2 = replines-KZWI2 * neg.
replines-WAVWR = replines-WAVWR * neg.
endif.
* calculate gross profit percent and apply selection value range
gross_profit = replines-kzwi2 - replines-wavwr.
gp_percent = ( gross_profit / replines-kzwi2 ) * hun.
check: gp_percent in s_gpct,
replines-kunn2 in s_srep.
* calculate unit price
uprice = replines-kzwi2 / replines-fkimg.
* calculate unit cost
ucost = replines-wavwr / replines-fkimg.
* begin output
if ( save_matnr <> replines-matnr and
not save_matnr is initial ).
perform material_footer.
endif.
if ( save_matkl <> replines-matkl and
not save_matkl is initial ).
perform material_group_footer.
endif.
save_matkl = replines-matkl.
save_matnr = replines-matnr.
save_arktx = replines-arktx.
invoice_no = replines-vbeln.
shift: invoice_no left deleting leading '0',
replines-kunag left deleting leading '0',
replines-matnr left deleting leading '0'.
WRITE: /01(3) REPLINES-MATKL,
05(20) REPLINES-ARKTX,
26(7) REPLINES-MATNR,
34(8) REPLINES-KUNAG,
42(14) REPLINES-NAME1,
57(10) INVOICE_NO,
68 REPLINES-FKDAT MM/DD/YY,
79(12) REPLINES-FKIMG decimals 0,
92(15) REPLINES-KZWI2,
108(12) UPRICE,
121(15) REPLINES-WAVWR,
137(12) UCOST,
150(15) gross_profit,
166(8) gp_percent,
175 '%'.
HIDE: REPLINES-BUKRS, REPLINES-VBELN.
* Report footer
IF NOT SY-SUBRC IS INITIAL.
SKIP. SKIP.
WRITE: /50 '*** NO RECORDS SELECTED ***'.
EXIT.
ELSE.
FORMAT COLOR COL_KEY ON INTENSIFIED OFF INVERSE OFF.
WRITE: /55 '*** END OF REPORT ***'.
ENDIF.
SY-LSIND = 0. "replaces basic list
ENDFORM.
*----------------------------------------------------------------------
FORM INIT_BATCH_HEADING.
* BHDGD-LINES = SY-LINSZ. "number of characters per line
BHDGD-LINES = 177. "number of characters per line
BHDGD-UNAME = SY-UNAME. "user name creating report
BHDGD-REPID = SY-REPID. "abap name
BHDGD-LINE1 = SY-TITLE. "report title from attributes
BHDGD-BUKRS = '7100'. "company
BHDGD-INIFL = '0'. "says you are initializing the heading
ENDFORM.
*----------------------------------------------------------------------
FORM HEADING_DISPLAY.
PERFORM BATCH-HEADING(RSBTCHH0).
SKIP.
h_tag = 'Invoice Dates'.
write_string date.
h_tag = 'Customers'.
write_string cust.
h_tag = 'Sales Reps'.
write_string srep.
h_tag = 'Material Groups'.
write_string mgrp.
h_tag = 'Gr.Profit Pct'.
write_string gpct.
skip 2.
FORMAT COLOR COL_KEY ON INTENSIFIED OFF INVERSE OFF.
WRITE: /01 'Mat',
26 'ATAC',
34 'Customer',
57 'Invoice',
68 'Invoice',
79(12) 'Invoice' right-justified,
92(15) 'Extended' right-justified,
108(12) 'Unit or Avg' right-justified,
121(15) 'Extended' right-justified,
137(12) 'Unit or Avg' right-justified,
150(15) 'Gross' right-justified,
/01 'Grp',
05 'Item Nbr',
26 'Nbr',
34 'Nbr',
42 'Name',
57 'Nbr',
68 'Date',
79(12) 'Quantity' right-justified,
92(15) 'Price' right-justified,
108(12) 'Price' right-justified,
121(15) 'Cost' right-justified,
137(12) 'Cost' right-justified,
150(15) 'Profit' right-justified,
171 'GP%'.
*&---------------------------------------------------------------------*
*& Form product_group_footer
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM material_group_footer.
clear: FKIMG_SUM_GRP,
KZWI2_SUM_GRP,
WAVWR_SUM_GRP.
*&---------------------------------------------------------------------*
*& Form invoice_footer
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM material_footer.
clear: FKIMG_SUM_MAT,
KZWI2_SUM_MAT,
WAVWR_SUM_MAT.
ENDFORM. " material_footer
val = 0.
do 4 times.
ENDDO.
PERFORM CLOSEGRAPH.
************************************************************
FORM CLOSEGRAPH.
tables: edidc,
mkpf,
ekpo,
rbkp,
e1edk01,
e1edka1,
e1edk02,
e1edp02.
constants:
* name of container element (workitem object id)
C_ELEMENT_WI_OBJ_ID LIKE SWCONT-ELEMENT VALUE '_WI_OBJECT_ID',
* name of container element (NumberPlusEventcode)
C_ELEMENT_NO_PLUS_INFO LIKE SWCONT-ELEMENT
VALUE 'NumberPlusEventcode'.
TYPE-POOLS:
* general idoc type pool
TIDOC.
************************************************************************
* INCLUDES *
************************************************************************
* include for workflow programming
INCLUDE <CNTN01>.
************************************************************************
* INNITIALIZATION *
************************************************************************
initialization.
* create IDoc status selection table.
clear r_status. refresh r_status.
************************************************************************
* START-OF-SELECTION
************************************************************************
loop at iedidc.
clear rc.
c_docnum = iedidc-docnum.
shift c_docnum left deleting leading '0'.
* 'Cannot retrieve data for INVOIC IDoc & (Goods Receipt processing)'
message w030 with c_docnum.
continue.
else.
CALL FUNCTION 'EDI_DOCUMENT_CLOSE_READ'
EXPORTING
DOCUMENT_NUMBER = iedidc-docnum
IMPORTING
IDOC_CONTROL = iedidc.
* If this is a change or modify IDoc, change status to 51 (error).
* One & only one K01 segment should exist -
read table data_rec with key segnam = 'E1EDK01'.
if sy-subrc is initial.
move data_rec-sdata to e1edk01.
case e1edk01-action.
when '000'. "original data
* OK - do nothing
when '002'. "modified data
* 'Invoice & - IDoc for Review Only'
perform idoc_status_update using '51' '028'
'Modification' ' '.
when '002'. "modified data
* 'Invoice & - IDoc for Review Only'
perform idoc_status_update using '51' '028'
'Cancellation' ' '.
endcase.
endif.
endloop. "iedidc
end-of-selection.
*-----------------------------------------------------------------------
* FORM IDOC_STATUS_UPDATE
* Creates status records for the selected IDocs.
*-----------------------------------------------------------------------
FORM IDOC_STATUS_UPDATE using value(i_stat)
value(i_msgno)
value(i_msgv1)
value(i_msgv2).
tables: edi_ds, tede2.
data:
l_commit_counter LIKE ediglodata-comcount value '00000001',
inbsync LIKE ediglodata-inbsync,
t_couple_to_process LIKE ediinbound OCCURS 0 WITH HEADER LINE.
CLEAR EDI_DS.
EDI_DS-DOCNUM = iedidc-DOCNUM.
EDI_DS-STATUS = i_stat.
EDI_DS-REPID = 'ZS7BM000007'.
EDI_DS-TABNAM = 'EDI_DS'.
EDI_DS-MANDT = SY-MANDT.
EDI_DS-STAMQU = 'SAP'.
EDI_DS-STAMID = 'ZS7'.
EDI_DS-STAMNO = i_msgno.
EDI_DS-STAPA1 = i_msgv1.
EDI_DS-STAPA2 = i_msgv2.
GET TIME.
EDI_DS-LOGDAT = SY-DATUM.
EDI_DS-LOGTIM = SY-UZEIT.
if i_stat = '51'.
clear: t_couple_to_process.
refresh: t_couple_to_process.
PERFORM analyzing_event_create
TABLES
t_couple_to_process
USING
l_commit_counter
inbsync.
if sy-subrc is initial.
COMMIT WORK.
endif. "link created
endif. "tede2 found
endif.
ENDFORM.
*-----------------------------------------------------------------------
* FORM ANALYZING_EVENT_CREATE
* Creates link between IDoc and workflow container.
* SAP code stolen from LEDINF01
*-----------------------------------------------------------------------
FORM analyzing_event_create
TABLES
t_couple_to_process_in STRUCTURE ediinbound
USING
commit_counter_in LIKE ediglodata-comcount
start_recfb_synchron_in LIKE ediglodata-inbsync.
* local variables
DATA:
* instance that is created
l_object TYPE swc_object,
* object key, e.g IDoc number
l_object_key LIKE swotobjid-objkey,
* id of wf event
l_event_id LIKE swedumevid-evtid,
* status record for case of error
l_status_record TYPE tidoc_status_record_ext,
* flag indicating whether subscribed task is started synchronously
l_start_recfb_synchron LIKE sweflags-syncflag VALUE ' ',
* idoc number (needed because of type checking)
l_idoc_number LIKE edidc-docnum.
* local constants
CONSTANTS:
* object type 'IDOC'
c_object_type LIKE swetypecou-objtype VALUE 'IDOCINVOIC',
* name of event to be created
c_idc_evt LIKE swetypecou-event VALUE 'INPUTERROROCCURREDMM'
.
if t_couple_to_process_in[] is initial.
COMMIT WORK.
CALL FUNCTION 'DEQUEUE_ALL'.
CLEAR commit_counter_in.
exit.
endif.
* cast
l_start_recfb_synchron = start_recfb_synchron_in.
* declaration of container
swc_container l_t_ev_container.
* initialize container
swc_clear_container l_t_ev_container.
IF ( sy-subrc <> 0 )
* event was not created => error handling for this idoc (EDIM)
OR ( l_event_id = 0 ).
* stop processing, no commit
MESSAGE ID 'E0'
TYPE 'A'
NUMBER '374'
WITH l_status_record-docnum
c_idc_evt
RAISING event_create_failed.
ELSE.
* do commit and reset counter
* the commit will get the idocs to the database and at the same time
* activate the event that was created
COMMIT WORK.
* dequeue all unprocessed IDocs to avoid log-overflow
CALL FUNCTION 'DEQUEUE_ALL'.
CLEAR commit_counter_in.
* reset table of idocs that need to be processed
CLEAR t_couple_to_process_in.
REFRESH t_couple_to_process_in.
ENDIF.
-{{{
SS_CDAT Date Created
{{{
SS_CNAM Created by UserID
{{{
SS_NAME Program Name
{{{
SS_SUBC Program Type
{{{
SS_UDAT Date Changed
{{{
SS_UNAM Last Changed by
UserID
-{{{
%&%& HEADZKBPROGS
DOKU ZHRBDC54 RE E
S_DOCU_SHOW S_DOCUS100002ABAPER1 31H 19990707151635ABAPER1 31H
1999070715193207200000 0
%&%& DOKLZKBPROGS
FORM read-direct-table.
DATA: offs TYPE i.
DATA: len2(5) TYPE n.
DATA: anz_numb TYPE i.
PERFORM gettableinfo USING tabname.
htmlview-htmlcode = '<table border="0" width="100%">'. APPEND htmlview.
htmlview-htmlcode = '<tr valign="middle" BGCOLOR="#5F5F5F">'.
APPEND htmlview.
htmlview-htmlcode = '<FONT SIZE="3" COLOR="#FFBF18" FACE= "Courier
new">'.
APPEND htmlview.
LOOP AT zdfies.
PERFORM htmlheader USING zdfies-fieldname.
flditab-fldname = zdfies-fieldname.
APPEND flditab.
ENDLOOP.
htmlview-htmlcode = '</B></tr>'. APPEND htmlview.
colorval = 1.
SELECT COUNT(*) FROM (tabname) INTO totalrows.
WRITE :/ totalrows.
* form print_tree
FORM PRINT_TREE TABLES ITEMS STRUCTURE ITEMS.
DATA: V_TABIX LIKE SY-TABIX,
START_TABIX LIKE SY-TABIX,
V_LEVEL LIKE SY-TFILL,
V_OFFSET TYPE I,
V_ID LIKE ITEMS-ID,
V_PARENT_ID LIKE ITEMS-PARENT_ID,
V_PARENT_ID_FOR_VLINE LIKE ITEMS-PARENT_ID,
V_PREV_LEVEL TYPE I,
V_ITEMS_COUNT LIKE SY-TFILL,
V_VLINES_STRING(200).
CHECK NOT ITEMS[] IS INITIAL.
SORT ITEMS BY PARENT_ID ID.
READ TABLE ITEMS INDEX 1.
V_PARENT_ID = ITEMS-PARENT_ID.
START_TABIX = 1.
REFRESH TABIX_STACK.
DO.
LOOP AT ITEMS FROM START_TABIX.
V_TABIX = START_TABIX = SY-TABIX. "remember current index
V_ID = ITEMS-ID.
V_PARENT_ID_FOR_VLINE = ITEMS-PARENT_ID.
* decrease level and exit loop if parent not the same as previous
IF ITEMS-PARENT_ID NE V_PARENT_ID.
PERFORM READ_FROM_STACK CHANGING START_TABIX. "level = NoOfRecs
READ TABLE ITEMS INDEX START_TABIX.
V_PARENT_ID = ITEMS-PARENT_ID.
ADD 1 TO START_TABIX. "next loop starts from parent index + 1
* clear vline
IF V_LEVEL > 1.
V_OFFSET = 2 + ( V_LEVEL - 2 ) * 3.
IF V_LEVEL = 1. V_OFFSET = 1. ENDIF.
V_VLINES_STRING+V_OFFSET = ' '.
ENDIF.
EXIT.
ENDIF.
V_PARENT_ID = ITEMS-PARENT_ID.
* write item
FORMAT COLOR OFF.
DESCRIBE TABLE TABIX_STACK LINES V_LEVEL."level is no of StackRecs
WRITE: / V_VLINES_STRING.
V_OFFSET = V_LEVEL * 3.
IF V_LEVEL NE 0.
IF V_PREV_LEVEL < V_LEVEL.
WRITE: AT V_OFFSET '|', / ''.
WRITE: / V_VLINES_STRING.
ENDIF.
V_OFFSET = V_LEVEL * 3.
WRITE AT V_OFFSET '|--'.
ENDIF.
V_OFFSET = V_OFFSET + 3.
CASE ITEMS-SYMBOL.
* form expand_collapse
FORM EXPAND_COLLAPSE USING VALUE(V_ID).
DATA: V_NO_MORE_ORPHANS,
ITEMS_TEMP LIKE ITEMS OCCURS 100 WITH HEADER LINE.
DELETE ITEMS_SHOW WHERE PARENT_ID = V_ID. "try to collapse
IF SY-SUBRC = 0. "succesfull first collapse
DO. "cascade collapse - delete 'orphans' that are left
REFRESH ITEMS_TEMP.
MOVE ITEMS_SHOW[] TO ITEMS_TEMP[].
SORT ITEMS_TEMP BY ID.
V_NO_MORE_ORPHANS = 'X'.
LOOP AT ITEMS_SHOW WHERE PARENT_ID NE ''.
READ TABLE ITEMS_TEMP WITH KEY ID = ITEMS_SHOW-PARENT_ID
BINARY SEARCH TRANSPORTING NO FIELDS.
IF SY-SUBRC NE 0. "no parent - it's an orphan
CLEAR V_NO_MORE_ORPHANS.
DELETE ITEMS_SHOW.
ENDIF.
ENDLOOP.
IF V_NO_MORE_ORPHANS = 'X'. EXIT. ENDIF.
ENDDO.
ITEMS_SHOW-SYMBOL = '+'.
MODIFY ITEMS_SHOW TRANSPORTING SYMBOL WHERE ID = V_ID.
ELSE. "unsuccessfull collapse - expand
ITEMS_SHOW-SYMBOL = '-'.
MODIFY ITEMS_SHOW TRANSPORTING SYMBOL WHERE ID = V_ID.
* form append_item
FORM APPEND_ITEM USING VALUE(ID) VALUE(PARENT_ID) VALUE(TEXT).
ITEMS-ID = ID.
ITEMS-PARENT_ID = PARENT_ID.
ITEMS-TEXT = TEXT.
APPEND ITEMS.
ENDFORM.
* form read_from_stack
FORM READ_FROM_STACK CHANGING TABIX LIKE SY-TABIX.
DESCRIBE TABLE TABIX_STACK.
CHECK SY-TFILL NE 0.
READ TABLE TABIX_STACK INDEX SY-TFILL.
TABIX = TABIX_STACK.
DELETE TABIX_STACK INDEX SY-TFILL.
ENDFORM.
* Default dates
MOVE 'I' TO s_erdat-sign.
MOVE 'BT' TO s_erdat-option.
MOVE sy-datum TO s_erdat-high.
SUBTRACT 7 FROM sy-datum.
MOVE sy-datum TO s_erdat-low.
APPEND s_erdat.
* Default Status
MOVE 'I' TO s_vstat-sign.
MOVE 'NE' TO s_vstat-option.
MOVE '1' TO s_vstat-low.
APPEND s_vstat.
* Default Output
MOVE 'I' TO s_kschl-sign.
MOVE 'EQ' TO s_kschl-option.
MOVE 'ZBA0' TO s_kschl-low.
APPEND s_kschl.
MOVE 'ZBA1' TO s_kschl-low.
APPEND s_kschl.
MOVE 'ZBA2' TO s_kschl-low.
APPEND s_kschl.
MOVE 'ZP00' TO s_kschl-low.
APPEND s_kschl.
MOVE 'ZAVA' TO s_kschl-low.
APPEND s_kschl.
MOVE 'ZD00' TO s_kschl-low.
APPEND s_kschl.
START-OF-SELECTION.
ENDSELECT.
IF sy-subrc <> 0.
MESSAGE i999(b1) WITH 'No records in that range!'.
CASE itab_data-kschl.
WHEN 'ZD00'. "Invoice
READ TABLE itab_data2 WITH KEY objky = itab_data-objky.
CHECK sy-subrc <> 0.
REFRESH: t_roles.
t_object-objkey = itab_data-objky.
t_object-objtype = 'VBRK'.
CALL FUNCTION 'SREL_GET_NEXT_RELATIONS'
EXPORTING
object = t_object
TABLES
roles = t_roles
EXCEPTIONS
internal_error = 1
no_logsys = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE i999(b1) WITH 'Could not execute linked docs FM:'
itab_data-objky.
ELSE.
LOOP AT t_roles WHERE objtype = 'IDOC'.
itab_data2-docnum = t_roles-objkey.
SELECT SINGLE mestyp FROM edidc
INTO itab_data2-mestyp
WHERE docnum = t_roles-objkey.
APPEND itab_data2.
ENDLOOP.
ENDIF.
REFRESH: t_roles.
t_object-objkey = itab_data-objky.
t_object-objtype = 'LIKP'.
CALL FUNCTION 'SREL_GET_NEXT_RELATIONS'
EXPORTING
object = t_object
TABLES
roles = t_roles
EXCEPTIONS
internal_error = 1
no_logsys = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE i999(b1) WITH 'Could not execute linked docs FM:'
itab_data-objky.
ELSE.
LOOP AT t_roles WHERE objtype = 'IDOC'.
itab_data2-docnum = t_roles-objkey.
SELECT SINGLE mestyp FROM edidc
INTO itab_data2-mestyp
WHERE docnum = t_roles-objkey.
APPEND itab_data2.
ENDLOOP.
ENDIF.
REFRESH: t_roles.
t_object-objkey = itab_data-objky.
t_object-objtype = 'BUS2032'.
CALL FUNCTION 'SREL_GET_NEXT_RELATIONS'
EXPORTING
IF sy-subrc <> 0.
MESSAGE i999(b1) WITH 'Could not execute linked docs FM:'
itab_data-objky.
ELSE.
LOOP AT t_roles WHERE objtype = 'IDOC'.
itab_data2-docnum = t_roles-objkey.
SELECT SINGLE mestyp FROM edidc
INTO itab_data2-mestyp
WHERE docnum = t_roles-objkey.
COLLECT itab_data2.
ENDLOOP.
ENDIF.
REFRESH: t_roles.
t_object-objkey = itab_data-objky.
t_object-objtype = 'BUS2035'.
CALL FUNCTION 'SREL_GET_NEXT_RELATIONS'
EXPORTING
object = t_object
TABLES
roles = t_roles
EXCEPTIONS
internal_error = 1
no_logsys = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE i999(b1) WITH 'Could not execute linked docs FM:'
itab_data-objky.
ELSE.
LOOP AT t_roles WHERE objtype = 'IDOC'.
itab_data2-docnum = t_roles-objkey.
SELECT SINGLE mestyp FROM edidc
INTO itab_data2-mestyp
WHERE docnum = t_roles-objkey.
APPEND itab_data2.
ENDLOOP.
ENDIF.
ENDCASE.
ENDLOOP.
ENDIF.
ENDIF.
END-OF-SELECTION.
IF sy-tfill > 0.
IF r_kappl = 'X'.
SORT itab_data BY kappl.
ELSEIF r_objky = 'X'.
SORT itab_data BY objky.
ELSEIF r_kschl = 'X'.
SORT itab_data BY kschl.
ELSEIF r_parnr = 'X'.
SORT itab_data BY parnr.
ELSEIF r_erdat = 'X'.
SORT itab_data BY erdat.
ELSEIF r_usnam = 'X'.
SORT itab_data BY usnam.
ELSEIF r_vstat = 'X'.
SORT itab_data BY vstat.
AT LINE-SELECTION.
GET CURSOR FIELD field_name.
CASE field_name.
WHEN 'ITAB_DATA2-DOCNUM' OR 'ITAB_DATA2-MESTYP'. "IDoc number
CALL FUNCTION 'EDI_DOCUMENT_DATA_DISPLAY'
EXPORTING
docnum = itab_data2-docnum
EXCEPTIONS
no_data_record_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE i999(b1) WITH 'Could not display IDoc:'
itab_data2-docnum.
ENDIF.
CLEAR: itab_data2-docnum.
CASE t_kschl.
WHEN 'ZAVA'. "Delivery
SET PARAMETER ID 'VL' FIELD itab_data-objky.
CALL TRANSACTION 'VL03' AND SKIP FIRST SCREEN.
WHEN OTHERS.
MESSAGE i999(b1) WITH 'Unrecognized Output Type!'.
ENDCASE.
WHEN OTHERS.
MESSAGE i999(b1) WITH 'Please click the Doc or Partner #.'.
ENDCASE.
*&---------------------------------------------------------------------*
*& Form print_itab_data
*&---------------------------------------------------------------------*
* Print out ITAB_DATA
*----------------------------------------------------------------------*
* -->T_ITAB_DATA Internal Table Data
*----------------------------------------------------------------------*
FORM print_itab_data
TABLES t_itab_data STRUCTURE itab_data
t_itab_data2 STRUCTURE itab_data2.
LOOP AT t_itab_data.
TYPE-POOLS: slis.
* Initialization fieldcatalog
INITIALIZATION.
g_repid = sy-repid.
PERFORM fieldcat_init USING gt_fieldcat[].
* Start of Selection
START-OF-SELECTION.
* Data selection
PERFORM select_data TABLES gt_outtab.
* Display list
END-OF-SELECTION.
CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
EXPORTING
i_callback_program = g_repid
it_fieldcat = gt_fieldcat[]
TABLES
t_outtab = gt_outtab.
*-----------------------------------------------------------------------
* Forms
*-----------------------------------------------------------------------
FORM fieldcat_init
USING rt_fieldcat TYPE slis_t_fieldcat_alv.
DATA: ls_fieldcat TYPE slis_fieldcat_alv.
DATA: pos TYPE i VALUE 1.
CLEAR ls_fieldcat.
ls_fieldcat-col_pos = pos.
ls_fieldcat-fieldname = 'BKPF-BUDAT'. "Posting Date
ls_fieldcat-ref_fieldname = 'BUDAT'.
ls_fieldcat-ref_tabname = 'BKPF'.
ls_fieldcat-key = 'X'.
APPEND ls_fieldcat TO rt_fieldcat.
CLEAR ls_fieldcat.
pos = pos + 1.
ls_fieldcat-col_pos = pos.
ls_fieldcat-fieldname = 'BSEG-BELNR'. "Acct Doc Number
ls_fieldcat-ref_fieldname = 'BELNR'.
ls_fieldcat-ref_tabname = 'BSEG'.
APPEND ls_fieldcat TO rt_fieldcat.
CLEAR ls_fieldcat.
pos = pos + 1.
ls_fieldcat-col_pos = pos.
ls_fieldcat-fieldname = 'BSEG-HKONT'. "Acct number
ls_fieldcat-ref_fieldname = 'HKONT'.
ls_fieldcat-ref_tabname = 'BSEG'.
APPEND ls_fieldcat TO rt_fieldcat.
CLEAR ls_fieldcat.
pos = pos + 1.
ls_fieldcat-col_pos = pos.
ls_fieldcat-fieldname = 'BSEG-KOSTL'. "Cost Center
ls_fieldcat-ref_fieldname = 'KOSTL'.
ls_fieldcat-ref_tabname = 'BSEG'.
APPEND ls_fieldcat TO rt_fieldcat.
CLEAR ls_fieldcat.
pos = pos + 1.
ls_fieldcat-col_pos = pos.
ls_fieldcat-fieldname = 'SKAT-TXT20'. "Acct Description
ls_fieldcat-col_pos = pos.
ls_fieldcat-fieldname = 'SKAT-TXT50'. "Acct Description
ls_fieldcat-ref_fieldname = 'TXT50'.
ls_fieldcat-ref_tabname = 'SKAT'.
LS_FIELDCAT-NO_OUT = 'X'.
APPEND ls_fieldcat TO rt_fieldcat.
CLEAR ls_fieldcat.
pos = pos + 1.
* ls_fieldcat-col_pos = pos.
* ls_fieldcat-fieldname = 'BSEG-AUGBL'. "Clearing Doc
* ls_fieldcat-ref_fieldname = 'AUGBL'.
* ls_fieldcat-ref_tabname = 'BSEG'.
* APPEND ls_fieldcat TO rt_fieldcat.
* CLEAR ls_fieldcat.
* pos = pos + 1.
ls_fieldcat-col_pos = pos.
ls_fieldcat-fieldname = 'BSEG-KUNNR'. "Cust number
ls_fieldcat-ref_fieldname = 'KUNNR'.
ls_fieldcat-ref_tabname = 'BSEG'.
APPEND ls_fieldcat TO rt_fieldcat.
CLEAR ls_fieldcat.
pos = pos + 1.
ls_fieldcat-col_pos = pos.
ls_fieldcat-fieldname = 'KNA1-NAME1'. "Customer name
ls_fieldcat-ref_fieldname = 'NAME1'.
ls_fieldcat-ref_tabname = 'KNA1'.
APPEND ls_fieldcat TO rt_fieldcat.
CLEAR ls_fieldcat.
pos = pos + 1.
ls_fieldcat-col_pos = pos.
ls_fieldcat-fieldname = 'BKPF-XBLNR'. "Ref Doc (Check) Number
ls_fieldcat-ref_fieldname = 'XBLNR'.
ls_fieldcat-ref_tabname = 'BKPF'.
APPEND ls_fieldcat TO rt_fieldcat.
CLEAR ls_fieldcat.
pos = pos + 1.
ls_fieldcat-col_pos = pos.
ls_fieldcat-fieldname = 'BSEG-SHKZG'. "DR/CR ind.
ls_fieldcat-ref_fieldname = 'SHKZG'.
ls_fieldcat-ref_tabname = 'BSEG'.
LS_FIELDCAT-NO_OUT = 'X'.
APPEND ls_fieldcat TO rt_fieldcat.
CLEAR ls_fieldcat.
pos = pos + 1.
ls_fieldcat-col_pos = pos.
ls_fieldcat-fieldname = 'BSEG-WRBTR'. "Amt in Doc Currency
ls_fieldcat-ref_fieldname = 'WRBTR'.
ls_fieldcat-ref_tabname = 'BSEG'.
APPEND ls_fieldcat TO rt_fieldcat.
CLEAR ls_fieldcat.
pos = pos + 1.
ls_fieldcat-col_pos = pos.
ls_fieldcat-fieldname = 'BKPF-WAERS'. "Currency Key
ls_fieldcat-ref_fieldname = 'WAERS'.
ls_fieldcat-ref_tabname = 'BKPF'.
APPEND ls_fieldcat TO rt_fieldcat.
CLEAR ls_fieldcat.
pos = pos + 1.
ls_fieldcat-col_pos = pos.
ls_fieldcat-col_pos = pos.
ls_fieldcat-fieldname = 'BSEG-DMBTR'. "Amt in Local Currency
ls_fieldcat-ref_fieldname = 'DMBTR'.
ls_fieldcat-ref_tabname = 'BSEG'.
APPEND ls_fieldcat TO rt_fieldcat.
CLEAR ls_fieldcat.
pos = pos + 1.
ls_fieldcat-col_pos = pos.
ls_fieldcat-fieldname = 'BSEG-GJAHR'. "Fiscal Year
ls_fieldcat-ref_fieldname = 'GJAHR'.
ls_fieldcat-ref_tabname = 'BSEG'.
LS_FIELDCAT-NO_OUT = 'X'.
APPEND ls_fieldcat TO rt_fieldcat.
CLEAR ls_fieldcat.
pos = pos + 1.
ls_fieldcat-col_pos = pos.
ls_fieldcat-fieldname = 'BSEG-BUZEI'. "Doc Line #
ls_fieldcat-ref_fieldname = 'BUZEI'.
ls_fieldcat-ref_tabname = 'BSEG'.
LS_FIELDCAT-NO_OUT = 'X'.
APPEND ls_fieldcat TO rt_fieldcat.
CLEAR ls_fieldcat.
pos = pos + 1.
ls_fieldcat-col_pos = pos.
ls_fieldcat-fieldname = 'BSEG-BSCHL'. "Posting Key
ls_fieldcat-ref_fieldname = 'BSCHL'.
ls_fieldcat-ref_tabname = 'BSEG'.
LS_FIELDCAT-NO_OUT = 'X'.
APPEND ls_fieldcat TO rt_fieldcat.
CLEAR ls_fieldcat.
pos = pos + 1.
ls_fieldcat-col_pos = pos.
ls_fieldcat-fieldname = 'BKPF-BUKRS'. "Company Code
ls_fieldcat-ref_fieldname = 'BUKRS'.
ls_fieldcat-ref_tabname = 'BKPF'.
LS_FIELDCAT-NO_OUT = 'X'.
APPEND ls_fieldcat TO rt_fieldcat.
CLEAR ls_fieldcat.
pos = pos + 1.
ls_fieldcat-col_pos = pos.
ls_fieldcat-fieldname = 'BKPF-BLART'. "Document Type
ls_fieldcat-ref_fieldname = 'BLART'.
ls_fieldcat-ref_tabname = 'BKPF'.
APPEND ls_fieldcat TO rt_fieldcat.
CLEAR ls_fieldcat.
pos = pos + 1.
ls_fieldcat-col_pos = pos.
ls_fieldcat-fieldname = 'BSEG-SGTXT'. "Item Text
ls_fieldcat-ref_fieldname = 'SGTXT'.
ls_fieldcat-col_pos = pos.
ls_fieldcat-fieldname = 'BKPF-USNAM'. "User name
ls_fieldcat-ref_fieldname = 'USNAM'.
ls_fieldcat-ref_tabname = 'BKPF'.
LS_FIELDCAT-NO_OUT = 'X'.
APPEND ls_fieldcat TO rt_fieldcat.
CLEAR ls_fieldcat.
ENDFORM. "fieldcat_init
* Data selection
FORM select_data TABLES rt_outtab LIKE gt_outtab[].
DATA: l_name LIKE tline-tdline.
* IF s_hkont IS INITIAL.
SELECT bukrs belnr blart budat usnam xblnr waers kursf INTO
CORRESPONDING FIELDS OF TABLE
i_bkpf FROM bkpf WHERE belnr IN s_belnr
AND blart IN s_blart
AND budat IN s_budat.
LOOP AT i_bkpf.
SELECT hkont kostl belnr gjahr buzei bschl shkzg dmbtr wrbtr sgtxt
kunnr INTO (bseg-hkont, bseg-kostl, bseg-belnr, bseg-gjahr,
bseg-buzei, bseg-bschl, bseg-shkzg, bseg-dmbtr,
bseg-wrbtr, bseg-sgtxt, bseg-kunnr) FROM bseg
WHERE belnr EQ i_bkpf-belnr.
CLEAR: KNA1, skat.
SELECT SINGLE * FROM skat WHERE SPRAS EQ SY-LANGU
AND KTOPL EQ '7100'
AND SAKNR = bseg-hkont.
APPEND rt_outtab.
CLEAR: rt_outtab.
ENDSELECT.
ENDLOOP.
INCLUDE <SYMBOL>.
INCLUDE <ICON>.
SELECTION-SCREEN: BEGIN OF BLOCK PROG
WITH FRAME TITLE TEXT-F58.
INCLUDE RSAQEXCD.
DATA %DATA_SELECTED(1).
DATA %GLFRAME(1) VALUE 'X' .
DATA %UFLAG(1).
DATA %USTFLAG(1).
DATA %GRST_TEXT(255).
DATA %GLLINE TYPE I.
DATA %TABIX LIKE SY-TABIX.
DATA %PRFLAG(1) TYPE X VALUE '02'.
AT SELECTION-SCREEN .
PERFORM ALVL_CHECK(RSAQEXCE) USING %ALVL 'G00'.
PERFORM TESTMODE(RSAQEXCE).
PERFORM CHECK_EXPCOL(RSAQEXCE) USING %ALV.
AT SELECTION-SCREEN OUTPUT .
PERFORM RINIT(RSAQBRST).
PERFORM SET_EXPCOL(RSAQEXCE) USING %ALV PB%EXCO.
PERFORM ALVL_SET_INVISIBLE(RSAQEXCE).
PERFORM SET_XINT_PARAMS(RSAQEXCE).
INITIALIZATION.
PERFORM INIT_XINT(RSAQEXCE).
PERFORM SET_WWW_FLAGS(RSAQEXCE).
START-OF-SELECTION.
INSERT MAKT-MAKTX INTO HEADER.
INSERT %COUNT-MBEW INTO HEADER.
END-OF-SELECTION.
SORT AS TEXT BY
MAKT-MAKTX
%COUNT-MBEW
%LINR-MBEW.
TOP-OF-PAGE.
PERFORM %TOP-OF-PAGE.
END-OF-PAGE.
PERFORM PAGE_FOOT(RSAQEXCE).
PERFORM %SAVE_PAGE.
AT USER-COMMAND.
CASE SY-UCOMM.
WHEN 'EXIT'.
LEAVE.
WHEN 'RETN'.
PERFORM RETURN(RSAQEXCE).
WHEN 'CANC'.
PERFORM RETURN(RSAQEXCE).
FORM %COMP_LDESC.
REFRESH %LDESC.
REFRESH %GDESC.
PERFORM LDESC(RSAQEXCE) USING 'G00010000X018 00 98'
TEXT-A00 TEXT-B00 TEXT-H00 'MBEW-MATNR' MBEW-MATNR 'MBEW-MATNR'.
PERFORM LDESC(RSAQEXCE) USING 'G00020000X040 01 98'
TEXT-A01 TEXT-B01 TEXT-H00 'MAKT-MAKTX' MAKT-MAKTX 'MAKT-MAKTX'.
PERFORM LDESC(RSAQEXCE) USING 'G00030062 015F 00 98'
TEXT-A02 TEXT-B02 TEXT-H00 'MBEW-VERPR' MBEW-VERPR 'MBEW-VERPR'.
PERFORM LDESC(RSAQEXCE) USING 'G00040000 005W 00 98'
TEXT-A03 TEXT-B03 TEXT-H00 'T001-WAERS' T001-WAERS
'T001-WAERS-0103'.
PERFORM LDESC(RSAQEXCE) USING 'G00050084 006 00 98'
TEXT-A04 TEXT-B04 TEXT-H00 'MBEW-PEINH' MBEW-PEINH 'MBEW-PEINH'.
PERFORM GDESC(RSAQEXCE) USING 'G00' 5 20 ' ' ' ' 'X'.
ENDFORM.
FORM %OUTPUT.
ENDFORM.
FORM %TOP-OF-PAGE.
ENDFORM.
FORM %NEWLINE.
%UFLAG = SPACE.
NEW-LINE.
WRITE: '|', 252 '|'.
POSITION 2.
ENDFORM.
IF SY-LINNO > 1.
%UFLAG = SPACE.
DO COUNT TIMES.
NEW-LINE.
FORMAT RESET.
WRITE: '|', 252 '|'.
ENDDO.
ENDIF.
ENDFORM.
FORM %ULINE.
IF %UFLAG = SPACE.
IF SY-LINNO > 1.
ULINE /1(252).
ENDIF.
%UFLAG = 'X'.
ENDIF.
ENDFORM.
FORM %HIDE.
FORM %HIDE_COLOR.
ENDFORM.
FIELD-SYMBOLS <FIELD>.
ENDFORM.
FORM %SAVE_PAGE.
ENDFORM.
FIELD-SYMBOLS <VAR>.
ENDFORM.
FORM %SAVE_LIST.
DATA: %SFLAG,
QREPORT LIKE SY-REPID.
ENDFORM.
FORM %REFRESH.
CASE %TAB.
WHEN 'G00'.
IMPORT %G00 FROM DATABASE AQLDB(AQ) ID %QL_ID.
ENDFORM.
PERFORM INIT_DOWNLOAD(RSAQEXCE).
QREPORT = SY-REPID.
CASE %TAB.
WHEN 'G00'.
PERFORM DOWNLOAD(RSAQEXCE)
TABLES %G00 USING CODE QREPORT TEXT-GRL.
WHEN OTHERS.
MESSAGE S860(AQ).
ENDCASE.
ENDFORM.
ENDFORM.
ENDFORM.
SUBRC = 0.
CASE LID.
WHEN 'G00'.
CREATE DATA REF_TO_ITAB LIKE %G00[].
WHEN OTHERS.
SUBRC = 4.
MESSAGE S860(AQ).
ENDCASE.
ENDFORM.
FORM %VIEW.
PROG = SY-REPID.
PERFORM INIT_DOWNLOAD(RSAQEXCE).
CASE %TAB.
WHEN 'G00'.
PERFORM GENERATE_VIEW_DYNPRO(RSAQEXCE)
USING PROG TEXT-GRL.
DESCRIBE TABLE %G00 LINES ANZ.
TVIEW100-LINES = ANZ.
PERFORM INIT_VIEW(RSAQEXCE) TABLES %G00 USING TVIEW100.
CALL SCREEN 100.
PERFORM RESET_VIEW_DYNPRO(RSAQEXCE).
WHEN OTHERS.
MESSAGE S860(AQ).
ENDCASE.
ENDFORM.
FORM %OUTPUT_GL.
IF %MAX_PRLIST <> 0.
ENDFORM.
ENDMODULE.
CASE %TAB.
WHEN 'G00'.
PERFORM LOOP_PBO(RSAQEXCE) TABLES %G00 USING %%G00 TVIEW100.
ENDCASE.
ENDMODULE.
CASE %TAB.
WHEN 'G00'.
PERFORM LOOP_PAI(RSAQEXCE) TABLES %G00 USING %%G00 TVIEW100.
ENDCASE.
ENDMODULE.
CASE %TAB.
WHEN 'G00'.
PERFORM OKCODE(RSAQEXCE) TABLES %G00 USING TVIEW100.
ENDCASE.
ENDMODULE.
TABLES: tstct.
AT SELECTION-SCREEN OUTPUT.
p_file = 'C:\SAPTXlist.xls'.
p_dnld = 'X'.
MOVE 'I' TO s_sprsl-sign.
MOVE 'EQ' TO s_sprsl-option.
MOVE 'EN' TO s_sprsl-low.
APPEND s_sprsl.
START-OF-SELECTION.
REFRESH itab_tx.
IF sy-subrc <> 0.
MESSAGE s265(sf).
ELSE.
SORT itab_tx BY tcode.
LOOP AT itab_tx.
WRITE: /1 itab_tx-tcode(20),
AT 20 itab_tx-ttext.
ENDLOOP.
IF p_dnld = 'X'.
CLEAR fields.
fields-tabname = 'RLGRAP'.
fields-fieldname = 'FILENAME'.
fields-value = p_file.
fields-field_attr = '00'.
APPEND fields.
CALL FUNCTION 'POPUP_GET_VALUES'
EXPORTING
popup_title = text-003
IMPORTING
returncode = returncode
TABLES
fields = fields
EXCEPTIONS
error_in_fields = 1
OTHERS = 2.
filestring = fields-value.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
filename = filestring
write_field_separator = ','
TABLES
data_tab = itab_tx
EXCEPTIONS
file_write_error = 1
no_batch = 2
gui_refuse_filetransfer = 3
invalid_type = 4
no_authority = 5
unknown_error = 6
header_not_allowed = 7
separator_not_allowed = 8
filesize_not_allowed = 9
header_too_long = 10
dp_error_create = 11
dp_error_send = 12