Đọc file CSV trên server sang Internal table động

Ngày 15 tháng 12 năm 2018 | 102 views

Dạo này thường suyên phải làm việc interface với kiểu đọc file .CSV củ lạc, tìm mãi chưa ra được hàm chuẩn của SAP để có thể đọc 1 file .CSV  bất kỳ ra internal table dynamic, đành phải tranh thủ quẩy lấy một hàm dùng chơi.

Để có thể đọc file đông chuyển sang internal động thì ae cần truyền vào tham số động dạng STANDARD TABLE:

*"*"Local Interface:
*"  IMPORTING
*"     REFERENCE(I_FULLPATH)
*"     REFERENCE(I_COMMA) TYPE  CHAR1 DEFAULT ','
*"     REFERENCE(I_HEADER) TYPE  CHAR1 DEFAULT 'X'
*"  TABLES
*"      IT_DATA TYPE  STANDARD TABLE
*"  EXCEPTIONS
*"      READ_FILE

Khai báo thông tin biến workarea:

  DATA: LW_FULL_PATH TYPE STRING,
        LW_CONTENT   TYPE STRING.
  DATA: LT_STRING     TYPE TABLE OF STRING,
        LW_STRING     TYPE STRING,
        LW_COL_IX     TYPE SY-TABIX,
        LW_LINE_COUNT TYPE SY-TABIX.
  "Khai bao biến động kiểu DATA để load return về cấu trúc bảng động
  DATA: LO_DATA_LINE TYPE REF TO DATA.
  FIELD-SYMBOLS:

    <LF_LINE>  TYPE ANY,
    <LF_VALUE> TYPE ANY.

Đọc nội dung file trên server, chúng ta dùng hàm chuẩn DATASET của SAP:

*--------------------------------------------------------------------*
* Doc Thong Tin File CSV
  LW_FULL_PATH  = I_FULLPATH.
  OPEN DATASET LW_FULL_PATH FOR INPUT IN TEXT MODE ENCODING NON-UNICODE
                      WITH SMART LINEFEED.
  IF SY-SUBRC IS NOT INITIAL.
    RAISE READ_FILE.
  ENDIF.

Để load dữ liệu từ file CSV vào cấu trúc bảng động chúng ta dùng GET REFERENCE OF, ở đây cần tạo ra cấu trúc line động như sau:

*--------------------------------------------------------------------*
* Assign structure of table dynamic
  GET REFERENCE OF IT_DATA INTO LO_DATA_LINE.
  ASSIGN LO_DATA_LINE->* TO <LF_LINE>.

Sau đó sử dụng vòng loop DO ENDDO. để mapping dữ liệu từ file CSV vào line động như sau:

*--------------------------------------------------------------------*
* Load Thong Tin File
  LW_LINE_COUNT = 0.
  DO .
    ADD 1 TO LW_LINE_COUNT.
    READ DATASET LW_FULL_PATH INTO LW_CONTENT.
    IF SY-SUBRC IS NOT INITIAL.
      " Exit Do time
      EXIT.
    ENDIF.
    IF LW_LINE_COUNT = 1 AND I_HEADER = 'X'.
      CONTINUE.
    ENDIF.
    " Load Du lieu vao Structure
    CLEAR: LT_STRING.
    LW_COL_IX = 1.
    SPLIT LW_CONTENT AT I_COMMA INTO TABLE LT_STRING.
    LOOP AT LT_STRING INTO LW_STRING.
      ASSIGN COMPONENT LW_COL_IX OF STRUCTURE <LF_LINE> TO <LF_VALUE>.
      <LF_VALUE> = LW_STRING.
      ADD 1 TO LW_COL_IX.
    ENDLOOP.
    APPEND <LF_LINE> TO IT_DATA.
  ENDDO.

Do cấu trúc structure là 1 structure bất kỳ nên chúng ta cần dùng ASSIGN COMPONENT LW_COL_IX OF STRUCTURE <LF_LINE> TO <LF_VALUE>. với LW_COL_IX là thứ tự của cột tương ứng trong structure trong bảng động.

Và cuối cùng ko thể khác là CLOSED.

*--------------------------------------------------------------------*
* Close Dataset after read content
  CLOSE DATASET LW_FULL_PATH.

 

PS: Ae có hàm chuẩn của sap thì có thể comment Ad cảm ơn nhiều nhé. Hiện mình mới tìm được hàm này KCD_CSV_FILE_TO_INTERN_CONVERT nhưng lại chỉ có thể đọc được từ local nhưng ý tưởng cũng rất hay.

Reverse lại code trong SAP ABAP

Ngày 04 tháng 1 năm 2019

04-01-2019
67
BTEs – Business Transaction Events

Ngày 26 tháng 12 năm 2018

26-12-2018
104
Run Operation System Commands

Ngày 21 tháng 12 năm 2018

21-12-2018
140