Exception classes

CX_ROOT
|
|--CX_STATIC_CHECK
|
|--CX_DYNAMIC_CHECK
| |
| |--CX_SY_ARITHMETIC_ERROR
| | |
| | |--CX_SY_ZERODIVIDE
| | |
| | |--CX_SY_ARITHMETIC_OVERFLOW
| | |
| | |--CX_SY_ARG_OUT_OF_DOMAIN
| | |
| | |--CX_SY_PRECISION_LOSS
| |
| |--CX_SY_ASSIGN_ERROR
| | |
| | |--CX_SY_ASSIGN_CAST_ERROR
| | | |
| | | |--CX_SY_ASSIGN_CAST_ILLEGAL_CAST
| | | |
| | | |--CX_SY_ASSIGN_CAST_UNKNOWN_TYPE
| | |
| | |--CX_SY_ASSIGN_OUT_OF_RANGE
| |
| |--CX_SY_CODEPAGE_CONVERTER_INIT
| |
| |--CX_SY_CONVERSION_ERROR
| | |
| | |--CX_SY_CONVERSION_CODEPAGE
| | |
| | |--CX_SY_CONVERSION_DATA_LOSS
| | |
| | |--CX_SY_CONVERSION_NO_BOOLEAN
| | |
| | |--CX_SY_CONVERSION_NO_DATE_TIME
| | |
| | |--CX_SY_CONVERSION_NO_NUMBER
| | |
| | |--CX_SY_CONVERSION_NO_RAW
| | |
| | |--CX_SY_CONVERSION_NO_UUID
| | |
| | |--CX_SY_CONVERSION_OVERFLOW
| | |
| | |--CX_SY_CONVERSION_ROUNDING
| | |
| | |--CX_SY_CONVERSION_UNKNOWN_LANGU
| |
| |--CX_SY_CREATE_ERROR
| | |
| | |--CX_SY_CREATE_OBJECT_ERROR
| | |
| | |--CX_SY_CREATE_DATA_ERROR
| |
| |--CX_SY_DATA_ACCESS_ERROR
| | |
| | |--CX_SY_RANGE_OUT_OF_BOUNDS
| | |
| | |--CX_SY_TAB_RANGE_OUT_OF_BOUNDS
| | |
| | |--CX_SY_OFFSET_NOT_ALLOWED
| |
| |--CX_SY_DYN_CALL_ERROR
| | |
| | |--CX_SY_DYN_CALL_ILLEGAL_CLASS
| | |
| | |--CX_SY_DYN_CALL_ILLEGAL_FORM
| | |
| | |--CX_SY_DYN_CALL_ILLEGAL_FUNC
| | |
| | |--CX_SY_DYN_CALL_ILLEGAL_METHOD
| | |
| | |
| | |--CX_SY_DYN_CALL_PARAMETER_ERROR
| | |
| | |--CX_SY_DYN_CALL_EXCP_NOT_FOUND
| | |
| | |--CX_SY_DYN_CALL_ILLEGAL_TYPE
| | |
| | |--CX_SY_DYN_CALL_PARAM_MISSING
| | |
| | |--CX_SY_DYN_CALL_PARAM_NOT_FOUND
| |
| |--CX_SY_EXPORT_NO_SHARED_MEMORY
| |
| |--CX_SY_FILE_ACCESS_ERROR
| | |
| | |--CX_SY_FILE_AUTHORITY
| | |
| | |--CX_SY_FILE_CLOSE
| | |
| | |--CX_SY_FILE_IO
| | |
| | |--CX_SY_FILE_OPEN
| | |
| | |--CX_SY_FILE_OPEN_MODE
| | |
| | |--CX_SY_FILE_POSITION
| | |
| | |--CX_SY_FILE_TRUNCATE
| |
| |--CX_SY_FIND_INFINITE_LOOP
| |
| |--CX_SY_GEN_SOURCE_TOO_WIDE
| |
| |--CX_SY_IMPORT_MISMATCH_ERROR
| | |
| | |--CX_SY_IMPORT_FORMAT_ERROR
| |
| |--CX_SY_ITAB_ERROR
| | |
| | |--CX_SY_ITAB_DUPLICATE_KEY
| |
| |--CX_SY_MATCHER
| | |
| | |--CX_SY_REGEX_TOO_COMPLEX
| | |
| | |--CX_SY_INVALID_REGEX_FORMAT
| |
| |--CX_SY_MOVE_CAST_ERROR
| |
| |--CX_SY_PROGRAM_NOT_FOUND
| |
| |--CX_SY_PROVIDE_EXCEPTION
| | |
| | |--CX_SY_PROVIDE_INTERVAL_OVERLAP
| | |
| | |--CX_SY_PROVIDE_TABLE_NOT_SORTED
| |
| |--CX_SY_READ_SRC_LINE_TOO_LONG
| |
| |--CX_SY_REF_IS_INITIAL | |
| |--CX_SY_REGEX
| | |
| | |--CX_SY_INVALID_REGEX
| |
| |--CX_SY_REPLACE_INFINITE_LOOP
| |
| |--CX_SY_SCAN_SOURCE_TOO_WIDE
| |
| |--CX_SY_SQL_ERROR
| | |
| | |--CX_SY_OPEN_SQL_ERROR
| | | |
| | | |--CX_SY_OPEN_SQL_DB
| | | |--CX_SY_DYNAMIC_OSQL_SEMANTICS
| | | |
| | | |--CX_SY_DYNAMIC_OSQL_SYNTAX
| | |
| | |--CX_SY_NATIVE_SQL_ERROR
| |
| |--CX_SY_UNKNOWN_CURRENCY
| |
| |--CX_SY_WRITE_INVALID_STYLE
| |
| |--CX_SY_WRITE_SRC_LINE_TOO_LONG
| |
| |--CX_TRANSFORMATION_ERROR
| |
| |--CX_ST_ERROR
| | |
| | |--CX_ST_CALL_ERROR
| | |
| | |--CX_ST_CALL_METHOD_ERROR
| | |
| | |--CX_ST_CONSTRAINT_ERROR
| | |
| | |--CX_ST_CONDITION
| | |
| | |--CX_ST_DESERIALIZATION_ERROR
| | |
| | |--CX_ST_FORMAT_ERROR
| | |
| | |--CX_ST_INVALID_XML
| | |
| | |--CX_ST_MATCH
| | |
| | |--CX_ST_REF_ACCESS
| | |
| | |--CX_ST_RUNTIME_ERROR
| | |
| | |--CX_ST_SERIALIZATION_ERROR
| |
| |--CX_XSLT_EXCEPTION
| |
| |--CX_XSLT_SYSTEM_ERROR
| |
| |--CX_XSLT_ABAP_CALL_ERROR
| |
| |--CX_XSLT_DESERIALIZATION_ERROR
| |
| |--CX_XSLT_FORMAT_ERROR
| |
| |--CX_XSLT_RUNTIME_ERROR
| |
| |--CX_XSLT_SERIALIZATION_ERROR
|
|--CX_NO_CHECK
|
|--CX_BADI
| |
| |--CX_BADI_CONTEXT_ERROR
| |
| |--CX_BADI_FILTER_ERROR
| |
| |--CX_BADI_INITIAL_CONTEXT
| |
| |--CX_BADI_INITIAL_REFERENCE
| |
| |--CX_BADI_NOT_SINGLE_USE
| | |
| | |--CX_BADI_MULTIPLY_IMPLEMENTED
|--CX_BADI_NOT_IMPLEMENTED
| |
| |--CX_BADI_UNKNOWN_ERROR
|
|--CX_SY_EXPORT_BUFFER_NO_MEMORY
|
|--CX_SY_GENERATE_SUBPOOL_FULL
|
|--CX_SY_ILLEGAL_HANDLER
|
|--CX_SY_LOCALIZATION_ERROR
|
|--CX_SY_NESTED_PRINT_ON
|
|--CX_SY_NO_HANDLER
|
|--CX_SY_PIPES_NOT_SUPPORTED
|
|--CX_SY_PIPE_REOPEN
|
|--CX_SY_REMOTE_CALL_ERROR
| |
| |--CX_SY_RMC_COMM_FAILURE
| |
| |--CX_SY_RMC_INVALID_STATUS
| |
| |--CX_SY_RMC_SYSTEM_FAILURE
|
|--CX_SY_TOO_MANY_FILES

Function module to generate password

You should use the addition LOWER CASE to take care of the Lower Case characters. Please see the code given below.

REPORT ZEX_PASSWORD .

Parameter: p_char(100) LOWER CASE.

Data: d_password(8),
d_len type i.


d_len = STRLEN( p_char ).

CALL FUNCTION 'RSEC_GENERATE_PASSWORD'
EXPORTING
ALPHABET = p_char
ALPHABET_LENGTH = d_len
FORCE_INIT = ' '
OUTPUT_LENGTH = 8
IMPORTING
OUTPUT = d_password
EXCEPTIONS
SOME_ERROR = 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.

Simple IDoc Program

*&---------------------------------------------------------------------*
*& Report ZIDOC_PROGRAM
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
* Submitted by Suresh Babburi

REPORT ZIDOC_PROGRAM.
data: IDOC_DATA TYPE EDIDD,
IDOC_TAB TYPE EDIDD OCCURS 0.

data: IDOC_CONTRL type EDIDC,
idoc_control1 type edidc occurs 0.


idoc_contrl-DOCNUM = '123456789'.

append idoc_contrl to idoc_control1.


IDOC_DATA-SDATA = '34343&12122008&SURESH'.
IDOC_DATA-SEGNAM = 'ZBABBU1'
.
APPEND IDOC_DATA TO IDOC_TAB.


IDOC_DATA-SDATA = 'ST'.
IDOC_DATA-SEGNAM = 'ZBABBU1'.

APPEND IDOC_DATA TO IDOC_TAB.



CALL FUNCTION 'MASTER_IDOC_DISTRIBUTE'
EXPORTING
master_idoc_control = idoc_control1
* OBJ_TYPE = ''
* CHNUM = ''
tables
communication_idoc_control = idoc_control1
master_idoc_data = idoc_tab
* EXCEPTIONS
* ERROR_IN_IDOC_CONTROL = 1
* ERROR_WRITING_IDOC_STATUS = 2
* ERROR_IN_IDOC_DATA = 3
* SENDING_LOGICAL_SYSTEM_UNKNOWN = 4
* OTHERS = 5
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

ABAP Class example

* This is very simple example on Class
* Describes how calss Definition, Implementation
* Object created

REPORT ZOOP.

Class cl DEFINITION.
PUBLIC SECTION.
METHODS: method1 IMPORTING X TYPE I Y TYPE I EXPORTING Z TYPE I.
PROTECTED SECTION.
PRIVATE SECTION.
endclass.


class cl IMPLEMENTATION.
METHOD method1.
Z = X + Y.
ENDMETHOD.
endclass.


DATA: obj TYPE REF TO cl.
data: A TYPE I VALUE 10, B TYPE I VALUE 20, C TYPE I.
START-OF-SELECTION.
create object obj.

start-of-selection.
call METHOD OBJ->METHOD1
EXPORTING
X = A
Y = B
IMPORTING
Z = C.
write C.

Purchase Orders report

*Purpose of the report is to display the list of Purchase Organization
*, Document Type and Account Group according to the Purchase Order
*Creation Date according to the user inputs and also downloads the file
*with the aboveDetails and stored that file in Text Mode.
*MODULE: MM

REPORT Z_MM_PUR_ORD_ITM MESSAGE-ID ZMHZMSG LINE-SIZE 57 NO STANDARD PAGE
HEADING.
TABLES: EKKO, LFA1, T024E, T077K, T161 .


DATA: BEGIN OF IT_PUR OCCURS 1,
EBELN LIKE EKKO-EBELN, "Document No.
EKORG LIKE EKKO-EKORG, "Purchase Organisation
KTOKK LIKE LFA1-KTOKK, "Account Group
BSART LIKE EKKO-BSART, "Document Type
END OF IT_PUR.


SELECTION-SCREEN: BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-000.
selection-screen skip 1.
SELECT-OPTIONS: PURCDATE FOR EKKO-BEDAT,
PURORG FOR T024E-EKORG,
ACCGRP FOR T077K-KTOKK,
DOCTYPE FOR T161-BSART.
SELECTION-SCREEN: END OF BLOCK B1.

SELECTION-SCREEN: BEGIN OF BLOCK B2 WITH FRAME TITLE TEXT-004.
PARAMETERS: R1 RADIOBUTTON GROUP RAD1 DEFAULT 'X',
R2 RADIOBUTTON GROUP RAD1.
SELECTION-SCREEN: END OF BLOCK B2.


AT SELECTION-SCREEN OUTPUT.
CLEAR: PURCDATE, PURORG, ACCGRP, DOCTYPE.
REFRESH: PURCDATE, PURORG, ACCGRP, DOCTYPE.

TOP-OF-PAGE.
FORMAT COLOR 1.
ULINE.
WRITE : / SY-VLINE, TEXT-001, SY-VLINE, TEXT-002, SY-VLINE, TEXT-003,
SY-VLINE.
ULINE.

END-OF-SELECTION.
SELECT EKKO~EBELN EKKO~BEDAT EKKO~EKORG EKKO~BSART LFA1~KTOKK INTO
CORRESPONDING FIELDS OF TABLE IT_PUR FROM ( EKKO
INNER JOIN LFA1 ON EKKO~LIFNR = LFA1~LIFNR ) WHERE EKKO~BEDAT IN
PURCDATE AND EKKO~EKORG IN PURORG AND EKKO~BSART IN DOCTYPE AND
LFA1~KTOKK IN ACCGRP ORDER BY EKKO~EBELN EKKO~BSART.


IF R1 = 'X'.
SORT IT_PUR BY EKORG KTOKK BSART.
DELETE ADJACENT DUPLICATES FROM IT_PUR COMPARING EKORG KTOKK BSART.
ENDIF.

LOOP AT IT_PUR.

FORMAT RESET.
FORMAT COLOR 6.
WRITE : / SY-VLINE,
(21) IT_PUR-EKORG UNDER TEXT-001 COLOR 2,
SY-VLINE,
(13) IT_PUR-KTOKK UNDER TEXT-002 COLOR 2,
SY-VLINE,
(13) IT_PUR-BSART UNDER TEXT-003 COLOR 2,
SY-VLINE.
ENDLOOP.
ULINE.

To Bold or not to bold for laser printer

Write - To Bold or not to bold for laser printer

format color col_group.
write: / 'not bold'.

format color col_total.
write: / 'Bold'.

write: / our_variable color col_total under 'Only this variable Bold'.

Different trx codes can be used to produce different selection options

This example shows how different transactions codes can be used to produce different selection options for the same program. The example allows for lookups on Sales Order number, Purchase Order Number, Delivery Number or Invoice number.



*--- SELECTION OPTIONS ---------------------------------------

SELECTION-SCREEN BEGIN OF BLOCK SO WITH FRAME TITLE TEXT-001.

SELECT-OPTIONS: S_VBELN FOR VBAK-VBELN,"Sales order number

S_VBELND FOR LIKP-VBELN,"Delivery number

S_VBELNI FOR VBRK-VBELN,"Invoice number

S_VBELNP FOR VBKD-BSTKD."PO number

SELECTION-SCREEN END OF BLOCK SO.



*--- EVENT AT SCREEN OUTPUT -------------------------------

AT SELECTION-SCREEN OUTPUT.

CASE SY-TCODE.

WHEN 'ZEDI6'.

LOOP AT SCREEN.

CASE SCREEN-GROUP4.

WHEN '001'. "Sales order select

SCREEN-ACTIVE = '1'. "1=Active, 0=Don't display

MODIFY SCREEN.

WHEN '002'. "Delivery select

SCREEN-ACTIVE = '0'. "1=Active, 0=Don't display

MODIFY SCREEN.

WHEN '003'. "Invoice select

SCREEN-ACTIVE = '0'. "1=Active, 0=Don't display

MODIFY SCREEN.

WHEN '004'. "PO Select

SCREEN-ACTIVE = '0'. "1=Active, 0=Don't display

MODIFY SCREEN.

ENDCASE.

ENDLOOP.

WHEN 'ZEDI6D'. "Delivery select

LOOP AT SCREEN.

CASE SCREEN-GROUP4.

WHEN '001'. "Sales order select

SCREEN-ACTIVE = '0'. "1=Active, 0=Don't display

MODIFY SCREEN.

WHEN '002'. "Delivery select

SCREEN-ACTIVE = '1'. "1=Active, 0=Don't display

MODIFY SCREEN.

WHEN '003'. "Invoice select

SCREEN-ACTIVE = '0'. "1=Active, 0=Don't display

MODIFY SCREEN.

WHEN '004'. "PO Select

SCREEN-ACTIVE = '0'. "1=Active, 0=Don't display

MODIFY SCREEN.

ENDCASE.

ENDLOOP.

WHEN 'ZEDI6I'. "Invoice select

LOOP AT SCREEN.

CASE SCREEN-GROUP4.

WHEN '001'. "Sales order select

SCREEN-ACTIVE = '0'. "1=Active, 0=Don't display

MODIFY SCREEN.

WHEN '002'. "Delivery select

SCREEN-ACTIVE = '0'. "1=Active, 0=Don't display

MODIFY SCREEN.

WHEN '003'. "Invoice select

SCREEN-ACTIVE = '1'. "1=Active, 0=Don't display

MODIFY SCREEN.

WHEN '004'. "PO Select

SCREEN-ACTIVE = '0'. "1=Active, 0=Don't display

MODIFY SCREEN.

ENDCASE.

ENDLOOP.

WHEN 'ZEDI6P'. "PO select

LOOP AT SCREEN.

CASE SCREEN-GROUP4.

WHEN '001'. "Sales order select

SCREEN-ACTIVE = '0'. "1=Active, 0=Don't display

MODIFY SCREEN.

WHEN '002'. "Delivery select

SCREEN-ACTIVE = '0'. "1=Active, 0=Don't display

MODIFY SCREEN.

WHEN '003'. "Invoice select

SCREEN-ACTIVE = '0'. "1=Active, 0=Don't display

MODIFY SCREEN.

WHEN '004'. "PO Select

SCREEN-ACTIVE = '1'. "1=Active, 0=Don't display

MODIFY SCREEN.

ENDCASE.

ENDLOOP.

ENDCASE.

SAP Icons on report

Write SAP ICONS on your reports

This program list for you all the SAP ICONS that can be used in your reports. Take note that the SAP ICONS are used for interative reports. It can be display on screens. You will only see the icon names when you do a print out.

REPORT ZICONS .
TABLES: ICON.
INCLUDE .
FIELD-SYMBOLS: .

* When displaying ICON, specify the maximum length of 4
WRITE: / 'ICON IN WRITE STATEMENT ', (4) ICON_ALARM.

SKIP.
WRITE: / 'List of SAP ICONS, minimum length 2, maximum length 4.'.
SKIP.
SELECT * FROM ICON.
ASSIGN (ICON-NAME) TO .
WRITE: /(5) , 20 '@',21 ICON-ID+1(2),23 '@',ICON-OLENG,
ICON-BUTTON,ICON-STATUS,ICON-MESSAGE,ICON-FUNCTION,
ICON-NAME.
ENDSELECT.

SAP Factory Calander

OY05 - Maintain the SAP Factory Calendar

SAP Factory Calendar allows companies to key in their own factory work days. Individual SAP application such as MRP will take into consideration these individual factory customizing.

For alternate Saturday, you set Saturday as a normal working day and key in all the off-days in the Special rules button.

In your abap program, you can calculate whether a particular day is a non-working day, with reference to the Factory Calendar.

ABAP Program to check for holidays using the factory calendar
* include zday .
* substitute tdate = 'yyyymmdd'.
* tholiday_found = 'X' -> Holiday
TABLES THOCS.
DATA: BEGIN OF INT_THOCS OCCURS 100,
THOCS LIKE THOCS.
DATA: END OF INT_THOCS.

DATA: TDAY(1),
TDATE LIKE SY-DATUM,
THOLIDAY_ATTRIBUTES,
THOLIDAY_FOUND(1).

FORM HOLIDAY.
CALL FUNCTION 'HOLIDAY_CHECK_AND_GET_INFO'
EXPORTING
DATE = TDATE
HOLIDAY_CALENDAR_ID = 'XX'
* WITH_HOLIDAY_ATTRIBUTES = ' '
IMPORTING
HOLIDAY_FOUND = THOLIDAY_FOUND
TABLES
HOLIDAY_ATTRIBUTES = INT_THOCS
EXCEPTIONS
CALENDAR_BUFFER_NOT_LOADABLE = 1
DATE_AFTER_RANGE = 2
DATE_BEFORE_RANGE = 3
DATE_INVALID = 4
HOLIDAY_CALENDAR_ID_MISSING = 5
HOLIDAY_CALENDAR_NOT_FOUND = 6
OTHERS = 7.

CALL FUNCTION 'DATE_COMPUTE_DAY'
EXPORTING
DATE = TDATE
IMPORTING
DAY = TDAY
EXCEPTIONS
OTHERS = 1.
* For checking.
*if tholiday_found = 'X'.
* write: /1 'Holiday ', tdate.
*else.
* write: /1 'Not Holiday ', tdate.
*endif.
*
*case sy-subrc.
* when 0. write: /1 tdate, tday.
* when others. write: /1 'Unknown day ', tdate.
*endcase.
ENDFORM.

Restrict values on Selection screen

REPORT Z_CONECT_A.

* Include type pool SSCR
TYPE-POOLS sscr.

TABLES : marc.

* defining the selection-screen
select-options :
s_matnr for marc-matnr,
s_werks for marc-werks.

* Define the object to be passed to the RESTRICTION parameter
DATA restrict TYPE sscr_restrict.

* Auxiliary objects for filling RESTRICT
DATA : optlist TYPE sscr_opt_list,
ass type sscr_ass.

INITIALIZATION.

* Restricting the MATNR selection to only EQ and 'BT'.
optlist-name = 'OBJECTKEY1'.
optlist-options-eq = 'X'.
optlist-options-bt = 'X'.
APPEND optlist TO restrict-opt_list_tab.

ass-kind = 'S'.
ass-name = 'S_MATNR'.
ass-sg_main = 'I'.
ass-sg_addy = space.
ass-op_main = 'OBJECTKEY1'.
APPEND ass TO restrict-ass_tab.

* Restricting the WERKS selection to CP, GE, LT, NE.
optlist-name = 'OBJECTKEY2'.
optlist-options-cp = 'X'.
optlist-options-ge = 'X'.
optlist-options-lt = 'X'.
optlist-options-ne = 'X'.
APPEND optlist TO restrict-opt_list_tab.

ass-kind = 'S'.
ass-name = 'S_WERKS'.
ass-sg_main = 'I'.
ass-sg_addy = space.
ass-op_main = 'OBJECTKEY2'.
APPEND ass TO restrict-ass_tab.

CALL FUNCTION 'SELECT_OPTIONS_RESTRICT'
EXPORTING
restriction = restrict
EXCEPTIONS
TOO_LATE = 1
REPEATED = 2
SELOPT_WITHOUT_OPTIONS = 3
SELOPT_WITHOUT_SIGNS = 4
INVALID_SIGN = 5
EMPTY_OPTION_LIST = 6
INVALID_KIND = 7
REPEATED_KIND_A = 8
OTHERS = 9
.
IF sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

code for READ_TEXT

REPORT ZGUI_DIR.

*ABAP READ_TEXT functions
*
*You have to used the READ_TEXT functions to read the SAP long text. e.
*g. Sales Order, Purchase Order Item text etc.
*To check your long text header, go into the long text. Click Goto ->
*Header
*
*Example of READ_TEXT functions reading tables PBIM - Independent
*requirements for material.
*=======================================================================
TABLES: PBIM.

* stxh, stxl, stxb - trans tables for text
* ttxit - text on text-ids
* ttxot - Short texts on text objects
* Transaction MD63

SELECT-OPTIONS: S_MATNR FOR PBIM-MATNR,
S_WERKS FOR PBIM-WERKS.

DATA: BEGIN OF HTEXT.
INCLUDE STRUCTURE THEAD.
DATA: END OF HTEXT.

DATA: BEGIN OF LTEXT OCCURS 50.
INCLUDE STRUCTURE TLINE.
DATA: END OF LTEXT.

DATA: BEGIN OF DTEXT OCCURS 50.
DATA: MATNR LIKE PBIM-MATNR.
INCLUDE STRUCTURE TLINE.
DATA: END OF DTEXT.

DATA: TNAME LIKE THEAD-TDNAME.

SELECT * FROM PBIM WHERE WERKS IN S_WERKS.
MOVE PBIM-BDZEI TO TNAME.
CALL FUNCTION 'READ_TEXT'
EXPORTING
* CLIENT = SY-MANDT
ID = 'PB'
LANGUAGE = 'E'
NAME = TNAME
OBJECT = 'PBPT'
* ARCHIVE_HANDLE = 0
IMPORTING
HEADER = HTEXT
TABLES
LINES = LTEXT
EXCEPTIONS
ID = 1
LANGUAGE = 2
NAME = 3
NOT_FOUND = 4
OBJECT = 5
REFERENCE_CHECK = 6
WRONG_ACCESS_TO_ARCHIVE = 7
OTHERS = 8.
LOOP AT LTEXT.
IF LTEXT-TDLINE NE ''.
MOVE LTEXT-TDLINE TO DTEXT-TDLINE.
MOVE PBIM-MATNR TO DTEXT-MATNR.
APPEND DTEXT.
ENDIF.
ENDLOOP.
ENDSELECT.
LOOP AT DTEXT.
WRITE:/ DTEXT-MATNR, DTEXT-TDLINE.
ENDLOOP.

code for PO condition records

Purchase Order Condition Records

select * from ekko.
select * from konv where knumv = ekko-knumv
"Get all the condition records for the purchase order
endselect.
endselect.

* Get the info record conditions record
* First declare the record structure for the key
data: begin of int_konp,
txt1(5),
lifnr(5),
matnr(18),
txt2(4),
txt3(1),
end of int_konp.

clear: konh, konp, int_konp.

* data for the record key konh-vakey
int_konp-txt1 = '00000'.
int_konp-lifnr = ekko-lifnr+5(5).
int_konp-matnr = ekpo-matnr(18).
int_konp-txt2 = 'ALL'.
int_konp-werks = ekpo-werks.
int_konp-txt3 = '0'.

select * from konh where kschl = 'PB00' "Conditions (Header)
and datab => p_datum. "valid from date

if konh-vakey = int_konp. "Conditions (Item)
select single * from konp where knumh = konh-knumh.
continue.
endif.

endselect.

code for Progress Indicator

REPORT ZV_DELETE .

DATA: A LIKE SY-UCOMM.

DO 100 TIMES.
DO 300 TIMES.
GET TIME.
ENDDO.
A(3) = SY-INDEX.A+3 = '%'.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = SY-INDEX
TEXT = A.
ENDDO.

WRITE: / 'PROGRESS INDICATOR'.

code for Production order system status

Extract the Producton Order System Status

tables: aufk "Order master data
jest, "Object status
tj02t. "Status Description

* Order Status - To Retrieve & Filter
select stat from jest
where objnr = aufk-objnr " objnr means object no
and stat in ('I0012', 'I0045', 'I0074', 'I0076')
and inact ne 'X' "Flag: Status inactive
order by stat.

select single * from tj02t
where istat = jest-stat
and spras = 'E'.

code for Previous Saturday

To find out the Previous Saturday for a given date

REPORT ZPREVIOUS.

* To find out the Previous Saturday for a given date

DATA: L_DATE LIKE SY-DATUM.

PARAMETERS: PREVDAY(2) TYPE N DEFAULT 7.

L_DATE = SY-DATUM.
L_DATE = L_DATE - ( ( ( L_DATE MOD 7 ) + PREVDAY ) MOD 7 ).

CASE PREVDAY.
WHEN 7. WRITE:/ 'Previous Saturday ', L_DATE.
WHEN 6. WRITE:/ 'Previous Sunday ', L_DATE.
WHEN 5. WRITE:/ 'Previous Monday ', L_DATE.
WHEN 4. WRITE:/ 'Previous Tuesday ', L_DATE.
WHEN 3. WRITE:/ 'Previous Wednesday', L_DATE.
WHEN 2. WRITE:/ 'Previous Thursday ', L_DATE.
WHEN 1. WRITE:/ 'Previous Friday ', L_DATE.
ENDCASE.

Pop-up Help, F4

*-- F4 help for Payroll Administrator
AT SELECTION SCREEN ON VALUE REQUEST FOR P_SACHA.
PERFORM VALUES_SACHA.
*-- F4 help for Pay Scale Group
AT SELECTION SCREEN ON VALUE REQUEST FOR P_TRFGR.
*-- F4 help for Pay Scale Level
AT SELECTION SCREEN ON VALUE REQUEST FOR P_TRFST.
*---------------------------------------------------------------------*
* FORM VALUES_SACHA
*---------------------------------------------------------------------*
* Provide popup help for the Payroll Admin field
*---------------------------------------------------------------------*
FORM VALUES_SACHA.

REFRESH: LTAB_DYNPSELECT,
LTAB_DYNPVALUETAB.

PERFORM READ_VALUE_FROM_SCREEN USING SY-REPID
SY-DYNNR
'PA0001-WERKS'
CHANGING LTAB_DYNPSELECT-FLDNAME
LTAB_DYNPSELECT-FLDINH.

APPEND LTAB_DYNPSELECT.

LTAB_DYNPSELECT-FLDNAME = 'MANDT'.
APPEND LTAB_DYNPSELECT.

LTAB_DYNPSELECT-FLDNAME = 'SACHX'.
APPEND LTAB_DYNPSELECT.

PERFORM SHOW_HELP TABLES LTAB_DYNPSELECT
LTAB_DYNPVALUETAB
USING 'T526'
'SACHX'
CHANGING PA0001-SACHA.

ENDFORM. " VALUES_SACHA
*---------------------------------------------------------------------*
* FORM VALUES_TRFGR
*---------------------------------------------------------------------*
* Provide popup help for Pay Scale Group
*---------------------------------------------------------------------*
FORM VALUES_TRFGR.

REFRESH: LTAB_DYNPSELECT,
LTAB_DYNPVALUETAB.

LTAB_DYNPSELECT-FLDNAME = 'MANDT'.
APPEND LTAB_DYNPSELECT.

LTAB_DYNPSELECT-FLDNAME = 'MOLGA'.
SELECT SINGLE MOLGA FROM T001P
INTO LTAB_DYNPSELECT-FLDINH
WHERE WERKS = *PA0001-WERKS
AND BTRTL = *PA0001-BTRTL.
IF SY-SUBRC NE 0.
LTAB_DYNPSELECT-FLDINH = SPACE.
ENDIF.
APPEND LTAB_DYNPSELECT.

LTAB_DYNPSELECT-FLDNAME = 'TRFAR'.
LTAB_DYNPSELECT-FLDINH = *PA0008-TRFAR.
APPEND LTAB_DYNPSELECT.

LTAB_DYNPSELECT-FLDNAME = 'TRFGB'.
LTAB_DYNPSELECT-FLDINH = *PA0008-TRFGB.
APPEND LTAB_DYNPSELECT.

LTAB_DYNPSELECT-FLDNAME = 'TRFKZ'.
SELECT SINGLE TRFKZ FROM T503
INTO LTAB_DYNPSELECT-FLDINH
WHERE PERSG = *PA0001-PERSG
AND PERSK = *PA0001-PERSK.
IF SY-SUBRC NE 0.
LTAB_DYNPSELECT-FLDINH = SPACE.
ENDIF.
APPEND LTAB_DYNPSELECT.

LTAB_DYNPSELECT-FLDNAME = 'TRFGR'.
LTAB_DYNPSELECT-FLDINH = SPACE.
APPEND LTAB_DYNPSELECT.

PERFORM SHOW_HELP TABLES LTAB_DYNPSELECT
LTAB_DYNPVALUETAB
USING 'T510'
'TRFGR'
CHANGING PA0008-TRFGR.

PERFORM UPDATE_VALUE_ON_SCREEN USING SY-REPID
SY-DYNNR
'PA0008-TRFGR'
PA0008-TRFGR.

ENDFORM. " VALUES_TRFGR
*---------------------------------------------------------------------*
* FORM VALUES_TRFST
*---------------------------------------------------------------------*
* Provide popup help for Pay Scale Area
*---------------------------------------------------------------------*
FORM VALUES_TRFST.

REFRESH: LTAB_DYNPSELECT,
LTAB_DYNPVALUETAB.

LTAB_DYNPSELECT-FLDNAME = 'MANDT'.
APPEND LTAB_DYNPSELECT.

LTAB_DYNPSELECT-FLDNAME = 'MOLGA'.
SELECT SINGLE MOLGA FROM T001P
INTO LTAB_DYNPSELECT-FLDINH
WHERE WERKS = *PA0001-WERKS
AND BTRTL = *PA0001-BTRTL.
IF SY-SUBRC NE 0.
LTAB_DYNPSELECT-FLDINH = SPACE.
ENDIF.
APPEND LTAB_DYNPSELECT.

LTAB_DYNPSELECT-FLDNAME = 'TRFAR'.
LTAB_DYNPSELECT-FLDINH = *PA0008-TRFAR.
APPEND LTAB_DYNPSELECT.

LTAB_DYNPSELECT-FLDNAME = 'TRFGB'.
LTAB_DYNPSELECT-FLDINH = *PA0008-TRFGB.
APPEND LTAB_DYNPSELECT.

LTAB_DYNPSELECT-FLDNAME = 'TRFKZ'.
SELECT SINGLE TRFKZ FROM T503
INTO LTAB_DYNPSELECT-FLDINH
WHERE PERSG = *PA0001-PERSG
AND PERSK = *PA0001-PERSK.
IF SY-SUBRC NE 0.
LTAB_DYNPSELECT-FLDINH = SPACE.
ENDIF.
APPEND LTAB_DYNPSELECT.

PERFORM READ_VALUE_FROM_SCREEN USING SY-REPID
SY-DYNNR
'PA0008-TRFGR'
CHANGING LTAB_DYNPSELECT-FLDNAME
LTAB_DYNPSELECT-FLDINH.

APPEND LTAB_DYNPSELECT.

LTAB_DYNPSELECT-FLDNAME = 'TRFST'.
LTAB_DYNPSELECT-FLDINH = SPACE.
APPEND LTAB_DYNPSELECT.

PERFORM SHOW_HELP TABLES LTAB_DYNPSELECT
LTAB_DYNPVALUETAB
USING 'T510'
'TRFST'
CHANGING PA0008-TRFST.

PERFORM UPDATE_VALUE_ON_SCREEN USING SY-REPID
SY-DYNNR
'PA0008-TRFST'
PA0008-TRFST.

ENDFORM. " VALUES_TRFST
*---------------------------------------------------------------------*
* FORM SHOW_HELP *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> FTAB_DYNPSELECT *
* --> FTAB_DYNPVALUETAB *
* --> FSTR_HELP_INFO *
* --> F_NEWVALUE *
*---------------------------------------------------------------------*
FORM SHOW_HELP TABLES FTAB_DYNPSELECT STRUCTURE DSELC
FTAB_DYNPVALUETAB STRUCTURE DVAL
USING F_CHECKTABLE LIKE HELP_INFO-CHECKTABLE
F_CHECKFIELD LIKE HELP_INFO-CHECKFIELD
CHANGING F_NEWVALUE.

DATA: LSTR_HELP_INFO LIKE HELP_INFO.
DATA: LC_SELECTION_VALUE LIKE HELP_INFO-FLDVALUE.
DATA: LC_SELECTION(1) TYPE C.

*-- Fill in fields required for help function call
LSTR_HELP_INFO-CALL = 'T'.
LSTR_HELP_INFO-OBJECT = 'F'.
LSTR_HELP_INFO-SPRAS = SY-LANGU.
LSTR_HELP_INFO-CHECKTABLE = F_CHECKTABLE.
LSTR_HELP_INFO-CHECKFIELD = F_CHECKFIELD.

CALL FUNCTION 'HELP_START'
EXPORTING
HELP_INFOS = LSTR_HELP_INFO
IMPORTING
SELECTION = LC_SELECTION
SELECT_VALUE = LC_SELECTION_VALUE
TABLES
DYNPSELECT = FTAB_DYNPSELECT
DYNPVALUETAB = FTAB_DYNPVALUETAB
EXCEPTIONS
OTHERS = 1.

IF LC_SELECTION NE SPACE AND SY-SUBRC = 0.
F_NEWVALUE = LC_SELECTION_VALUE.
ENDIF.

ENDFORM. " SHOW_HELP

*---------------------------------------------------------------------*
* FORM READ_VALUE_FROM_SCREEN *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> F_REPID *
* --> F_DYNNR *
* --> VALUE(F_FIELDNAME_IN) *
* --> F_FIELDNAME_OUT *
* --> F_FIELDVALUE *
*---------------------------------------------------------------------*
FORM READ_VALUE_FROM_SCREEN USING F_REPID
F_DYNNR
VALUE(F_FIELDNAME_IN)
CHANGING F_FIELDNAME_OUT
F_FIELDVALUE.

DATA: LTAB_FIELDS LIKE DYNPREAD OCCURS 0 WITH HEADER LINE.
DATA: LC_DYNAME LIKE SY-REPID.
DATA: LC_DYNUMB LIKE SY-DYNNR.
DATA: LC_DUMMY(1) TYPE C.

*-- Read the screen to see if the user has entered a value for WERKS
LTAB_FIELDS-FIELDNAME = F_FIELDNAME_IN.
append ltab_fields.

LC_DYNAME = F_REPID.
LC_DYNUMB = F_DYNNR.

CALL FUNCTION 'DYNP_VALUES_READ'
EXPORTING
DYNAME = LC_DYNAME
DYNUMB = LC_DYNUMB
TABLES
dynpfields = ltab_fields
EXCEPTIONS
OTHERS = 01.
read table ltab_fields index 1.
*-- Return the value from the screen
IF SY-SUBRC EQ 0.
SPLIT LTAB_FIELDS-FIELDNAME AT '-'
INTO LC_DUMMY
F_FIELDNAME_OUT.
F_FIELDVALUE = LTAB_FIELDS-FIELDVALUE.
ENDIF.

ENDFORM. " READ_VALUE_FROM_SCREEN
*---------------------------------------------------------------------*
* FORM UPDATE_VALUE_ON_SCREEN *
*---------------------------------------------------------------------*
* The PROCESS ON VALUE-REQUEST does not always return blanks. *
* If a blank value is to be returned, this routine must be *
* called.
*---------------------------------------------------------------------*
* --> F_REPID *
* --> F_DYNNR *
* --> VALUE(F_FIELDNAME) *
* --> F_FIELDVALUE *
*---------------------------------------------------------------------*
FORM UPDATE_VALUE_ON_SCREEN USING F_REPID
F_DYNNR
VALUE(F_FIELDNAME)
F_FIELDVALUE.

DATA: LTAB_FIELDS LIKE DYNPREAD OCCURS 0 WITH HEADER LINE.

DATA: LC_DYNAME LIKE SY-REPID.
DATA: LC_DYNUMB LIKE SY-DYNNR.

LC_DYNAME = SY-REPID.
LC_DYNUMB = SY-DYNNR.

LTAB_FIELDS-FIELDNAME = F_FIELDNAME.
LTAB_FIELDS-FIELDVALUE = F_FIELDVALUE.
APPEND LTAB_FIELDS.

CALL FUNCTION 'DYNP_VALUES_UPDATE'
EXPORTING
DYNAME = LC_DYNAME
DYNUMB = LC_DYNUMB
TABLES
DYNPFIELDS = LTAB_FIELDS
EXCEPTIONS
OTHERS = 8.

ENDFORM. " UPDATE_VALUE_ON_SCREEN

Page numbers in report

ABAP Report Page Number

The code below shows how to display the total number of pages in a report like "Page 1 of 8." However, it doesn't work if you execute the program as a background jobs.

* Declare a variable
DATA L_PAGE_COUNT(5) TYPE C.

* Copy this code to the end of program
* Page count will be printed on each page here
WRITE SY-PAGNO TO L_PAGE_COUNT LEFT-JUSTIFIED.
DO SY-PAGNO TIMES.
READ LINE 1 OF PAGE SY-INDEX.
REPLACE '-----' WITH L_PAGE_COUNT INTO SY-LISEL.
MODIFY CURRENT LINE.
ENDDO.

TOP-OF-PAGE.
WRITE: /(70) 'Heading' CENTERED, 70 SY-PAGNO,'of ', '-----'.

Output Table fields

REPORT ZZTAB_FLDS .
TABLES: DD02L, DD03L, DD04T.

PARAMETERS THETABLE LIKE DD02L-TABNAME OBLIGATORY.
DATA: BEGIN OF MYTABLE,
TABNAME LIKE DD02L-TABNAME,
AS4LOCAL LIKE DD02L-AS4LOCAL,
AS4VERS LIKE DD02L-AS4VERS,
END OF MYTABLE.

SELECT SINGLE TABNAME AS4LOCAL AS4VERS INTO MYTABLE FROM DD03L
WHERE TABNAME = THETABLE.
WRITE: / MYTABLE-TABNAME, 11 MYTABLE-AS4LOCAL, 13 MYTABLE-AS4VERS.
SELECT * FROM DD03L
WHERE TABNAME = MYTABLE-TABNAME AND
AS4LOCAL = MYTABLE-AS4LOCAL AND AS4VERS = MYTABLE-AS4VERS.
WRITE: / DD03L-FIELDNAME, 11 DD03L-KEYFLAG, 13 DD03L-ROLLNAME,
24 DD03L-CHECKTABLE, 35 DD03L-INTTYPE, 37 DD03L-REFTABLE,
48 DD03L-DATATYPE.
SELECT SINGLE * FROM DD04T
WHERE ROLLNAME = DD03L-ROLLNAME AND
AS4LOCAL = MYTABLE-AS4LOCAL AND AS4VERS = MYTABLE-AS4VERS AND
DDLANGUAGE = 'E'.

WRITE: 53 DD04T-DDTEXT.
ENDSELECT.

File programming

REPORT ZZBGS010 .
*----------------------------------------------------------------------*
* Example: Interface between Microsoft Excel and ABAP/4 with up- and *
* downloading of data plus executing Microsoft Excel. *
*----------------------------------------------------------------------*
TABLES: USR04.
DATA: SIZE TYPE I.

DATA: BEGIN OF USER OCCURS 100.
INCLUDE STRUCTURE USR04.
DATA: END OF USER.

* ---------------------------------------------------------------------*
* Example: Select some data into an internal table. *
* ---------------------------------------------------------------------*

SELECT * FROM USR04 INTO TABLE USER .

* ---------------------------------------------------------------------*
* Example: Downloading data in Microsoft Excel Format with automatic *
* prompt popup dialog. *
* ---------------------------------------------------------------------*
CALL FUNCTION 'DOWNLOAD'
EXPORTING
FILENAME = 'C:\tmp\SAPEXL1.XLS'
FILETYPE = 'WK1' "ASC, WK1, DBF, DAT, bin
MODE = ' ' "Mode ' ' = Rewrite Mode 'A' = Appending
TABLES
DATA_TAB = USER.

* ---------------------------------------------------------------------*
* Example: Downloading data in Microsoft Excel Format without automatic*
* prompt popup. *
* ---------------------------------------------------------------------*
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
FILENAME = 'C:\tmp\SAPEXL2.XLS'
FILETYPE = 'WK1' "ASC, WK1, DBF, DAT, bin
MODE = ' ' "Mode ' ' = Rewrite Mode 'A' = Appending
TABLES
DATA_TAB = USER.


CLEAR USER. "Clear buffer
REFRESH USER. "Refresh, empty internal table

*----------------------------------------------------------------------*
* Example: Uploading Microsoft Excel to ABAP/4 internal table. *
*----------------------------------------------------------------------*
CALL FUNCTION 'UPLOAD'
EXPORTING
FILENAME = 'C:\tmp\SAPEXL.prn'
FILETYPE = 'ASC'
IMPORTING
FILESIZE = SIZE
TABLES
DATA_TAB = USER.

*----------------------------------------------------------------------*
* Example: Starting Microsoft Excel and load sheet. *
*----------------------------------------------------------------------*
CALL FUNCTION 'WS_EXECUTE'
EXPORTING
COMMANDLINE = 'C:\tmp\SAPEXL1.XLS'
PROGRAM = 'F:\APPL\WINDOWS\EXCEL5DK\EXCEL.EXE'
.

*----------------------------------------------------------------------*
* Example: Starting Microsoft Excel and load internal table as sheet *
*----------------------------------------------------------------------*
CALL FUNCTION 'WS_EXCEL'
EXPORTING
FILENAME = 'C:\tmp\SAPEXL.XLS'
SYNCHRON = ' '
TABLES
DATA = USER.
--------------------------------------------------------------------------------

Field Group

REPORT ZZBGS008 .
*-----------------------------------------------------------------------*
* Example program: Use of FIELD-GROUPS, COLLECT, SORT, EXTRACT *
*-----------------------------------------------------------------------*
TABLES: T001.

DATA: BEGIN OF RESULT OCCURS 100.
DATA: MANDT LIKE T001-MANDT,
BUKRS LIKE T001-BUKRS,
BUTXT LIKE T001-BUTXT,
ORT01 LIKE T001-ORT01,
LAND1 LIKE T001-LAND1,
WAERS LIKE T001-WAERS,
SPRAS LIKE T001-SPRAS,
KTOPL LIKE T001-KTOPL. "Bemærk at da dette felt ikke er med i
"insert vil feltet være tomt.
DATA: END OF RESULT.

FIELD-GROUPS: HEADER, DATA.
INSERT
T001-SPRAS " SPROGNØGLE
T001-MANDT " KLIENT
T001-BUKRS " FIRMAKODE
INTO HEADER.

INSERT
T001-BUTXT "
T001-ORT01 " BY
T001-LAND1 " LANDENØGLE
T001-WAERS " VALUTANØGLE
INTO DATA.

START-OF-SELECTION.

REFRESH RESULT.
SELECT * FROM T001.
EXTRACT DATA.
ENDSELECT.

END-OF-SELECTION.


SORT BY T001-SPRAS T001-MANDT T001-BUKRS.

LOOP.
MOVE-CORRESPONDING T001 TO RESULT.
APPEND RESULT.
ENDLOOP.

Interactive/Drill down Report

STEP ONE - ADD THESE LINES OF CODE IN THE DECLARATION AREA

**** DECLARATION
DATA: BEGIN OF items OCCURS 100,
id type sy-tabix,
parent_id type sy-tabix,
text(1000),
symbol,
END OF items,
tabix_stack LIKE sy-tabix OCCURS 10 WITH HEADER LINE,
items_show LIKE items OCCURS 100 WITH HEADER LINE.

DATA: parent_stack LIKE sy-tabix OCCURS 10 WITH HEADER LINE,
t_parent LIKE sy-tabix,
current LIKE sy-tabix.
INCLUDE .
INCLUDE ZTREE_REPORT_INCLUDES.

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.

* itab_data is an internal table with one field of length 1000.
* itab_data contains the output in this one field, as it must appear on the
screen
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 THREE - ADD THESE LINES OF CODE TO PRINT THE REPORT
LOOP AT items WHERE parent_id = 0.
MOVE-CORRESPONDING items TO items_show.
items_show-symbol = '+'.
APPEND items_show.
ENDLOOP.
PERFORM print_tree TABLES items_show.

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'
IF sy-subrc = 0. "item has children - expand or collapse
sy-lsind = 0.
PERFORM expand_collapse USING items_show-id.
PERFORM print_tree TABLES items_show.
ELSE. "item has NO children - perform some action
READ TABLE items WITH KEY id = items_show-id.
WRITE: 'Action performed on item "' NO-GAP, items-text NO-GAP,
'", id.', items-id.
ENDIF.

STEP FIVE - ADD THIS INCLUDE CODE
*----------------------------------------------------------------------*
* INCLUDE ZTREE_REPORT_INCLUDES *
*----------------------------------------------------------------------*
* 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. " APPEND_ITEM

* 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 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.
WHEN '+'.
WRITE AT v_offset sym_plus_folder AS SYMBOL
COLOR 4 INTENSIFIED HOTSPOT.
WHEN '-'.
WRITE AT v_offset sym_minus_folder AS SYMBOL
COLOR 4 INTENSIFIED HOTSPOT.
WHEN OTHERS. FORMAT COLOR 5.
ENDCASE.
WRITE: items-text.
v_prev_level = v_level.
HIDE: items-id.
ADD 1 TO v_items_count.
READ TABLE items WITH KEY parent_id = items-id.
* increase level and exit loop if item has children
IF sy-subrc = 0.
start_tabix = sy-tabix.
APPEND v_tabix TO tabix_stack. "level is no of recs in stack
v_parent_id = items-parent_id.
* set vline
v_tabix = v_tabix + 1.
READ TABLE items INDEX v_tabix.
v_offset = 2 + ( v_level - 1 ) * 3.
IF v_level > 0.
IF items-parent_id = v_parent_id_for_vline AND sy-subrc = 0.
v_vlines_string+v_offset = '|'.
ELSE.
v_vlines_string+v_offset = ' '.
ENDIF.
ENDIF.
EXIT.
ENDIF.
* at last - decrease level
AT LAST.
* 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.
" next loop starts from parent index, not parent index + 1
" because of different parents level will decrease anyway
PERFORM read_from_stack CHANGING start_tabix.
APPEND start_tabix TO tabix_stack. "must return index to stack
ENDAT.
ENDLOOP.
DESCRIBE TABLE items.
IF start_tabix > sy-tfill OR v_items_count >= sy-tfill.
EXIT.
ENDIF.
ENDDO.
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.
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.
ENDFORM.

*& Form delete_parent_stack
*&---------------------------------------------------------------------*
form delete_parent_stack.
DESCRIBE TABLE parent_stack.
CHECK sy-tfill NE 0.
DELETE parent_stack INDEX sy-tfill.
endform. " delete_parent_stack

Describe Select-Options

ABAP/4 Program: Describe Select-Options
back to ABAP/4 index
--------------------------------------------------------------------------------

When printing a report, you can print the search conditions or report parameters that the user entered. For instance, if a report output was restricted to plants between 1011 and 1501, you may want to print "Plants Between 1011 and 1501" on the report. This procedure describes the selected parameters.

Describe Select-Options


select-options: sel_opt for sy-datum.
.
.
.
loop at sel_opt.
perform describe_select_options using 'Date'
sel_opt-sign
sel_opt-option
sel_opt-low
sel_opt-high
changing datedesc.
write: / datedesc.
endloop.
.
.
.
*&---------------------------------------------------------------------*
*& Form DESCRIBE_SELECT_OPTIONS
*&---------------------------------------------------------------------*
form describe_select_options using
field_name type c "name to describe field (e.g. "Date")
sel_opt_sign like sel_opt-sign
sel_opt_option like sel_opt-option
sel_opt_low like sel_opt-low
sel_opt_high like sel_opt_high
changing descline type c. "line that will hold the one-line description
if sel_opt_sign = 'i'.
concatenate 'Include' field_name into descline separated by space.
else.
concatenate 'Exclude' field_name into descline separated by space.
endif.
case sel_opt_option.
when 'EQ'.
concatenate descline '=' sel_opt_low into descline
separated by space.
when 'BT'.
concatenate descline 'between' sel_opt_low 'and' sel_opt_high
into descline separated by space.
when 'NB'.
concatenate descline 'not between' sel_opt_low 'and' sel_opt_high
into descline separated by space.
when 'NE'.
concatenate descline '!=' sel_opt_low into descline
separated by space.
when 'GE'.
concatenate descline '>=' sel_opt_low into descline
separated by space.
when 'LE'.
concatenate descline '<=' sel_opt_low into descline
separated by space.
when 'GT'.
concatenate descline '>' sel_opt_low into descline
separated by space.
when 'LT'.
concatenate descline '<' sel_opt_low into descline
separated by space.
endcase.
endform. " describe_select_options

Report: Daily Cash reciept

REPORT ZV_IDOC_CREATE .

*-----------------------------------------------------------------------
*/ Description :This program creates an ALV report for Daily Cash
* Receipts for a selected date range.
*-----------------------------------------------------------------------
* Global data declaration

TYPE-POOLS: slis.

* Global structure of list
TYPES: BEGIN OF i_cust_invoices, "This is a temp-table where SELECT
"data is to be stored.
bkpf LIKE bkpf, "Acct Doc Header structure
bseg LIKE bseg, "Acct Doc Segment struc
kna1 LIKE kna1, "Customer Master struc
skat LIKE skat, "Chart of Accts struc
END OF i_cust_invoices.


TABLES: bkpf, "TABLES: def of Database tables.
bseg,
kna1,
skat.

*/ Selection and Input Parameters
SELECTION-SCREEN BEGIN OF BLOCK block1 WITH FRAME.

SELECT-OPTIONS: s_belnr FOR bseg-belnr, "Acct Doc number
s_budat FOR bkpf-budat, "Doc Posting Date
s_blart FOR bkpf-blart DEFAULT 'DZ'. "Document Type
SELECTION-SCREEN END OF BLOCK block1.


DATA: gt_fieldcat TYPE slis_t_fieldcat_alv.
DATA: gt_outtab TYPE i_cust_invoices OCCURS 0 WITH HEADER LINE.
DATA: g_repid LIKE sy-repid.
DATA: i_bkpf TYPE bkpf OCCURS 0 WITH HEADER LINE.

* 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
*-----------------------------------------------------------------------

* Initialization fieldcatalog DEFINITION OF HEADING.
* Fieldnames and ref_fieldnames MUST be UPPER CASE !!

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-ref_fieldname = 'TXT20'.
ls_fieldcat-ref_tabname = 'SKAT'.
APPEND ls_fieldcat TO rt_fieldcat.
CLEAR ls_fieldcat.
pos = pos + 1.


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-fieldname = 'BKPF-KURSF'. "Exchange Rate
ls_fieldcat-ref_fieldname = 'KURSF'.
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-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.


* Cost Center is not needed for cash posting - only expenses.
*
* 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 = '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-ref_tabname = 'BSEG'.
APPEND ls_fieldcat TO rt_fieldcat.
CLEAR ls_fieldcat.
pos = pos + 1.


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.


"ska1, skb1 account # stored in SAKNR.
"in BSEG, account # stored in HKONT.
if bseg-SHKZG eq 'H'.

multiply : bseg-wrbtr by -1,
bseg-dmbtr by -1.
endif.
MOVE-CORRESPONDING: i_bkpf TO rt_outtab-bkpf,
bseg TO rt_outtab-bseg,
skat TO rt_outtab-skat.


SELECT SINGLE name1 INTO rt_outtab-kna1-name1 FROM KNA1
WHERE kunnr = rt_outtab-bseg-kunnr.


APPEND rt_outtab.
CLEAR: rt_outtab.

ENDSELECT.
ENDLOOP.

ENDFORM. " select_data

Create Directory

REPORT ZGUI_DIR.

call function 'GUI_CREATE_DIRECTORY'
exporting
dirname = 'C:\TEST\'
EXCEPTIONS
FAILED = 1
OTHERS = 2.

if sy-subrc <> 0.
WRITE: / 'Error Code ',SY-SUBRC.
else.
WRITE: / 'Directory Created...'.
endif.

Convert minus sign to left

Convert minus sign to the left

data prnamt(18).

Version 4.x

CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
CHANGING
VALUE = prnamt(18).

Version 3.x

perform convertsign changing origamtprnamt.

form convertsign using origval changing prnval.
DATA: TEXT1(1) TYPE C.

PRNVALUE = ORIGVAL.

SEARCH PRNVALUE FOR '-'.
IF SY-SUBRC = 0 AND SY-FDPOS <> 0.
SPLIT PRNVALUE AT '-' INTO PRNVALUE TEXT1.
CONDENSE PRNVALUE.
ELSE.
CONDENSE PRNVALUE.
ENDIF.
endform.

Check for holiday

REPORT Z_CONECT_A.

* ABAP Program to check for holidays using the factory calendar
* include zday .
* substitute tdate = 'yyyymmdd'.
* tholiday_found = 'X' -> Holiday
TABLES THOCS.

DATA: BEGIN OF INT_THOCS OCCURS 100,
THOCS LIKE THOCS.
DATA: END OF INT_THOCS.

DATA: TDAY(1),
* TDATE LIKE SY-DATUM,
THOLIDAY_ATTRIBUTES,
THOLIDAY_FOUND(1).

PARAMETERS: P_DATE LIKE SY-DATUM DEFAULT SY-DATUM.

*&------- Selection ------------------------
START-OF-SELECTION.

PERFORM HOLIDAY.

FORM HOLIDAY.
CALL FUNCTION 'HOLIDAY_CHECK_AND_GET_INFO'
EXPORTING
DATE = P_DATE
HOLIDAY_CALENDAR_ID = 'XX'
* WITH_HOLIDAY_ATTRIBUTES = ' '
IMPORTING
HOLIDAY_FOUND = THOLIDAY_FOUND
TABLES
HOLIDAY_ATTRIBUTES = INT_THOCS
EXCEPTIONS
CALENDAR_BUFFER_NOT_LOADABLE = 1
DATE_AFTER_RANGE = 2
DATE_BEFORE_RANGE = 3
DATE_INVALID = 4
HOLIDAY_CALENDAR_ID_MISSING = 5
HOLIDAY_CALENDAR_NOT_FOUND = 6
OTHERS = 7.

CALL FUNCTION 'DATE_COMPUTE_DAY'
EXPORTING
DATE = P_DATE
IMPORTING
DAY = TDAY
EXCEPTIONS
OTHERS = 1.

* For checking.
if tholiday_found = 'X'.
write: /1 'Holiday ', P_DATE.
else.
write: /1 'Not Holiday ', P_DATE.
endif.

case sy-subrc.
when 0.
write: /1 P_DATE, 'is', tday, 'day of the week.'.
when others.
write: /1 'Unknown day ', P_DATE.
endcase.

ENDFORM.

Calling another ABAP program

ABAP program calling another ABAP program
* and return - returns to the calling program
submit zxxxx via selection-screen and return.

* ZX refers to the variant.
submit zxxxx via selection-screen using selection-set 'ZX' and return.

Calculate Date

Calculate begining of previous to end of previous month

ldate = sy-datum.
ldate+6(2) = '01'.
ldate = ldate - 1.
fdate = ldate.
fdate+6(2) = '01'.

move: fdate to date-low,
ldate to date-high.

append date.

BDC and IDoc Status

*---- Data definition -------------------------------------------------

DATA: BEGIN OF BDCDATA OCCURS 5.

INCLUDE STRUCTURE BDCDATA.

DATA: END OF BDCDATA.

DATA: C_TCODE LIKE BKPF-TCODE VALUE 'FB01'.

DATA BEGIN OF MESSTAB OCCURS 10.

INCLUDE STRUCTURE BDCMSGCOLL.

DATA END OF MESSTAB.



*---- Call transaction ------------------------------------------------

FORM Main_Program

REFRESH BDCDATA.

PERFORM APPEND_BDC USING 'SAPMF05A' '0100' ' ' ' '.

PERFORM APPEND_BDC USING ' ' ' ' 'BKPF-BLDAT' '09031998'.

PERFORM APPEND_BDC USING ' ' ' ' 'BDC_OKCODE' '/00'.

PERFORM APPEND_BDC USING 'SAPMF05A' '0300' ' ' ' '.

PERFORM APPEND_BDC USING ' ' ' ' 'BSEG-WRBTR' '*'.

PERFORM APPEND_BDC USING ' ' ' ' 'BDC_OKCODE' 'BU'.



CALL TRANSACTION 'FB01' USING BDCDATA MODE 'N' UPDATE 'S'.

PERFORM UPDATE_IDOC_STATUS.

ENDFORM.



*--- 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.

ENDFORM.



*&---------------------------------------------------------------------*

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

BDC error handling

Question : Subject : BDC FAQ

Dear Friends:
1.How to handle errors in call transaction method and session method.

2.where can i get good examples of call transaction & session method in sap r/3 system,on internet or in books?

3. What is the criteria to select call transaction method or session method for data upload?

All your answers will be greatly appreciated.

Regards


Reply : Subject : BDC FAQ

You can try this code to handle your BDC errors and display the corresponding error messages:

if session ne 'X'.
call transaction tcode using itab_bdc mode 'N' UPDATE 'S' MESSAGES INTO i_errors.

* N - no display
* E - errors only
* A - display ALL screens
elseif session = 'X'.
call function 'BDC_INSERT'
exporting
tcode = tcode
tables
dynprotab = itab_bdc
exceptions
internal_error = 1
not_open = 2
queue_error = 3
tcode_invalid = 4
printing_invalid = 5
posting_invalid = 6
others = 7

*Check SY-SUBRC
if sy-subrc <> 0. "Unsuccessful
loop at i_errors.
MESSAGE ID i_errors-msgid TYPE i_errors-msgtyp NUMBER
i_errors-msgnr WITH i_errors-msgv1 i_errors-msgv2
i_errors-msgv3 i_errors-msgv4 INTO i_error_messages-message.

append i_error_messages.
endloop.
endif.
endif.

Financial Accounting ALV Report

*----------------------------------------------------------------------*
* Report : ZARAGEDTB *
* Author : xxxxxxxxxxxx *
* Application : FINANCIAL ACCOUNTING
* Date created : Nov 2001 *
* Description : Aged Trial balance report using select-options for
* Sales Group and Pricing Group. The logic is copied from
* Aged trial balance Print program which already exists.
* Output is displayed using ALV.
*----------------------------------------------------------------------*
* Modification history *
*----------------------------------------------------------------------*
* Request no. |Date |Programmer | Description *
*----------------------------------------------------------------------*
* 0001 |27.01.2002| |To Include future Transactions *
* 0002 |14.02.2002| |Display select-options at title*
* 0003 |18.11.2002| |To make it Interactive and Other
* |changes as per Andrew Stewart.
*----------------------------------------------------------------------*
REPORT ZARAGEDTB NO STANDARD PAGE HEADING
LINE-SIZE 132
LINE-COUNT 65.
*----------------------------------------------------------------------*
* Tables
*----------------------------------------------------------------------*
TABLES: BSID, "open items (Accounting: Secondary Index for Customers)
KNA1, "customer master
RF140, "temp stru (Work Fields for Correspondence (SAPF140*))
BSAD, "cleared items (Accounting: Secondary Index for Customers (Cleared Items))
KNVV, "sales data (Customer Master Sales Data)
KNKK. "credit mgt (

*----------------------------------------------------------------------*
* constants and variables
*----------------------------------------------------------------------*
TYPE-POOLS: SLIS.

DATA: FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
FIELDCAT1 TYPE SLIS_T_FIELDCAT_ALV,
FIELDCAT_LN LIKE LINE OF FIELDCAT,
LAYOUT_IN TYPE SLIS_LAYOUT_ALV,
LAYOUT_IN1 TYPE SLIS_LAYOUT_ALV,
SORTCAT TYPE SLIS_T_SORTINFO_ALV,
SORTCAT1 TYPE SLIS_T_SORTINFO_ALV,
SORTCAT_LN LIKE LINE OF SORTCAT,
EVENTCAT1 TYPE SLIS_T_EVENT,
EVENTCAT TYPE SLIS_T_EVENT,
EVENTCAT_LN LIKE LINE OF EVENTCAT,
COL_POS TYPE I.

DATA: TARG_MONTH(2) TYPE N, "0001
TARG_YEAR(4) TYPE N, "0001
TARG_MTH_ABS TYPE P, "0001
DOC_MONTH(2) TYPE N, "0001
DOC_YEAR(4) TYPE N, "0001
DOC_MTH_ABS TYPE P, "0001
MTH_RESULT TYPE P, "0001
EXT_DAYS TYPE P,
V_DAYS(3) TYPE C,
v_kkber like knkk-kkber.

DATA:
BEGIN OF INREC OCCURS 1000, "0001
KUNNR LIKE BSID-KUNNR,
BELNR LIKE BSID-BELNR,
GJAHR LIKE BSID-GJAHR,
BLDAT LIKE BSID-BLDAT,
XBLNR LIKE BSID-XBLNR,
BLART LIKE BSID-BLART,
SGTXT LIKE BSID-SGTXT,
SHKZG LIKE BSID-SHKZG,
DMBTR LIKE BSID-DMBTR,
ZFBDT LIKE BSID-ZFBDT,
ZBD1T LIKE BSID-ZBD1T,
ZBD2T LIKE BSID-ZBD2T,
ZBD3T LIKE BSID-ZBD3T,
VBELN LIKE BSID-VBELN, " 0001
ZUONR LIKE BSID-ZUONR,
END OF INREC,
BEGIN OF T_ITEM OCCURS 1000, " 0001
KUNNR LIKE BSID-KUNNR,
BELNR LIKE BSID-BELNR,
GJAHR LIKE BSID-GJAHR,
BLDAT LIKE BSID-BLDAT,
XBLNR LIKE BSID-XBLNR,
BLART LIKE BSID-BLART,
SGTXT LIKE BSID-SGTXT,
VBELN LIKE BSID-VBELN,
ZFBDT LIKE BSID-ZFBDT,
DMBTR LIKE BSID-DMBTR,
DAYS(3) TYPE C,
ZUONR LIKE BSID-ZUONR,
END OF T_ITEM,
T_LINE LIKE T_ITEM OCCURS 1000 WITH HEADER LINE, " 0001
BEGIN OF ITAB OCCURS 1000,
KUNNR LIKE KNA1-KUNNR,
TOTAL TYPE P DECIMALS 2,
ZFUTURE TYPE P DECIMALS 2,
ZCURRENT TYPE P DECIMALS 2,
30DAYS TYPE P DECIMALS 2,
60DAYS TYPE P DECIMALS 2,
90DAYS TYPE P DECIMALS 2,
99DAYS TYPE P DECIMALS 2,
VKBUR LIKE KNVV-VKBUR,
VWERK LIKE KNVV-VWERK,
VKGRP LIKE KNVV-VKGRP,
KLIMK LIKE KNKK-KLIMK,
CASHD LIKE KNKK-CASHD,
GRUPP LIKE KNKK-GRUPP,
ERDAT LIKE KNA1-ERDAT,
NAME1 LIKE KNA1-NAME1,
NAME2 LIKE KNA1-NAME2,
STRAS like kna1-STRAS,
ORT01 like kna1-ORT01,
TELF1 LIKE KNA1-TELF1,
PSORT(10),
END OF ITAB.
DATA: SEL_TAB TYPE TABLE OF RSPARAMS with header line..
data: t_variant like DISVARIANT occurs 0 with header line.
*----------------------------------------------------------------------*
* parameters and select-options
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK BLCK0 WITH FRAME TITLE TEXT-001.

PARAMETERS: STIDA LIKE SY-DATUM DEFAULT SY-DATUM OBLIGATORY,
P_BUKRS LIKE T001-BUKRS MEMORY ID BUK OBLIGATORY.
* P_BUKRS LIKE T001-BUKRS DEFAULT 'CC01' OBLIGATORY. "0003
SELECT-OPTIONS: S_VKBUR FOR KNVV-VKBUR,
S_KUNNR FOR BSID-KUNNR MATCHCODE OBJECT DEBI,
S_VKGRP FOR KNVV-VKGRP,
s_bzirk for knvv-bzirk,
S_KONDA FOR KNVV-KONDA,
S_KDGRP FOR KNVV-KVGR2,
s_kvgr2 for knvv-kvgr2,
S_KKBER FOR KNKK-KKBER,
S_GRUPP FOR KNKK-GRUPP,
S_CTLPC FOR KNKK-CTLPC,
S_KTOKD FOR KNA1-KTOKD,
s_blart for bsid-blart.
PARAMETERS: P_FUTURE AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF BLOCK BLCK0.
*----------------------------------------------------------------------*
* start-of-selection.
*----------------------------------------------------------------------*
START-OF-SELECTION.
* PERFORM BUILD_EVENTCAT.
*-----------------
PERFORM GET_CUSTOMER_INVOICES.
* filter records based on selection criteria
PERFORM FILTER_RECORDS.

END-OF-SELECTION.
*---------------
PERFORM ADD_SORT_FIELD.
PERFORM WRITE_REPORT.
*&---------------------------------------------------------------------*
*& Form FILTER_RECORDS
*&---------------------------------------------------------------------*
* To collect all the required data from DB and store them in
* internal table.
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FILTER_RECORDS.
*
* delete records based on selection criteria
LOOP AT ITAB.
SELECT VKBUR VKGRP VWERK ERDAT KONDA KDGRP bzirk kvgr2
INTO (ITAB-VKBUR, ITAB-VKGRP, ITAB-VWERK, KNVV-ERDAT,
KNVV-KONDA, KNVV-KDGRP,knvv-bzirk,knvv-kvgr2)
FROM KNVV WHERE KUNNR = ITAB-KUNNR
ORDER BY ERDAT DESCENDING.
CASE ITAB-VKBUR.
WHEN 'SA1'.
ITAB-VKBUR = 'SF25'.
WHEN 'QLD1'.
ITAB-VKBUR = 'SF23'.
WHEN 'WA1'.
ITAB-VKBUR = 'SF26'.
ENDCASE.
EXIT.
ENDSELECT.
IF ITAB-VKBUR IN S_VKBUR AND
ITAB-VKGRP IN S_VKGRP AND
KNVV-KONDA IN S_KONDA AND
KNVV-KDGRP IN S_KDGRP and
knvv-bzirk in s_bzirk and
knvv-kvgr2 in s_kvgr2.
ELSE.
DELETE ITAB.
CONTINUE.
ENDIF.
SELECT SINGLE KLIMK GRUPP CASHD
INTO (ITAB-KLIMK, ITAB-GRUPP, ITAB-CASHD)
FROM KNKK WHERE KUNNR = ITAB-KUNNR
AND KKBER IN S_KKBER
AND CTLPC IN S_CTLPC
AND GRUPP IN S_GRUPP.
IF SY-SUBRC NE 0.
DELETE ITAB.
CONTINUE.
ENDIF.
SELECT SINGLE NAME1 NAME2 TELF1 ERDAT stras ORT01
INTO (ITAB-NAME1, ITAB-NAME2, ITAB-TELF1,
ITAB-ERDAT, itab-stras, itab-ORT01)
FROM KNA1
WHERE KUNNR = ITAB-KUNNR
AND KTOKD IN S_KTOKD.
IF SY-SUBRC NE 0.
DELETE ITAB.
CONTINUE.
ENDIF.
MODIFY ITAB.
ENDLOOP.
ENDFORM. " FILTER_RECORDS

*&---------------------------------------------------------------------*
*& Form GET_CUSTOMER_INVOICES
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM GET_CUSTOMER_INVOICES.

MOVE STIDA TO RF140-STIDA.
MOVE RF140-STIDA+4(2) TO TARG_MONTH.
MOVE RF140-STIDA+0(4) TO TARG_YEAR.
TARG_MTH_ABS = ( TARG_YEAR * 12 ) + TARG_MONTH.

* select open items.
SELECT KUNNR BELNR GJAHR BLDAT XBLNR BLART SGTXT " 0001
SHKZG DMBTR ZFBDT ZBD1T ZBD2T ZBD3T VBELN
zuonr
FROM BSID INTO TABLE INREC
WHERE BUKRS = P_BUKRS
AND BUDAT LE STIDA
AND KUNNR IN S_KUNNR
and blart in s_blart.

LOOP AT INREC.
IF INREC-SHKZG = 'H'.
INREC-DMBTR = INREC-DMBTR * -1.
ENDIF.
MOVE-CORRESPONDING INREC TO T_ITEM. " 0001
PERFORM COLLECT_INVOICE USING INREC-KUNNR INREC-DMBTR
INREC-ZFBDT INREC-ZBD1T
INREC-ZBD2T INREC-ZBD3T.
APPEND T_ITEM.
CLEAR T_ITEM.
ENDLOOP.

* select cleared items
REFRESH INREC. CLEAR INREC.
SELECT KUNNR BELNR GJAHR BLDAT XBLNR BLART SGTXT
SHKZG DMBTR ZFBDT ZBD1T ZBD2T ZBD3T VBELN
zuonr
FROM BSAD INTO TABLE INREC
WHERE BUKRS = P_BUKRS
AND BUDAT LE STIDA
AND AUGDT > STIDA
AND KUNNR IN S_KUNNR
and blart in s_blart.
LOOP AT INREC.
IF INREC-SHKZG = 'H'.
INREC-DMBTR = INREC-DMBTR * -1.
ENDIF.
MOVE-CORRESPONDING INREC TO T_ITEM. " 0001
PERFORM COLLECT_INVOICE USING INREC-KUNNR INREC-DMBTR
INREC-ZFBDT INREC-ZBD1T
INREC-ZBD2T INREC-ZBD3T.
APPEND T_ITEM.
CLEAR T_ITEM. " 0001
ENDLOOP.

ENDFORM. " GET_CUSTOMER_INVOICES

*&---------------------------------------------------------------------*
*& Form COLLECT_INVOICE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_BSID_KUNNR text
* -->P_BSID_DMBTR text
* -->P_BSID_ZFBDT text
* -->P_BSID_ZFBDT1 text
* -->P_BSID_ZFBDT2 text
* -->P_BSID_ZFBDT3 text
*----------------------------------------------------------------------*
FORM COLLECT_INVOICE USING PP_KUNNR
PP_DMBTR
PP_ZFBDT
PP_ZBD1T
PP_ZBD2T
PP_ZBD3T.

DOC_MONTH = PP_ZFBDT+4(2).
DOC_YEAR = PP_ZFBDT+0(4).
DOC_MTH_ABS = ( DOC_YEAR * 12 ) + DOC_MONTH.
MTH_RESULT = ( TARG_MTH_ABS - DOC_MTH_ABS ).

IF NOT PP_ZBD3T IS INITIAL.
MOVE PP_ZBD3T TO EXT_DAYS.
ELSEIF NOT PP_ZBD2T IS INITIAL.
MOVE PP_ZBD2T TO EXT_DAYS.
ELSEIF NOT PP_ZBD1T IS INITIAL.
MOVE PP_ZBD1T TO EXT_DAYS.
ELSE.
CLEAR EXT_DAYS.
ENDIF.
* CHECK with Andrew whether this is working or not
* if extended payment terms exist, subtract no of mths from mth_result
* IF NOT EXT_DAYS IS INITIAL.
* CASE EXT_DAYS.
* WHEN 30.
* SUBTRACT 1 FROM MTH_RESULT.
* WHEN 60.
* SUBTRACT 2 FROM MTH_RESULT.
* WHEN 90.
* SUBTRACT 3 FROM MTH_RESULT.
* WHEN 120.
* SUBTRACT 4 FROM MTH_RESULT.
* ENDCASE.
* ENDIF.
* change to key date
IF P_FUTURE = 'X'. " 0001
IF MTH_RESULT <= 0.
ITAB-ZCURRENT = PP_DMBTR.
T_ITEM-DAYS = 'CUR'.
ELSEIF MTH_RESULT = 1.
ITAB-30DAYS = PP_DMBTR.
T_ITEM-DAYS = '30D'.
ELSEIF MTH_RESULT = 2.
ITAB-60DAYS = PP_DMBTR.
T_ITEM-DAYS = '60D'.
ELSEIF MTH_RESULT = 3.
ITAB-90DAYS = PP_DMBTR.
T_ITEM-DAYS = '90D'.
ELSEIF MTH_RESULT > 3.
ITAB-99DAYS = PP_DMBTR.
T_ITEM-DAYS = '99D'.
ENDIF.
ELSE.
IF MTH_RESULT < 0.
ITAB-ZFUTURE = PP_DMBTR.
T_ITEM-DAYS = 'FUT'.
ELSEIF MTH_RESULT = 0.
ITAB-ZCURRENT = PP_DMBTR.
T_ITEM-DAYS = 'CUR'.
ELSEIF MTH_RESULT = 1.
ITAB-30DAYS = PP_DMBTR.
T_ITEM-DAYS = '30D'.
ELSEIF MTH_RESULT = 2.
ITAB-60DAYS = PP_DMBTR.
T_ITEM-DAYS = '60D'.
ELSEIF MTH_RESULT = 3.
ITAB-90DAYS = PP_DMBTR.
T_ITEM-DAYS = '90D'.
ELSEIF MTH_RESULT > 3.
ITAB-99DAYS = PP_DMBTR.
T_ITEM-DAYS = '99D'.
ENDIF.
ENDIF. " 0001
ITAB-KUNNR = PP_KUNNR.
ITAB-TOTAL = PP_DMBTR.
COLLECT ITAB.
CLEAR ITAB.
ENDFORM. " COLLECT_INVOICE
*&---------------------------------------------------------------------*
*& Form ADD_SORT_FIELD
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM ADD_SORT_FIELD.
DATA: L_AMOUNT(9) TYPE N.
IF P_FUTURE = 'X'.
LOOP AT ITAB.
L_AMOUNT = 999999999.
IF ITAB-99DAYS > 0.
L_AMOUNT = L_AMOUNT - ITAB-99DAYS.
CONCATENATE 'A' L_AMOUNT INTO ITAB-PSORT.
ELSEIF ITAB-90DAYS > 0.
L_AMOUNT = L_AMOUNT - ITAB-90DAYS.
CONCATENATE 'B' L_AMOUNT INTO ITAB-PSORT.
ELSEIF ITAB-60DAYS > 0.
L_AMOUNT = L_AMOUNT - ITAB-60DAYS.
CONCATENATE 'C' L_AMOUNT INTO ITAB-PSORT.
ELSEIF ITAB-30DAYS > 0.
L_AMOUNT = L_AMOUNT - ITAB-30DAYS.
CONCATENATE 'D' L_AMOUNT INTO ITAB-PSORT.
ELSEIF ITAB-ZCURRENT > 0.
L_AMOUNT = L_AMOUNT - ITAB-ZCURRENT.
CONCATENATE 'E' L_AMOUNT INTO ITAB-PSORT.
* ELSEif itab-zfuture > 0.
* L_AMOUNT = L_AMOUNT - ITAB-zfuture.
* CONCATENATE 'F' L_AMOUNT INTO ITAB-PSORT.
ELSE.
L_AMOUNT = ABS( ITAB-TOTAL ).
CONCATENATE 'G' L_AMOUNT INTO ITAB-PSORT.
ENDIF.
MODIFY ITAB.
ENDLOOP.
ELSE.
LOOP AT ITAB.
L_AMOUNT = 999999999.
IF ITAB-99DAYS > 0.
L_AMOUNT = L_AMOUNT - ITAB-99DAYS.
CONCATENATE 'A' L_AMOUNT INTO ITAB-PSORT.
ELSEIF ITAB-90DAYS > 0.
L_AMOUNT = L_AMOUNT - ITAB-90DAYS.
CONCATENATE 'B' L_AMOUNT INTO ITAB-PSORT.
ELSEIF ITAB-60DAYS > 0.
L_AMOUNT = L_AMOUNT - ITAB-60DAYS.
CONCATENATE 'C' L_AMOUNT INTO ITAB-PSORT.
ELSEIF ITAB-30DAYS > 0.
L_AMOUNT = L_AMOUNT - ITAB-30DAYS.
CONCATENATE 'D' L_AMOUNT INTO ITAB-PSORT.
ELSEIF ITAB-ZCURRENT > 0.
L_AMOUNT = L_AMOUNT - ITAB-ZCURRENT.
CONCATENATE 'E' L_AMOUNT INTO ITAB-PSORT.
ELSEIF ITAB-ZFUTURE > 0.
L_AMOUNT = L_AMOUNT - ITAB-ZFUTURE.
CONCATENATE 'F' L_AMOUNT INTO ITAB-PSORT.
ELSE.
L_AMOUNT = ABS( ITAB-TOTAL ).
CONCATENATE 'G' L_AMOUNT INTO ITAB-PSORT.
ENDIF.
MODIFY ITAB.
ENDLOOP.
ENDIF.

ENDFORM. " ADD_SORT_FIELD
*&---------------------------------------------------------------------*
*& Form WRITE_REPORT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM WRITE_REPORT.
PERFORM BUILD_FIELDCAT.
PERFORM BUILD_SORTCAT.
PERFORM BUILD_EVENTCAT.
PERFORM BUILD_LAYOUT.
PERFORM START_LIST_VIEWER.
ENDFORM. " WRITE_REPORT

*&---------------------------------------------------------------------*
*& Form BUILD_FIELDCAT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM BUILD_FIELDCAT.
* KUNNR
ADD 1 TO COL_POS.
CLEAR FIELDCAT_LN.
FIELDCAT_LN-REF_TABNAME = 'KNA1'.
FIELDCAT_LN-FIELDNAME = 'KUNNR'.
FIELDCAT_LN-COL_POS = COL_POS.
FIELDCAT_LN-HOTSPOT = 'X'.
fieldcat_ln-emphasize = 'C41'.
APPEND FIELDCAT_LN TO FIELDCAT.
* Name1
ADD 1 TO COL_POS.
CLEAR FIELDCAT_LN.
FIELDCAT_LN-REF_TABNAME = 'KNA1'.
FIELDCAT_LN-FIELDNAME = 'NAME1'.
fieldcat_ln-emphasize = 'C41'.
FIELDCAT_LN-COL_POS = COL_POS.
APPEND FIELDCAT_LN TO FIELDCAT.
* Credit Limit
ADD 1 TO COL_POS.
CLEAR FIELDCAT_LN.
FIELDCAT_LN-REF_TABNAME = 'KNKK'.
FIELDCAT_LN-FIELDNAME = 'KLIMK'.
FIELDCAT_LN-COL_POS = COL_POS.
fieldcat_ln-emphasize = 'C41'.
APPEND FIELDCAT_LN TO FIELDCAT.
* Total Amount
ADD 1 TO COL_POS.
CLEAR FIELDCAT_LN.
FIELDCAT_LN-REF_TABNAME = 'BSID'.
FIELDCAT_LN-REF_FIELDNAME = 'DMBTR'.
FIELDCAT_LN-FIELDNAME = 'TOTAL'.
FIELDCAT_LN-COL_POS = COL_POS.
fieldcat_ln-emphasize = 'C41'.
FIELDCAT_LN-DO_SUM = 'X'.
FIELDCAT_LN-HOTSPOT = 'X'.
FIELDCAT_LN-SELTEXT_L = 'Out.St.Amount'.
FIELDCAT_LN-SELTEXT_M = 'Out.St.Amount'.
FIELDCAT_LN-SELTEXT_S = 'Out.St.Amount'.
APPEND FIELDCAT_LN TO FIELDCAT.
IF P_FUTURE NE 'X'.
* Future
ADD 1 TO COL_POS.
CLEAR FIELDCAT_LN.
FIELDCAT_LN-REF_TABNAME = 'BSID'.
FIELDCAT_LN-REF_FIELDNAME = 'DMBTR'.
FIELDCAT_LN-FIELDNAME = 'ZFUTURE'.
FIELDCAT_LN-COL_POS = COL_POS.
FIELDCAT_LN-DO_SUM = 'X'.
FIELDCAT_LN-HOTSPOT = 'X'.
fieldcat_ln-emphasize = 'C41'.
FIELDCAT_LN-SELTEXT_L = 'Future'.
FIELDCAT_LN-SELTEXT_M = 'Future'.
FIELDCAT_LN-SELTEXT_S = 'Future'.
APPEND FIELDCAT_LN TO FIELDCAT.
ENDIF.
* Current
ADD 1 TO COL_POS.
CLEAR FIELDCAT_LN.
FIELDCAT_LN-REF_TABNAME = 'BSID'.
FIELDCAT_LN-REF_FIELDNAME = 'DMBTR'.
FIELDCAT_LN-FIELDNAME = 'ZCURRENT'.
FIELDCAT_LN-COL_POS = COL_POS.
FIELDCAT_LN-DO_SUM = 'X'.
FIELDCAT_LN-HOTSPOT = 'X'.
fieldcat_ln-emphasize = 'C41'.
FIELDCAT_LN-SELTEXT_L = 'Current'.
FIELDCAT_LN-SELTEXT_M = 'Current'.
FIELDCAT_LN-SELTEXT_S = 'Current'.
APPEND FIELDCAT_LN TO FIELDCAT.
* 30 Days
ADD 1 TO COL_POS.
CLEAR FIELDCAT_LN.
FIELDCAT_LN-REF_TABNAME = 'BSID'.
FIELDCAT_LN-REF_FIELDNAME = 'DMBTR'.
FIELDCAT_LN-FIELDNAME = '30DAYS'.
FIELDCAT_LN-COL_POS = COL_POS.
FIELDCAT_LN-DO_SUM = 'X'.
FIELDCAT_LN-HOTSPOT = 'X'.
fieldcat_ln-emphasize = 'C41'.
FIELDCAT_LN-SELTEXT_L = '30 Days'.
FIELDCAT_LN-SELTEXT_M = '30 Days'.
FIELDCAT_LN-SELTEXT_S = '30 Days'.
APPEND FIELDCAT_LN TO FIELDCAT.
* 60 Days
ADD 1 TO COL_POS.
CLEAR FIELDCAT_LN.
FIELDCAT_LN-REF_TABNAME = 'BSID'.
FIELDCAT_LN-REF_FIELDNAME = 'DMBTR'.
FIELDCAT_LN-FIELDNAME = '60DAYS'.
FIELDCAT_LN-COL_POS = COL_POS.
FIELDCAT_LN-DO_SUM = 'X'.
FIELDCAT_LN-HOTSPOT = 'X'.
fieldcat_ln-emphasize = 'C41'.
FIELDCAT_LN-SELTEXT_L = '60 Days'.
FIELDCAT_LN-SELTEXT_M = '60 Days'.
FIELDCAT_LN-SELTEXT_S = '60 Days'.
APPEND FIELDCAT_LN TO FIELDCAT.
* 90 Days
ADD 1 TO COL_POS.
CLEAR FIELDCAT_LN.
FIELDCAT_LN-REF_TABNAME = 'BSID'.
FIELDCAT_LN-REF_FIELDNAME = 'DMBTR'.
FIELDCAT_LN-FIELDNAME = '90DAYS'.
FIELDCAT_LN-COL_POS = COL_POS.
FIELDCAT_LN-DO_SUM = 'X'.
FIELDCAT_LN-HOTSPOT = 'X'.
fieldcat_ln-emphasize = 'C41'.
FIELDCAT_LN-SELTEXT_L = '90 Days'.
FIELDCAT_LN-SELTEXT_M = '90 Days'.
FIELDCAT_LN-SELTEXT_S = '90 Days'.
APPEND FIELDCAT_LN TO FIELDCAT.
* 99 Days
ADD 1 TO COL_POS.
CLEAR FIELDCAT_LN.
FIELDCAT_LN-REF_TABNAME = 'BSID'.
FIELDCAT_LN-REF_FIELDNAME = 'DMBTR'.
FIELDCAT_LN-FIELDNAME = '99DAYS'.
FIELDCAT_LN-COL_POS = COL_POS.
FIELDCAT_LN-DO_SUM = 'X'.
FIELDCAT_LN-HOTSPOT = 'X'.
fieldcat_ln-emphasize = 'C41'.
FIELDCAT_LN-SELTEXT_L = '120 Days'.
FIELDCAT_LN-SELTEXT_M = '120 Days'.
FIELDCAT_LN-SELTEXT_S = '120 Days'.
APPEND FIELDCAT_LN TO FIELDCAT.

* Last Payment Date
ADD 1 TO COL_POS.
CLEAR FIELDCAT_LN.
FIELDCAT_LN-REF_TABNAME = 'KNKK'.
FIELDCAT_LN-FIELDNAME = 'CASHD'.
FIELDCAT_LN-COL_POS = COL_POS.
APPEND FIELDCAT_LN TO FIELDCAT.

* Street Name
ADD 1 TO COL_POS.
CLEAR FIELDCAT_LN.
FIELDCAT_LN-REF_TABNAME = 'KNA1'.
FIELDCAT_LN-FIELDNAME = 'STRAS'.
FIELDCAT_LN-COL_POS = COL_POS.
APPEND FIELDCAT_LN TO FIELDCAT.

* City Details
ADD 1 TO COL_POS.
CLEAR FIELDCAT_LN.
FIELDCAT_LN-REF_TABNAME = 'KNA1'.
FIELDCAT_LN-FIELDNAME = 'ORT01'.
FIELDCAT_LN-COL_POS = COL_POS.
APPEND FIELDCAT_LN TO FIELDCAT.


* Telephone
ADD 1 TO COL_POS.
CLEAR FIELDCAT_LN.
FIELDCAT_LN-REF_TABNAME = 'KNA1'.
FIELDCAT_LN-FIELDNAME = 'TELF1'.
FIELDCAT_LN-COL_POS = COL_POS.
APPEND FIELDCAT_LN TO FIELDCAT.
* Credit Group
ADD 1 TO COL_POS.
CLEAR FIELDCAT_LN.
FIELDCAT_LN-REF_TABNAME = 'KNKK'.
FIELDCAT_LN-FIELDNAME = 'GRUPP'.
FIELDCAT_LN-COL_POS = COL_POS.
APPEND FIELDCAT_LN TO FIELDCAT.
* Sales Office
ADD 1 TO COL_POS.
CLEAR FIELDCAT_LN.
FIELDCAT_LN-REF_TABNAME = 'KNVV'.
FIELDCAT_LN-FIELDNAME = 'VKBUR'.
FIELDCAT_LN-COL_POS = COL_POS.
APPEND FIELDCAT_LN TO FIELDCAT.
* Cust Creat Date
ADD 1 TO COL_POS.
CLEAR FIELDCAT_LN.
FIELDCAT_LN-REF_TABNAME = 'KNA1'.
FIELDCAT_LN-FIELDNAME = 'ERDAT'.
FIELDCAT_LN-COL_POS = COL_POS.
APPEND FIELDCAT_LN TO FIELDCAT.
* Del Plant
ADD 1 TO COL_POS.
CLEAR FIELDCAT_LN.
FIELDCAT_LN-REF_TABNAME = 'KNVV'.
FIELDCAT_LN-FIELDNAME = 'VWERK'.
FIELDCAT_LN-COL_POS = COL_POS.
APPEND FIELDCAT_LN TO FIELDCAT.
* Sales Group
ADD 1 TO COL_POS.
CLEAR FIELDCAT_LN.
FIELDCAT_LN-REF_TABNAME = 'KNVV'.
FIELDCAT_LN-FIELDNAME = 'VKGRP'.
FIELDCAT_LN-COL_POS = COL_POS.
APPEND FIELDCAT_LN TO FIELDCAT.
* Sort Criteria
ADD 1 TO COL_POS.
CLEAR FIELDCAT_LN.
FIELDCAT_LN-REF_TABNAME = 'BSID'.
FIELDCAT_LN-REF_FIELDNAME = 'KUNNR'.
FIELDCAT_LN-FIELDNAME = 'PSORT'.
FIELDCAT_LN-COL_POS = COL_POS.
FIELDCAT_LN-DO_SUM = 'X'.
FIELDCAT_LN-SELTEXT_L = 'Sort Field'.
FIELDCAT_LN-SELTEXT_M = 'Sort Field'.
FIELDCAT_LN-SELTEXT_S = 'Sort Field'.
APPEND FIELDCAT_LN TO FIELDCAT.

ENDFORM. " BUILD_FIELDCAT
*&---------------------------------------------------------------------*
*& Form BUILD_SORTCAT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM BUILD_SORTCAT.
* SORTCAT_LN-SPOS = '1'.
SORTCAT_LN-SPOS = '2'. " 0001
SORTCAT_LN-FIELDNAME = 'PSORT'.
SORTCAT_LN-UP = 'X'. " 0001
* sortcat_ln-subtot = 'X'.
APPEND SORTCAT_LN TO SORTCAT.

CLEAR SORTCAT_LN.
* SORTCAT_LN-SPOS = '2'.
* SORTCAT_LN-FIELDNAME = 'KUNNR'.
SORTCAT_LN-SPOS = '1'. " 0001
SORTCAT_LN-FIELDNAME = 'NAME1'. " 0001
SORTCAT_LN-UP = 'X'.
APPEND SORTCAT_LN TO SORTCAT.

ENDFORM. " BUILD_SORTCAT

*&---------------------------------------------------------------------*
*& Form BUILD_EVENTCAT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM BUILD_EVENTCAT.
EVENTCAT_LN-NAME = 'TOP_OF_PAGE'.
EVENTCAT_LN-FORM = 'PAGE_HEADER'.
APPEND EVENTCAT_LN TO EVENTCAT.
ENDFORM. " BUILD_EVENTCAT

*&---------------------------------------------------------------------*
*& Form BUILD_LAYOUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM BUILD_LAYOUT.
LAYOUT_IN-COLWIDTH_OPTIMIZE = 'X'.
* layout_in-no_hotspot = 'X'.
LAYOUT_IN-ZEBRA = 'X'.
LAYOUT_IN-GET_SELINFOS = 'X'.
ENDFORM. " BUILD_LAYOUT

*&---------------------------------------------------------------------*
*& Form START_LIST_VIEWER
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM START_LIST_VIEWER.
DATA: PGM LIKE SY-REPID.
PGM = SY-REPID.
* if t_variant[] is initial.
* t_variant-report = pgm.
* t_variant-variant = '/ATB'.
* t_variant-TEXT = '/ATB'.
* t_variant-DEPENDVARS = 'S'.
* append t_variant.
* clear t_variant.
* endif.
CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
EXPORTING
I_CALLBACK_PROGRAM = PGM
I_CALLBACK_USER_COMMAND = 'USER_COMMAND'
IT_FIELDCAT = FIELDCAT
IT_SORT = SORTCAT
IS_LAYOUT = LAYOUT_IN
I_SAVE = 'A'
* IS_VARIANT = t_variant
IT_EVENTS = EVENTCAT
TABLES
T_OUTTAB = ITAB
EXCEPTIONS
OTHERS = 2.

ENDFORM. " START_LIST_VIEWER
*-----------------------------------------------------------------------
FORM USER_COMMAND USING UCOMM LIKE SY-UCOMM
SELFIELD TYPE SLIS_SELFIELD.
data l_kunnr(10) type n.
READ TABLE ITAB INDEX SELFIELD-TABINDEX.
CHECK SY-SUBRC = 0.
CASE UCOMM.
WHEN '&IC1'.
CASE SELFIELD-SEL_TAB_FIELD.
WHEN 'ITAB-KUNNR'.
* SET PARAMETER ID 'KUN' FIELD ITAB-KUNNR.
* SET PARAMETER ID 'BUK' FIELD P_BUKRS.
if itab-kunnr co '0123456789 '.
l_kunnr = itab-kunnr.
itab-kunnr = l_kunnr.
endif.
select single kkber into knkk-kkber
from knkk where kunnr = itab-kunnr.
if sy-subrc eq 0.
v_kkber = knkk-kkber.
else.
clear v_kkber.
endif.
refresh sel_tab[].
MOVE: 'KUNNR' TO SEL_TAB-SELNAME,
'P' TO SEL_TAB-KIND, " PARAMETER
itab-kunnr TO SEL_TAB-LOW.
APPEND SEL_TAB.
clear sel_tab.
MOVE: 'KKBER' TO SEL_TAB-SELNAME,
'P' TO SEL_TAB-KIND, " PARAMETER
v_kkber TO SEL_TAB-LOW.
APPEND SEL_TAB.
clear sel_tab.

SUBMIT RFDKLI41
USING SELECTION-SET 'VAR1'
WITH SELECTION-TABLE SEL_TAB
AND RETURN.
* CALL TRANSACTION 'XD03'.
WHEN 'ITAB-ZCURRENT'. " 0001
V_DAYS = 'CUR'.
PERFORM DISPLAY_LINE_ITEM_LEVEL.
WHEN 'ITAB-ZFUTURE'.
V_DAYS = 'FUT'.
PERFORM DISPLAY_LINE_ITEM_LEVEL.
WHEN 'ITAB-30DAYS'.
V_DAYS = '30D'.
PERFORM DISPLAY_LINE_ITEM_LEVEL.
WHEN 'ITAB-60DAYS'.
V_DAYS = '60D'.
PERFORM DISPLAY_LINE_ITEM_LEVEL.
WHEN 'ITAB-90DAYS'.
V_DAYS = '90D'.
PERFORM DISPLAY_LINE_ITEM_LEVEL.
WHEN 'ITAB-99DAYS'.
V_DAYS = '99D'.
PERFORM DISPLAY_LINE_ITEM_LEVEL.
WHEN 'ITAB-TOTAL'.
V_DAYS = ' '.
PERFORM DISPLAY_LINE_ITEM_LEVEL. " 0001
ENDCASE.
ENDCASE.
ENDFORM.
*----------------------------------------------------------------------*
* PAGE_HEADER
*----------------------------------------------------------------------*
FORM PAGE_HEADER.

WRITE:/02 'Report:',SY-REPID,
115 'Time:', SY-TIMLO.

WRITE: /02 'User:', (10) SY-UNAME,
115 'Date:', SY-DATUM.


WRITE: /52 'Customer Aged Trial Balance List', "0002
115 'Page:', SY-PAGNO.
SKIP.
ULINE /(132).

***
WRITE: /02 'Open Items as of:', STIDA.

IF NOT S_VKGRP[] IS INITIAL.
IF S_VKGRP-HIGH IS INITIAL.
WRITE: 52 'Sales Group :',S_VKGRP-LOW.
ELSE.
WRITE: 52 'Sales Group :',S_VKGRP-LOW,'to',S_VKGRP-HIGH.
ENDIF.
ELSE.
WRITE: 52 'Sales Group : All'.
ENDIF.

IF NOT S_GRUPP[] IS INITIAL.
IF S_GRUPP-HIGH IS INITIAL.
WRITE: 107 'Credit group :',S_GRUPP-LOW.
ELSE.
WRITE: 107 'Credit group :',S_GRUPP-LOW,' to',S_GRUPP-HIGH.
ENDIF.
ELSE.
WRITE: 107 'Credit Group : All'.
ENDIF.
***
WRITE: /02 'Comapany Code :', P_BUKRS.
IF NOT S_KONDA[] IS INITIAL.
IF S_KONDA-HIGH IS INITIAL.
WRITE: 52 'Price group :',S_KONDA-LOW.
ELSE.
WRITE: 52 'Price group :',S_KONDA-LOW,' to',S_KONDA-HIGH.
ENDIF.
ELSE.
WRITE: 52 'Price Group : All'.
ENDIF.

IF NOT S_CTLPC[] IS INITIAL.
IF S_CTLPC-HIGH IS INITIAL.
WRITE: 107 'Risk category:',S_CTLPC-LOW.
ELSE.
WRITE: 107 'Risk category:',S_CTLPC-LOW,' to',S_CTLPC-HIGH.
ENDIF.
ELSE.
WRITE: 107 'Risk category: All'.
ENDIF.
***
IF NOT S_VKBUR[] IS INITIAL.
IF S_VKBUR-HIGH IS INITIAL.
WRITE:/02 'Sales Office :',S_VKBUR-LOW.
ELSE.
WRITE:/02 'Sales Office :',S_VKBUR-LOW,' to',S_VKBUR-HIGH.
ENDIF.
ELSE.
WRITE:/02 'Sales Office : All'.
ENDIF.

IF NOT S_KDGRP[] IS INITIAL.
IF S_KDGRP-HIGH IS INITIAL.
WRITE: 52 'Customer group :',S_KDGRP-LOW.
ELSE.
WRITE: 52 'Customer group :',S_KDGRP-LOW,' to',S_KDGRP-HIGH.
ENDIF.
ELSE.
WRITE: 52 'Customer group : All'.
ENDIF.

IF NOT S_KTOKD[] IS INITIAL.
IF S_KTOKD-HIGH IS INITIAL.
WRITE: 107 'Account Group:',S_KTOKD-LOW.
ELSE.
WRITE: 107 'Account Group:',S_KTOKD-LOW,' to',S_KTOKD-HIGH.
ENDIF.
ELSE.
WRITE: 107 'Account Group: All'.
ENDIF.
***
IF NOT S_KUNNR[] IS INITIAL.
IF S_KUNNR-HIGH IS INITIAL.
WRITE: /02 'Customer No :',S_KUNNR-LOW.
ELSE.
WRITE: /02 'Customer No :',S_KUNNR-LOW,' to',S_KUNNR-HIGH.
ENDIF.
ELSE.
WRITE: /02 'Customer No : All'.
ENDIF.

IF NOT S_KKBER[] IS INITIAL.
IF S_KKBER-HIGH IS INITIAL.
WRITE: 52 'Credit Control Area:',S_KKBER-LOW.
ELSE.
WRITE: 52 'Credit Control Area:',S_KKBER-LOW,' to',S_KKBER-HIGH.
ENDIF.
ELSE.
WRITE: 52 'Credit Control Area: All'.
ENDIF.
SKIP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form display_line_item_level
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM DISPLAY_LINE_ITEM_LEVEL.
REFRESH T_LINE[].
IF V_DAYS EQ SPACE.
LOOP AT T_ITEM WHERE KUNNR = ITAB-KUNNR.
MOVE-CORRESPONDING T_ITEM TO T_LINE.
APPEND T_LINE.
CLEAR T_LINE.
ENDLOOP.
ELSE.
LOOP AT T_ITEM WHERE KUNNR = ITAB-KUNNR
AND DAYS = V_DAYS.
MOVE-CORRESPONDING T_ITEM TO T_LINE.
APPEND T_LINE.
CLEAR T_LINE.
ENDLOOP.
ENDIF.
PERFORM BUILD_FIELDCAT_ITEM.
PERFORM BUILD_SORTCAT_ITEM.
PERFORM BUILD_EVENTCAT_ITEM.
PERFORM BUILD_LAYOUT_ITEM.
PERFORM START_LIST_VIEWER_ITEM.

ENDFORM. " display_line_item_level

*&---------------------------------------------------------------------*
*& Form BUILD_FIELDCAT_item
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM BUILD_FIELDCAT_ITEM.
REFRESH FIELDCAT1.
* DOCU TYPE
ADD 1 TO COL_POS.
CLEAR FIELDCAT_LN.
FIELDCAT_LN-REF_TABNAME = 'BSID'.
FIELDCAT_LN-REF_FIELDNAME = 'BLART'.
FIELDCAT_LN-FIELDNAME = 'BLART'.
FIELDCAT_LN-COL_POS = COL_POS.
APPEND FIELDCAT_LN TO FIELDCAT1.
* REF dOCU
ADD 1 TO COL_POS.
CLEAR FIELDCAT_LN.
FIELDCAT_LN-REF_TABNAME = 'BSID'.
FIELDCAT_LN-REF_FIELDNAME = 'XBLNR'.
FIELDCAT_LN-FIELDNAME = 'XBLNR'.
FIELDCAT_LN-COL_POS = COL_POS.
APPEND FIELDCAT_LN TO FIELDCAT1.

* BILLING dOCU
ADD 1 TO COL_POS.
CLEAR FIELDCAT_LN.
FIELDCAT_LN-REF_TABNAME = 'BSID'.
FIELDCAT_LN-REF_FIELDNAME = 'VBELN'.
FIELDCAT_LN-FIELDNAME = 'VBELN'.
FIELDCAT_LN-COL_POS = COL_POS.
FIELDCAT_LN-HOTSPOT = 'X'.
APPEND FIELDCAT_LN TO FIELDCAT1.
* Belnr
ADD 1 TO COL_POS.
CLEAR FIELDCAT_LN.
FIELDCAT_LN-REF_TABNAME = 'BSID'.
FIELDCAT_LN-FIELDNAME = 'BELNR'.
FIELDCAT_LN-FIELDNAME = 'BELNR'.
FIELDCAT_LN-COL_POS = COL_POS.
FIELDCAT_LN-HOTSPOT = 'X'.
APPEND FIELDCAT_LN TO FIELDCAT1.
* Budat
ADD 1 TO COL_POS.
CLEAR FIELDCAT_LN.
FIELDCAT_LN-REF_TABNAME = 'BSID'.
FIELDCAT_LN-FIELDNAME = 'BLDAT'.
FIELDCAT_LN-FIELDNAME = 'BLDAT'.
FIELDCAT_LN-COL_POS = COL_POS.
APPEND FIELDCAT_LN TO FIELDCAT1.

* Total Amount
ADD 1 TO COL_POS.
CLEAR FIELDCAT_LN.
FIELDCAT_LN-REF_TABNAME = 'BSID'.
FIELDCAT_LN-REF_FIELDNAME = 'DMBTR'.
FIELDCAT_LN-FIELDNAME = 'DMBTR'.
FIELDCAT_LN-COL_POS = COL_POS.
FIELDCAT_LN-DO_SUM = 'X'.
FIELDCAT_LN-SELTEXT_L = 'Amount'.
FIELDCAT_LN-SELTEXT_M = 'Amount'.
FIELDCAT_LN-SELTEXT_S = 'Amount'.
APPEND FIELDCAT_LN TO FIELDCAT1.

* zfbdt
ADD 1 TO COL_POS.
CLEAR FIELDCAT_LN.
FIELDCAT_LN-REF_TABNAME = 'BSID'.
FIELDCAT_LN-FIELDNAME = 'ZFBDT'.
FIELDCAT_LN-COL_POS = COL_POS.
APPEND FIELDCAT_LN TO FIELDCAT1.
* Total Amount
ADD 1 TO COL_POS.
CLEAR FIELDCAT_LN.
FIELDCAT_LN-REF_TABNAME = 'BSID'.
FIELDCAT_LN-REF_FIELDNAME = 'SGTXT'.
FIELDCAT_LN-FIELDNAME = 'SGTXT'.
FIELDCAT_LN-COL_POS = COL_POS.
APPEND FIELDCAT_LN TO FIELDCAT1.

ADD 1 TO COL_POS.
CLEAR FIELDCAT_LN.
FIELDCAT_LN-REF_TABNAME = 'BSID'.
FIELDCAT_LN-FIELDNAME = 'ZUONR'.
FIELDCAT_LN-COL_POS = COL_POS.
APPEND FIELDCAT_LN TO FIELDCAT1.



ENDFORM. " BUILD_FIELDCAT_item
*&---------------------------------------------------------------------*
*& Form BUILD_SORTCAT_item
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM BUILD_SORTCAT_ITEM.
REFRESH SORTCAT1.
SORTCAT_LN-SPOS = '1'.
SORTCAT_LN-FIELDNAME = 'BLDAT'.
SORTCAT_LN-UP = 'X'.
* sortcat_ln-subtot = 'X'.
APPEND SORTCAT_LN TO SORTCAT1.

CLEAR SORTCAT_LN.
SORTCAT_LN-SPOS = '2'.
SORTCAT_LN-FIELDNAME = 'BELNR'.
SORTCAT_LN-UP = 'X'.
APPEND SORTCAT_LN TO SORTCAT1.

ENDFORM. " BUILD_SORTCAT_item

*&---------------------------------------------------------------------*
*& Form BUILD_EVENTCAT_item
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM BUILD_EVENTCAT_ITEM.
REFRESH EVENTCAT1.
* EVENTCAT_LN-NAME = 'TOP_OF_PAGE'.
* EVENTCAT_LN-FORM = 'PAGE_HEADER'.
* APPEND EVENTCAT_LN TO EVENTCAT1.
ENDFORM. " BUILD_EVENTCAT_item

*&---------------------------------------------------------------------*
*& Form BUILD_LAYOUT_item
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM BUILD_LAYOUT_ITEM.
LAYOUT_IN1-COLWIDTH_OPTIMIZE = 'X'.
* layout_in-no_hotspot = 'X'.
LAYOUT_IN1-ZEBRA = 'X'.
LAYOUT_IN1-GET_SELINFOS = 'X'.
ENDFORM. " BUILD_LAYOUT_item

*&---------------------------------------------------------------------*
*& Form START_LIST_VIEWER_item
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM START_LIST_VIEWER_ITEM.
DATA: PGM LIKE SY-REPID.
PGM = SY-REPID.
CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
EXPORTING
I_CALLBACK_PROGRAM = PGM
I_CALLBACK_USER_COMMAND = 'USER_COMMAND1'
IT_FIELDCAT = FIELDCAT1
IT_SORT = SORTCAT1
IS_LAYOUT = LAYOUT_IN1
I_SAVE = 'A'
IT_EVENTS = EVENTCAT1
TABLES
T_OUTTAB = T_LINE
EXCEPTIONS
OTHERS = 2.

ENDFORM. " START_LIST_VIEWER_item
*---------------------------------------------------------------------*
* FORM USER_COMMAND1 *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> UCOMM *
* --> SELFIELD *
*---------------------------------------------------------------------*
FORM USER_COMMAND1 USING UCOMM LIKE SY-UCOMM
SELFIELD TYPE SLIS_SELFIELD.
IF SY-LSIND = 0.
ENDIF.
READ TABLE T_LINE INDEX SELFIELD-TABINDEX.
CHECK SY-SUBRC = 0.
CASE UCOMM.
WHEN '&IC1'.
CASE SELFIELD-SEL_TAB_FIELD.
WHEN 'T_LINE-KUNNR'.
SET PARAMETER ID 'KUN' FIELD ITAB-KUNNR.
SET PARAMETER ID 'BUK' FIELD P_BUKRS.
CALL TRANSACTION 'XD03' and skip first screen.
WHEN 'T_LINE-BELNR'.
SET PARAMETER ID 'BLN' FIELD T_LINE-BELNR.
SET PARAMETER ID 'BUK' FIELD P_BUKRS.
SET PARAMETER ID 'GJR' FIELD T_LINE-GJAHR.
CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.
WHEN 'T_LINE-VBELN'.
SET PARAMETER ID 'VF' FIELD T_LINE-VBELN.
CALL TRANSACTION 'VF03' AND SKIP FIRST SCREEN.
ENDCASE.
ENDCASE.
ENDFORM.