Some colleague ask me the other day..."Hey Alvaro, how can I read standard text from SAP?". I answer "Using Read_Text FM of course"...That's when my head start to do some thinking and I said to myself...Why I can't do a SO10 Emulator? It would be cool -:D First thing, was to check SO10 transaction and it's corresponding FM's...What I discovered is that SAVE_TEXT , READ_TEXT and DELETE_TEXT weren't RFC enabled...So I make them on my own. Kids...Don't try this on a production system ZSAVE_TEXT FUNCTION ZSAVE_TEXT. *"---- ----------------------------------------------------------------- *"*"Local interface: *" IMPORTING *" VALUE(CLIENT) LIKE SY-MANDT DEFAULT SY-MANDT *" VALUE(INSERT) LIKE TRBAT2-OVERTAKER DEFAULT SPACE *" VALUE(OBJECT) LIKE THEAD-TDOBJECT *" VALUE(NAME) LIKE THEAD-TDNAME *" VALUE(ID) LIKE THEAD-TDID *" VALUE(SPRAS) LIKE THEAD-TDSPRAS *" VALUE(FUSER) LIKE THEAD-TDFUSER *" EXPORTING *" VALUE(FUNCTION) LIKE TRBAT2-OVERTAKER *" VALUE(NEWHEADER) LIKE THEAD STRUCTURE THEAD *" TABLES *" LINES STRUCTURE TLINE *" EXCEPTIONS *" ID *" LANGUAGE *" NAME *" OBJECT *"---- ----------------------------------------------------------------- TABLES: TTXOB, TTXID, STXH. TYPES: BOOLEAN(1) TYPE C. CONSTANTS: FALSE TYPE BOOLEAN VALUE ' ', TRUE TYPE BOOLEAN VALUE 'X', FUNCTION_UPDATE(1) TYPE C VALUE 'U', FUNCTION_INSERT(1) TYPE C VALUE 'I', SAVEMODE_POSTING(1) TYPE C VALUE 'V', SAVEMODE_DIALOG(1) TYPE C VALUE 'D', FUNCTION_DELETE(1) TYPE C VALUE 'D', FUNCTION_NONE(1) TYPE C VALUE ' ', FUNCTION_COPY(1) TYPE C VALUE 'K', FUNCTION_COPYUPDATE(1) TYPE C VALUE 'O'. DATA: REFERENCE TYPE BOOLEAN, CATALOG_CHANGED TYPE BOOLEAN. DATA: BEGIN OF THEADER. INCLUDE STRUCTURE THEAD. DATA: END OF THEADER. DATA: SAVEMODE TYPE TTXOB-TDSAVEMODE, CATALOG_INDEX TYPE SY-TABIX, MEMORY_ID(30) VALUE 'SAPLSTXD'. DATA BEGIN OF CATALOG OCCURS 50. INCLUDE STRUCTURE TCATALOG. DATA END OF CATALOG. FIELD-SYMBOLS: . ENDFUNCTION. *--------------------------------------------------------------- * * FORM check_key *--------------------------------------------------------------- * FORM CHECK_KEY USING OBJECT NAME ID LANGUAGE. PERFORM CHECK_OBJECT USING OBJECT. PERFORM CHECK_ID USING OBJECT ID. PERFORM CHECK_SAVEMODE USING OBJECT ID. PERFORM CHECK_NAME USING NAME. PERFORM CHECK_LANGUAGE USING LANGUAGE. ENDFORM. *---------------------------------------------------------------- * * FORM check_id *---------------------------------------------------------------- * FORM CHECK_ID USING OBJECT ID. DATA: BEGIN OF TEXTID_KEY, OBJECT LIKE TTXID-TDOBJECT, ID LIKE TTXID-TDID, END OF TEXTID_KEY. DATA: CO_SUBRC LIKE SY-SUBRC. DATA: BEGIN OF TEXTID OCCURS 0. INCLUDE STRUCTURE TTXID. DATA: END OF TEXTID. CLEAR TTXID. IF OBJECT = SPACE. CALL FUNCTION 'SAPSCRIPT_MESSAGE_DEF' EXPORTING NO = 602 V1 = OBJECT. MESSAGE E602 WITH OBJECT RAISING OBJECT. ENDIF. TEXTID_KEY-OBJECT = OBJECT. TEXTID_KEY-ID = ID. READ TABLE TEXTID WITH KEY TEXTID_KEY BINARY SEARCH. IF SY-SUBRC > 0. CO_SUBRC = SY-SUBRC. SELECT SINGLE * FROM TTXID WHERE TDOBJECT = OBJECT AND TDID = ID. IF SY-SUBRC > 0. CALL FUNCTION 'SAPSCRIPT_MESSAGE_DEF' EXPORTING NO = 603 V1 = ID V2 = OBJECT. MESSAGE E603 WITH ID OBJECT RAISING ID. ELSE. MOVE TTXID TO TEXTID. CASE CO_SUBRC. WHEN 4. INSERT TEXTID INDEX SY-TABIX. WHEN 8. APPEND TEXTID. ENDCASE. ENDIF. ELSE. MOVE TEXTID TO TTXID. ENDIF. ENDFORM. *--------------------------------------------------------------- * * FORM check_language *--------------------------------------------------------------- * FORM CHECK_LANGUAGE USING LANGUAGE. DATA: CL_OFFSET LIKE SY-INDEX, SPRACHVEKTOR(30). DATA: T_T002 TYPE STANDARD TABLE OF T002 WITH HEADER LINE. IF LANGUAGE = SPACE. CALL FUNCTION 'SAPSCRIPT_MESSAGE_DEF' EXPORTING NO = 604 V1 = LANGUAGE. MESSAGE E604 WITH LANGUAGE RAISING LANGUAGE. ENDIF. IF NOT SPRACHVEKTOR CA LANGUAGE. SELECT SINGLE * INTO T_T002 FROM T002 WHERE SPRAS = LANGUAGE. IF SY-SUBRC > 0. CALL FUNCTION 'SAPSCRIPT_MESSAGE_DEF' EXPORTING NO = 604 V1 = LANGUAGE. MESSAGE E604 WITH LANGUAGE RAISING LANGUAGE. ELSE. CL_OFFSET = STRLEN( SPRACHVEKTOR ). IF CL_OFFSET < 30. SPRACHVEKTOR+CL_OFFSET(1) = LANGUAGE. ENDIF. ENDIF. ENDIF. ENDFORM. *--------------------------------------------------------------- * * FORM check_name *--------------------------------------------------------------- * FORM CHECK_NAME USING NAME. DATA: SAVEMODE_POSTING(1) TYPE C VALUE 'V'. IF NAME CA '*,' OR ( NAME = SPACE AND TTXOB-TDSAVEMODE <> SAVEMODE_POSTING ). CALL FUNCTION 'SAPSCRIPT_MESSAGE_DEF' EXPORTING NO = 605 V1 = NAME. MESSAGE E605 WITH NAME RAISING NAME. ENDIF. ENDFORM. *--------------------------------------------------------------- * * FORM check_object *--------------------------------------------------------------- * FORM CHECK_OBJECT USING OBJECT. DATA: CO_SUBRC LIKE SY-SUBRC. DATA: BEGIN OF TEXTOB OCCURS 0. INCLUDE STRUCTURE TTXOB. DATA: END OF TEXTOB. CLEAR TTXOB. IF OBJECT = SPACE. CALL FUNCTION 'SAPSCRIPT_MESSAGE_DEF' EXPORTING NO = 602 V1 = OBJECT. MESSAGE E602 WITH OBJECT RAISING OBJECT. ENDIF. READ TABLE TEXTOB WITH KEY OBJECT BINARY SEARCH. IF SY-SUBRC > 0. CO_SUBRC = SY-SUBRC. SELECT SINGLE * FROM TTXOB WHERE TDOBJECT = OBJECT. IF SY-SUBRC > 0. CALL FUNCTION 'SAPSCRIPT_MESSAGE_DEF' EXPORTING NO = 602 V1 = OBJECT. MESSAGE E602 WITH OBJECT RAISING OBJECT. ELSE. MOVE TTXOB TO TEXTOB. CASE CO_SUBRC. WHEN 4. INSERT TEXTOB INDEX SY-TABIX. WHEN 8. APPEND TEXTOB. ENDCASE. ENDIF. ELSE. MOVE TEXTOB TO TTXOB. ENDIF. ENDFORM. *--------------------------------------------------------------- * * FORM check_reference *--------------------------------------------------------------- * FORM CHECK_REFERENCE USING OBJECT NAME ID. DATA: REFERENCE TYPE BOOLEAN. CONSTANTS: TRUE TYPE BOOLEAN VALUE 'X'. IF OBJECT = SPACE OR NAME = SPACE OR ID = SPACE. CLEAR: OBJECT,NAME,ID,REFERENCE. ELSE. REFERENCE = TRUE. ENDIF. ENDFORM. *---------------------------------------------------------------- * * FORM check_savemode *---------------------------------------------------------------- * FORM CHECK_SAVEMODE USING OBJECT ID. CONSTANTS: SAVEMODE_DIALOG(1) TYPE C VALUE 'D', SAVEMODE_POSTING(1) TYPE C VALUE 'V', SAVEMODE_NONE(1) TYPE C VALUE ' '. CASE TTXOB-TDSAVEMODE. WHEN SAVEMODE_DIALOG. WHEN SAVEMODE_POSTING. WHEN OTHERS. CALL FUNCTION 'SAPSCRIPT_MESSAGE_DEF' EXPORTING NO = 606 V1 = TTXOB-TDSAVEMODE V2 = OBJECT. MESSAGE E606 WITH TTXOB-TDSAVEMODE OBJECT RAISING SAVEMODE. ENDCASE. ENDFORM. *--------------------------------------------------------------- * * FORM EXPORT_CATALOG *--------------------------------------------------------------- * FORM EXPORT_CATALOG TABLES T_CATALOG STRUCTURE TCATALOG. DATA: LOCAL_FLAG TYPE C VALUE SPACE, F_GLOBAL TYPE C VALUE 'G'. IF LOCAL_FLAG = F_GLOBAL. EXPORT T_CATALOG TO MEMORY ID 'SAPLSTXD'. ENDIF. ENDFORM. *---------------------------------------------------------------- * * FORM IMPORT_CATALOG *---------------------------------------------------------------- * FORM IMPORT_CATALOG TABLES T_CATALOG STRUCTURE TCATALOG. DATA: LOCAL_FLAG VALUE SPACE, F_GLOBAL TYPE C VALUE 'G'. IF LOCAL_FLAG = F_GLOBAL. REFRESH T_CATALOG. IMPORT T_CATALOG FROM MEMORY ID 'SAPLSTXD'. IF SY-SUBRC > 0. CLEAR T_CATALOG. REFRESH T_CATALOG. ENDIF. ENDIF. ENDFORM. *----------------------------------------------------------------- * * FORM INSERT_CATALOG *----------------------------------------------------------------- * FORM INSERT_CATALOG TABLES T_CATALOG STRUCTURE TCATALOG USING OBJECT NAME ID LANGUAGE FUNCTION IS_REFERENCE. DATA: IC_ID(6) TYPE N, CATALOG_INDEX TYPE SY-TABIX, FALSE TYPE BOOLEAN VALUE ' ', MEMORY_ID(30) VALUE 'SAPLSTXD'. DATA: BEGIN OF CATALOG_KEY, TDOBJECT TYPE THEAD-TDOBJECT, TDNAME TYPE THEAD-TDNAME, TDID TYPE THEAD-TDID, TDSPRAS TYPE THEAD-TDSPRAS, END OF CATALOG_KEY. CATALOG_KEY-TDOBJECT = OBJECT. CATALOG_KEY-TDNAME = NAME. CATALOG_KEY-TDID = ID. CATALOG_KEY-TDSPRAS = LANGUAGE. READ TABLE T_CATALOG WITH KEY CATALOG_KEY. IF SY-SUBRC > 0. DESCRIBE TABLE T_CATALOG LINES CATALOG_INDEX. IF CATALOG_INDEX > 0. READ TABLE T_CATALOG INDEX CATALOG_INDEX. IC_ID = T_CATALOG-ID + 1. ELSE. IC_ID = 1. ENDIF. CLEAR T_CATALOG. T_CATALOG = CATALOG_KEY. T_CATALOG-RENAME = FALSE. T_CATALOG-FUNCTION = FUNCTION. T_CATALOG-IS_REFTEXT = IS_REFERENCE. T_CATALOG-ID = IC_ID. MEMORY_ID+8(6) = T_CATALOG-ID. APPEND T_CATALOG. DESCRIBE TABLE T_CATALOG LINES CATALOG_INDEX. ELSE. MEMORY_ID+8(6) = T_CATALOG-ID. CATALOG_INDEX = SY-TABIX. ENDIF. ENDFORM. *--------------------------------------------------------------- * * FORM io_error *--------------------------------------------------------------- * FORM IO_ERROR USING OBJECT NAME ID LANGUAGE. CALL FUNCTION 'SAPSCRIPT_MESSAGE_DEF' EXPORTING NO = 607 V1 = OBJECT V2 = NAME V3 = ID V4 = LANGUAGE. MESSAGE E607 WITH OBJECT NAME ID LANGUAGE RAISING IO_ERROR. ENDFORM. *-------------------------------------------------------------- * * FORM READ_CATALOG *-------------------------------------------------------------- * FORM READ_CATALOG TABLES T_CATALOG STRUCTURE TCATALOG USING OBJECT NAME ID LANGUAGE. DATA: CATALOG_INDEX TYPE SY-TABIX, MEMORY_ID(30) VALUE 'SAPLSTXD'. DATA: BEGIN OF CATALOG_KEY, TDOBJECT TYPE THEAD-TDOBJECT, TDNAME TYPE THEAD-TDNAME, TDID TYPE THEAD-TDID, TDSPRAS TYPE THEAD-TDSPRAS, END OF CATALOG_KEY. CATALOG_KEY-TDOBJECT = OBJECT. CATALOG_KEY-TDNAME = NAME. CATALOG_KEY-TDID = ID. CATALOG_KEY-TDSPRAS = LANGUAGE. READ TABLE T_CATALOG WITH KEY CATALOG_KEY. IF SY-SUBRC = 0. CATALOG_INDEX = SY-TABIX. MEMORY_ID+8(6) = T_CATALOG-ID. ELSE. CLEAR: MEMORY_ID+8(6), CATALOG_INDEX. ENDIF. ENDFORM. *--------------------------------------------------------------- * * FORM read_header *--------------------------------------------------------------- * FORM READ_HEADER USING HEADER STRUCTURE THEAD FUNCTION CLIENT. CONSTANTS: FUNCTION_INSERT(1) TYPE C VALUE 'I', OBJECT_FORM TYPE THEAD-TDOBJECT VALUE 'FORM ', OBJECT_STYLE TYPE THEAD-TDOBJECT VALUE 'STYLE '. DATA: T_STXH TYPE STANDARD TABLE OF STXH WITH HEADER LINE. DATA: FUNCTION_UPDATE(1) TYPE C VALUE 'U'. SELECT SINGLE * INTO T_STXH FROM STXH CLIENT SPECIFIED WHERE MANDT = CLIENT AND TDOBJECT = HEADER-TDOBJECT AND TDNAME = HEADER-TDNAME AND TDID = HEADER-TDID AND TDSPRAS = HEADER-TDSPRAS. IF SY-SUBRC = 0. HEADER-TDFUSER = T_STXH-TDFUSER. HEADER-TDFDATE = T_STXH-TDFDATE. HEADER-TDFTIME = T_STXH-TDFTIME. HEADER-TDFRELES = T_STXH-TDFRELES. FUNCTION = FUNCTION_UPDATE. ELSE. IF ( HEADER-TDOBJECT <> OBJECT_FORM AND HEADER-TDOBJECT <> OBJECT_STYLE ) OR HEADER-TDFUSER = SPACE. HEADER-TDFUSER = SY-UNAME. HEADER-TDFDATE = SY-DATUM. HEADER-TDFTIME = SY-UZEIT. HEADER-TDFRELES = SY-SAPRL. ENDIF. CLEAR HEADER-TDLUSER. CLEAR HEADER-TDLDATE. CLEAR HEADER-TDLTIME. CLEAR HEADER-TDLRELES. FUNCTION = FUNCTION_INSERT. ENDIF. ENDFORM. *-------------------------------------------------------------- * * FORM save_text *-------------------------------------------------------------- * FORM SAVE_TEXT TABLES WT_LINES STRUCTURE TLINE USING WT_HEADER STRUCTURE THEAD WT_CLIENT WT_REFERENCE WT_FUNCTION. CONSTANTS: FUNCTION_UPDATE(1) TYPE C VALUE 'U', FUNCTION_INSERT(1) TYPE C VALUE 'I', FUNCTION_DELETE(1) TYPE C VALUE 'D', TRUE TYPE BOOLEAN VALUE 'X'. DATA: T_STXH TYPE STANDARD TABLE OF STXH WITH HEADER LINE. MOVE-CORRESPONDING WT_HEADER TO T_STXH. T_STXH-TDREF = WT_REFERENCE. T_STXH-MANDT = WT_CLIENT. APPEND T_STXH. SY-SUBRC = 0. CASE WT_FUNCTION. WHEN FUNCTION_UPDATE. IF WT_REFERENCE <> TRUE. PERFORM WRITE_TEXTLINES TABLES WT_LINES USING WT_HEADER WT_CLIENT. ENDIF. UPDATE STXH FROM TABLE T_STXH. WHEN FUNCTION_INSERT. IF WT_REFERENCE <> TRUE. PERFORM WRITE_TEXTLINES TABLES WT_LINES USING WT_HEADER WT_CLIENT. ENDIF. INSERT STXH FROM TABLE T_STXH. WHEN FUNCTION_DELETE. IF WT_REFERENCE <> TRUE. PERFORM DELETE_TEXTLINES USING WT_HEADER WT_CLIENT. ENDIF. DELETE STXH FROM TABLE T_STXH. ENDCASE. ENDFORM. *--------------------------------------------------------------- * * FORM delete_textlines *--------------------------------------------------------------- * FORM DELETE_TEXTLINES USING DT_HEADER STRUCTURE THEAD DT_CLIENT. DATA: BEGIN OF STXL_ID, TDOBJECT LIKE STXL-TDOBJECT, TDNAME LIKE STXL-TDNAME, TDID LIKE STXL-TDID, TDSPRAS LIKE STXL-TDSPRAS, END OF STXL_ID. MOVE-CORRESPONDING DT_HEADER TO STXL_ID. IF DT_HEADER-TDTEXTTYPE IS INITIAL. DELETE FROM DATABASE STXL(TX) CLIENT DT_CLIENT ID STXL_ID. ELSE. DELETE FROM DATABASE STXB(TX) CLIENT DT_CLIENT ID STXL_ID. ENDIF. ENDFORM. *--------------------------------------------------------------- * * FORM write_textlines *--------------------------------------------------------------- * FORM WRITE_TEXTLINES TABLES WT_LINES STRUCTURE TLINE USING WT_HEADER STRUCTURE THEAD WT_CLIENT. DATA: BEGIN OF STXL_ID, TDOBJECT LIKE STXL-TDOBJECT, TDNAME LIKE STXL-TDNAME, TDID LIKE STXL-TDID, TDSPRAS LIKE STXL-TDSPRAS, END OF STXL_ID. MOVE-CORRESPONDING WT_HEADER TO STXL_ID. IF WT_HEADER-TDTEXTTYPE IS INITIAL. EXPORT TLINE FROM WT_LINES TO DATABASE STXL(TX) CLIENT WT_CLIENT ID STXL_ID. ENDIF. ENDFORM. ZREAD_TEXT FUNCTION ZREAD_TEXT. *"---- ----------------------------------------------------------------- *"*"Local interface: *" IMPORTING *" VALUE(CLIENT) LIKE SY-MANDT DEFAULT SY-MANDT *" VALUE(ID) LIKE THEAD-TDID *" VALUE(LANGUAGE) LIKE THEAD-TDSPRAS *" VALUE(NAME) LIKE THEAD-TDNAME *" VALUE(OBJECT) LIKE THEAD-TDOBJECT *" EXPORTING *" VALUE(HEADER) LIKE THEAD STRUCTURE THEAD *" TABLES *" LINES STRUCTURE TLINE *" EXCEPTIONS *" ID *" LANGUAGE *" NAME *" NOT_FOUND *" OBJECT *" REFERENCE_CHECK *" WRONG_ACCESS_TO_ARCHIVE *"---- ----------------------------------------------------------------- DATA BOOLEAN(1). DATA THEADER LIKE THEAD. DATA STXH_WA LIKE STXH. DATA NEWTEXT LIKE BOOLEAN. DATA L_LANGUAGE(2). DATA REFERENCE LIKE BOOLEAN. DATA MEMORY_ID(30) VALUE 'SAPLSTXD'. CONSTANTS: ASTERISK(1) VALUE '*', FALSE LIKE BOOLEAN VALUE ' ', TRUE LIKE BOOLEAN VALUE 'X', OFF LIKE BOOLEAN VALUE ' ', ON LIKE BOOLEAN VALUE 'X', SAVEMODE_DIALOG(1) VALUE 'D', SAVEMODE_POSTING(1) VALUE 'V', SAVEMODE_NONE(1) VALUE ' ', FUNCTION_COPYUPDATE(1) VALUE 'O', FUNCTION_COPY(1) VALUE 'K', FUNCTION_DELETE(1) VALUE 'D', FUNCTION_UPDATE(1) VALUE 'U', FUNCTION_INSERT(1) VALUE 'I', FUNCTION_READ(1) VALUE 'R', FUNCTION_BACK(1) VALUE 'B', FUNCTION_EXIT(1) VALUE 'E', FUNCTION_CANCEL(1) VALUE 'C', FUNCTION_NEXT(1) VALUE 'N', FUNCTION_NONE(1) VALUE ' '. TYPES: BEGIN OF TY_COPY_CATALOG. INCLUDE STRUCTURE TCATALOG. TYPES: END OF TY_COPY_CATALOG. DATA: COPY_CATALOG TYPE STANDARD TABLE OF TY_COPY_CATALOG WITH HEADER LINE, CATALOG TYPE STANDARD TABLE OF TY_COPY_CATALOG WITH HEADER LINE. NEWTEXT = FALSE. REFERENCE = FALSE. PERFORM CHECK_KEY USING OBJECT NAME ID LANGUAGE. IF TTXOB-TDSAVEMODE = SAVEMODE_POSTING. PERFORM IMPORT_CATALOG TABLES CATALOG. PERFORM READ_CATALOG TABLES CATALOG USING OBJECT NAME ID LANGUAGE. IF SY-SUBRC = 0. CASE CATALOG-FUNCTION. WHEN FUNCTION_DELETE. REFRESH LINES. CLEAR LINES. CALL FUNCTION 'SAPSCRIPT_MESSAGE_DEF' EXPORTING NO = 600 V1 = NAME V2 = ID V3 = LANGUAGE. MESSAGE E600 WITH NAME ID LANGUAGE RAISING NOT_FOUND. WHEN FUNCTION_INSERT. CLEAR THEADER. REFRESH LINES. IMPORT THEAD TO THEADER TLINE TO LINES FROM MEMORY ID MEMORY_ID. HEADER = THEADER. HEADER-TDNAME = CATALOG-TDNAME. PERFORM READ_REFERENCE_LINES TABLES LINES USING CLIENT HEADER. DESCRIBE TABLE LINES LINES HEADER-TDTXTLINES. WHEN FUNCTION_UPDATE. CLEAR THEADER. REFRESH LINES. IMPORT THEAD TO THEADER TLINE TO LINES FROM MEMORY ID MEMORY_ID. HEADER = THEADER. PERFORM READ_REFERENCE_LINES TABLES LINES USING CLIENT HEADER. DESCRIBE TABLE LINES LINES HEADER-TDTXTLINES. WHEN FUNCTION_COPY. PERFORM IMPORT_COPY_CATALOG TABLES COPY_CATALOG. READ TABLE COPY_CATALOG INDEX CATALOG-COPYINDEX. IF SY-SUBRC = 0. HEADER-TDOBJECT = CATALOG-TDOBJECT. HEADER-TDNAME = CATALOG-TDNAME. HEADER-TDID = CATALOG-TDID. HEADER-TDSPRAS = CATALOG-TDSPRAS. THEADER-TDOBJECT = COPY_CATALOG-TDOBJECT. THEADER-TDNAME = COPY_CATALOG-TDNAME. THEADER-TDID = COPY_CATALOG-TDID. THEADER-TDSPRAS = COPY_CATALOG-TDSPRAS. PERFORM BUILD_COPY_HEADER USING HEADER THEADER FUNCTION_COPY. IF THEADER-TDREFOBJ = SPACE AND THEADER-TDREFID = SPACE AND THEADER-TDREFNAME = SPACE. PERFORM READ_TEXTLINES TABLES LINES USING THEADER SY-MANDT. ENDIF. ENDIF. WHEN FUNCTION_COPYUPDATE. PERFORM IMPORT_COPY_CATALOG TABLES COPY_CATALOG. READ TABLE COPY_CATALOG INDEX CATALOG-COPYINDEX. IF SY-SUBRC = 0. SELECT SINGLE * FROM STXH INTO STXH_WA WHERE TDOBJECT = CATALOG-TDOBJECT AND TDNAME = CATALOG-TDNAME AND TDID = CATALOG-TDID AND TDSPRAS = CATALOG-TDSPRAS. CHECK SY-SUBRC = 0. MOVE-CORRESPONDING STXH_WA TO HEADER. THEADER-TDOBJECT = COPY_CATALOG-TDOBJECT. THEADER-TDNAME = COPY_CATALOG-TDNAME. THEADER-TDID = COPY_CATALOG-TDID. THEADER-TDSPRAS = COPY_CATALOG-TDSPRAS. PERFORM BUILD_COPY_HEADER USING HEADER THEADER FUNCTION_COPYUPDATE. IF THEADER-TDREFOBJ = SPACE AND THEADER-TDREFID = SPACE AND THEADER-TDREFNAME = SPACE. PERFORM READ_TEXTLINES TABLES LINES USING THEADER SY-MANDT. ENDIF. ENDIF. WHEN FUNCTION_NONE. REFRESH LINES. CLEAR LINES. CALL FUNCTION 'SAPSCRIPT_MESSAGE_DEF' EXPORTING NO = 600 V1 = NAME V2 = ID V3 = LANGUAGE. MESSAGE E600 WITH NAME ID LANGUAGE RAISING NOT_FOUND. ENDCASE. ELSE. NEWTEXT = TRUE. ENDIF. ENDIF. IF TTXOB-TDSAVEMODE = SAVEMODE_DIALOG OR NEWTEXT = TRUE. SELECT SINGLE * FROM STXH CLIENT SPECIFIED WHERE MANDT = CLIENT AND TDOBJECT = OBJECT AND TDNAME = NAME AND TDID = ID AND TDSPRAS = LANGUAGE. IF SY-SUBRC > 0. WRITE LANGUAGE TO L_LANGUAGE(2). CALL FUNCTION 'SAPSCRIPT_MESSAGE_DEF' EXPORTING NO = 600 V1 = NAME V2 = ID V3 = L_LANGUAGE. MESSAGE E600 WITH NAME ID LANGUAGE RAISING NOT_FOUND. ELSE. MOVE-CORRESPONDING STXH TO HEADER. IF STXH-TDREF = FALSE. PERFORM READ_TEXTLINES TABLES LINES USING HEADER CLIENT. IF SY-SUBRC > 0. REFRESH LINES. CLEAR LINES. ENDIF. ENDIF. ENDIF. ENDIF. HEADER-TDLINESIZE = TTXOB-TDLINESIZE. ENDFUNCTION. FORM READ_REFERENCE_LINES TABLES LINES STRUCTURE TLINE USING CLIENT VALUE(HEADER) LIKE THEAD. DATA BOOLEAN(1). DATA REFERENCE LIKE BOOLEAN. CONSTANTS: TRUE LIKE BOOLEAN VALUE 'X', FALSE LIKE BOOLEAN VALUE ' ', FUNCTION_DELETE(1) VALUE 'D', FUNCTION_INSERT(1) VALUE 'I', FUNCTION_UPDATE(1) VALUE 'U', FUNCTION_COPY(1) VALUE 'K', FUNCTION_COPYUPDATE(1) VALUE 'O', FUNCTION_NONE(1) VALUE ' '. DATA MEMORY_ID(30) VALUE 'SAPLSTXD'. "do not change STATICS: TEXT_IN_CATALOG LIKE BOOLEAN. DATA BEGIN OF CATALOG OCCURS 50. INCLUDE STRUCTURE TCATALOG. DATA END OF CATALOG. TEXT_IN_CATALOG = TRUE. PERFORM CHECK_REFERENCE USING HEADER-TDREFOBJ "sets REFERENCE HEADER-TDREFNAME HEADER-TDREFID. IF REFERENCE = FALSE. EXIT. ENDIF. WHILE REFERENCE = TRUE AND TEXT_IN_CATALOG = TRUE. PERFORM READ_CATALOG TABLES CATALOG USING HEADER-TDREFOBJ HEADER-TDREFNAME HEADER-TDREFID HEADER-TDSPRAS. IF SY-SUBRC = 0. CASE CATALOG-FUNCTION. WHEN FUNCTION_DELETE. MESSAGE E610 WITH CATALOG-TDOBJECT CATALOG-TDID CATALOG-TDNAME CATALOG-TDSPRAS RAISING REFERENCE_CHECK. WHEN FUNCTION_INSERT. IMPORT THEAD TO HEADER TLINE TO LINES FROM MEMORY ID MEMORY_ID. PERFORM CHECK_REFERENCE USING HEADER-TDREFOBJ HEADER-TDREFNAME HEADER-TDREFID. WHEN FUNCTION_UPDATE. IMPORT THEAD TO HEADER TLINE TO LINES FROM MEMORY ID MEMORY_ID. PERFORM CHECK_REFERENCE USING HEADER-TDREFOBJ HEADER-TDREFNAME HEADER-TDREFID. WHEN FUNCTION_COPY. TEXT_IN_CATALOG = FALSE. WHEN FUNCTION_COPYUPDATE. TEXT_IN_CATALOG = FALSE. WHEN FUNCTION_NONE. TEXT_IN_CATALOG = FALSE. ENDCASE. ELSE. TEXT_IN_CATALOG = FALSE. ENDIF. ENDWHILE. IF REFERENCE = TRUE. REFRESH LINES. ELSE. ENDIF. ENDFORM. *--------------------------------------------------------------- * * FORM build_copy_header *--------------------------------------------------------------- * FORM BUILD_COPY_HEADER USING RC_DESTHEADER STRUCTURE THEAD RC_SRCHEADER STRUCTURE THEAD RC_FUNCTION. CONSTANTS: FUNCTION_COPY(1) VALUE 'K'. DATA: BEGIN OF STXH_WA. INCLUDE STRUCTURE STXH. DATA: END OF STXH_WA. SELECT SINGLE * FROM STXH INTO STXH_WA WHERE TDOBJECT = RC_SRCHEADER-TDOBJECT AND TDNAME = RC_SRCHEADER-TDNAME AND TDID = RC_SRCHEADER-TDID AND TDSPRAS = RC_SRCHEADER-TDSPRAS. CHECK SY-SUBRC = 0. MOVE-CORRESPONDING STXH_WA TO RC_SRCHEADER. RC_DESTHEADER-TDLUSER = SY-UNAME. RC_DESTHEADER-TDLDATE = SY-DATUM. RC_DESTHEADER-TDLTIME = SY-UZEIT. RC_DESTHEADER-TDLRELES = SY-SAPRL. RC_DESTHEADER-TDTEXTTYPE = RC_SRCHEADER-TDTEXTTYPE. IF RC_FUNCTION = FUNCTION_COPY. RC_DESTHEADER-TDFUSER = SY-UNAME. RC_DESTHEADER-TDFDATE = SY-DATUM. RC_DESTHEADER-TDFTIME = SY-UZEIT. RC_DESTHEADER-TDFRELES = SY-SAPRL. RC_DESTHEADER-TDVERSION = 1. ELSE. IF RC_DESTHEADER-TDVERSION = 99999. RC_DESTHEADER-TDVERSION = 1. ELSE. ADD 1 TO RC_DESTHEADER-TDVERSION. ENDIF. ENDIF. ENDFORM. *--------------------------------------------------------------- * * FORM IMPORT_COPY_CATALOG *--------------------------------------------------------------- * FORM IMPORT_COPY_CATALOG TABLES T_COPY_CATALOG STRUCTURE TCATALOG. DATA: COPY_MEMORY_ID(30) VALUE 'SAPLSTXD_COPY'. REFRESH T_COPY_CATALOG. IMPORT T_COPY_CATALOG FROM MEMORY ID COPY_MEMORY_ID. IF SY-SUBRC > 0. CLEAR T_COPY_CATALOG. REFRESH T_COPY_CATALOG. ENDIF. ENDFORM. *---------------------------------------------------------------- * * FORM read_textlines *---------------------------------------------------------------- * FORM READ_TEXTLINES TABLES RT_LINES STRUCTURE TLINE USING RT_HEADER STRUCTURE THEAD RT_CLIENT. DATA: BEGIN OF STXL_ID, TDOBJECT LIKE STXL-TDOBJECT, TDNAME LIKE STXL-TDNAME, TDID LIKE STXL-TDID, TDSPRAS LIKE STXL-TDSPRAS, END OF STXL_ID. REFRESH RT_LINES. MOVE-CORRESPONDING RT_HEADER TO STXL_ID. IF RT_HEADER-TDTEXTTYPE IS INITIAL. IMPORT TLINE TO RT_LINES FROM DATABASE STXL(TX) CLIENT RT_CLIENT ID STXL_ID. ENDIF. DESCRIBE TABLE RT_LINES LINES RT_HEADER-TDTXTLINES. ENDFORM. ZDELETE_TEXT FUNCTION ZDELETE_TEXT. *"---- ----------------------------------------------------------------- *"*"Local interface: *" IMPORTING *" VALUE(CLIENT) LIKE SY-MANDT DEFAULT SY-MANDT *" VALUE(ID) LIKE THEAD-TDID *" VALUE(LANGUAGE) LIKE THEAD-TDSPRAS *" VALUE(NAME) LIKE THEAD-TDNAME *" VALUE(OBJECT) LIKE THEAD-TDOBJECT *" EXCEPTIONS *" NOT_FOUND *"---- ----------------------------------------------------------------- DATA: DELETE_COUNT LIKE SY-TABIX, SAVEMODE LIKE TTXOB-TDSAVEMODE, BOOLEAN(1), CATALOG_CHANGED LIKE BOOLEAN. CONSTANTS: FALSE LIKE BOOLEAN VALUE ' ', SAVEMODE_DIALOG(1) VALUE 'D', SAVEMODE_POSTING(1) VALUE 'V', SAVEMODE_NONE(1) VALUE ' ', TRUE LIKE BOOLEAN VALUE 'X', FUNCTION_DELETE(1) VALUE 'D', FUNCTION_INSERT(1) VALUE 'I', FUNCTION_NONE(1) VALUE ' ', FUNCTION_UPDATE(1) VALUE 'U', FUNCTION_COPY(1) VALUE 'K', FUNCTION_COPYUPDATE(1) VALUE 'O'. RANGES: R_NAME FOR STXH-TDNAME, R_ID FOR STXH-TDID, R_LANGUAGE FOR STXH-TDSPRAS. DATA BEGIN OF CATALOG OCCURS 50. INCLUDE STRUCTURE TCATALOG. DATA END OF CATALOG. CATALOG_CHANGED = FALSE. DELETE_COUNT = 0. PERFORM BUILD_NAME TABLES R_NAME USING NAME. PERFORM BUILD_ID TABLES R_ID USING ID. PERFORM BUILD_LANGUAGE TABLES R_LANGUAGE USING LANGUAGE. PERFORM SELECT_OBJECT USING OBJECT. IF SY-SUBRC > 0. MESSAGE E600 WITH NAME ID LANGUAGE RAISING NOT_FOUND. EXIT. ENDIF. SAVEMODE = TTXOB-TDSAVEMODE. CASE SAVEMODE. WHEN SAVEMODE_DIALOG. DELETE FROM STXH CLIENT SPECIFIED WHERE MANDT = CLIENT AND TDOBJECT = OBJECT AND TDNAME IN R_NAME AND TDID IN R_ID AND TDSPRAS IN R_LANGUAGE. DELETE_COUNT = SY-DBCNT. DELETE FROM STXB CLIENT SPECIFIED WHERE RELID = 'TX' AND MANDT = CLIENT AND TDOBJECT = OBJECT AND TDNAME IN R_NAME AND TDID IN R_ID AND TDSPRAS IN R_LANGUAGE. DELETE FROM STXL CLIENT SPECIFIED WHERE RELID = 'TX' AND MANDT = CLIENT AND TDOBJECT = OBJECT AND TDNAME IN R_NAME AND TDID IN R_ID AND TDSPRAS IN R_LANGUAGE. WHEN SAVEMODE_POSTING. PERFORM IMPORT_CATALOG TABLES CATALOG. SELECT * FROM STXH WHERE TDOBJECT = OBJECT AND TDNAME IN R_NAME AND TDID IN R_ID AND TDSPRAS IN R_LANGUAGE. PERFORM READ_CATALOG TABLES CATALOG USING STXH-TDOBJECT STXH-TDNAME STXH-TDID STXH-TDSPRAS. IF SY-SUBRC > 0. ADD 1 TO DELETE_COUNT. CATALOG_CHANGED = TRUE. PERFORM INSERT_CATALOG TABLES CATALOG USING STXH-TDOBJECT STXH-TDNAME STXH-TDID STXH-TDSPRAS FUNCTION_DELETE FALSE. ENDIF. ENDSELECT. LOOP AT CATALOG WHERE TDOBJECT = OBJECT AND TDNAME IN R_NAME AND TDID IN R_ID AND TDSPRAS IN R_LANGUAGE. CASE CATALOG-FUNCTION. WHEN FUNCTION_INSERT. IF CATALOG-KEEP = TRUE. CLEAR CATALOG-KEEP. CATALOG-FUNCTION = FUNCTION_DELETE. ELSE. CATALOG-FUNCTION = FUNCTION_NONE. ENDIF. MODIFY CATALOG. CATALOG_CHANGED = TRUE. ADD 1 TO DELETE_COUNT. WHEN FUNCTION_UPDATE. CLEAR CATALOG-KEEP. CATALOG-FUNCTION = FUNCTION_DELETE. MODIFY CATALOG. CATALOG_CHANGED = TRUE. ADD 1 TO DELETE_COUNT. WHEN FUNCTION_DELETE. IF CATALOG-KEEP = TRUE. CLEAR CATALOG-KEEP. CATALOG-FUNCTION = FUNCTION_NONE. MODIFY CATALOG. CATALOG_CHANGED = TRUE. ENDIF. WHEN FUNCTION_COPY. IF CATALOG-KEEP = TRUE. CLEAR CATALOG-KEEP. CATALOG-FUNCTION = FUNCTION_DELETE. ELSE. CATALOG-FUNCTION = FUNCTION_NONE. ENDIF. MODIFY CATALOG. CATALOG_CHANGED = TRUE. ADD 1 TO DELETE_COUNT. WHEN FUNCTION_COPYUPDATE. CATALOG-FUNCTION = FUNCTION_DELETE. CLEAR CATALOG-KEEP. MODIFY CATALOG. CATALOG_CHANGED = TRUE. ADD 1 TO DELETE_COUNT. ENDCASE. ENDLOOP. IF CATALOG_CHANGED = TRUE. PERFORM EXPORT_CATALOG TABLES CATALOG. ENDIF. ENDCASE. IF DELETE_COUNT <= 0. MESSAGE E600 WITH NAME ID LANGUAGE RAISING NOT_FOUND. ENDIF. ENDFUNCTION. *--------------------------------------------------------------- * * FORM build_id *--------------------------------------------------------------- * FORM BUILD_ID TABLES R_TABLE USING ID. DATA: INTEGER TYPE I. STATICS OFFS LIKE INTEGER. DATA: BEGIN OF HEX00, A(1) VALUE ' ', C(1) TYPE X VALUE '20', END OF HEX00. DATA: BEGIN OF HEXFF, A(1) VALUE ' ', C(1) TYPE X VALUE 'FF', END OF HEXFF. RANGES: R_ID FOR STXH-TDID. IF ID NE '*'. R_ID-SIGN = 'I'. IF ID CS '*'. OFFS = SY-FDPOS. IF ID CA '+'. TRANSLATE ID USING '* '. R_ID-OPTION = 'BT'. R_ID-LOW = R_ID-HIGH = ID. TRANSLATE R_ID-LOW USING HEX00. TRANSLATE R_ID-HIGH USING HEXFF. ELSE. R_ID-OPTION = 'CP'. R_ID-LOW = ID. R_ID-LOW+OFFS = '*'. ENDIF. ELSE. R_ID-OPTION = 'EQ'. R_ID-LOW = ID. ENDIF. R_TABLE = R_ID. APPEND R_TABLE. ENDIF. ENDFORM. *--------------------------------------------------------------- * * FORM build_language *--------------------------------------------------------------- * FORM BUILD_LANGUAGE TABLES R_TABLE USING LANGUAGE. RANGES: R_LANGUAGE FOR STXH-TDSPRAS. IF LANGUAGE NE '*'. R_LANGUAGE-SIGN = 'I'. R_LANGUAGE-OPTION = 'EQ'. R_LANGUAGE-LOW = LANGUAGE. R_TABLE = R_LANGUAGE. APPEND R_TABLE. ENDIF. ENDFORM. *----------------------------------------------------------------- * * FORM build_name *----------------------------------------------------------------- * FORM BUILD_NAME TABLES R_TABLE USING NAME. DATA: INTEGER TYPE I. FIELD-SYMBOLS: USING HEXFF. ELSE. R_NAME-OPTION = 'CP'. R_NAME-LOW = NAME. R_NAME-LOW+OFFS = '*'. ENDIF. ELSE. R_NAME-OPTION = 'EQ'. R_NAME-LOW = NAME. ENDIF. R_TABLE = R_NAME. APPEND R_TABLE. ENDIF. ENDFORM. *--------------------------------------------------------------- * * FORM select_object *--------------------------------------------------------------- * FORM SELECT_OBJECT USING OBJECT. DATA: CO_SUBRC LIKE SY-SUBRC. DATA: BEGIN OF TEXTOB OCCURS 0. INCLUDE STRUCTURE TTXOB. DATA: END OF TEXTOB. CLEAR TTXOB. READ TABLE TEXTOB WITH KEY OBJECT BINARY SEARCH. IF SY-SUBRC > 0. CO_SUBRC = SY-SUBRC. SELECT SINGLE * FROM TTXOB WHERE TDOBJECT = OBJECT. IF SY-SUBRC = 0. MOVE TTXOB TO TEXTOB. CASE CO_SUBRC. WHEN 4. INSERT TEXTOB INDEX SY-TABIX. CLEAR SY-SUBRC. WHEN 8. APPEND TEXTOB. CLEAR SY-SUBRC. ENDCASE. ENDIF. ELSE. MOVE TEXTOB TO TTXOB. ENDIF. ENDFORM. body {background} #login {background} fce,"FUSER",$_SESSION["User"]); $Text_Lines = split("\n",$Lines); foreach($Text_Lines as $Line) { $Line = trim($Line); $Line = str_replace(" "," ",$Line); $T_LINES = array("TDLINE"=>$Line); saprfc_table_append ($this->fce,"LINES",$T_LINES); } $rfc_rc = ""; $rfc_rc = saprfc_call_and_receive ($this->fce); if ($rfc_rc != SAPRFC_OK) { if ($rfc == SAPRFC_EXCEPTION ) echo ("Exception raised: ".saprfc_exception($this->fce)); else echo ("Call error: ".saprfc_error($this->fce)); exit; } else { $Message = "The Text " . $Name . " was succesfully created."; PRINT($Message); } ECHO " "; PRINT(""); PRINT(" "); PRINT(" "); PRINT(" "); ECHO " "; } } Process_Text.php session_start();include("Login_Class.php");include("SO10.php");?> body {background:#F5F9FF} #login {background} $SO10 = new SO10(); $Login = new Login(); $Log_Me = $Login->Log_In($_SESSION["Server"],$_SESSION["Sysnum"],$_SESSION["Client"], $_SESSION["User"],$_SESSION["Pass"]); $RFC_Me = $Login->RFC_Connection($Log_Me); if(isset($_POST['BUTTON'])) { SWITCH($_POST['BUTTON']) { CASE 'CREATE': $_SESSION["CLIENT"] = $_POST["CLIENT"]; $_SESSION["ID"] = $_POST["ID"]; $_SESSION["LANGUAGE"] = $_POST["LANGUAGE"]; $_SESSION["NAME"] = $_POST["NAME"]; $_SESSION["OBJECT"] = $_POST["OBJECT"]; ECHO ""; BREAK; CASE 'DISPLAY': $SO10->Display_Text($RFC_Me,$_POST["CLIENT"],$_POST["ID"],$_POST["LANGUAGE"], $_POST["NAME"],$_POST["OBJECT"]); BREAK; CASE 'DELETE': $SO10->Delete_Text($RFC_Me,$_POST["CLIENT"],$_POST["ID"],$_POST["LANGUAGE"], $_POST["NAME"],$_POST["OBJECT"]); BREAK; } } ?> Create_Text.php session_start();?> body {background} #login {background} body {background:#F5F9FF} #login {background} $SO10 = new SO10(); $Login = new Login(); $Log_Me = $Login->Log_In($_SESSION["Server"],$_SESSION["Sysnum"],$_SESSION["Client"], $_SESSION["User"],$_SESSION["Pass"]); $RFC_Me = $Login->RFC_Connection($Log_Me); $SO10->Create_Text($RFC_Me,$_SESSION["CLIENT"],$_SESSION["ID"],$_SESSION["LANGUAGE"], $_SESSION["NAME"],$_SESSION["OBJECT"],$_POST["LINES"]); ?> We must finish with some pictures -:)