2010 Sep 27 11:26 AM
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.
2010 Sep 27 11:37 AM
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.
2010 Sep 27 2:37 PM
Moderator message - Please ask a specific question. Some bug" doesn't really give much information. Post locked Rob