Application Development and Automation Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

Please help to check what's wrong with my code?

Former Member
0 Likes
635

Dear Expert,

I'm trying to write a file IO program.

but there are some bug i don't know what's wrong with it.

source code as below,

can anyone helps to fix it ?

&----


*& Report Z_TEST_IO

*&

&----


*&

*&

&----


REPORT Z_TEST_IO.

DATA: FILENAME TYPE LOCALFILE,

FILETYPE(10) TYPE C.

DATA: BEGIN OF RECORD OCCURS 0,

COL1(20),

COL2(20),

COL3(20),

COL4(20),

COL5(20),

END OF RECORD.

DATA: FORECAST_ITABT LIKE STANDARD TABLE OF ALSMEX_TABLINE WITH HEADER LINE.

START-OF-SELECTION.

*調用函數打開文件對話框,mask 表示預設開啟文件類型,若需要定義多個類型可採用

MASK = '',.txt,.txt;,.dat,.dat;,.xls,.xls..'

CALL FUNCTION 'WS_FILENAME_GET'

EXPORTING

DEF_FILENAME = ''

DEF_PATH = 'c:\EXAMPLE\DIR'

MASK = ',.,..'

MADE = 'O'

TITLE = 'Choose input file'

IMPORTING

FILENIME = FILENAME

EXCEPTIONS

INV_WINSYS = 1

NO_BATCH = 2

SELECTION_CANCEL = 3

SELECTION_ERROR = 4

OTHERS =5.

IF SY-SUBRC <> 0.

EXIT.

ENDIF.

**自定義子程序從字串分析文件類型

PERFORM GETFILETYPE USING FILENAME FILETYPE.

IF FILETYPE = 'XLS'.

***當為EXCEL 類型時調用此參數,所抓取的件數據在內表中為每個單元格為一行

CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'

EXPORTING

FILENAME = FILENAME

I_BEGIN_COL = 1

I_BEGIN_ROW = 1

I_END_COL = 5

I_END_ROW = 1000

TABLES

INTERN = FORECAST_ITABT

EXCEPTIONS

INCONSISTENT_PARAMETERS = 1

UPLOAD_OLE = 2

OTHERS = 3.

**重新整理從EXCEL中抓取數據整理到所應用的內表

IF NOT FORECAST_ITABT[] IS INITIAL.

LOOP AT FORECAST_ITABT.

CASE FORECAST_ITABT-COL.

WHEN '0001'.

RECORD-COL1 = FORECAST_ITABT-VALUE.

WHEN '0002'.

RECORD-COL2 = FORECAST_ITABT-VALUE.

WHEN '0003'.

RECORD-COL3 = FORECAST_ITABT-VALUE.

WHEN '0004'.

RECORD-COL4 = FORECAST_ITABT-VALUE.

WHEN '0005'.

RECORD-COL5 = FORECAST_ITABT-VALUE.

ENDCASE.

**當表示某一行的數據讀取完成時,在應用內表各字段填充值並新增一行,內表首行不做APPEND處理

ON CHANGE OF FORECAST_ITABT-ROW.

IF SY-TABIX <> 1.

APPEND RECORD.

ENDIF.

ENDON.

ENDLOOP.

ENDIF.

*當為文本類型時調用此參數,所抓取的文件按製表位在內表填充

ELSEIF FILETYPE = 'TXT' OR FILETYPE = 'DAT'.

CALL FUNCTION 'WS_UPLOAD'

EXPORTING

FILENAME = FILENAME

FILETYPE = 'DAT'

TABLES

DATA_TAB = RECORD.

ELSE.

MESSAGE I001(00) WITH 'Not support this format files!'.

EXIT.

ENDIF.

**根據內表類型將數據寫入到本地文件

CONCATENATE 'C:\BACK\' SY-DATUM SY-UZEIT '.' FILETYPE INTO FILENAME.

IF FILETYPE = 'TXT' OR FILETYPE = 'DAT'.

**寫入到文本文件

CALL FUNCTION 'WS_DOWNLOAD'

EXPORTING

FILENAME = FILENAME

FILETYPE = 'DAT'

TABLES

DATA_TAB = RECORD

EXCEPTIONS

FILE_OPEN_ERROR = 1

FILE_WRITE_ERROR = 2

INVALID_FILESIZE = 3

INVALID_TABLE_WIDTH = 4

INVALID_TYPE = 5.

ELSEIF FILETYPE = 'XLS'.

CALL FUNCTION 'WS_EXCEL' "寫到EXCEL

EXPORTING

FILENAME = FILENAME

TABLES

DATA = RECORD.

ENDIF.

**輸出所讀取文件類型

LOOP AT RECORD.

WRITE:/ RECORD.

ENDLOOP.

*自定義獲取文本類型,從文件明最後一位判斷值到手次出現 "."符號

FORM GETFILETYPE USING FILENAME TYPE LOCALFILE

FILETYPE TYPE C.

DATA: LEN TYPE I,

POS TYPE I,

CHAR TYPE C.

LEN = STRLEN(FILENAME).

POS = LEN.

DO LEN TIMES.

POS = POS-1.

CHAR = FILENAME + POS(1).

IF CHAR = '.'.

LEN = LEN - POS.

POS = POS + 1.

FILETYPE = FILENAME + POS(LEN).

TRANSLATE FILETYPE TO UPPER CASE.

EXIT.

ENDIF.

ENDDO.

ENDFORM.

Dear Expert,

I'm trying to write a file IO program.

but there are some bug i don't know what's wrong with it.

source code as below,

can anyone helps to fix it ?

&----


*& Report Z_TEST_IO

*&

&----


*&

*&

&----


REPORT Z_TEST_IO.

DATA: FILENAME TYPE LOCALFILE,

FILETYPE(10) TYPE C.

DATA: BEGIN OF RECORD OCCURS 0,

COL1(20),

COL2(20),

COL3(20),

COL4(20),

COL5(20),

END OF RECORD.

DATA: FORECAST_ITABT LIKE STANDARD TABLE OF ALSMEX_TABLINE WITH HEADER LINE.

START-OF-SELECTION.

*調用函數打開文件對話框,mask 表示預設開啟文件類型,若需要定義多個類型可採用

MASK = '',.txt,.txt;,.dat,.dat;,.xls,.xls..'

CALL FUNCTION 'WS_FILENAME_GET'

EXPORTING

DEF_FILENAME = ''

DEF_PATH = 'c:\EXAMPLE\DIR'

MASK = ',.,..'

MADE = 'O'

TITLE = 'Choose input file'

IMPORTING

FILENIME = FILENAME

EXCEPTIONS

INV_WINSYS = 1

NO_BATCH = 2

SELECTION_CANCEL = 3

SELECTION_ERROR = 4

OTHERS =5.

IF SY-SUBRC <> 0.

EXIT.

ENDIF.

**自定義子程序從字串分析文件類型

PERFORM GETFILETYPE USING FILENAME FILETYPE.

IF FILETYPE = 'XLS'.

***當為EXCEL 類型時調用此參數,所抓取的件數據在內表中為每個單元格為一行

CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'

EXPORTING

FILENAME = FILENAME

I_BEGIN_COL = 1

I_BEGIN_ROW = 1

I_END_COL = 5

I_END_ROW = 1000

TABLES

INTERN = FORECAST_ITABT

EXCEPTIONS

INCONSISTENT_PARAMETERS = 1

UPLOAD_OLE = 2

OTHERS = 3.

**重新整理從EXCEL中抓取數據整理到所應用的內表

IF NOT FORECAST_ITABT[] IS INITIAL.

LOOP AT FORECAST_ITABT.

CASE FORECAST_ITABT-COL.

WHEN '0001'.

RECORD-COL1 = FORECAST_ITABT-VALUE.

WHEN '0002'.

RECORD-COL2 = FORECAST_ITABT-VALUE.

WHEN '0003'.

RECORD-COL3 = FORECAST_ITABT-VALUE.

WHEN '0004'.

RECORD-COL4 = FORECAST_ITABT-VALUE.

WHEN '0005'.

RECORD-COL5 = FORECAST_ITABT-VALUE.

ENDCASE.

**當表示某一行的數據讀取完成時,在應用內表各字段填充值並新增一行,內表首行不做APPEND處理

ON CHANGE OF FORECAST_ITABT-ROW.

IF SY-TABIX <> 1.

APPEND RECORD.

ENDIF.

ENDON.

ENDLOOP.

ENDIF.

*當為文本類型時調用此參數,所抓取的文件按製表位在內表填充

ELSEIF FILETYPE = 'TXT' OR FILETYPE = 'DAT'.

CALL FUNCTION 'WS_UPLOAD'

EXPORTING

FILENAME = FILENAME

FILETYPE = 'DAT'

TABLES

DATA_TAB = RECORD.

ELSE.

MESSAGE I001(00) WITH 'Not support this format files!'.

EXIT.

ENDIF.

**根據內表類型將數據寫入到本地文件

CONCATENATE 'C:\BACK\' SY-DATUM SY-UZEIT '.' FILETYPE INTO FILENAME.

IF FILETYPE = 'TXT' OR FILETYPE = 'DAT'.

**寫入到文本文件

CALL FUNCTION 'WS_DOWNLOAD'

EXPORTING

FILENAME = FILENAME

FILETYPE = 'DAT'

TABLES

DATA_TAB = RECORD

EXCEPTIONS

FILE_OPEN_ERROR = 1

FILE_WRITE_ERROR = 2

INVALID_FILESIZE = 3

INVALID_TABLE_WIDTH = 4

INVALID_TYPE = 5.

ELSEIF FILETYPE = 'XLS'.

CALL FUNCTION 'WS_EXCEL' "寫到EXCEL

EXPORTING

FILENAME = FILENAME

TABLES

DATA = RECORD.

ENDIF.

**輸出所讀取文件類型

LOOP AT RECORD.

WRITE:/ RECORD.

ENDLOOP.

*自定義獲取文本類型,從文件明最後一位判斷值到手次出現 "."符號

FORM GETFILETYPE USING FILENAME TYPE LOCALFILE

FILETYPE TYPE C.

DATA: LEN TYPE I,

POS TYPE I,

CHAR TYPE C.

LEN = STRLEN(FILENAME).

POS = LEN.

DO LEN TIMES.

POS = POS-1.

CHAR = FILENAME + POS(1).

IF CHAR = '.'.

LEN = LEN - POS.

POS = POS + 1.

FILETYPE = FILENAME + POS(LEN).

TRANSLATE FILETYPE TO UPPER CASE.

EXIT.

ENDIF.

ENDDO.

ENDFORM.

2 REPLIES 2
Read only

Former Member
0 Likes
536

Hi,

Check the bold ones ..

START-OF-SELECTION.

CALL FUNCTION 'WS_FILENAME_GET'

EXPORTING

DEF_FILENAME = ''

DEF_PATH = 'c:\EXAMPLE\DIR'

MASK = ',.,..'

MADE = 'O'

TITLE = 'Choose input file'

IMPORTING

FILENIME = FILENAME

EXCEPTIONS

INV_WINSYS = 1

NO_BATCH = 2

SELECTION_CANCEL = 3

SELECTION_ERROR = 4

OTHERS = 5.

IF SY-SUBRC <> 0.

EXIT.

ENDIF.

PERFORM GETFILETYPE USING FILENAME FILETYPE.

IF FILETYPE = 'XLS'.

CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'

EXPORTING

FILENAME = FILENAME

I_BEGIN_COL = 1

I_BEGIN_ROW = 1

I_END_COL = 5

I_END_ROW = 1000

TABLES

INTERN = FORECAST_ITABT

EXCEPTIONS

INCONSISTENT_PARAMETERS = 1

UPLOAD_OLE = 2

OTHERS = 3.

IF NOT FORECAST_ITABT[] IS INITIAL.

LOOP AT FORECAST_ITABT.

CASE FORECAST_ITABT-COL.

WHEN '0001'.

RECORD-COL1 = FORECAST_ITABT-VALUE.

WHEN '0002'.

RECORD-COL2 = FORECAST_ITABT-VALUE.

WHEN '0003'.

RECORD-COL3 = FORECAST_ITABT-VALUE.

WHEN '0004'.

RECORD-COL4 = FORECAST_ITABT-VALUE.

WHEN '0005'.

RECORD-COL5 = FORECAST_ITABT-VALUE.

ENDCASE.

ON CHANGE OF FORECAST_ITABT-ROW.

IF SY-TABIX = 1.

APPEND RECORD.

ENDIF.

ENDON.

ENDLOOP.

ENDIF.

ELSEIF FILETYPE = 'TXT' OR FILETYPE = 'DAT'.

CALL FUNCTION 'WS_UPLOAD'

EXPORTING

FILENAME = FILENAME

FILETYPE = 'DAT'

TABLES

DATA_TAB = RECORD.

ELSE.

MESSAGE I001(00) WITH 'Not support this format files!'.

EXIT.

ENDIF.

CONCATENATE 'C:\BACK\' SY-DATUM SY-UZEIT '.' FILETYPE INTO FILENAME.

IF FILETYPE = 'TXT' OR FILETYPE = 'DAT'.

CALL FUNCTION 'WS_DOWNLOAD'

EXPORTING

FILENAME = FILENAME

FILETYPE = 'DAT'

TABLES

DATA_TAB = RECORD

EXCEPTIONS

FILE_OPEN_ERROR = 1

FILE_WRITE_ERROR = 2

INVALID_FILESIZE = 3

INVALID_TABLE_WIDTH = 4

INVALID_TYPE = 5.

ELSEIF FILETYPE = 'XLS'.

CALL FUNCTION 'WS_EXCEL' "??EXCEL

EXPORTING

FILENAME = FILENAME

TABLES

DATA = RECORD.

ENDIF.

LOOP AT RECORD.

WRITE:/ RECORD.

ENDLOOP.

FORM GETFILETYPE USING FILENAME TYPE LOCALFILE

FILETYPE TYPE C.

DATA: LEN TYPE I,

POS TYPE I,

CHAR TYPE C.

LEN = STRLEN( FILENAME ).

POS = LEN.

DO LEN TIMES.

POS = POS - 1.

CHAR = FILENAME+POS(1).

IF CHAR = '.'.

LEN = LEN - POS.

POS = POS + 1.

FILETYPE = FILENAME+POS(LEN).

TRANSLATE FILETYPE TO UPPER CASE.

EXIT.

ENDIF.

ENDDO.

ENDFORM.

Regards,

Srini.

Read only

Former Member
0 Likes
536

Moderator message - Please ask a specific question. Some bug" doesn't really give much information. Post locked Rob