REPORT ZBDCTOOL_FROM_EXCEL LINE-COUNT 0 LINE-SIZE 80
NO STANDARD PAGE HEADING.
*-----------------------------------------------------------------------
* BDC Data Upload by Recording
*-----------------------------------------------------------------------
* Licensed by BIZTECH Consulting Co. in Korea
* Developed by BIZTECH Consulting Co.
*
*-----------------------------------------------------------------------
* |* ; comment
* |*FIELDNAME ; field name
* |STARTDATA ; data start
* |
* |
* |ENDDATA ; data end
*-----------------------------------------------------------------------
TYPE-POOLS: SLIS , KKBLO, VRM, KCDE.
DATA: DYNFLOW LIKE BDCDATA OCCURS 0 WITH HEADER LINE.
DATA: SAV_DF LIKE BDCDATA OCCURS 0 WITH HEADER LINE.
DATA: BDC_DATA LIKE BDCDATA OCCURS 0 WITH HEADER LINE.
DATA: PRG_DYN(50), ICODE(30).
*DATA: GR_FNAM LIKE RANGE OF BDCDATA-FNAM OCCURS 0 WITH HEADER LINE.
*
DATA: DOWLOAD(20) VALUE '<Excel Dowload>',
UPLOAD(12) VALUE '<Processing>',
TESTING(14) VALUE '<Test Display>',
TESTONE(10) VALUE '<Test One>',
SESSION(17) VALUE '<Process Session>',
SAVEREC(24) VALUE '<Save RECORDING to File>'.
*
DATA: BEGIN OF ALPHA,
X1 TYPE HEXTYP VALUE 65,
X2 TYPE HEXTYP VALUE 32,
END OF ALPHA.
DATA READTYPE.
DATA: MESSTAB LIKE BDCMSGCOLL OCCURS 0 WITH HEADER LINE.
DATA: L_MSTRING(512).
DATA CCODE(2).
DATA TRAN_SUBRC TYPE SY-SUBRC.
DATA: FILENAME LIKE RLGRAP-FILENAME,
FILETYPE LIKE RLGRAP-FILETYPE VALUE 'ASC',
ACT_FILENAME LIKE RLGRAP-FILENAME,
FILESIZE TYPE I.
DATA: BEGIN OF GA_EXCEL_HEADER,
DDTEXT TYPE AS4TEXT,
END OF GA_EXCEL_HEADER.
DATA: BEGIN OF GT_EXCEL_BODY OCCURS 0,
COL01(100),
COL02(100),
COL03(100),
COL04(100),
COL05(100),
COL06(100),
COL07(100),
COL08(100),
COL09(100),
COL10(100),
COL11(100),
COL12(100),
COL13(100),
COL14(100),
COL15(100),
COL16(100),
COL17(100),
COL18(100),
COL19(100),
COL20(100),
COL21(100),
COL22(100),
COL23(100),
COL24(100),
COL25(100),
COL26(100),
COL27(100),
COL28(100),
COL29(100),
COL30(100),
COL31(100),
COL32(100),
COL33(100),
COL34(100),
COL35(100),
COL36(100),
COL37(100),
COL38(100),
COL39(100),
COL40(100),
COL41(100),
COL42(100),
COL43(100),
COL44(100),
COL45(100),
COL46(100),
COL47(100),
COL48(100),
COL49(100),
COL50(100),
COL51(100),
COL52(100),
COL53(100),
COL54(100),
COL55(100),
COL56(100),
COL57(100),
COL58(100),
COL59(100),
COL60(100),
END OF GT_EXCEL_BODY.
*----------------------------------------------------------------------*
* EXCEL sheet using OLE automation.
*----------------------------------------------------------------------*
INCLUDE OLE2INCL.
DATA : GT_XLS TYPE STANDARD TABLE OF KCDE_INTERN_STRUC
WITH HEADER LINE.
* Handles for OLE objects
DATA: H_EXCEL TYPE OLE2_OBJECT, " Excel object
H_MAPL TYPE OLE2_OBJECT, " list of workbooks
H_MAP TYPE OLE2_OBJECT, " workbook
H_ZL TYPE OLE2_OBJECT, " cell
H_F TYPE OLE2_OBJECT. " font
DATA : FTAB TYPE TABLE OF STRING,
T_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
WA_FIELDCAT TYPE SLIS_FIELDCAT_ALV.
* Recording
SELECTION-SCREEN BEGIN OF BLOCK RECO0 WITH FRAME TITLE T-RECO0.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(31) T-GRPID.
PARAMETERS: P-GRPID LIKE APQI-GROUPID.
PARAMETERS: P-MANDT LIKE APQI-MANDANT OBLIGATORY DEFAULT SY-MANDT.
SELECTION-SCREEN END OF LINE.
* Created on
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(31) T-CREDT.
PARAMETERS: P-CREDT LIKE APQI-CREDATE.
SELECTION-SCREEN END OF LINE.
* Created by
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(31) T-CREUR.
PARAMETERS: P-CREUR LIKE APQI-CREATOR.
SELECTION-SCREEN END OF LINE.
*
SELECTION-SCREEN ULINE.
*
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(31) T-RFILE.
PARAMETERS: P-RFILE(128) MEMORY ID DLP.
SELECTION-SCREEN END OF LINE.
*
SELECTION-SCREEN END OF BLOCK RECO0.
*
SELECTION-SCREEN BEGIN OF BLOCK FSRC0 WITH FRAME TITLE T-FSCR0.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS P-FRPC RADIOBUTTON GROUP FSRC.
SELECTION-SCREEN COMMENT 3(15) T-FRPC.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS P-FRSR RADIOBUTTON GROUP FSRC.
SELECTION-SCREEN COMMENT 3(15) T-FRSR.
SELECTION-SCREEN END OF LINE.
*
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(31) T-FNAME.
PARAMETERS: P-FNAME LIKE RLGRAP-FILENAME
* DEFAULT 'C:\SAPWorkdir\MAT.TXT'
MEMORY ID DLF.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: X_DEFLT AS CHECKBOX.
SELECTION-SCREEN COMMENT 3(70) T-DEFLT.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(31) T-NULTXT.
PARAMETERS: X_NULIND DEFAULT '!'.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK FSRC0.
*
SELECTION-SCREEN BEGIN OF BLOCK SESS0 WITH FRAME TITLE T-SESS0.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: X_TRAN RADIOBUTTON GROUP BTYP.
SELECTION-SCREEN COMMENT 3(20) T-TRAN.
SELECTION-SCREEN END OF LINE.
*
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(31) T-DMODE.
PARAMETERS: DMODE LIKE CTU_PARAMS-DISMODE DEFAULT 'N'.
SELECTION-SCREEN END OF LINE.
*
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(31) T-UMODE.
PARAMETERS: UMODE LIKE CTU_PARAMS-UPDMODE DEFAULT 'L'.
SELECTION-SCREEN END OF LINE.
*
SELECTION-SCREEN ULINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: X_SES RADIOBUTTON GROUP BTYP.
SELECTION-SCREEN COMMENT 3(20) T-SES.
SELECTION-SCREEN END OF LINE.
PARAMETERS: BDCGROUP(12).
PARAMETERS: USERNAME LIKE SY-UNAME DEFAULT SY-UNAME OBLIGATORY.
SELECTION-SCREEN END OF BLOCK SESS0.
*
DATA: BEGIN OF XDAT OCCURS 0,
DAT(1024),
END OF XDAT.
*
RANGES: R-GRPID FOR APQI-GROUPID,
R-CREDT FOR APQI-CREDATE,
R-CREUR FOR APQI-CREATOR.
*
DATA: APQITAB LIKE APQI OCCURS 0 WITH HEADER LINE,
RECORDING_TYPE LIKE APQI-DATATYP VALUE '%BDC'.
*
DATA: INDATA(1024) OCCURS 0 WITH HEADER LINE.
*
DATA: LEN TYPE I,
N TYPE I,
O TYPE I,
SEQ TYPE I,
DAT(128),
CH.
*
*DATA: BEGIN OF TAB,
* T TYPE X VALUE '09',
* END OF TAB.
*
DATA: BDC_VALUE(128) OCCURS 0 WITH HEADER LINE,
BDC_INDEX TYPE I,
BDC_COUNT TYPE I.
DATA TRANCODE LIKE TSTC-TCODE.
*
DATA: H LIKE D020S,
F LIKE D021S OCCURS 0 WITH HEADER LINE,
E LIKE D022S OCCURS 0 WITH HEADER LINE,
M LIKE D023S OCCURS 0 WITH HEADER LINE.
*
DATA: BEGIN OF DYNP,
PROG LIKE D020S-PROG,
DNUM LIKE D020S-DNUM,
END OF DYNP.
TYPE-POOLS: OLE2.
*
DATA: XL_ROW TYPE I,
XL_COLUMN TYPE I.
DATA: E_FONT(20) VALUE '굴림',
E_SIZE TYPE I VALUE 12.
DATA: E_SHEET_NO TYPE I VALUE 1,
E_SHEET_NAME(20) VALUE 'TEST',
XL_TITLE(100).
*
* Automation EXCEL
DATA: EXCEL TYPE OLE2_OBJECT, BOOKS TYPE OLE2_OBJECT,
BOOK TYPE OLE2_OBJECT, SHEETS TYPE OLE2_OBJECT,
SHEET TYPE OLE2_OBJECT, CELLS TYPE OLE2_OBJECT,
CELL TYPE OLE2_OBJECT, APPL TYPE OLE2_OBJECT,
FONT TYPE OLE2_OBJECT.
DATA: DYN_TABIX LIKE SY-TABIX,
DYN_ORDER LIKE SY-TABIX.
DATA: BEGIN OF FTEXT OCCURS 10,
OUTPUTLEN LIKE DFIES-OUTPUTLEN,
SCRTEXT_S(14),
SCRTEXT_M(24),
SCRTEXT_L LIKE DFIES-SCRTEXT_L,
LINENO(4),
TABIX LIKE SY-TABIX,
END OF FTEXT.
DATA: BEGIN OF FNAM OCCURS 10,
FNAM LIKE BDCDATA-FNAM,
ORDER LIKE SY-TABIX,
END OF FNAM.
DATA: G_FNAME LIKE RLGRAP-FILENAME,
G_MASK(20) VALUE ',*.*,*.*.',
G_MODE_OPEN VALUE 'O',
G_TITLE(30) VALUE 'FileUploadDialog'.
AT SELECTION-SCREEN OUTPUT.
*
GET PARAMETER ID 'DLP' FIELD P-RFILE.
GET PARAMETER ID 'DLF' FIELD P-FNAME.
TABLES: APQI,
TSTCT,
DFIES,
X031L,
T100.
*
*
INITIALIZATION.
*
* bdcgroup = 'ZBDCGROUP'.
USERNAME = SY-UNAME.
T-DMODE = 'Run mode'.
T-UMODE = 'Update mode'.
T-TRAN = 'Call transaction'.
T-SES = 'Generate session'.
T-GRPID = 'Recording'.
T-CREDT = 'Created on'.
T-CREUR = 'Created by'.
T-FRPC = 'From PC'.
T-FRSR = 'From Server'.
T-FNAME = 'Path: file name of the BDC data'.
T-FSCR0 = 'BDC data'.
T-RECO0 = 'Selection for Recording'.
T-SESS0 = 'Processing type'.
T-DEFLT = 'Default Value - Use no space RECORDING field value'.
T-NULTXT = 'Null indicator'.
T-RFILE = 'External recording file'.
*
GET PARAMETER ID 'DLP' FIELD P-RFILE.
GET PARAMETER ID 'DLF' FIELD P-FNAME.
*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P-RFILE.
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
MASK = ',*.*,*.*.'
MODE = 'O'
IMPORTING
FILENAME = P-RFILE
EXCEPTIONS
INV_WINSYS = 1
NO_BATCH = 2
SELECTION_CANCEL = 3
SELECTION_ERROR = 4
OTHERS = 5.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P-FNAME.
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
MASK = ',*.*,*.*.'
MODE = 'O'
IMPORTING
FILENAME = P-FNAME
EXCEPTIONS
INV_WINSYS = 1
NO_BATCH = 2
SELECTION_CANCEL = 3
SELECTION_ERROR = 4
OTHERS = 5.
START-OF-SELECTION.
*
IF P-GRPID IS INITIAL AND
P-RFILE IS INITIAL.
MESSAGE S208(00) WITH
'Enter the Recording name or Ext.Recording file name'.
EXIT.
ENDIF.
*
IF X_SES = 'X' AND BDCGROUP IS INITIAL.
MESSAGE S208(00) WITH 'Enter the BDCGROUP Name'.
LEAVE LIST-PROCESSING.
ENDIF.
*
IF NOT P-GRPID IS INITIAL.
PERFORM SET_SELECT_OPTIONS.
SELECT * FROM APQI INTO TABLE APQITAB
WHERE GROUPID IN R-GRPID
AND CREDATE IN R-CREDT
AND DATATYP = RECORDING_TYPE
AND MANDANT = P-MANDT
AND CREATOR IN R-CREUR
ORDER BY CREDATE DESCENDING CRETIME DESCENDING.
ENDIF.
IF NOT P-RFILE IS INITIAL AND SY-DBCNT = 0.
PERFORM UPLOAD_THE_RECORDING.
ENDIF.
*
DESCRIBE TABLE APQITAB LINES SY-TFILL.
IF SY-TFILL = 0.
MESSAGE S208(00) WITH 'Not found recording !'.
EXIT.
ENDIF.
*
FORMAT COLOR COL_NORMAL INTENSIFIED OFF.
*
LOOP AT APQITAB.
WRITE: /1 SY-VLINE,
(6) APQITAB-MANDANT, SY-VLINE,
(12) APQITAB-GROUPID, SY-VLINE,
(10) APQITAB-CREDATE, SY-VLINE,
(8) APQITAB-CRETIME, SY-VLINE,
(12) APQITAB-CREATOR, SY-VLINE,
(5) APQITAB-TRANSCNT, SY-VLINE,
(5) APQITAB-MSGCNT, SY-VLINE.
APQI = APQITAB.
HIDE: APQI-GROUPID, APQI-QID, APQI-MANDANT, APQITAB.
ENDLOOP.
ULINE.
CLEAR APQITAB.
*
*
TOP-OF-PAGE.
*
FORMAT COLOR COL_HEADING.
ULINE.
WRITE: /1 SY-VLINE,
(6) 'Client', SY-VLINE,
(12) 'Recording', SY-VLINE,
(10) 'Date', SY-VLINE,
(8) 'Time', SY-VLINE,
(12) 'Created by', SY-VLINE,
(5) 'Trans', SY-VLINE,
(5) 'Scrn', SY-VLINE.
ULINE.
*
AT LINE-SELECTION.
*
IF SY-LSIND = 1.
CHECK NOT APQI-GROUPID IS INITIAL.
CLEAR ICODE.
PERFORM PUT_SCREEN_TEMPLATE.
CLEAR ICODE.
ELSEIF SY-LSIND = 2.
CLEAR ICODE.
GET CURSOR FIELD ICODE.
*
IF ICODE = 'UPLOAD' OR ICODE = 'TESTING' OR ICODE = 'TESTONE'.
PERFORM UPLOAD_DATA.
PERFORM EXECUTION_BDC.
* DESCRIBE TABLE INDATA LINES SY-TFILL.
* IF SY-TFILL > 0.
* PERFORM MAKE_BDC_DATA.
* ENDIF.
ELSEIF ICODE = 'DOWLOAD'.
PERFORM DOWNLOAD_EXCEL_FORM .
ELSEIF ICODE = 'SESSION'.
PERFORM PROCESS_SESSION.
ELSEIF ICODE = 'SAVEREC'.
PERFORM SAVE_RECORDING.
ENDIF.
ENDIF.
*&---------------------------------------------------------------------*
*& Form EXCLE_PROCESSING
*&---------------------------------------------------------------------*
FORM EXCLE_PROCESSING.
* DATA: LT_XLS LIKE ZPTPCS0001 OCCURS 0 WITH HEADER LINE,
* L_SUBRC LIKE SY-SUBRC.
* REFRESH GT_UP.
* CLEAR GT_UP.
*
* PERFORM ZPTCM_EXCEL_UPLOAD TABLES LT_XLS
* USING P_FILE.
* IF NOT GT_UP[] IS INITIAL.
* PERFORM EXCEL_UPLOAD_PROCESS.
* ENDIF.
ENDFORM. " EXCLE_PROCESSING
*&---------------------------------------------------------------------*
*& Form CALL_WS_UPLOAD
*&---------------------------------------------------------------------*
FORM CALL_WS_UPLOAD.
* DATA: BEGIN OF LT_PLAN OCCURS 0,
* KOSTL(10),
* KTEXT(20),
* STAGR(6),
* BEZEI(40),
* SMEXXX(15),
* END OF LT_PLAN.
*
* DATA: LT_COPY LIKE LT_PLAN OCCURS 0 WITH HEADER LINE.
* DATA: LT_RESUL LIKE GT_RESUL OCCURS 0 WITH HEADER LINE.
* DATA: LA_PLAN LIKE LT_PLAN.
* DATA: L_CHEK,
* L_TABIX LIKE SY-TABIX.
*
* CALL FUNCTION 'KCD_EXCEL_OLE_TO_INT_CONVERT'
* EXPORTING
* FILENAME = P-FNAME
* I_BEGIN_COL = 1
* I_BEGIN_ROW = 1
* I_END_COL = 256
* I_END_ROW = 65536
* TABLES
* INTERN = GT_XLS
* EXCEPTIONS
* INCONSISTENT_PARAMETERS = 1
* UPLOAD_OLE = 2
* OTHERS = 3.
*
* IF SY-SUBRC = 0.
* SORT GT_XLS BY ROW COL.
* LOOP AT GT_XLS.
* ASSIGN COMPONENT GT_XLS-COL OF STRUCTURE LT_PLAN TO <FS>.
* <FS> = GT_XLS-VALUE.
* AT END OF ROW.
* APPEND LT_PLAN.
* CLEAR LT_PLAN.
* ENDAT.
* ENDLOOP.
* ENDIF.
*
** HEADER 삭제
* DATA: L_INDEX LIKE SY-INDEX.
* DO P_LINE TIMES.
* DELETE LT_PLAN INDEX 1.
* ENDDO.
*
* DELETE LT_PLAN WHERE KOSTL EQ ' '
* OR STAGR EQ ' '.
*
* SORT LT_PLAN.
*
* LT_COPY[] = LT_PLAN[].
* LOOP AT LT_PLAN.
* LA_PLAN = LT_PLAN.
*
** 에러 결과값을 보여주기 위해서
* MOVE-CORRESPONDING LT_PLAN TO GT_RESUL.
* GT_RESUL-COUNT = SY-TABIX.
*
** COST CENTER CONVERSION
* PERFORM ALPHA_CONVERSION USING LA_PLAN-KOSTL
* CHANGING GT_LIST-KOSTL.
** COST CENTER TEXT
* PERFORM COST_CENTER_TEXT USING '1000'
* GT_LIST-KOSTL
* CHANGING GT_LIST-KOTXT.
*
** SKF
* GT_LIST-STAGR = LT_PLAN-STAGR.
** SKF TEXT
* PERFORM SKF_TEXT USING '1000'
* GT_LIST-STAGR
* CHANGING GT_LIST-STTXT.
*
** Cost Center Check
* SELECT SINGLE * FROM CSKS
* WHERE KOKRS EQ '1000'
* AND KOSTL EQ GT_LIST-KOSTL
* AND DATBI EQ '99991231'.
* IF SY-SUBRC EQ 0.
* ELSE.
* L_CHEK = 'X'.
** RED ICON을 보여줌
* PERFORM GET_ICON USING ICON_RED
* CHANGING GT_RESUL-ICONS.
* CONCATENATE 'Cost Center' LA_PLAN-KOSTL
* '가 등록되지 않았습니다.'
* INTO GT_RESUL-RESUL SEPARATED BY SPACE.
* APPEND GT_RESUL.
* ENDIF.
*
** SKF Check
* IF GT_LIST-STAGR NE P_STAGR.
* L_CHEK = 'X'.
** RED ICON을 보여줌
* PERFORM GET_ICON USING ICON_RED
* CHANGING GT_RESUL-ICONS.
* CONCATENATE '엑셀과 선택화면 SKF가 서로 다릅니다.'
* GT_LIST-STAGR '/' P_STAGR
* INTO GT_RESUL-RESUL SEPARATED BY SPACE.
* APPEND GT_RESUL.
* ENDIF.
*
* SELECT SINGLE * FROM TKA03
* WHERE STAGR EQ GT_LIST-STAGR
* AND KOKRS EQ '1000'.
* IF SY-SUBRC EQ 0.
* ELSE.
* L_CHEK = 'X'.
** RED ICON을 보여줌
* PERFORM GET_ICON USING ICON_RED
* CHANGING GT_RESUL-ICONS.
* CONCATENATE 'SKF' LA_PLAN-STAGR
* '가 등록되지 않았습니다.'
* INTO GT_RESUL-RESUL SEPARATED BY SPACE.
* APPEND GT_RESUL.
*
* ENDIF.
*
** 중복여부 체크
* READ TABLE LT_COPY WITH KEY KOSTL = LA_PLAN-KOSTL
* STAGR = LA_PLAN-STAGR.
* IF SY-SUBRC EQ 0.
* L_TABIX = SY-TABIX.
* DELETE LT_COPY INDEX L_TABIX.
* READ TABLE LT_COPY WITH KEY KOSTL = LA_PLAN-KOSTL
* STAGR = LA_PLAN-STAGR.
* IF SY-SUBRC EQ 0.
** RED ICON을 보여줌
* PERFORM GET_ICON USING ICON_RED
* CHANGING GT_RESUL-ICONS.
* CONCATENATE 'Cost Center' LA_PLAN-KOSTL
* 'SKF' LA_PLAN-STAGR
* '가 중복'
* INTO GT_RESUL-RESUL SEPARATED BY SPACE.
* APPEND GT_RESUL.
** 중복체크하기 위해서 MOVE
* LT_RESUL = GT_RESUL.
* APPEND LT_RESUL.
* ELSE.
* READ TABLE LT_RESUL WITH KEY KOSTL = LA_PLAN-KOSTL
* STAGR = LA_PLAN-STAGR.
* IF SY-SUBRC EQ 0.
** RED ICON을 보여줌
* PERFORM GET_ICON USING ICON_RED
* CHANGING GT_RESUL-ICONS.
* CONCATENATE 'Cost Center' LA_PLAN-KOSTL
* 'SKF' LA_PLAN-STAGR
* '가 중복'
* INTO GT_RESUL-RESUL SEPARATED BY SPACE.
* APPEND GT_RESUL.
* ELSE.
* IF L_CHEK NE 'X'.
** GREEN ICON을 보여줌
* PERFORM GET_ICON USING ICON_GREEN
* CHANGING GT_RESUL-ICONS.
* GT_RESUL-RESUL = ' '.
* APPEND GT_RESUL.
* ENDIF.
* ENDIF.
* ENDIF.
* ENDIF.
*
* GT_LIST-SMEXXX = LA_PLAN-SMEXXX.
*
*
* COLLECT GT_LIST. CLEAR GT_LIST.
*
* CLEAR: L_CHEK, LT_RESUL, GT_RESUL.
* ENDLOOP.
ENDFORM. " CALL_WS_UPLOAD
*&---------------------------------------------------------------------*
*& Form put_screen_template
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM PUT_SCREEN_TEMPLATE.
*
*
REFRESH: FTEXT, FNAM.
CLEAR FNAM.
CLEAR DYN_ORDER.
ALPHA-X1 = 65.
ALPHA-X2 = 32.
*
IF ICODE IS INITIAL AND NOT P-GRPID IS INITIAL.
CALL FUNCTION 'BDC_OBJECT_READ'
EXPORTING
QUEUE_ID = APQI-QID
DATATYPE = RECORDING_TYPE
* CLIENT = APQI-MANDANT
TABLES
DYNPROTAB = DYNFLOW
EXCEPTIONS
NOT_FOUND = 1
OTHERS = 99.
IF SY-SUBRC <> 0.
MESSAGE S208(00) WITH 'Cannot get the Recoreing info.'.
EXIT.
ENDIF.
ENDIF.
*
NEW-PAGE LINE-SIZE 120.
*
WRITE : DOWLOAD COLOR 5 HOTSPOT.
*
WRITE : /1 UPLOAD COLOR 5 HOTSPOT.
IF X_TRAN = 'X'.
WRITE: TESTONE COLOR 5 HOTSPOT.
ENDIF.
WRITE: TESTING COLOR 5 HOTSPOT.
WRITE: SAVEREC COLOR 5 HOTSPOT.
*
ULINE.
FORMAT COLOR COL_HEADING INTENSIFIED OFF.
* Recording Name
WRITE AT : /1(SY-LINSZ) 'Recording :',
15 APQI-GROUPID.
*
ULINE.
*
LOOP AT DYNFLOW.
DYN_TABIX = SY-TABIX.
IF DYNFLOW-DYNBEGIN = 'T'. " Tcode
TSTCT-TCODE = DYNFLOW-FNAM.
TRANCODE = TSTCT-TCODE.
SELECT SINGLE * FROM TSTCT WHERE SPRSL = SY-LANGU
AND TCODE = TSTCT-TCODE.
FORMAT COLOR COL_KEY.
WRITE AT : /1(SY-LINSZ) 'Transaction :'.
WRITE: 15 TSTCT-TCODE,
TSTCT-TTEXT.
ULINE.
ELSEIF DYNFLOW-DYNBEGIN = 'X'.
PRG_DYN = DYNP-PROG = DYNFLOW-PROGRAM.
PRG_DYN+41 = DYNP-DNUM = DYNFLOW-DYNPRO.
IMPORT DYNPRO H F E M ID DYNP.
CONDENSE PRG_DYN.
FORMAT COLOR COL_GROUP.
WRITE AT : /1(SY-LINSZ) SPACE,
6 PRG_DYN.
ELSE.
IF DYNFLOW-FNAM(4) NE 'BDC_'.
IF NOT ( X_DEFLT = 'X' AND DYNFLOW-FVAL NE SPACE ).
IF ALPHA-X2 = 32.
ALPHA-X1 = ALPHA-X1 + 1.
IF ALPHA-X1 > 90.
IF ALPHA-X2 = 32.
ALPHA-X1 = ALPHA-X2 = 65.
ENDIF.
ENDIF.
ELSE.
ALPHA-X2 = ALPHA-X2 + 1.
IF ALPHA-X2 > 90.
ALPHA-X1 = ALPHA-X1 + 1.
ALPHA-X2 = 65.
ENDIF.
ENDIF.
ENDIF.
*
PERFORM GET_FILENAME.
FORMAT COLOR COL_NORMAL.
*
WRITE: /6 DYNFLOW-FNAM(25) COLOR COL_POSITIVE,
31 DFIES-FIELDTEXT(30).
IF X_DEFLT = 'X' AND DYNFLOW-FVAL NE SPACE.
WRITE 61(5) '.'.
ELSE.
WRITE:61(2) ALPHA-X1 COLOR COL_TOTAL,
63(2) ALPHA-X1 COLOR COL_TOTAL.
ADD 1 TO FNAM-ORDER.
MOVE DYNFLOW-FNAM TO FNAM-FNAM.
APPEND FNAM.
ENDIF.
*
IF ICODE = 'TESTING'.
READ TABLE SAV_DF INDEX DYN_TABIX.
DYNFLOW-FVAL = SAV_DF-FVAL.
ENDIF.
WRITE: 66 DYNFLOW-FVAL.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM. " put_screen_template
*&---------------------------------------------------------------------*
*& Form upload_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM UPLOAD_DATA.
DATA: L_SUBRC TYPE SY-SUBRC.
FIELD-SYMBOLS <FS> TYPE ANY.
REFRESH GT_EXCEL_BODY.
IF P-FRPC = 'X'.
PERFORM CALL_OPEN_DIALOG.
* PERFORM WS_FILENAME_GET USING 'O' "파일 열기
* CHANGING P-FNAME
* L_SUBRC.
CASE SY-SUBRC.
WHEN 0.
CALL FUNCTION 'KCD_EXCEL_OLE_TO_INT_CONVERT'
EXPORTING
FILENAME = P-FNAME
I_BEGIN_COL = 2
I_BEGIN_ROW = 3
I_END_COL = 256
I_END_ROW = 65536
TABLES
INTERN = GT_XLS
EXCEPTIONS
INCONSISTENT_PARAMETERS = 1
UPLOAD_OLE = 2
OTHERS = 3.
IF SY-SUBRC = 0.
SORT GT_XLS BY ROW COL.
** Header 값 삭제
* DELETE GT_XLS
* WHERE ROW EQ 1.
** AND COL EQ 1.
LOOP AT GT_XLS.
ASSIGN COMPONENT GT_XLS-COL OF STRUCTURE
GT_EXCEL_BODY TO <FS>.
<FS> = GT_XLS-VALUE.
AT END OF ROW.
APPEND GT_EXCEL_BODY.
CLEAR GT_EXCEL_BODY.
ENDAT.
ENDLOOP.
ENDIF.
WHEN OTHERS.
* 취소
ENDCASE.
ELSE.
DATA: OPEN_MSG(80).
OPEN DATASET P-FNAME FOR INPUT IN TEXT MODE
ENCODING DEFAULT
MESSAGE OPEN_MSG.
IF SY-SUBRC NE 0.
MESSAGE S453(00) WITH 'Data Open error :' OPEN_MSG.
EXIT.
ENDIF.
*
MESSAGE S453(00) WITH 'Reading...' SPACE.
DO.
READ DATASET P-FNAME INTO INDATA.
IF SY-SUBRC NE 0. EXIT. ENDIF.
APPEND INDATA.
ENDDO.
CLOSE DATASET P-FNAME.
ENDIF.
SET PARAMETER ID 'DLF' FIELD P-FNAME.
ENDFORM. " upload_data
*&---------------------------------------------------------------------*
*& Form CALL_OPEN_DIALOG
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM CALL_OPEN_DIALOG .
*
IF P-FNAME <> SPACE.
MOVE P-FNAME TO G_FNAME.
SET PARAMETER ID 'GR9' FIELD G_FNAME. "Upload path
ELSE.
ENDIF.
*
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
DEF_FILENAME = G_FNAME
MASK = G_MASK
MODE = G_MODE_OPEN
TITLE = G_TITLE
IMPORTING
FILENAME = G_FNAME
EXCEPTIONS
INV_WINSYS = 01
NO_BATCH = 02
SELECTION_CANCEL = 03
SELECTION_ERROR = 04.
*
IF SY-SUBRC = 0 AND G_FNAME <> SPACE.
P-FNAME = G_FNAME.
SET PARAMETER ID 'GR9' FIELD G_FNAME. "Upload path
ELSE.
ENDIF.
*
ENDFORM. " call_open_dialog
*&---------------------------------------------------------------------*
*& Form WS_FILENAME_GET
*&---------------------------------------------------------------------*
FORM WS_FILENAME_GET USING P_MODE
CHANGING P_FILE
P_SUBRC TYPE SY-SUBRC.
DATA: L_DEF_FILENAME LIKE RLGRAP-FILENAME, "VALUE '*.XLS',
L_DEF_PATH LIKE RLGRAP-FILENAME, " VALUE 'C:\',
L_TMP_FILENAME LIKE RLGRAP-FILENAME,
L_TMP_MASK(80) VALUE ',*.*,*.*.'.
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
DEF_FILENAME = L_DEF_FILENAME
DEF_PATH = L_DEF_PATH
MASK = L_TMP_MASK
MODE = P_MODE
IMPORTING
FILENAME = P_FILE
EXCEPTIONS
INV_WINSYS = 01
NO_BATCH = 02
SELECTION_CANCEL = 03
SELECTION_ERROR = 04.
P_SUBRC = SY-SUBRC.
CASE SY-SUBRC.
WHEN 3.
* MESSAGE S000 "DISPLAY LIKE 'E'
* WITH '파일 선택을 취소했습니다.'.
ENDCASE.
ENDFORM. " WS_FILENAME_GET
*&---------------------------------------------------------------------*
*& Form make_bdc_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM MAKE_BDC_DATA.
*
DATA: START, END.
CLEAR BDC_COUNT.
*
IF ICODE = 'UPLOAD' OR ICODE = 'TESTONE'.
NEW-PAGE LINE-SIZE 255.
ENDIF.
*
LOOP AT INDATA.
IF INDATA(1) = '*'. "comment row
CONTINUE.
ENDIF.
*
IF INDATA(9) = 'STARTDATA'. "data start row
START = 'X'.
ENDIF.
*
IF INDATA(7) = 'ENDDATA'. "data finished row
END = 'X'.
ENDIF.
*
CHECK START = 'X'.
*
LEN = STRLEN( INDATA ).
CLEAR: N,O,SEQ,DAT.
REFRESH BDC_VALUE.
DO.
IF N => LEN.
EXIT.
ENDIF.
*
CH = INDATA+N(1).
IF CH = CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB. "TAB.
SEQ = SEQ + 1.
PERFORM MOVE_BDC.
ADD 1 TO N.
CLEAR: O, DAT.
ELSE.
DAT+O(1) = INDATA+N(1).
ADD 1 TO: O, N.
ENDIF.
ENDDO.
SEQ = SEQ + 1.
PERFORM MOVE_BDC.
CLEAR DAT.
*
PERFORM APPEND_TO_BDC.
*
IF END = 'X' OR ( ICODE NE 'UPLOAD' AND START = 'X' ).
EXIT.
ENDIF.
ENDLOOP.
*
PERFORM CLOSE_BDC_GROUP.
*
IF START IS INITIAL.
WRITE: / 'ERROR :' COLOR COL_NEGATIVE,
'I Can''t found the ''STARTDATA'' tag.'.
ENDIF.
*
IF SY-SUBRC = 0.
IF ICODE = 'UPLOAD' AND X_SES = 'X'.
WRITE: / SESSION COLOR 5 HOTSPOT.
ULINE.
WRITE: / 'BDC session created.',
/ SY-ULINE,
/ 'BDC session :', BDCGROUP,
/ 'BDC Count :', BDC_COUNT.
ELSEIF ICODE = 'TESTING'.
PERFORM PUT_SCREEN_TEMPLATE.
SY-LSIND = SY-LSIND - 1.
ENDIF.
ENDIF.
*
ENDFORM. " make_bdc_data
*&---------------------------------------------------------------------*
*& Form DOWNLOAD_EXCEL_FORM
*&---------------------------------------------------------------------*
FORM DOWNLOAD_EXCEL_FORM .
DATA : COL_CNT TYPE I,
CELL_CNT TYPE I VALUE '1'.
DATA: L_TABIX LIKE SY-TABIX,
L_LAST_FLAG TYPE C,
L_INT(2) TYPE N,
L_DO_TIMES TYPE I.
DATA: L_ITAB_NAME(30),
L_FIELDNAME(50).
DATA L_TITLE TYPE STRING.
DATA LT_EXCEL_HEADER LIKE GA_EXCEL_HEADER OCCURS 0 WITH HEADER LINE.
DATA: LT_DYNFLOW TYPE STANDARD TABLE OF BDCDATA.
FIELD-SYMBOLS: <FS_FNAME> TYPE ANY.
LOOP AT DYNFLOW.
L_TABIX = SY-TABIX.
IF DYNFLOW-DYNBEGIN = 'T'. " Tcode
ELSEIF DYNFLOW-DYNBEGIN = 'X'.
PRG_DYN = DYNP-PROG = DYNFLOW-PROGRAM.
PRG_DYN+41 = DYNP-DNUM = DYNFLOW-DYNPRO.
IMPORT DYNPRO H F E M ID DYNP.
CONDENSE PRG_DYN.
ELSE.
IF DYNFLOW-FNAM(4) NE 'BDC_'.
L_INT = L_INT + 1.
PERFORM GET_FILENAME.
LT_EXCEL_HEADER-DDTEXT = DFIES-FIELDTEXT(30).
APPEND LT_EXCEL_HEADER. CLEAR LT_EXCEL_HEADER.
CONCATENATE 'GT_EXCEL_BODY-COL' L_INT INTO L_FIELDNAME.
ASSIGN (L_FIELDNAME) TO <FS_FNAME>.
<FS_FNAME> = DYNFLOW-FVAL.
CONDENSE <FS_FNAME>.
ENDIF.
ENDIF.
AT LAST.
APPEND GT_EXCEL_BODY. CLEAR GT_EXCEL_BODY.
ENDAT.
ENDLOOP.
* Header Field is count
DESCRIBE TABLE LT_EXCEL_HEADER LINES L_DO_TIMES.
* start Excel
CREATE OBJECT H_EXCEL 'EXCEL.APPLICATION'.
PERFORM ERR_HDL.
SET PROPERTY OF H_EXCEL 'Visible' = 1.
PERFORM ERR_HDL.
* get list of workbooks, initially empty
CALL METHOD OF
H_EXCEL
'Workbooks' = H_MAPL.
PERFORM ERR_HDL.
* add a new workbook
CALL METHOD OF
H_MAPL
'Add' = H_MAP.
PERFORM ERR_HDL.
*-Header
* PERFORM FILL_CELL USING CELL_CNT 1 0 'STARTDATA'.
COL_CNT = COL_CNT + 1.
PERFORM FILL_CELL USING 1 COL_CNT 1 '샘플'.
LOOP AT LT_EXCEL_HEADER.
COL_CNT = COL_CNT + 1.
PERFORM FILL_CELL USING 1 COL_CNT 1 LT_EXCEL_HEADER-DDTEXT.
CLEAR LT_EXCEL_HEADER.
ENDLOOP.
*-Body
CLEAR: COL_CNT, L_INT, <FS_FNAME>, L_FIELDNAME.
LOOP AT GT_EXCEL_BODY.
CELL_CNT = CELL_CNT + 1.
COL_CNT = COL_CNT + 1.
PERFORM FILL_CELL USING CELL_CNT COL_CNT 0 '샘플'.
AT LAST.
L_LAST_FLAG = 'X'.
ENDAT.
DO L_DO_TIMES TIMES.
* IF L_LAST_FLAG EQ 'X'.
* PERFORM FILL_CELL USING CELL_CNT 1 0 'ENDDATA'.
* ENDIF.
L_INT = L_INT + 1.
COL_CNT = COL_CNT + 1.
CONCATENATE 'GT_EXCEL_BODY-COL' L_INT INTO L_FIELDNAME.
ASSIGN (L_FIELDNAME) TO <FS_FNAME>.
PERFORM FILL_CELL USING CELL_CNT COL_CNT 0 <FS_FNAME>.
ENDDO.
CLEAR GT_EXCEL_BODY.
ENDLOOP.
* Excel Save안하고 종료
* SET PROPERTY OF H_MAP 'SAVED' = 0.
* CALL METHOD OF H_MAPL 'SAVED' = H_MAP
* EXPORTING
* #1 = GV_FNAME.
FREE OBJECT H_EXCEL.
PERFORM ERR_HDL.
ENDFORM. " DOWNLOAD_EXCEL_FORM
*&---------------------------------------------------------------------*
*& Form ERR_HDL
*&---------------------------------------------------------------------*
FORM ERR_HDL .
IF SY-SUBRC <> 0.
WRITE: / 'Fehler bei OLE-Automation:'(010), SY-SUBRC.
STOP.
ENDIF.
ENDFORM. " ERR_HDL
*&---------------------------------------------------------------------*
*& Form FILL_CELL
*&---------------------------------------------------------------------*
FORM FILL_CELL USING I J BOLD VAL.
CALL METHOD OF
H_EXCEL
'Cells' = H_ZL
EXPORTING
#1 = I
#2 = J.
PERFORM ERR_HDL.
SET PROPERTY OF H_ZL 'Value' = VAL.
PERFORM ERR_HDL.
GET PROPERTY OF H_ZL 'Font' = H_F.
PERFORM ERR_HDL.
SET PROPERTY OF H_F 'Bold' = BOLD.
PERFORM ERR_HDL.
ENDFORM. " FILL_CELL
*&---------------------------------------------------------------------*
*& Form move_bdc
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM MOVE_BDC.
CHECK SEQ > 1.
BDC_VALUE = DAT.
CONDENSE BDC_VALUE.
APPEND BDC_VALUE.
ENDFORM. " move_bdc
*&---------------------------------------------------------------------*
*& Form append_to_bdc
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM APPEND_TO_BDC.
*
CLEAR: BDC_VALUE, BDC_INDEX.
REFRESH BDC_DATA.
*
LOOP AT DYNFLOW.
IF DYNFLOW-DYNBEGIN = 'T'.
CONTINUE.
ENDIF.
*
BDC_DATA = DYNFLOW.
IF BDC_DATA-DYNBEGIN = 'X' OR
BDC_DATA-FNAM(4) = 'BDC_'.
APPEND BDC_DATA.
CONTINUE.
ENDIF.
*
IF X_DEFLT = 'X' AND NOT BDC_DATA-FVAL IS INITIAL.
APPEND BDC_DATA.
CONTINUE.
ENDIF.
*
ADD 1 TO BDC_INDEX.
READ TABLE BDC_VALUE INDEX BDC_INDEX.
IF SY-SUBRC NE 0.
CLEAR BDC_VALUE.
ENDIF.
IF BDC_VALUE = '!'. " null field
CONTINUE.
ENDIF.
*
BDC_DATA-FVAL = BDC_VALUE.
APPEND BDC_DATA.
ENDLOOP.
*
IF ICODE = 'TESTING'.
CLEAR BDC_INDEX.
REFRESH SAV_DF.
CLEAR SAV_DF.
LOOP AT DYNFLOW INTO SAV_DF.
IF SAV_DF-DYNBEGIN = 'T'.
APPEND SAV_DF.
CONTINUE.
ENDIF.
*
IF SAV_DF-DYNBEGIN = 'X' OR
SAV_DF-FNAM(4) = 'BDC_'.
APPEND SAV_DF.
CONTINUE.
ENDIF.
*
IF X_DEFLT = 'X' AND NOT SAV_DF-FVAL IS INITIAL.
APPEND SAV_DF.
CONTINUE.
ENDIF.
*
ADD 1 TO BDC_INDEX.
READ TABLE BDC_VALUE INDEX BDC_INDEX.
IF SY-SUBRC NE 0.
BDC_VALUE = '!!'.
ENDIF.
IF BDC_VALUE = X_NULIND OR " null field
BDC_VALUE = '!!'.
SAV_DF-FVAL = '<Null>'.
APPEND SAV_DF.
CLEAR SAV_DF.
CONTINUE.
ENDIF.
SAV_DF-FVAL = BDC_VALUE.
APPEND SAV_DF.
ENDLOOP.
ENDIF.
*
ADD 1 TO BDC_COUNT.
*
IF BDC_COUNT = 1 AND ICODE = 'UPLOAD'.
PERFORM OPEN_BDC_GROUP.
ENDIF.
*
IF X_SES = 'X'.
IF ICODE = 'UPLOAD'.
PERFORM BDC_INSERT.
ENDIF.
ELSEIF ICODE = 'TESTONE' OR ICODE = 'UPLOAD'.
CCODE(1) = CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB.
TRANSLATE INDATA USING CCODE.
FORMAT COLOR COL_KEY INTENSIFIED OFF.
WRITE: /(5) BDC_COUNT , INDATA(120).
PERFORM CALL_TRANSACTION.
ENDIF.
ENDFORM. " append_to_bdc
*&---------------------------------------------------------------------*
*& Form open_bdc_group
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM OPEN_BDC_GROUP.
*
CHECK X_SES = 'X'.
*
CALL FUNCTION 'BDC_OPEN_GROUP'
EXPORTING
CLIENT = SY-MANDT
GROUP = BDCGROUP
USER = USERNAME
KEEP = 'X'
EXCEPTIONS
CLIENT_INVALID = 1
DESTINATION_INVALID = 2
GROUP_INVALID = 3
GROUP_IS_LOCKED = 4
HOLDDATE_INVALID = 5
INTERNAL_ERROR = 6
QUEUE_ERROR = 7
RUNNING = 8
SYSTEM_LOCK_ERROR = 9
USER_INVALID = 10
OTHERS = 11.
*
IF SY-SUBRC NE 0.
MESSAGE E435(00) WITH 'BDC GROUP Open Error !'.
ENDIF.
*
ENDFORM. " open_bdc_group
*&---------------------------------------------------------------------*
*& Form close_bdc_group
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM CLOSE_BDC_GROUP.
*
CHECK X_SES = 'X'.
CHECK ICODE = 'UPLOAD'.
CALL FUNCTION 'BDC_CLOSE_GROUP'
EXCEPTIONS
NOT_OPEN = 1
QUEUE_ERROR = 2
OTHERS = 3.
*
ENDFORM. " close_bdc_group
*&---------------------------------------------------------------------*
*& Form set_select_options
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM SET_SELECT_OPTIONS.
*
IF P-GRPID CP '*'.
R-GRPID-OPTION = 'CP'.
R-GRPID-SIGN = 'I'.
R-GRPID-LOW = P-GRPID.
APPEND R-GRPID.
ELSEIF P-GRPID NE SPACE.
R-GRPID-OPTION = 'EQ'.
R-GRPID-SIGN = 'I'.
R-GRPID-LOW = P-GRPID.
APPEND R-GRPID.
ENDIF.
*
IF NOT P-CREDT IS INITIAL.
R-CREDT-OPTION = 'EQ'.
R-CREDT-SIGN = 'I'.
R-CREDT-LOW = P-CREDT.
APPEND R-CREDT.
ENDIF.
*
IF NOT P-CREUR IS INITIAL.
R-CREUR-OPTION = 'EQ'.
R-CREUR-SIGN = 'I'.
R-CREUR-LOW = P-CREUR.
APPEND R-CREUR.
ENDIF.
ENDFORM. " set_select_options
*&---------------------------------------------------------------------*
*& Form PROCESS_SESSION
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM PROCESS_SESSION.
*
SET PARAMETER ID 'MPN' FIELD BDCGROUP.
*
CALL TRANSACTION 'SM35' AND SKIP FIRST SCREEN.
ENDFORM. " PROCESS_SESSION
*&---------------------------------------------------------------------*
*& Form GET_FILENAME
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM GET_FILENAME.
*
DATA: T_LINE_NR(4).
F-ITYP = '2'.
F-FNAM = DYNFLOW-FNAM.
READ TABLE F WITH KEY FNAM = F-FNAM
ITYP = F-ITYP.
IF SY-SUBRC = 0 AND F-STXT NE SPACE.
DFIES-FIELDTEXT = F-STXT.
EXIT.
ENDIF.
*
IF DYNFLOW-FNAM CA '-'.
X031L-TABNAME = DYNFLOW-FNAM(SY-FDPOS).
SY-FDPOS = SY-FDPOS + 1.
X031L-FIELDNAME = DYNFLOW-FNAM+SY-FDPOS.
IF X031L-FIELDNAME CA '('.
X031L-FIELDNAME = X031L-FIELDNAME(SY-FDPOS).
ENDIF.
READTYPE = 'X'.
CLEAR DFIES.
DO.
CALL 'C_DD_READ_FIELD'
ID 'TYPE' FIELD READTYPE
ID 'TABNAME' FIELD X031L-TABNAME
ID 'FIELDNAME' FIELD X031L-FIELDNAME
ID 'LANGUAGE' FIELD SY-LANGU.
IF SY-SUBRC = 0. EXIT. ENDIF.
IF READTYPE = SPACE. EXIT. ENDIF.
CLEAR READTYPE.
ENDDO.
ENDIF.
MOVE DFIES-OUTPUTLEN TO FTEXT-OUTPUTLEN.
MOVE DFIES-SCRTEXT_S TO FTEXT-SCRTEXT_S.
MOVE DFIES-SCRTEXT_M TO FTEXT-SCRTEXT_M.
MOVE DFIES-SCRTEXT_L TO FTEXT-SCRTEXT_L.
MOVE DYN_TABIX TO FTEXT-TABIX.
MOVE T_LINE_NR TO FTEXT-LINENO.
APPEND FTEXT.
ENDFORM. " GET_FILENAME
*&---------------------------------------------------------------------*
*& Form BDC_INSERT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM BDC_INSERT.
*
CALL FUNCTION 'BDC_INSERT'
EXPORTING
TCODE = TRANCODE
TABLES
DYNPROTAB = BDC_DATA
EXCEPTIONS
INTERNAL_ERROR = 1
NOT_OPEN = 2
QUEUE_ERROR = 3
TCODE_INVALID = 4
OTHERS = 5.
*
IF SY-SUBRC NE 0.
MESSAGE E435(00) WITH 'BDC INSERT Error !'.
ENDIF.
ENDFORM. " BDC_INSERT
*&---------------------------------------------------------------------*
*& Form CALL_TRANSACTION
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM CALL_TRANSACTION.
*
DATA: W_DMODE LIKE CTU_PARAMS-DISMODE VALUE 'A'.
*
IF ICODE = 'UPLOAD'.
W_DMODE = DMODE.
ENDIF.
*
REFRESH MESSTAB.
*
CALL TRANSACTION TRANCODE USING BDC_DATA
MODE W_DMODE
UPDATE UMODE
MESSAGES INTO MESSTAB.
*
TRAN_SUBRC = SY-SUBRC.
*
PERFORM WRITE_MESSAGE TABLES MESSTAB.
*
ENDFORM. " CALL_TRANSACTION
*&---------------------------------------------------------------------*
*& Form WRITE_MESSAGE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_MESSTAB text
*----------------------------------------------------------------------*
FORM WRITE_MESSAGE TABLES P_MESSTAB STRUCTURE MESSTAB.
*
LOOP AT P_MESSTAB.
SELECT SINGLE * FROM T100 WHERE SPRSL = P_MESSTAB-MSGSPRA
AND ARBGB = P_MESSTAB-MSGID
AND MSGNR = P_MESSTAB-MSGNR.
CASE P_MESSTAB-MSGTYP.
WHEN 'E'. FORMAT COLOR COL_NEGATIVE INTENSIFIED OFF.
WHEN 'W'. FORMAT COLOR COL_TOTAL INTENSIFIED ON.
WHEN 'S'. FORMAT COLOR COL_POSITIVE INTENSIFIED OFF.
WHEN 'I'. FORMAT COLOR COL_NORMAL INTENSIFIED OFF.
WHEN 'A'. FORMAT COLOR COL_GROUP INTENSIFIED ON.
WHEN OTHERS. FORMAT COLOR COL_BACKGROUND INTENSIFIED ON.
ENDCASE.
*
IF SY-SUBRC = 0.
L_MSTRING = T100-TEXT.
IF L_MSTRING CS '&1'.
REPLACE '&1' WITH P_MESSTAB-MSGV1 INTO L_MSTRING.
REPLACE '&2' WITH P_MESSTAB-MSGV2 INTO L_MSTRING.
REPLACE '&3' WITH P_MESSTAB-MSGV3 INTO L_MSTRING.
REPLACE '&4' WITH P_MESSTAB-MSGV4 INTO L_MSTRING.
ELSE.
REPLACE '&' WITH P_MESSTAB-MSGV1 INTO L_MSTRING.
REPLACE '&' WITH P_MESSTAB-MSGV2 INTO L_MSTRING.
REPLACE '&' WITH P_MESSTAB-MSGV3 INTO L_MSTRING.
REPLACE '&' WITH P_MESSTAB-MSGV4 INTO L_MSTRING.
ENDIF.
CONDENSE L_MSTRING.
WRITE: /11 P_MESSTAB-MSGTYP, P_MESSTAB-MSGID(4),
P_MESSTAB-MSGNR, L_MSTRING(120).
ELSE.
WRITE: /11 P_MESSTAB-MSGTYP, P_MESSTAB-MSGID(4),
P_MESSTAB-MSGNR.
ENDIF.
ENDLOOP.
IF TRAN_SUBRC NE 0.
FORMAT COLOR COL_NEGATIVE INTENSIFIED OFF.
WRITE: /11 'Error - Data is not processed.'.
ENDIF.
ENDFORM. " WRITE_MESSAGE
*&---------------------------------------------------------------------*
*& Form SAVE_RECORDING
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM SAVE_RECORDING.
CREATE OBJECT EXCEL 'EXCEL.APPLICATION'.
*
CALL METHOD OF
EXCEL
'APPLICATION' = APPL.
SET PROPERTY OF APPL 'STANDARDFONT' = E_FONT.
SET PROPERTY OF APPL 'STANDARDFONTSIZE' = E_SIZE.
*
CALL METHOD OF
EXCEL
'WORKBOOKS' = BOOKS.
CALL METHOD OF BOOKS 'ADD' = BOOK. "ADD, OPEN
*
CALL METHOD OF
BOOK
'sheets' = SHEETS.
CALL METHOD OF
SHEETS
'item' = SHEET
EXPORTING
#1 = 1.
CALL METHOD OF
SHEET
'Activate'.
*
CALL METHOD OF
SHEET
'cells' = CELLS.
*
LOOP AT DYNFLOW.
*
MOVE SY-TABIX TO DYN_TABIX.
*
IF DYNFLOW-DYNBEGIN = 'T'. " Tcode
* Write Header Title to Excel
MOVE DYNFLOW-FNAM TO E_SHEET_NAME.
SET PROPERTY OF SHEET 'NAME' = E_SHEET_NAME. " Name of Sheet
CONCATENATE '*' TSTCT-TTEXT '(TCODE:' TRANCODE ')/'
'Recording:' APQI-GROUPID
'(' X_DEFLT ')' INTO XL_TITLE.
*
PERFORM XL_PUT_TO_CELL USING 1 1 XL_TITLE.
PERFORM XL_PUT_TO_CELL USING 2 1 '*Text:'.
PERFORM XL_PUT_TO_CELL USING 3 1 'FIELDNAME'.
*
PERFORM XL_PUT_TO_CELL USING 4 1 'STARTDATA'.
PERFORM XL_PUT_TO_CELL USING 24 1 'ENDDATA'.
XL_ROW = 2.
XL_COLUMN = 1.
ELSEIF DYNFLOW-DYNBEGIN = SPACE.
* e_size = 9.
* SET PROPERTY OF sheet 'STANDARDFONTSIZE' = e_size.
IF DYNFLOW-FNAM(4) NE 'BDC_'.
IF NOT ( X_DEFLT = 'X' AND DYNFLOW-FVAL NE SPACE ).
ADD 1 TO XL_COLUMN.
*
READ TABLE FTEXT WITH KEY TABIX = DYN_TABIX.
IF SY-SUBRC = 0.
IF FTEXT-LINENO NE SPACE.
CONCATENATE FTEXT-SCRTEXT_M FTEXT-LINENO
INTO FTEXT-SCRTEXT_M.
ENDIF.
PERFORM XL_PUT_TO_CELL
USING
XL_ROW XL_COLUMN
FTEXT-SCRTEXT_M.
ENDIF.
*
XL_ROW = XL_ROW + 1.
PERFORM XL_PUT_TO_CELL USING XL_ROW XL_COLUMN DYNFLOW-FNAM.
*
XL_ROW = XL_ROW + 1.
IF DYNFLOW-FVAL NE SPACE.
PERFORM XL_PUT_TO_CELL USING XL_ROW XL_COLUMN DYNFLOW-FVAL.
ENDIF.
XL_ROW = XL_ROW - 2.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
*
SET PROPERTY OF EXCEL 'VISIBLE' = 1.
*
FREE OBJECT CELLS.
FREE OBJECT SHEET.
FREE OBJECT SHEETS.
FREE OBJECT BOOK.
FREE OBJECT BOOKS.
FREE OBJECT APPL.
FREE OBJECT EXCEL.
*
ENDFORM. " SAVE_RECORDING
*&---------------------------------------------------------------------*
*& Form XL_PUT_TO_CELL
*&---------------------------------------------------------------------*
FORM XL_PUT_TO_CELL USING ROW COL VALUE.
* here you get the CELL object
CALL METHOD OF
CELLS
'ITEM' = CELL
EXPORTING
#1 = ROW
#2 = COL.
* here you use the CELL object
SET PROPERTY OF CELL 'VALUE' = VALUE. " write VALUE to the excel cell
GET PROPERTY OF CELL 'FONT' = FONT.
*
IF ROW = 1.
SET PROPERTY OF FONT 'BOLD' = 1.
SET PROPERTY OF FONT 'SIZE' = 14.
ELSE.
SET PROPERTY OF FONT 'BOLD' = 0.
SET PROPERTY OF FONT 'SIZE' = 9.
ENDIF.
*
FREE OBJECT CELL.
FREE OBJECT FONT.
*
ENDFORM. "XL_PUT_TO_CELL
*&---------------------------------------------------------------------*
*& Form CL_NLS_STRUC_CONTAINER
*&---------------------------------------------------------------------*
FORM CL_NLS_STRUC_CONTAINER
CHANGING P_CONTAINER TYPE REF TO
CL_NLS_STRUC_CONTAINER.
DATA: LT_CP TYPE NLS_LANGU_CP_TAB,
LS_CP_LINE TYPE NLS_LANGU_CP_LINE.
LS_CP_LINE-LANGU = '3'.
LS_CP_LINE-CODEPAGE = '8500'.
INSERT LS_CP_LINE INTO TABLE LT_CP.
P_CONTAINER = CL_NLS_STRUC_CONTAINER=>CREATE( LT_CP ).
ENDFORM. " CL_NLS_STRUC_CONTAINER
*&---------------------------------------------------------------------*
*& Form CONT_TO_STRUC
*&---------------------------------------------------------------------*
FORM CONT_TO_STRUC
USING P_CONTAINER TYPE REF TO CL_NLS_STRUC_CONTAINER
P_STRING
CHANGING PS_LINE.
TRY.
CALL METHOD P_CONTAINER->CONT_TO_STRUC
EXPORTING
CONT = P_STRING
LANGU = SY-LANGU
IMPORTING
STRUC = PS_LINE.
CATCH CX_SY_CONVERSION_CODEPAGE .
CATCH CX_PARAMETER_INVALID_RANGE .
ENDTRY.
ENDFORM. " CONT_TO_STRUC
*&---------------------------------------------------------------------*
*& Form STRUC_TO_CONT
*&---------------------------------------------------------------------*
FORM STRUC_TO_CONT
USING P_CONTAINER TYPE REF TO CL_NLS_STRUC_CONTAINER
PS_LINE TYPE ANY
CHANGING P_STRING.
FIELD-SYMBOLS <FS> TYPE CLIKE.
ASSIGN PS_LINE TO <FS>.
TRY.
CALL METHOD P_CONTAINER->STRUC_TO_CONT
EXPORTING
STRUC = <FS>
LANGU = SY-LANGU
IMPORTING
CONT = P_STRING.
CATCH CX_SY_CONVERSION_CODEPAGE .
CATCH CX_PARAMETER_INVALID_RANGE .
ENDTRY.
ENDFORM. " STRUC_TO_CONT
*&---------------------------------------------------------------------*
*& Form UPLOAD_THE_RECORDING
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM UPLOAD_THE_RECORDING.
DATA:
LCL_NLS_STRUC_CONT TYPE REF TO CL_NLS_STRUC_CONTAINER,
L_STRING TYPE STRING.
* Correct Alignment of Structures in Containers
PERFORM CL_NLS_STRUC_CONTAINER
CHANGING
LCL_NLS_STRUC_CONT.
FILENAME = P-RFILE.
*
CALL FUNCTION 'WS_UPLOAD'
EXPORTING
FILENAME = FILENAME
FILETYPE = 'ASC'
IMPORTING
FILELENGTH = FILESIZE
TABLES
DATA_TAB = XDAT
EXCEPTIONS
FILE_OPEN_ERROR = 1
FILE_WRITE_ERROR = 2.
*
IF FILESIZE = 0.
CALL FUNCTION 'UPLOAD'
EXPORTING
FILENAME = FILENAME
FILETYPE = FILETYPE
IMPORTING
ACT_FILENAME = ACT_FILENAME
FILESIZE = FILESIZE
TABLES
DATA_TAB = XDAT.
ENDIF.
P-RFILE = ACT_FILENAME.
SET PARAMETER ID 'DLP' FIELD P-RFILE.
*
IF FILESIZE > 0.
LOOP AT XDAT.
IF SY-TABIX = 1.
PERFORM CONT_TO_STRUC
USING
LCL_NLS_STRUC_CONT
XDAT
CHANGING
APQITAB.
* APQITAB = XDAT.
IF APQITAB-DATATYP = '%BDC'.
APPEND APQITAB.
ENDIF.
CONTINUE.
ENDIF.
DYNFLOW = XDAT. APPEND DYNFLOW.
ENDLOOP.
CLEAR P-GRPID.
ENDIF.
REFRESH XDAT.
ENDFORM. " UPLOAD_THE_RECORDING
*&---------------------------------------------------------------------*
*& Form DOWLOAD_DATA
*&---------------------------------------------------------------------*
FORM DOWLOAD_DATA.
DATA: L_TABIX LIKE SY-TABIX,
L_INT(2) TYPE N.
DATA: L_ITAB_NAME(30),
L_FIELDNAME(50).
DATA L_TITLE TYPE STRING.
DATA LT_EXCEL_HEADER LIKE GA_EXCEL_HEADER OCCURS 0 WITH HEADER LINE.
DATA: LT_DYNFLOW TYPE STANDARD TABLE OF BDCDATA.
FIELD-SYMBOLS: <FS_FNAME> TYPE ANY.
LOOP AT DYNFLOW.
L_TABIX = SY-TABIX.
IF DYNFLOW-DYNBEGIN = 'T'. " Tcode
ELSEIF DYNFLOW-DYNBEGIN = 'X'.
PRG_DYN = DYNP-PROG = DYNFLOW-PROGRAM.
PRG_DYN+41 = DYNP-DNUM = DYNFLOW-DYNPRO.
IMPORT DYNPRO H F E M ID DYNP.
CONDENSE PRG_DYN.
ELSE.
IF DYNFLOW-FNAM(4) NE 'BDC_'.
L_INT = L_INT + 1.
PERFORM GET_FILENAME.
LT_EXCEL_HEADER-DDTEXT = DFIES-FIELDTEXT(30).
APPEND LT_EXCEL_HEADER. CLEAR LT_EXCEL_HEADER.
CONCATENATE 'GT_EXCEL_BODY-COL' L_INT INTO L_FIELDNAME.
ASSIGN (L_FIELDNAME) TO <FS_FNAME>.
<FS_FNAME> = DYNFLOW-FVAL.
CONDENSE <FS_FNAME>.
ENDIF.
ENDIF.
AT LAST.
APPEND GT_EXCEL_BODY. CLEAR GT_EXCEL_BODY.
ENDAT.
ENDLOOP.
PERFORM DOWNLOAD_FILE "IN PROGRAM ZPTPPICOMF01
TABLES LT_EXCEL_HEADER
GT_EXCEL_BODY
USING L_TITLE.
REFRESH LT_EXCEL_HEADER.
CLEAR: L_ITAB_NAME,
L_TITLE.
ENDFORM. " DOWLOAD_DATA
*&---------------------------------------------------------------------*
*& Form DOWNLOAD_FILE
*&---------------------------------------------------------------------*
FORM DOWNLOAD_FILE TABLES PT_HEADER
PT_BODY
USING P_TITLE.
DATA: L_FILENAME TYPE STRING,
L_FILEFILTER TYPE STRING,
L_PATH TYPE STRING,
L_FULLPATH TYPE STRING,
L_FILEPATH LIKE RLGRAP-FILENAME,
L_USER_ACTION TYPE I.
CONCATENATE 'Excel Files (*.XLS)|*.XLS|'
'Text Files (*.TXT)|*.TXT|'
'Rich Text Format (*.RTF)|*.RTF|'
'PDF Files (*.PDF)|*.PDF|'
'All files (*.*)|*.*|'
'|' INTO L_FILEFILTER.
CALL FUNCTION 'ZGUI_FILE_SAVE_DIALOG'
EXPORTING
WINDOW_TITLE = P_TITLE
DEFAULT_EXTENSION = 'XLS'
DEFAULT_FILE_NAME = P_TITLE
FILE_FILTER = L_FILEFILTER
IMPORTING
FILENAME = L_FILENAME
PATH = L_PATH
FULLPATH = L_FULLPATH
USER_ACTION = L_USER_ACTION.
CASE SY-SUBRC.
WHEN 0.
WHEN OTHERS.
* MESSAGE I050 RAISING SOME_ERROR.
ENDCASE.
IF L_USER_ACTION EQ 0 OR "GENERATE를 선택
L_USER_ACTION EQ 1. "REPLACE를 선택
CALL FUNCTION 'ZGUI_DOWNLOAD'
EXPORTING
FILENAME = L_FULLPATH
FILETYPE = 'ASC'
DAT_MODE = 'X'
WRITE_FIELD_SEPARATOR = 'X'
TABLES
DATA_TAB = PT_BODY
FIELDNAMES = PT_HEADER
EXCEPTIONS
FILE_WRITE_ERROR = 01
NO_BATCH = 04
UNKNOWN_ERROR = 05
OTHERS = 99.
CASE SY-SUBRC.
WHEN 0.
WHEN OTHERS.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDCASE.
ELSEIF L_USER_ACTION EQ 2. "EXTEND를 선택
CALL FUNCTION 'ZGUI_DOWNLOAD'
EXPORTING
FILENAME = L_FULLPATH
FILETYPE = 'ASC'
APPEND = 'X'
DAT_MODE = 'X'
WRITE_FIELD_SEPARATOR = 'X'
TABLES
DATA_TAB = PT_BODY
FIELDNAMES = PT_HEADER
EXCEPTIONS
FILE_WRITE_ERROR = 01
NO_BATCH = 04
UNKNOWN_ERROR = 05
OTHERS = 99.
CASE SY-SUBRC.
WHEN 0.
WHEN OTHERS.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDCASE.
ELSEIF L_USER_ACTION EQ 9. "취소
* MESSAGE S000 DISPLAY LIKE 'E' WITH
* '파일 다운로드를 취소했습니다.'.
ENDIF.
ENDFORM. " DOWNLOAD_FILE
*&---------------------------------------------------------------------*
*& Form EXECUTION_BDC
*&---------------------------------------------------------------------*
FORM EXECUTION_BDC.
CHECK NOT GT_EXCEL_BODY[] IS INITIAL.
*
DATA: START, END.
CLEAR BDC_COUNT.
*
IF ICODE = 'UPLOAD' OR ICODE = 'TESTONE'.
NEW-PAGE LINE-SIZE 255.
ENDIF.
DATA: L_DO_TIMES TYPE I.
DATA: L_TABIX LIKE SY-TABIX,
L_LAST_FLAG TYPE C,
L_INT(2) TYPE N.
DATA: L_ITAB_NAME(30),
L_FIELDNAME(50).
DATA L_TITLE TYPE STRING.
DATA LT_EXCEL_HEADER LIKE GA_EXCEL_HEADER OCCURS 0 WITH HEADER LINE.
DATA: LT_DYNFLOW TYPE STANDARD TABLE OF BDCDATA.
FIELD-SYMBOLS: <FS_FNAME> TYPE ANY.
LOOP AT DYNFLOW.
L_TABIX = SY-TABIX.
IF DYNFLOW-DYNBEGIN = 'T'. " Tcode
ELSEIF DYNFLOW-DYNBEGIN = 'X'.
PRG_DYN = DYNP-PROG = DYNFLOW-PROGRAM.
PRG_DYN+41 = DYNP-DNUM = DYNFLOW-DYNPRO.
IMPORT DYNPRO H F E M ID DYNP.
CONDENSE PRG_DYN.
ELSE.
IF DYNFLOW-FNAM(4) NE 'BDC_'.
L_INT = L_INT + 1.
PERFORM GET_FILENAME.
LT_EXCEL_HEADER-DDTEXT = DFIES-FIELDTEXT(30).
APPEND LT_EXCEL_HEADER. CLEAR LT_EXCEL_HEADER.
ENDIF.
ENDIF.
ENDLOOP.
* Header Field is count
DESCRIBE TABLE LT_EXCEL_HEADER LINES L_DO_TIMES.
CLEAR L_INT.
LOOP AT GT_EXCEL_BODY.
REFRESH BDC_VALUE.
CLEAR L_INT.
DO L_DO_TIMES TIMES.
L_INT = L_INT + 1.
CONCATENATE 'GT_EXCEL_BODY-COL' L_INT INTO L_FIELDNAME.
ASSIGN (L_FIELDNAME) TO <FS_FNAME>.
BDC_VALUE = <FS_FNAME>.
CONDENSE BDC_VALUE.
APPEND BDC_VALUE.
ENDDO.
PERFORM APPEND_TO_BDC.
ENDLOOP.
*
PERFORM CLOSE_BDC_GROUP.
**
* IF START IS INITIAL.
* WRITE: / 'ERROR :' COLOR COL_NEGATIVE,
* 'I Can''t found the ''STARTDATA'' tag.'.
* ENDIF.
*
IF SY-SUBRC = 0.
IF ICODE = 'UPLOAD' AND X_SES = 'X'.
WRITE: / SESSION COLOR 5 HOTSPOT.
ULINE.
WRITE: / 'BDC session created.',
/ SY-ULINE,
/ 'BDC session :', BDCGROUP,
/ 'BDC Count :', BDC_COUNT.
ELSEIF ICODE = 'TESTING'.
PERFORM PUT_SCREEN_TEMPLATE.
SY-LSIND = SY-LSIND - 1.
ENDIF.
ENDIF.
*
ENDFORM. " EXECUTION_BDC
댓글 없음:
댓글 쓰기