Showing posts with label ABAP. Show all posts
Showing posts with label ABAP. Show all posts

2011/04/21

用例:ALVの出荷伝票番号、受注伝票番号をWクリックして、伝票照合画面に遷移する。

ログラム呼出の前に SPA/GPA パラメータを設定する場合は、第一画面のどの項目にどのパラメータがリンクされているかを把握している必要があります。この情報を簡単に確認するには、呼び出すプログラムを起動して入力項目の上にカーソルを置き、 技術情報の前の F1 を選択します。対応する SPA/GPA パラメータの名称が項目パラメータ ID に含まれています。あるいは、スクリーンペインタの画面定義を参照して確認することもできます。
※SAP Memory(SPA/GPA)

用例:ALVの出荷伝票番号、受注伝票番号をWクリックして、伝票照合画面に遷移する。


FORM UCOMM_WCLICK USING RS_SELFIELD TYPE SLIS_SELFIELD.

IF RS_SELFIELD-VALUE <> SPACE.

* 出荷伝票番号
IF RS_SELFIELD-SEL_TAB_FIELD = 'TD_DATA-VBELN'.
SET PARAMETER ID 'VL' FIELD RS_SELFIELD-VALUE.
CALL TRANSACTION 'VL03N' AND SKIP FIRST SCREEN. "#EC CI_CALLTA
LEAVE TO LIST-PROCESSING.
ENDIF.

* 受注伝票番号
IF RS_SELFIELD-SEL_TAB_FIELD = 'TD_DATA-VGBEL'.
SET PARAMETER ID 'AUN' FIELD RS_SELFIELD-VALUE.
CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN. "#EC CI_CALLTA
LEAVE TO LIST-PROCESSING.
ENDIF.

ENDIF.

ENDFORM. " UCOMM_WCLICK

2011/03/23

複数回REUSE_ALV_GRID_DISPLAYを呼び出す時に、複数回「全画面F3」ボタンを押さないと、EXITできない問題

複数回REUSE_ALV_GRID_DISPLAYを呼び出す時に、複数回「全画面F3」ボタンを押さないと、EXITできない問題
FORM F_ALV_USER_COMMAND USING R_UCOMM LIKE SY-UCOMM
RS_SELFIELD TYPE SLIS_SELFIELD.

RS_SELFIELD-EXIT を'X'に設定すれば、

前alvをクリアされる。

2011/03/10

請求伝票をみて、出荷関連か、受注関連かを判断する方法 販売伝票タイプTBL:TVAK

販売伝票タイプTBL:TVAK
請求伝票をみて、出荷関連か、受注関連かを判断する方法

2011/02/10

ABAP  REGEX正規表現

ABAP  REGEX正規表現

SE:38  DEMO_REGEX_TOY

image002.jpg

* パターン:MESSAGE E001(ZJMM001) | パターン:MESSAGE E001
FIND ALL OCCURRENCES OF

REGEX 'message\s\w{1}\d{3}\(\w{7}\)|message\s\w{1}\d{3}' IN LW_LONGSTRING
IGNORING CASE RESULTS RESULT_TAB.

2011/02/07

バリアントの依存と非依存

バリアントの依存と非依存

SE38で作ったバリアントは普通はクライアント依存になる。

移送依頼は:「ユーティリティ⇒移送依頼」で発行する。

下記の場合には、バリアントはクライアント非依存扱い。

バリアントの前にCUS&を付けると、クライアント非依存のバリアントになります。移送依頼はバリアント保存時に発行される。

2010/08/31

通过SAP表维护工具来维护自定义表TCODE [转]

在sap开发的过程中,经常需要自定义数据表,对于简单的数据表,我们可以通过sap的表维护工具生成维护代码,并建立自定义的TCODE来维护其数据。具体步骤如下:

一、建立自定义表(TCODE :SE11)
1 在"Delivery and Maintenance"Tab屏幕设置"Data Browser/Table view Maint."属性为"允许通过标准表格维护工具维护"
2 设计表格字段
3 设置表格技术设置,菜单:转到-》技术设置
4 保存激活。

二、生成维护代码
生成维护代码代码有两个途径:
1、se11界面的菜单:实用程序-》Table Maintenance Generator其实这里就是调用SE54
2、通过TCODE: SE54

三、建立自定义CODE(TCODE:SE93)
有三种方法来建立自己的TCODE来维护自定义表;
1 通过SM30维护
进入TCODE:SE93建立新TCODE,tcode类型选择为:"Transaction with parameters(parameter transaction)";事务栏输入"SM30";选中"跳过起始屏幕";选中"Inherit GUI attribute";输入默认字段:VIEWNAME = '自定义的表名' 和UPDATE = 'X';保存激活即可;
2 通过RS_TABLE_LIST_CREATE函数建立新程序来建立TCODE
新程序代码如下

report zjwec026 .

call function
'RS_TABLE_LIST_CREATE'
exporting
action
='ANLE'
table_name
='ZJW_CC_GZJSQ'
generation_forced
=''.


3通过View_Maintenance_Call 函数建立新程序来建立TCODE,代码可以参见SAP的标准程序RFT042D_CALL
代码如下

report rft042d_call.

call function
'VIEW_MAINTENANCE_CALL'
exporting
action
='S'
view_name
='V_T042D'.

http://tech.it168.com/a2009/0720/608/000000608795.shtml

2010/08/25

ABAP Edit NotePad2

http://www.flos-freeware.ch/notepad2.html

notepad2 abap.JPG

ABAP SE38 Shortcut Key Ver:SAP GUI710

ABAP SE38 Shortcut Key Ver:SAP GUI710

暗記したほうがいいショートカット

単語の自動補完 Ctl + Space

行複製  Ctrl + D

行カット Ctrl + Shift + X

行削除  Ctrl + Shift + L

行コピー Ctrl + Shift + T

小文字に Ctrl + L

大文字に Ctrl + U

大/小文字切り替える Ctrl + K

コメント Ctl + <

コメント解除 Ctl + >

Sentence Style Ctl + T

Flickr :

ABAP TRANSLATE USING

*-ABAP TRANSLATE USING
REPORT YZEROCHO00.

DATA: W(13) VALUE '12;34;56;AB;CD'.


WRITE:/ 'Before TRANSLATE:'. WRITE W.

TRANSLATE W USING ';,'. "Translate ; to ,

WRITE:/ 'After TRANSLATE:'. WRITE W.

DATA: TEXT TYPE STRING.
TEXT = 'Abcdefg'.
WRITE:/ 'Before TRANSLATE:'. WRITE TEXT.

* Translate A to 1 ,b to 2, c to 3 .....
TRANSLATE TEXT USING 'A1b2c3d4e5f7g7'.

WRITE:/ 'After TRANSLATE:'. WRITE TEXT.

*----RESULT------
*Before TRANSLATE: 12;34;56;AB;C
*After TRANSLATE: 12,34,56,AB,C
*Before TRANSLATE: Abcdefg
*After TRANSLATE: 1234577

2010/08/24

ABAP NUMERIC CHECK WITH DECIMAL

*-ABAP NUMERIC CHECK WITH DECIMAL
*-ABAP 数値チェック(小数)
REPORT YZEROCHO00.

DATA: W(13) VALUE '1234.345'.

DATA: TEMP(13).
DATA: I TYPE I.

TEMP = W.
REPLACE ALL OCCURRENCES OF '.' IN TEMP WITH ''.
I = STRLEN( W ) - STRLEN( TEMP ).
IF W CO '0123456789. ' AND I <= 1.
WRITE :/ 'A NUMBER:'.
WRITE W.
ELSE.
WRITE :/ 'NOT A NUMBER:'.
WRITE W.
ENDIF.

W = '1.2.34....'.
TEMP = W.
REPLACE ALL OCCURRENCES OF '.' IN TEMP WITH ''.
I = STRLEN( W ) - STRLEN( TEMP ).
IF W CO '0123456789. ' AND I <= 1.
WRITE :/ 'A NUMBER:'.
WRITE W.
ELSE.
WRITE :/ 'NOT A NUMBER:'.
WRITE W.
ENDIF.

*NOTE: '0123456789. '(THERE IS A SPACE AFTER .DOT)
*-----RESULT-----
*A NUMBER: 1234.345
*NOT A NUMBER: 1.2.34....


*http://enta2008.blogspot.com/2010/08/abap-numeric-checknuber-check.html

ABAP NUMERIC CHECK/NUBER CHECK

*-ABAP NUMERIC CHECK/NUBER CHECK
REPORT YZEROCHO00.

DATA: W(13) VALUE '1234.345'.

*-1- CHECK IF A VARIABLE IS NUMERIC (with decimal)
* NOTE: '0123456789. '(THERE IS A SPACE AFTER .DOT)
IF W CO '0123456789. ' .
WRITE :/ 'A NUMBER:'.
WRITE W.
ELSE.
WRITE :/ 'NOT A NUMBER:'.
WRITE W.
ENDIF.

*※ '1.2.34....' is also a number
W = '1.2.34....'.
IF W CO '0123456789. ' .
WRITE :/ 'A NUMBER:'.
WRITE W.
ELSE.
WRITE :/ 'NOT A NUMBER:'.
WRITE W.
ENDIF.

*-2- NUMBER CHECK INTEGER
W = '12567'.
* NOTE: '0123456789 '(THERE IS A SPACE AFTER 9)
IF W CO '0123456789 ' .
WRITE :/ 'A INTEGER:'.
WRITE W.
ELSE.
WRITE :/ 'NOT A INTEGER:'.
WRITE W.
ENDIF.

*-21- FM:NUMBERIC_CHECK. NOTE: This FM is limited for integer
DATA:HTYPE LIKE DD01V-DATATYPE.
CALL FUNCTION 'NUMERIC_CHECK'
EXPORTING
STRING_IN = W
IMPORTING
STRING_OUT = W
HTYPE = HTYPE.

WRITE :/ HTYPE.
WRITE W.

W = '1234.345'.
CALL FUNCTION 'NUMERIC_CHECK'
EXPORTING
STRING_IN = W
IMPORTING
STRING_OUT = W
HTYPE = HTYPE.

WRITE :/ HTYPE.
WRITE W.

***Result******
*A NUMBER: 1234.345
*A NUMBER: 1.2.34....
*A INTEGER: 12567
*NUMC 0000000012567
*CHAR 1234.345

2010/08/23

USER-COMMAND FOR CHECKBOX /ABAP SCREEN STRUCTURE

USER-COMMAND FOR CHECKBOX /ABAP SCREEN STRUCTURE

PARAMETERS show_all AS CHECKBOX USER-COMMAND flag.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.

PARAMETERS: p1 TYPE c LENGTH 10,

p2 TYPE c LENGTH 10,

p3 TYPE c LENGTH 10.

SELECTION-SCREEN END OF BLOCK b1.

SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME.

PARAMETERS: p4 TYPE c LENGTH 10 MODIF ID bl2,

p5 TYPE c LENGTH 10 MODIF ID bl2,

p6 TYPE c LENGTH 10 MODIF ID bl2.

SELECTION-SCREEN END OF BLOCK b2.

AT SELECTION-SCREEN OUTPUT. "選択画面のPBO

LOOP AT SCREEN.

IF show_all <> 'X' AND

screen-group1 = 'BL2'.

screen-active = '0'.

ENDIF.

MODIFY SCREEN.

ENDLOOP.

abap screen structure

You do not have to declare this structure in your program. You can access screen during screen processing in dialog modules.

Component

Meaning

surname

Name of the screen field

group1

Modification group 1

group2

Modification group 2

group3

Modification group 3

group4

Modification group 4

required

Field input is mandatory

input

Field is ready for input

output

Field is for display only

intensified

Field is highlighted

invisible

Field is suppressed

length

Field length

active

Field is active

display_3d

Three-dimensional box

value_help

Input help button display

request

Input exists

http://help.sap.com/saphelp_nw70/helpdata/en/9f/dbab6f35c111d1829f0000e829fbfe/content.htm

2010/08/05

Download one or more Fucntion Groups to PC-File (ZZ)


REPORT ZERO_CHOTEST_DOWNABAPFM LINE-SIZE 255.
************************************************************************
* Download one or more Fucntion Groups to PC-File *
* If Filename contains a % sign it will be replaced by the name *
* of the ABAP *
************************************************************************

DEFINE ADD_SINGLE_LINE_IDOCS.
CLEAR IDOCDATA.
IDOCDATA-SEGNAM = 'Z1AXXFB&2'.
IDOCDATA-SDATA = &1.
APPEND IDOCDATA.
END-OF-DEFINITION.

DEFINE ADD_LINES_IDOCS.
LOOP AT &1.
CLEAR IDOCDATA.
IDOCDATA-SEGNAM = 'Z1AXXFB&2'.
IDOCDATA-SDATA = &1.
APPEND IDOCDATA.
ENDLOOP.
END-OF-DEFINITION.

DEFINE ADD_SINGLE_LINE_WEB.
WEBTLINE-TDFORMAT = '/*'.
WEBTLINE-TDLINE = '&2'.
APPEND WEBTLINE.

CLEAR WEBTLINE.
WEBTLINE-TDLINE = &1.
APPEND WEBTLINE.

ADD_SINGLE_LINE_IDOCS &1 &2.
END-OF-DEFINITION.

DEFINE ADD_LINES_WEB.
WEBTLINE-TDFORMAT = '/*'.
WEBTLINE-TDLINE = '&1'.
APPEND WEBTLINE.

LOOP AT T_&1.
CLEAR WEBTLINE.
WEBTLINE-TDLINE = T_&1.
APPEND WEBTLINE.
ENDLOOP.

ADD_LINES_IDOCS T_&1 &1.
END-OF-DEFINITION.

DEFINE ADD_SINGLE_LINE.
CLEAR XLINE.
XLINE-FORMAT = '/*'.
XLINE-TYPE = 'H'.
XLINE-OBJECT_NAME = '&3'.
XLINE-OBJECT_NAME = '&1'.
XLINE-LINE = &1.
APPEND XLINE TO TTLINE.

CLEAR XLINE.
XLINE-NAME = TFDIR-PNAME.
XLINE-OBJECT = 'FUNC'.
XLINE-OBJECT_NAME = TFDIR-FUNCNAME.
XLINE-SUBTYPE = '&2'.
XLINE-SEP1 = DELIM.
XLINE-SEP2 = DELIM.
XLINE-SEP3 = DELIM.
XLINE-SEP4 = DELIM.
IF EXCEL IS INITIAL.
XLINE-DELIM = SPACE.
ELSE.
XLINE-DELIM = DELIM.
ENDIF.

XLINE-TYPE = 'F'.
XLINE-LINE = &1.
APPEND XLINE TO TTLINE.

ADD_SINGLE_LINE_WEB &1 &3.
END-OF-DEFINITION.

DEFINE ADD_LINES.
CLEAR XLINE.
XLINE-FORMAT = '/*'.
XLINE-TYPE = 'H'.
XLINE-OBJECT_NAME = '&3'.
XLINE-OBJECT_NAME = '&1'.
XLINE-LINE = T_&1.
APPEND XLINE TO TTLINE.

LOOP AT T_&1.
CLEAR XLINE.
XLINE-NAME = TFDIR-PNAME.
XLINE-OBJECT = 'FUNC'.
XLINE-OBJECT_NAME = TFDIR-FUNCNAME.
XLINE-SUBTYPE = '&2'.
XLINE-SEP1 = DELIM.
XLINE-SEP2 = DELIM.
XLINE-SEP3 = DELIM.
XLINE-SEP4 = DELIM.
IF EXCEL IS INITIAL.
XLINE-DELIM = SPACE.
ELSE.
XLINE-DELIM = DELIM.
ENDIF.

XLINE-TYPE = 'F'.
XLINE-LINE = T_&1.
APPEND XLINE TO TTLINE.
ENDLOOP.

ADD_LINES_WEB &1.
END-OF-DEFINITION.

INCLUDE <ICON>.
TABLES: TFDIR, TLIBG, TLIBV, TRDIR, ENLFDIR.
TABLES: SSCRFIELDS.
TABLES: RS38L.

PARAMETERS: FUNCAREA LIKE TLIBG-AREA.
SELECT-OPTIONS: FUNCNAME FOR TFDIR-FUNCNAME. " memory id lib.
*elect-options: author for trdir-unam.
SELECT-OPTIONS: RESTRICT FOR TFDIR-FUNCNAME.

PARAMETERS: EXCEL AS CHECKBOX DEFAULT ' '.
PARAMETERS: HYPER AS CHECKBOX DEFAULT 'X'.
PARAMETERS: DELIM DEFAULT ';'.
PARAMETERS: FILEDIR LIKE RLGRAP-FILENAME MEMORY ID ZDI.
PARAMETERS: FILENAME LIKE RLGRAP-FILENAME MEMORY ID ZPC OBLIGATORY.

DATA: XFILENAME LIKE FILENAME.
DATA: FULLFILENAME LIKE XFILENAME.
DATA: PROGRAM LIKE SY-REPID.
DATA: TTFDIR LIKE TADIR OCCURS 0 WITH HEADER LINE.

DATA: BEGIN OF TTLINE OCCURS 0,
TDFORMAT LIKE TLINE-TDFORMAT,
TDLINE(250).
DATA: END OF TTLINE.

DATA: WEBTLINE LIKE TTLINE OCCURS 0 WITH HEADER LINE.

DATA: X_TTLINE LIKE TTLINE OCCURS 0 WITH HEADER LINE.
DATA: T_ENLFDIR LIKE ENLFDIR OCCURS 0 WITH HEADER LINE.
DATA: T_FUNCNAMES LIKE TFDIR OCCURS 0 WITH HEADER LINE.
DATA: CHECK VALUE 'X'.
DATA: HTML_TOC(132) OCCURS 0 WITH HEADER LINE.

DATA: FUNCPOOL LIKE SY-REPID.
DATA: T_COMPO LIKE SCOMPO OCCURS 0 WITH HEADER LINE.
DATA: T_CROSS_REF LIKE CROSS OCCURS 0 WITH HEADER LINE.
DATA: T_INC LIKE D010INC OCCURS 0 WITH HEADER LINE.
DATA: X_INC LIKE T_INC OCCURS 0 WITH HEADER LINE.

DATA: BEGIN OF LINES,
TOP LIKE SY-LINNO,
LAST LIKE SY-LINNO,
END OF LINES.
DATA: IX LIKE SY-LINNO.

DATA: BEGIN OF XLINE.
DATA: FORMAT LIKE TLINE-TDFORMAT.
DATA: NAME LIKE SY-REPID.
DATA: SEP1.
DATA: TYPE.
DATA: SEP2.
DATA: OBJECT LIKE TADIR-OBJECT.
DATA: SEP3.
DATA: OBJECT_NAME LIKE TADIR-OBJ_NAME.
DATA: SEP4.
DATA: SUBTYPE(4).
DATA: DELIM.
DATA: LINE(132).
DATA: END OF XLINE.

DATA: HEADERSTYLE LIKE RS38L-OPTIONAL VALUE 'F'.
DATA: E_TFDIR LIKE TFDIR .
DATA: E_ENLFDIR LIKE ENLFDIR .

DATA: T_IMPORT LIKE RSIMP OCCURS 0 WITH HEADER LINE.
DATA: T_CHANGE LIKE RSCHA OCCURS 0 WITH HEADER LINE.
DATA: T_EXPORT LIKE RSEXP OCCURS 0 WITH HEADER LINE.
DATA: T_TABLES LIKE RSTBL OCCURS 0 WITH HEADER LINE.
DATA: T_EXCEPT LIKE RSEXC OCCURS 0 WITH HEADER LINE.
DATA: T_PARAM_DOCU LIKE RSFDO OCCURS 0 WITH HEADER LINE.
*DATA: T_ABAPTEXT LIKE ABAPTEXT OCCURS 0 WITH HEADER LINE.
DATA: T_ABAPTEXT(500) OCCURS 0 WITH HEADER LINE.
DATA: T_FTEXT LIKE TFTIT OCCURS 0 WITH HEADER LINE.

DATA: T_AREA LIKE ENLFDIR-AREA OCCURS 0 WITH HEADER LINE.
RANGES: R_AREA FOR ENLFDIR-AREA.
DATA: INCLNAME LIKE SY-REPID OCCURS 0 WITH HEADER LINE.

DATA: IDOCCTRL LIKE EDIDC OCCURS 0 WITH HEADER LINE.
DATA: IDOCDATA LIKE EDIDD OCCURS 0 WITH HEADER LINE.


INITIALIZATION.
GET PARAMETER ID 'ZPC' FIELD FILENAME.
IF FILENAME IS INITIAL.
FILENAME = '%.txt'.
ENDIF.
GET PARAMETER ID 'ZDI' FIELD FILEDIR.
IF FILENAME IS INITIAL.
FILEDIR = 'C:\SAP'.
ENDIF.

CLEAR: FUNCNAME.
MOVE: 'CP' TO RESTRICT-OPTION.
MOVE: 'I' TO RESTRICT-SIGN.
MOVE: 'Y*' TO RESTRICT-LOW.
APPEND RESTRICT.
MOVE: 'Z*' TO RESTRICT-LOW.
APPEND RESTRICT.


AT SELECTION-SCREEN ON FUNCNAME.
CONDENSE FUNCNAME-LOW.
IF FUNCNAME-LOW EQ '*'.
CLEAR FUNCNAME.
REFRESH FUNCNAME.
ENDIF.

AT SELECTION-SCREEN.
IF FUNCAREA IS INITIAL.
IF SSCRFIELDS-UCOMM EQ 'ONLI'
OR SSCRFIELDS-UCOMM EQ 'PRIN'.
IF FUNCNAME[] IS INITIAL.
* and author[] is initial.
MESSAGE ID '38' TYPE 'E' NUMBER '000'
WITH 'Nicht alle auf einmal -> Auswahl einschraenken'.
ENDIF.
ENDIF.
ELSE.

SELECT * FROM ENLFDIR INTO TABLE T_ENLFDIR WHERE AREA EQ FUNCAREA.

LOOP AT T_ENLFDIR WHERE AREA EQ FUNCAREA.
CLEAR: FUNCNAME.
MOVE: T_ENLFDIR-FUNCNAME TO FUNCNAME-LOW.
MOVE: 'EQ' TO FUNCNAME-OPTION.
MOVE: 'I' TO FUNCNAME-SIGN.
CHECK FUNCNAME-LOW IN RESTRICT.
APPEND FUNCNAME.
ENDLOOP.

SORT FUNCNAME.
DELETE ADJACENT DUPLICATES FROM FUNCNAME.
CLEAR: FUNCAREA.
ENDIF.

START-OF-SELECTION.

END-OF-SELECTION.
* determine all relevant function areas
REFRESH T_AREA.
REFRESH X_INC.
SELECT DISTINCT AREA INTO TABLE T_AREA
FROM ENLFDIR
WHERE FUNCNAME IN FUNCNAME.
* we have now our proper function area
* LET US LOOK FOR ANY referenced ones
LOOP AT T_AREA.
FUNCPOOL = 'SAPL'.
FUNCPOOL+4 = T_AREA.
CALL FUNCTION 'RS_PROGRAM_INDEX'
EXPORTING
PG_NAME = FUNCPOOL
* WITHOUT_TREE = ' '
* IMPORTING
* MESSAGE_CLASS =
TABLES
COMPO = T_COMPO
CROSS_REF = T_CROSS_REF
INC = T_INC
EXCEPTIONS
SYNTAX_ERROR = 1
OTHERS = 2.
CLEAR FUNCNAME.
MOVE 'EQ' TO FUNCNAME-OPTION.
MOVE 'I' TO FUNCNAME-SIGN.

LOOP AT T_CROSS_REF.
IF T_CROSS_REF-TYPE EQ 'F'
AND T_CROSS_REF-NAME(1) GE 'Y'.
MOVE T_CROSS_REF-NAME TO FUNCNAME-LOW.
APPEND FUNCNAME.
ENDIF.
ENDLOOP.
ENDLOOP.
*
SELECT DISTINCT AREA INTO TABLE T_AREA
FROM ENLFDIR
WHERE FUNCNAME IN FUNCNAME.

WRITE: / ICON_EXECUTE_OBJECT AS ICON HOTSPOT.
WRITE: 'Press PF8 to start download'.
CHECK = 'X'.
LINES-TOP = SY-LINNO.

LOOP AT T_AREA.
REFRESH TTFDIR.
SELECT * FROM ENLFDIR WHERE AREA EQ T_AREA.
SELECT * FROM TFDIR APPENDING TABLE TTFDIR
WHERE FUNCNAME EQ ENLFDIR-FUNCNAME.
ENDSELECT.

WRITE: / CHECK AS CHECKBOX.
FUNCPOOL = 'SAPL'.
FUNCPOOL+4 = T_AREA.
WRITE FILENAME TO XFILENAME.
REPLACE '%' WITH FUNCPOOL INTO XFILENAME.
HIDE: T_AREA, XFILENAME.
WRITE: 'Download', T_AREA COLOR COL_TOTAL, 'to'.
WRITE: XFILENAME INPUT.
SORT TTFDIR.
LOOP AT TTFDIR INTO TFDIR.
PERFORM SE37_GET_INCLUDENAME USING TFDIR-FUNCNAME CHANGING PROGRAM.
WRITE: /5 TFDIR-FUNCNAME COLOR COL_KEY.
ENDLOOP.
LINES-LAST = SY-LINNO.
ENDLOOP.


AT PF8.
PERFORM DOWNLOAD.
* set screen 0. leave.


AT LINE-SELECTION.
IF SY-CUROW EQ LINES-TOP.
PERFORM DOWNLOAD.
* set screen 0. leave.
ENDIF.


*---------------------------------------------------------------------*
* FORM SE37_GET_INCLUDENAME *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> TFDIR-FUNCNAME *
* --> PROGRAM *
*---------------------------------------------------------------------*
FORM SE37_GET_INCLUDENAME USING TFDIR-FUNCNAME CHANGING PROGRAM.
SELECT SINGLE * FROM ENLFDIR WHERE FUNCNAME EQ TFDIR-FUNCNAME.
CHECK SY-SUBRC EQ 0.
CONCATENATE TFDIR-PNAME+3 'U' TFDIR-INCLUDE INTO PROGRAM.
ENDFORM. " se37_get_includename.
*---------------------------------------------------------------------*
* FORM DOWNLOAD *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM DOWNLOAD.
PERFORM HYPER_INIT.
REFRESH TTLINE.
CLEAR: XLINE.
XLINE-FORMAT = '/*'.
XLINE-NAME = 'FUNCTION'.
XLINE-TYPE = 'V'.
XLINE-OBJECT = 'V4B0'.
XLINE-LINE = 'Download ABAP Version 4B.0'.
APPEND XLINE TO TTLINE.

REFRESH: T_AREA.
IX = 1.
WHILE IX LE LINES-LAST.
CLEAR T_AREA.
SY-LINNO = IX.
ADD 1 TO IX.
READ LINE SY-LINNO FIELD VALUE T_AREA.
CHECK T_AREA NE SPACE.
READ LINE SY-LINNO FIELD VALUE CHECK.
CHECK CHECK EQ 'X'.
CLEAR CHECK.
MODIFY LINE SY-LINNO FIELD FORMAT CHECK INPUT OFF.
MODIFY LINE SY-LINNO FIELD VALUE CHECK.
REFRESH T_FUNCNAMES.
SELECT * FROM ENLFDIR WHERE AREA EQ T_AREA.
MOVE ENLFDIR-FUNCNAME TO PROGRAM.
* write: / xfilename.
MOVE ENLFDIR-FUNCNAME TO T_FUNCNAMES-FUNCNAME.
APPEND T_FUNCNAMES.
APPEND T_AREA.
ENDSELECT.

PERFORM SE37_DOWNLOAD
TABLES
T_FUNCNAMES
TTLINE
USING
SPACE
EXCEL
DELIM
'F'.
* BREAK-POINT.
* retrieve global data and custom includes
SORT T_AREA.
DELETE ADJACENT DUPLICATES FROM T_AREA.
LOOP AT T_AREA.
FUNCPOOL = 'SAPL'.
FUNCPOOL+4 = T_AREA.
CALL FUNCTION 'RS_PROGRAM_INDEX'
EXPORTING
PG_NAME = FUNCPOOL
* WITHOUT_TREE = ' '
* IMPORTING
* MESSAGE_CLASS =
TABLES
COMPO = T_COMPO
CROSS_REF = T_CROSS_REF
INC = T_INC
EXCEPTIONS
SYNTAX_ERROR = 1
OTHERS = 2.

LOOP AT T_INC.
IF T_INC-INCLUDE(1) CA 'YZ'
OR ( T_INC-INCLUDE(5) EQ FUNCPOOL+3(5)
AND T_INC-INCLUDE+5(1) NE 'U' ).
APPEND T_INC TO X_INC.
ENDIF.
ENDLOOP.
ENDLOOP.
SORT X_INC.
DELETE ADJACENT DUPLICATES FROM X_INC COMPARING INCLUDE.
CLEAR X_INC.
MOVE FUNCPOOL TO X_INC-INCLUDE.
APPEND X_INC.

LOOP AT X_INC.
READ TABLE INCLNAME WITH KEY X_INC-INCLUDE.
CHECK SY-SUBRC NE 0. " already processed
INCLNAME = X_INC-INCLUDE.
APPEND INCLNAME.
REFRESH X_TTLINE.

PERFORM SE38_DOWNLOAD
* TABLES
* x_ttline
USING
X_INC-INCLUDE
EXCEL
DELIM.
APPEND LINES OF X_TTLINE TO TTLINE.
ENDLOOP.
* BREAK-POINT.
LOOP AT WEBTLINE.
FORMAT RESET.
IF WEBTLINE-TDFORMAT EQ '/*'.
FORMAT COLOR COL_HEADING.
ENDIF.
WRITE: / WEBTLINE.
ENDLOOP.


* Now download
IF NOT FILENAME IS INITIAL.
MOVE FILENAME TO XFILENAME.
IF XFILENAME CA '%'.
MOVE FILENAME TO XFILENAME.
REPLACE '%' WITH FUNCPOOL INTO XFILENAME.
ENDIF.

IF XFILENAME CA '%'.
WRITE: / 'Fatal error!' COLOR COL_NEGATIVE.
WRITE: / 'Cannot download. Check your filename please.'.
STOP.
ENDIF.

CONCATENATE FILEDIR XFILENAME INTO FULLFILENAME.
CONDENSE FULLFILENAME.
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
FILENAME = FULLFILENAME
TABLES
DATA_TAB = TTLINE
EXCEPTIONS
FILE_OPEN_ERROR = 1
FILE_WRITE_ERROR = 2
INVALID_FILESIZE = 3
INVALID_TABLE_WIDTH = 4
INVALID_TYPE = 5
NO_BATCH = 6
UNKNOWN_ERROR = 7
OTHERS = 8.
IF SY-SUBRC EQ 0.
FORMAT COLOR COL_POSITIVE.
IF HYPER NE SPACE.
* PERFORM hyper_append_suffix USING funcpool ''.
ENDIF.
ELSE.
FORMAT COLOR COL_NEGATIVE.
ENDIF.
WRITE: / 'Return code ', (3) SY-SUBRC.
WRITE: 'Download to', FULLFILENAME.
ENDIF.
ENDWHILE.

* BREAK-POINT.
MOVE '</font>' TO HTML_TOC.
APPEND HTML_TOC.
MOVE '</table>' TO HTML_TOC.
APPEND HTML_TOC.
MOVE '</table>' TO HTML_TOC.
APPEND HTML_TOC.
MOVE '</table>' TO HTML_TOC.
APPEND HTML_TOC.
*----------------------------------------------------------------------*
CONCATENATE 'toc' SY-DATUM SY-UZEIT '.htm'
INTO XFILENAME.
CONCATENATE FILEDIR XFILENAME INTO FULLFILENAME.
CONDENSE FULLFILENAME.
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
FILENAME = FULLFILENAME
TABLES
DATA_TAB = HTML_TOC
EXCEPTIONS
FILE_OPEN_ERROR = 1
FILE_WRITE_ERROR = 2
INVALID_FILESIZE = 3
INVALID_TABLE_WIDTH = 4
INVALID_TYPE = 5
NO_BATCH = 6
UNKNOWN_ERROR = 7
OTHERS = 8.
*----------------------------------------------------------------------*
CONCATENATE 'toc' '.htm'
INTO XFILENAME.
CONCATENATE FILEDIR XFILENAME INTO FULLFILENAME.
CONDENSE FULLFILENAME.
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
FILENAME = FULLFILENAME
TABLES
DATA_TAB = HTML_TOC
EXCEPTIONS
FILE_OPEN_ERROR = 1
FILE_WRITE_ERROR = 2
INVALID_FILESIZE = 3
INVALID_TABLE_WIDTH = 4
INVALID_TYPE = 5
NO_BATCH = 6
UNKNOWN_ERROR = 7
OTHERS = 8.
*----------------------------------------------------------------------*
REFRESH HTML_TOC.
CONCATENATE 'coding' '.txt'
INTO XFILENAME.
CONCATENATE FILEDIR XFILENAME INTO FULLFILENAME.
CONDENSE FULLFILENAME.
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
FILENAME = FULLFILENAME
TABLES
DATA_TAB = HTML_TOC
EXCEPTIONS
FILE_OPEN_ERROR = 1
FILE_WRITE_ERROR = 2
INVALID_FILESIZE = 3
INVALID_TABLE_WIDTH = 4
INVALID_TYPE = 5
NO_BATCH = 6
UNKNOWN_ERROR = 7
OTHERS = 8.
*----------------------------------------------------------------------*
READ TABLE T_AREA INDEX 1.
* PERFORM hyper_header USING 'Function Group Download'.
PERFORM HYPER_HEADER USING 'Function Group' T_AREA.
CONCATENATE 'header' '.htm'
INTO XFILENAME.
CONCATENATE FILEDIR XFILENAME INTO FULLFILENAME.
CONDENSE FULLFILENAME.
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
FILENAME = FULLFILENAME
TABLES
DATA_TAB = HTML_TOC
EXCEPTIONS
FILE_OPEN_ERROR = 1
FILE_WRITE_ERROR = 2
INVALID_FILESIZE = 3
INVALID_TABLE_WIDTH = 4
INVALID_TYPE = 5
NO_BATCH = 6
UNKNOWN_ERROR = 7
OTHERS = 8.
*----------------------------------------------------------------------*
PERFORM HYPER_FRAME USING 'Function Group'.
CONCATENATE 'frameset' '.htm'
INTO XFILENAME.
CONCATENATE FILEDIR XFILENAME INTO FULLFILENAME.
CONDENSE FULLFILENAME.
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
FILENAME = FULLFILENAME
TABLES
DATA_TAB = HTML_TOC
EXCEPTIONS
FILE_OPEN_ERROR = 1
FILE_WRITE_ERROR = 2
INVALID_FILESIZE = 3
INVALID_TABLE_WIDTH = 4
INVALID_TYPE = 5
NO_BATCH = 6
UNKNOWN_ERROR = 7
OTHERS = 8.

ENDFORM. "download

*---------------------------------------------------------------------*
* FORM SE37_DOWNLOAD *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> T_FUNCNAMES *
* --> TTLINE *
* --> VALUE(FUNCNAME) *
* --> VALUE(EXCEL) *
* --> VALUE(DELIM) *
* --> VALUE(HEADERSTYLE) *
*---------------------------------------------------------------------*
FORM SE37_DOWNLOAD
TABLES
T_FUNCNAMES STRUCTURE TFDIR
TTLINE STRUCTURE TTLINE
USING
VALUE(FUNCNAME) LIKE TFDIR-FUNCNAME
VALUE(EXCEL) LIKE RS38L-OPTIONAL
VALUE(DELIM) LIKE RS38L-OPTIONAL
VALUE(HEADERSTYLE) LIKE RS38L-OPTIONAL.
*"----------------------------------------------------------------------
************************************************************************
* (c) Axel Angeli 1997 *
* created Dec 1997 *
* *
************************************************************************

DATA: X_INC LIKE T_INC OCCURS 0 WITH HEADER LINE.
DATA: X_TTLINE LIKE TTLINE OCCURS 0 WITH HEADER LINE.

* data: headerstyle like rs38l-optional value 'F'.
DATA: E_TFDIR LIKE TFDIR .
DATA: E_ENLFDIR LIKE ENLFDIR .

DATA: T_ERRORMESSAGES LIKE BDCMSGCOLL OCCURS 0 WITH HEADER LINE.
DATA: T_IMPORT LIKE RSIMP OCCURS 0 WITH HEADER LINE.
DATA: T_CHANGE LIKE RSCHA OCCURS 0 WITH HEADER LINE.
DATA: T_EXPORT LIKE RSEXP OCCURS 0 WITH HEADER LINE.
DATA: T_TABLES LIKE RSTBL OCCURS 0 WITH HEADER LINE.
DATA: T_EXCEPT LIKE RSEXC OCCURS 0 WITH HEADER LINE.
DATA: T_PARAM_DOCU LIKE RSFDO OCCURS 0 WITH HEADER LINE.
DATA: T_LINES LIKE ABAPTEXT OCCURS 0 WITH HEADER LINE.
DATA: T_FTEXT LIKE TFTIT OCCURS 0 WITH HEADER LINE.
IF FUNCNAME IS INITIAL.
ELSE.
T_FUNCNAMES = FUNCNAME.
APPEND T_FUNCNAMES.
ENDIF.

LOOP AT T_FUNCNAMES.
SELECT SINGLE * FROM TFDIR WHERE FUNCNAME EQ T_FUNCNAMES-FUNCNAME.
IF SY-SUBRC NE 0.
CONTINUE.
ENDIF.
SELECT * FROM TFTIT INTO TABLE T_FTEXT
WHERE FUNCNAME EQ TFDIR-FUNCNAME.

SELECT SINGLE * FROM ENLFDIR INTO E_ENLFDIR
WHERE FUNCNAME EQ TFDIR-FUNCNAME.

PERFORM FU_IMPORT_INTERFACE(SAPMS38L)
TABLES T_IMPORT
T_CHANGE
T_EXPORT
T_TABLES
T_EXCEPT
T_PARAM_DOCU
USING TFDIR-FUNCNAME
CHANGING RS38L-GLOBAL.

PERFORM SE37_GET_INCLUDENAME USING TFDIR-FUNCNAME CHANGING INCLNAME.
CASE SY-SUBRC.
WHEN 0.
WHEN 1. RAISE FUNCTION_DOES_NOT_EXIST.
WHEN OTHERS. RAISE ERROR_GET_INCLUDENAME.
ENDCASE.
*-------- Remember processed includes to avoid doubly download
* APPEND inclname.

READ REPORT INCLNAME INTO T_ABAPTEXT.

ADD_SINGLE_LINE TFDIR FDIR TFDIR.
ADD_SINGLE_LINE E_ENLFDIR ENLF ENLFDIR.

ADD_LINES IMPORT IMPO RSIMP.
ADD_LINES EXPORT EXPO RSCHA.
ADD_LINES CHANGE CHAN RSEXP.
ADD_LINES TABLES TABL RSTBL.
ADD_LINES EXCEPT EXCE RSEXC.
ADD_LINES PARAM_DOCU DOCU RSFDO.
* add_lines abaptext prog abaptext.
ADD_LINES FTEXT TEXT TFTIT.


* ** retrieve all includes and append the code as well
CALL FUNCTION 'RS_PROGRAM_INDEX'
EXPORTING
PG_NAME = TFDIR-PNAME
* WITHOUT_TREE = ' '
* IMPORTING
* MESSAGE_CLASS =
TABLES
COMPO = T_COMPO
CROSS_REF = T_CROSS_REF
INC = X_INC
EXCEPTIONS
SYNTAX_ERROR = 1
OTHERS = 2.

APPEND LINES OF X_INC TO T_INC.
ENDLOOP.

SORT T_INC BY MASTER INCLUDE.
DELETE ADJACENT DUPLICATES FROM T_INC.

LOOP AT T_INC.
CHECK T_INC-INCLUDE+0(1) GE 'Y'.
CHECK T_INC-INCLUDE+1(4) NE TFDIR-PNAME+4(4)
OR T_INC-INCLUDE+5(1) NE 'U'.

REFRESH X_TTLINE.
PERFORM SE38_DOWNLOAD
* TABLES
* ttline
USING
T_INC-INCLUDE
EXCEL
DELIM.
APPEND LINES OF X_TTLINE TO TTLINE.
ENDLOOP.
ENDFORM.

*---------------------------------------------------------------------*
* FORM SE38_DOWNLOAD *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> TTLINE *
* --> VALUE(PROGRAM) *
* --> VALUE(EXCEL) *
* --> VALUE(DELIM) *
*---------------------------------------------------------------------*
FORM SE38_DOWNLOAD
* TABLES
* ttline STRUCTURE ttline
USING
VALUE(PROGRAM) LIKE TRDIR-NAME
VALUE(EXCEL) LIKE RS38L-OPTIONAL
VALUE(DELIM) LIKE RS38L-OPTIONAL.

DATA: TDD02L LIKE DD02L OCCURS 0 WITH HEADER LINE.
DATA: XTTLINE LIKE TTLINE OCCURS 0 WITH HEADER LINE.

* Read Program attributes
SELECT SINGLE * FROM TRDIR WHERE NAME EQ PROGRAM.
IF SY-SUBRC NE 0.
RAISE ABAP_NOT_IN_TRDIR.
ENDIF.

* Retrieve REPORT-Code from Text base
READ REPORT PROGRAM INTO T_ABAPTEXT.

* Retrieve REPORT-Texts
* READ TEXTPOOL program INTO ttextpool.

* Attributes from TRDIRE
* SELECT * FROM trdire INTO TABLE ttrdire
* WHERE report EQ program.

CLEAR: XLINE.
XLINE-FORMAT = '/*'.
XLINE-OBJECT = 'ABAP '.
XLINE-TYPE = 'V'.
XLINE-NAME = 'V4B1'.
XLINE-LINE = 'Download ABAP Version 4B.1'.
APPEND XLINE TO TTLINE.

IF 1 = 0.
LOOP AT T_ABAPTEXT.
CLEAR XLINE.
XLINE-LINE = T_ABAPTEXT.
XLINE-NAME = PROGRAM.
XLINE-OBJECT = 'PROG'.
XLINE-OBJECT_NAME = PROGRAM.
XLINE-SEP1 = DELIM.
XLINE-SEP2 = DELIM.
XLINE-SEP3 = DELIM.
XLINE-SEP4 = DELIM.
XLINE-DELIM = SPACE.
XLINE-TYPE = 'S'.
* ttline = t_abaptext.
TTLINE = XLINE.
APPEND TTLINE.
ENDLOOP.
ENDIF.
*----------------------------------------------------------------------*
* add_lines_web abaptext.
ADD_LINES ABAPTEXT PROG ABAPTEXT.
*----------------------------------------------------------------------*
IF HYPER NE SPACE.
CONCATENATE PROGRAM '.function.txt' INTO XFILENAME.
CONCATENATE FILEDIR XFILENAME INTO FULLFILENAME.
CONDENSE FULLFILENAME.
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
FILENAME = FULLFILENAME
TABLES
DATA_TAB = T_ABAPTEXT
EXCEPTIONS
FILE_OPEN_ERROR = 1
FILE_WRITE_ERROR = 2
INVALID_FILESIZE = 3
INVALID_TABLE_WIDTH = 4
INVALID_TYPE = 5
NO_BATCH = 6
UNKNOWN_ERROR = 7
OTHERS = 8.

READ TABLE T_ABAPTEXT INDEX 1.
PERFORM HYPER_APPEND USING PROGRAM T_ABAPTEXT.
ENDIF.

ENDFORM. "

*---------------------------------------------------------------------*
* FORM HYPER_INIT *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM HYPER_INIT.
REFRESH HTML_TOC.
MOVE '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">' TO HTML_TOC.
APPEND HTML_TOC.
MOVE '<html>' TO HTML_TOC.
APPEND HTML_TOC.
MOVE '<head>' TO HTML_TOC.
APPEND HTML_TOC.
MOVE '<meta HTTP-EQUIV="Content-Type"'&
'CONTENT="text/html;CHARSET=iso-8859-1">' TO HTML_TOC.
APPEND HTML_TOC.
MOVE '<meta NAME="GENERATOR" Content="Logosworld ABAP Archive 4.0">'
TO HTML_TOC.
APPEND HTML_TOC.
MOVE '<meta NAME="keywords" CONTENT="R/3,Function Modules,ABAP'
& ',Examples,Library,Axel Angeli,logosworld"'
TO HTML_TOC.
APPEND HTML_TOC.
MOVE '<meta NAME="description" CONTENT="Library of universal '
& 'function modules for R/3'
TO HTML_TOC.
APPEND HTML_TOC.
MOVE '<link rel="stylesheet" href="style.css" type="text/css">'
TO HTML_TOC.
APPEND HTML_TOC.
MOVE '<title>Axel Angelis Logosworld '
& 'R/3 ABAP Function Module Library</title>'
TO HTML_TOC.
APPEND HTML_TOC.
MOVE '<base target="function">' TO HTML_TOC.
APPEND HTML_TOC.
MOVE '</head>' TO HTML_TOC.
APPEND HTML_TOC.

MOVE '<body>' TO HTML_TOC.
APPEND HTML_TOC.
MOVE '<font SIZE="1">' TO HTML_TOC.
APPEND HTML_TOC.
CONCATENATE '<p>Last Edited ' SY-DATUM INTO HTML_TOC.
APPEND HTML_TOC.
MOVE '</FONT>' TO HTML_TOC.
APPEND HTML_TOC.
MOVE '<table BORDER="0">' TO HTML_TOC.
APPEND HTML_TOC.
ENDFORM.

*---------------------------------------------------------------------*
* FORM HYPER_APPEND *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> VALUE(PROGRAM) *
*---------------------------------------------------------------------*
FORM HYPER_APPEND USING VALUE(PROGRAM) VALUE(DESCRIPT).
* CONCATENATE '<tr><td valign="top" width="200"><FONT FACE="Arial">'&
* '<A HREF=' program '.function.txt>' program '</A></TD></tr>'
* INTO html_toc.
* APPEND html_toc.
PERFORM HYPER_APPEND_SUFFIX USING PROGRAM '.function.txt' DESCRIPT.
ENDFORM.
*---------------------------------------------------------------------*
* FORM HYPER_APPEND_SUFFIX *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> VALUE(PROGRAM) *
* --> VALUE(SUFFIX) *
* --> VALUE(DESCRIPT) *
*---------------------------------------------------------------------*
FORM HYPER_APPEND_SUFFIX USING VALUE(PROGRAM)
VALUE(SUFFIX)
VALUE(DESCRIPT).
CONCATENATE '<tr><td valign="top">'&
'<FONT SIZE="1"><A HREF=' PROGRAM SUFFIX '>' PROGRAM
INTO HTML_TOC.
APPEND HTML_TOC.
CONCATENATE '</FONT></A></td><td> <FONT SIZE="1">'
DESCRIPT '</FONT></TD></TR></FONT>'
INTO HTML_TOC SEPARATED BY SPACE.
APPEND HTML_TOC.
ENDFORM.
FORM HYPER_HEADER USING PREFIX TITLE.
REFRESH HTML_TOC.
MOVE '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">' TO HTML_TOC.
APPEND HTML_TOC.
MOVE '<html>' TO HTML_TOC.
APPEND HTML_TOC.
MOVE '<head>' TO HTML_TOC.
APPEND HTML_TOC.
MOVE '<meta HTTP-EQUIV="Content-Type"'&
'CONTENT="text/html;CHARSET=iso-8859-1">' TO HTML_TOC.
APPEND HTML_TOC.
MOVE '<meta NAME="GENERATOR" Content="Logosworld ABAP Archive 4.0">'
TO HTML_TOC.
APPEND HTML_TOC.
MOVE '<meta NAME="keywords" CONTENT="R/3,Function Modules,ABAP'
& ',Examples,Library,Axel Angeli,logosworld"'
TO HTML_TOC.
APPEND HTML_TOC.
MOVE '<meta NAME="description" CONTENT="Library of universal '
& 'function modules for R/3">'
TO HTML_TOC.
APPEND HTML_TOC.
MOVE '<link rel="stylesheet" href="style.css" type="text/css">'
TO HTML_TOC.
APPEND HTML_TOC.
*----------------------------------------------------------------------*
MOVE '<title>Axel Angelis Logosworld '
& 'R/3 ABAP Function Module Library</title>'
TO HTML_TOC.
APPEND HTML_TOC.
*----------------------------------------------------------------------*
MOVE '</head>' TO HTML_TOC.
APPEND HTML_TOC.
*----------------------------------------------------------------------*
MOVE '<body>' TO HTML_TOC.
APPEND HTML_TOC.
*----------------------------------------------------------------------*
MOVE '<H1>' TO HTML_TOC.
APPEND HTML_TOC.
*----------------------------------------------------------------------*
CONCATENATE PREFIX TITLE INTO HTML_TOC SEPARATED BY SPACE.
APPEND HTML_TOC.
*----------------------------------------------------------------------*
MOVE '</H1>' TO HTML_TOC.
APPEND HTML_TOC.
*----------------------------------------------------------------------*
CONCATENATE '<p>Last Edited ' SY-DATUM INTO HTML_TOC.
* APPEND html_toc.
*----------------------------------------------------------------------*
MOVE '</p></body>' TO HTML_TOC.
APPEND HTML_TOC.
*----------------------------------------------------------------------*
MOVE '<html>' TO HTML_TOC.
APPEND HTML_TOC.
ENDFORM.

FORM HYPER_FRAME USING TITLE.
REFRESH HTML_TOC.
MOVE '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">' TO HTML_TOC.
APPEND HTML_TOC.
MOVE '<html>' TO HTML_TOC.
APPEND HTML_TOC.
MOVE '<head>' TO HTML_TOC.
APPEND HTML_TOC.
MOVE '<meta HTTP-EQUIV="Content-Type"'&
'CONTENT="text/html;CHARSET=iso-8859-1">' TO HTML_TOC.
APPEND HTML_TOC.
MOVE '<meta NAME="GENERATOR" Content="Logosworld ABAP Archive 4.0">'
TO HTML_TOC.
APPEND HTML_TOC.
MOVE '<meta NAME="keywords" CONTENT="R/3,Function Modules,ABAP'
& ',Examples,Library,Axel Angeli,logosworld"'
TO HTML_TOC.
APPEND HTML_TOC.
MOVE '<meta NAME="description" CONTENT="Library of universal '
& 'function modules for R/3'
TO HTML_TOC.
APPEND HTML_TOC.
MOVE '<link rel="stylesheet" href="style.css" type="text/css">'
TO HTML_TOC.
APPEND HTML_TOC.
MOVE '<title>Axel Angelis Logosworld '
& 'R/3 ABAP Function Module Library</title>'
TO HTML_TOC.
APPEND HTML_TOC.
MOVE '</head>' TO HTML_TOC.
*----------------------------------------------------------------------*
MOVE '<frameset framespacing="0" border="false"' &
' rows="60,*" frameborder="0">'
TO HTML_TOC.
APPEND HTML_TOC.
*----------------------------------------------------------------------*
MOVE '<frame name="banner" scrolling="no" noresize src="header.htm">'
TO HTML_TOC.
APPEND HTML_TOC.
*----------------------------------------------------------------------*
MOVE ' <frameset cols="40%,*">' TO HTML_TOC.
APPEND HTML_TOC.
*----------------------------------------------------------------------*
MOVE '<frame name="contents" target="function" ' TO HTML_TOC.
APPEND HTML_TOC.
*----------------------------------------------------------------------*
MOVE 'src="toc.htm" scrolling="auto">' TO HTML_TOC.
APPEND HTML_TOC.
*----------------------------------------------------------------------*
MOVE '<frame name="function" src="coding.txt">' TO HTML_TOC.
APPEND HTML_TOC.
*----------------------------------------------------------------------*
MOVE '</frameset>' TO HTML_TOC.
APPEND HTML_TOC.
*----------------------------------------------------------------------*
MOVE '<noframes>' TO HTML_TOC.
APPEND HTML_TOC.
*----------------------------------------------------------------------*
MOVE '<body>' TO HTML_TOC.
APPEND HTML_TOC.
*----------------------------------------------------------------------*
MOVE '</body>' TO HTML_TOC.
APPEND HTML_TOC.
*----------------------------------------------------------------------*
MOVE '</noframes>' TO HTML_TOC.
APPEND HTML_TOC.
*----------------------------------------------------------------------*
MOVE '</frameset>' TO HTML_TOC.
APPEND HTML_TOC.
*----------------------------------------------------------------------*
MOVE '<html>' TO HTML_TOC.
APPEND HTML_TOC.
ENDFORM.

ABAP TABLE REPORT FUNCTION MODULE(FM) BACTH DOWNLOAD

REPORT YZEROCHO01 NO STANDARD PAGE HEADING LINE-SIZE 500.
***************************************************************
*** ABAP TABLE REPORT FUNCTION MODULE(FM) BACTH DOWNLOAD ***
*** Download one or more Fucntion Groups to PC-File
*** ABAP テーブル レポート 汎用モジュール バッチダウンロード ***
*** FMのインクルードファイル
*** 参照
*** http://hi.baidu.com/festsoft/blog/item/5c69f595a98b164ed0135e4c.html
***************************************************************

TABLES:TADIR,TRDIRT,TSTC,DD03L,DD02L,DD04L,DD02T,DD03T,DD04T.
TABLES:TFDIR.
DATA: BEGIN OF YTADIR OCCURS 0.
INCLUDE STRUCTURE TADIR.
INCLUDE STRUCTURE TRDIRT.
DATA: END OF YTADIR.

DATA:PROG(72) TYPE C OCCURS 0 WITH HEADER LINE.
*テーブル構造
DATA:BEGIN OF TAB OCCURS 0.
INCLUDE STRUCTURE DD03L.
DATA:TEXT(40).
DATA:END OF TAB.

DATA:BEGIN OF T1 OCCURS 0,
TABNAME LIKE DD02L-TABNAME,
DDTEXT LIKE DD02T-DDTEXT,
END OF T1.

DATA:BEGIN OF ITAB OCCURS 0,
FIELD(15), "
KEY(6), "
ELMENT(15), "
TYPE(10), "
LENG(8) , "
DECIMALS(8) , "
CHK(10), "
CAN(10), "
CFI(10), "
TEXT(40), "
END OF ITAB.

DATA: BEGIN OF IT_TFDIR OCCURS 0,
NAME LIKE PROGDIR-NAME ,
FGNAME LIKE EFRM-FUNC_POOL ,
FUNCNAME LIKE TFDIR-FUNCNAME ,
INCNAME LIKE PROGDIR-NAME ,
INCLUDE LIKE TFDIR-INCLUDE,
OBSOLETE LIKE RODIR-OBSOLETE,
FUNAM LIKE PROGDIR-UNAM ,
FUDAT LIKE PROGDIR-UDAT,
STEXT LIKE TFTIT-STEXT ,
END OF IT_TFDIR.

DATA: YYNAME(128) TYPE C.
DATA: TT(500) OCCURS 0 WITH HEADER LINE.
DATA: RN(72).

DATA: T_ENLFDIR LIKE ENLFDIR OCCURS 0 WITH HEADER LINE.

DATA:FIELDS(40),
LIN TYPE I,
VAL(30),
REP(40).
SELECTION-SCREEN BEGIN OF BLOCK BLK1 WITH FRAME.
PARAMETERS:DOW AS CHECKBOX. "ダウンロード
PARAMETERS:P_DIR(50) DEFAULT 'D:\ABAPCODE\'. "パス
PARAMETERS:STYPE(6) DEFAULT 'TXT'.

PARAMETERS:R1 RADIOBUTTON GROUP R DEFAULT 'X',
R2 RADIOBUTTON GROUP R,
R3 RADIOBUTTON GROUP R.
SELECTION-SCREEN COMMENT /1(30) COMM1.
SELECTION-SCREEN END OF BLOCK BLK1.

SELECTION-SCREEN BEGIN OF BLOCK BLK2 WITH FRAME.
SELECT-OPTIONS:AUTHOR FOR TADIR-AUTHOR. "開発者
SELECT-OPTIONS:DEVCLASS FOR TADIR-DEVCLASS. "クラス
SELECT-OPTIONS:OBJ FOR TADIR-OBJ_NAME. "プログラム名
SELECT-OPTIONS:TABNAME FOR DD02L-TABNAME. "テーブル名
SELECTION-SCREEN END OF BLOCK BLK2.

SELECTION-SCREEN BEGIN OF BLOCK BLK3 WITH FRAME.
PARAMETERS: FUNCAREA LIKE TLIBG-AREA.
SELECT-OPTIONS: FUNCNAME FOR TFDIR-FUNCNAME."汎用モジュール
PARAMETERS: INCLD AS CHECKBOX DEFAULT 'X'. "INCLUDE
SELECTION-SCREEN END OF BLOCK BLK3.

AT SELECTION-SCREEN OUTPUT.
comm1 ='R1:REPORT R2:TABLE R3:FUNCTION MODULE'.

INITIALIZATION .

AT SELECTION-SCREEN.
IF FUNCAREA IS NOT INITIAL.
SELECT * FROM ENLFDIR INTO TABLE T_ENLFDIR WHERE AREA EQ FUNCAREA.
LOOP AT T_ENLFDIR WHERE AREA EQ FUNCAREA.
CLEAR: FUNCNAME.
MOVE: T_ENLFDIR-FUNCNAME TO FUNCNAME-LOW.
MOVE: 'EQ' TO FUNCNAME-OPTION.
MOVE: 'I' TO FUNCNAME-SIGN.
* CHECK FUNCNAME-LOW IN RESTRICT.
APPEND FUNCNAME.
ENDLOOP.
SORT FUNCNAME.
DELETE ADJACENT DUPLICATES FROM FUNCNAME.
CLEAR: FUNCAREA.
ENDIF.

START-OF-SELECTION .
IF R1 = 'X'.
PERFORM GET_DATA.
ENDIF.

IF R2 = 'X'.
IF TABNAME IS INITIAL.
MESSAGE 'テーブル名' TYPE 'I'.
ELSE.
PERFORM GET_TABLE_DATA.
ENDIF.
ENDIF.

IF R3 = 'X'.
IF FUNCNAME IS INITIAL.
MESSAGE '汎用モジュール名' TYPE 'I'.
ELSE.
PERFORM GET_FM_DATA.
ENDIF.
ENDIF.


AT LINE-SELECTION.
CLEAR: FIELDS, LIN.
GET CURSOR FIELD FIELDS LINE LIN VALUE VAL.
LIN = LIN - 1.
IF LIN >= 1.
READ TABLE YTADIR INDEX LIN.
IF SY-SUBRC = 0.
CLEAR REP.
CLEAR PROG.
REP = YTADIR-OBJ_NAME.
READ REPORT REP INTO PROG.
EDITOR-CALL FOR PROG.
* SET PARAMETER ID 'RID' FIELD REP.
* CALL TRANSACTION 'SE38' AND SKIP FIRST SCREEN.
ENDIF.
ENDIF.

END-OF-SELECTION.


*---------------------------------------------------------------------*
* FORM GET_DATA *
*---------------------------------------------------------------------*
* プログラム ダウンロード *
*---------------------------------------------------------------------*
FORM GET_DATA.
SELECT * INTO CORRESPONDING FIELDS OF TABLE YTADIR
FROM TADIR
INNER JOIN TRDIRT ON TADIR~OBJ_NAME = TRDIRT~NAME
WHERE OBJECT = 'PROG'
AND OBJ_NAME IN OBJ
AND DEVCLASS IN DEVCLASS
AND AUTHOR IN AUTHOR
AND SPRSL = SY-LANGU.
SORT YTADIR BY OBJ_NAME.

WRITE:/ '開発者','開発クラス','プログラム','プログラム名'.
LOOP AT YTADIR.
IF DOW = 'X'.
REFRESH TT.
RN = YTADIR-OBJ_NAME.
READ REPORT RN INTO TT.

* 禁止文字
REPLACE '/' with '_' into YTADIR-TEXT."/スラッシュ
REPLACE '\' with '_' into YTADIR-TEXT."\バックスラッシュ(円マーク)
REPLACE ':' with '_' into YTADIR-TEXT.":コロン
REPLACE '*' with '_' into YTADIR-TEXT."*アスタリスク
REPLACE '"' with '_' into YTADIR-TEXT."
REPLACE '<' with '_' into YTADIR-TEXT.
REPLACE '>' with '_' into YTADIR-TEXT.
REPLACE '|' with '_' into YTADIR-TEXT."|パイプ
REPLACE '?' with '_' into YTADIR-TEXT."?クエッションマーク

CONCATENATE P_DIR YTADIR-AUTHOR '_' YTADIR-OBJ_NAME
'_' YTADIR-TEXT '.' STYPE
INTO YYNAME.

CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
FILENAME = YYNAME
FILETYPE = 'ASC'
TABLES
DATA_TAB = TT.

IF SY-SUBRC = 0.
WRITE:/1(10) YTADIR-DEVCLASS,
(8) YTADIR-AUTHOR,
(15) YTADIR-OBJ_NAME,
(40) YTADIR-TEXT.

FORMAT COLOR 5.
WRITE: 'ダウンロードしました'.
FORMAT COLOR OFF.
ELSE.
WRITE:/ YTADIR-DEVCLASS,YTADIR-AUTHOR,YTADIR-OBJ_NAME,YTADIR-TEXT.
FORMAT COLOR 4.
WRITE: 'ダウンロード出来ない'.
FORMAT COLOR OFF.

ENDIF.
ELSE.
WRITE:/ YTADIR-DEVCLASS,YTADIR-AUTHOR,YTADIR-OBJ_NAME,YTADIR-TEXT.
ENDIF.

ENDLOOP.

ENDFORM.

*---------------------------------------------------------------------*
* FORM GET_TABLE_DATA *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM GET_TABLE_DATA.
SELECT DISTINCT * INTO CORRESPONDING FIELDS OF TABLE T1
FROM DD02T WHERE TABNAME IN TABNAME
AND DDLANGUAGE EQ SY-LANGU.

SELECT * INTO CORRESPONDING FIELDS OF TABLE TAB FROM DD03L AS A
WHERE A~TABNAME IN TABNAME.
SORT TAB BY TABNAME POSITION.

WRITE:/'項目名','PK','データエレメント','タイプ','長さ','小数',
'テーブルチェック','参考テーブル','参照項目','項目テキスト'.
ULINE.
LOOP AT T1.
REFRESH ITAB.
CLEAR YYNAME.

IF DOW = 'X'.
ITAB-FIELD = '項目名'.
ITAB-KEY = 'PK'.
ITAB-ELMENT = 'データエレメント'.
ITAB-TYPE = 'タイプ'.
ITAB-LENG = '長さ'.
ITAB-DECIMALS = '小数'.
ITAB-TEXT = '字段描述'.
ITAB-CHK = 'テーブルチェック'.
ITAB-CAN = '参考テーブル'.
ITAB-CFI = '参照項目'.
APPEND ITAB.
CLEAR ITAB.
ENDIF.
CONCATENATE T1-TABNAME '_' T1-DDTEXT '的表结构如下:'
INTO YYNAME.
FORMAT COLOR 3.
WRITE:/ YYNAME.
FORMAT COLOR OFF.


LOOP AT TAB WHERE TABNAME = T1-TABNAME.
ITAB-FIELD = TAB-FIELDNAME.
ITAB-KEY = TAB-KEYFLAG.
ITAB-ELMENT = TAB-ROLLNAME.
ITAB-TYPE = TAB-DATATYPE.
ITAB-LENG = TAB-LENG.
ITAB-CHK = TAB-CHECKTABLE.
ITAB-CAN = TAB-REFTABLE.
ITAB-CFI = TAB-REFFIELD.
ITAB-DECIMALS = TAB-DECIMALS.

IF TAB-ROLLNAME NE SPACE.
SELECT SINGLE * FROM DD04T WHERE ROLLNAME = TAB-ROLLNAME
AND DDLANGUAGE = SY-LANGU.
IF SY-SUBRC = 0.
ITAB-TEXT = DD04T-DDTEXT.
ELSE.
CLEAR ITAB-TEXT.
ENDIF.
ELSE.
SELECT SINGLE * FROM DD03T WHERE TABNAME = TAB-TABNAME
AND DDLANGUAGE = SY-LANGU
AND FIELDNAME = TAB-FIELDNAME.
IF SY-SUBRC = 0.
ITAB-TEXT = DD03T-DDTEXT.
ELSE.
CLEAR ITAB-TEXT.
ENDIF.
ENDIF.
APPEND ITAB.
WRITE:/ ITAB-FIELD,ITAB-KEY,ITAB-ELMENT,ITAB-TYPE,ITAB-LENG,
ITAB-DECIMALS,ITAB-CHK,ITAB-CAN,ITAB-CFI,ITAB-TEXT.
CLEAR ITAB.
ENDLOOP.

IF DOW = 'X'.

* 禁止文字
REPLACE '/' with '_' into T1-DDTEXT."/スラッシュ
REPLACE '\' with '_' into T1-DDTEXT."\バックスラッシュ(円マーク)
REPLACE ':' with '_' into T1-DDTEXT.":コロン
REPLACE '*' with '_' into T1-DDTEXT."*アスタリスク
REPLACE '"' with '_' into T1-DDTEXT."
REPLACE '<' with '_' into T1-DDTEXT.
REPLACE '>' with '_' into T1-DDTEXT.
REPLACE '|' with '_' into T1-DDTEXT."|パイプ
REPLACE '?' with '_' into T1-DDTEXT."?クエッションマーク

CONCATENATE P_DIR T1-TABNAME '_' T1-DDTEXT '.' STYPE
INTO YYNAME.

CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
FILENAME = YYNAME
FILETYPE = 'ASC'
TABLES
DATA_TAB = ITAB.

ELSE.
ULINE.
ENDIF.

ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& FORM GET_FM_DATA 汎用モジュール
*&---------------------------------------------------------------------*
FORM GET_FM_DATA .
DATA: f1(40),f2(40),f3(40) .
SELECT TFDIR~FUNCNAME
TFDIR~PNAME
TFDIR~INCLUDE
TFTIT~STEXT
PROGDIR~NAME
RODIR~OBSOLETE
INTO CORRESPONDING FIELDS OF TABLE IT_TFDIR
FROM TFDIR
INNER JOIN PROGDIR ON TFDIR~PNAME = PROGDIR~NAME AND
PROGDIR~STATE = 'A'
LEFT JOIN TFTIT ON TFDIR~FUNCNAME = TFTIT~FUNCNAME AND
TFTIT~SPRAS = SY-LANGU
LEFT JOIN RODIR ON TFDIR~FUNCNAME = RODIR~OBJECT AND
RODIR~OBJECTTYPE = 'FUNC'
WHERE TFDIR~FUNCNAME IN FUNCNAME.

LOOP AT it_tfdir.
IF it_tfdir-name(1) = '/'.
SPLIT it_tfdir-name AT '/' INTO f1 f2 f3 .
CONCATENATE '/' f2 '/' 'L' f3+4(36) 'U' it_tfdir-include
INTO it_tfdir-incname.
CONCATENATE '/' f2 '/' f3+4(36) INTO it_tfdir-fgname.
ELSE.
CONCATENATE 'L' it_tfdir-name+4(36) 'U' it_tfdir-include
INTO it_tfdir-incname.
it_tfdir-fgname = it_tfdir-name+4(36).
ENDIF.
SELECT SINGLE unam udat INTO (it_tfdir-funam,it_tfdir-fudat)
FROM progdir
WHERE name = it_tfdir-incname .
MODIFY it_tfdir .
ENDLOOP.

WRITE:/ 'プログラム名','汎用グループ','汎用モジュール名','プログラム名','文字','変更者','変更日','テキスト'.
LOOP AT IT_TFDIR.
IF DOW = 'X'.
REFRESH TT.
RN = IT_TFDIR-INCNAME.
READ REPORT RN INTO TT.

* 禁止文字
REPLACE '/' with '_' into IT_TFDIR-STEXT."/スラッシュ
REPLACE '\' with '_' into IT_TFDIR-STEXT."\バックスラッシュ(円マーク)
REPLACE ':' with '_' into IT_TFDIR-STEXT.":コロン
REPLACE '*' with '_' into IT_TFDIR-STEXT."*アスタリスク
REPLACE '"' with '_' into IT_TFDIR-STEXT."
REPLACE '<' with '_' into IT_TFDIR-STEXT.
REPLACE '>' with '_' into IT_TFDIR-STEXT.
REPLACE '|' with '_' into IT_TFDIR-STEXT."|パイプ
REPLACE '?' with '_' into IT_TFDIR-STEXT."?クエッションマーク

CONCATENATE P_DIR IT_TFDIR-FUNCNAME '_' IT_TFDIR-INCNAME
'_' IT_TFDIR-STEXT '.' STYPE
INTO YYNAME.

CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
FILENAME = YYNAME
FILETYPE = 'ASC'
TABLES
DATA_TAB = TT.

IF SY-SUBRC = 0.
* WRITE:/ IT_TFDIR-NAME,IT_TFDIR-FGNAME,IT_TFDIR-FUNCNAME,IT_TFDIR-INCNAME,IT_TFDIR-INCLUDE,
* IT_TFDIR-OBSOLETE,IT_TFDIR-FUNAM,IT_TFDIR-FUDAT,IT_TFDIR-STEXT.
WRITE:/1(20) IT_TFDIR-FUNCNAME,(30)IT_TFDIR-INCNAME,(40)IT_TFDIR-STEXT.
FORMAT COLOR 5.
WRITE: 'ダウンロードしました'.
FORMAT COLOR OFF.
ELSE.
WRITE:/1(20) IT_TFDIR-FUNCNAME,(30)IT_TFDIR-INCNAME,(40)IT_TFDIR-STEXT.
FORMAT COLOR 4.
WRITE: 'ダウンロード出来ない'.
FORMAT COLOR OFF.

ENDIF.

ELSE.
WRITE:/ IT_TFDIR-NAME,IT_TFDIR-FGNAME,IT_TFDIR-FUNCNAME,IT_TFDIR-INCNAME,IT_TFDIR-INCLUDE,
IT_TFDIR-OBSOLETE,IT_TFDIR-FUNAM,IT_TFDIR-FUDAT,IT_TFDIR-STEXT.
ENDIF.

ENDLOOP.

* INLUCDE ダウンロード----------------------
DATA: FUNCPOOL LIKE SY-REPID.
DATA: INCL LIKE SY-REPID OCCURS 0 WITH HEADER LINE.
DATA: T_COMPO LIKE SCOMPO OCCURS 0 WITH HEADER LINE.
DATA: T_CROSS_REF LIKE CROSS OCCURS 0 WITH HEADER LINE.
DATA: T_INC LIKE D010INC OCCURS 0 WITH HEADER LINE.

FUNCPOOL = IT_TFDIR-NAME.
CALL FUNCTION 'RS_PROGRAM_INDEX'
EXPORTING
PG_NAME = FUNCPOOL
* WITHOUT_TREE = ' '
* IMPORTING
* MESSAGE_CLASS =
TABLES
COMPO = T_COMPO
CROSS_REF = T_CROSS_REF
INC = T_INC
EXCEPTIONS
SYNTAX_ERROR = 1
OTHERS = 2.

LOOP AT T_COMPO.
INCL = T_COMPO-INCL .
ENDLOOP.


SORT T_COMPO BY INCL.
DELETE ADJACENT DUPLICATES FROM T_COMPO COMPARING INCL.

WRITE /'FMのインクルード プログラム'.
LOOP AT T_COMPO.
WRITE:/1(20) T_COMPO-INCL.
IF DOW = 'X' AND INCLD = 'X'.
REFRESH TT.
RN = T_COMPO-INCL.
READ REPORT RN INTO TT.

CONCATENATE P_DIR T_COMPO-INCL '_インクルードプログラム' '.' STYPE
INTO YYNAME.

CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
FILENAME = YYNAME
FILETYPE = 'ASC'
TABLES
DATA_TAB = TT.

IF SY-SUBRC = 0.
FORMAT COLOR 5.
WRITE: 'ダウンロードしました'.
FORMAT COLOR OFF.
ELSE.
FORMAT COLOR 4.
WRITE: 'ダウンロード出来ない'.
FORMAT COLOR OFF.
ENDIF.
ENDIF.
ENDLOOP.

ENDFORM. " GET_FM_DATA