Application Development and Automation Blog Posts
Learn and share on deeper, cross technology development topics such as integration and connectivity, automation, cloud extensibility, developing at scale, and security.
cancel
Showing results for 
Search instead for 
Did you mean: 
Swastik
Discoverer
1,374

 

 

Problem Statement

Adobe Forms Language Translation during Country Roll-Outs is a cumbersome task, and lot of manual activities are involved. Developer needs to manually go through the Adobe Form to fetch the list of Text Modules. Prepare the list and send it to Business to provide the Translation. After receiving the translation, developer needs to manually populate

individual translations in TCode SE63. After manually updating all the translations, developer has to include the translations in a Transport Request using TCode SLXT.

Solution:

  • Create an Automation Tool, which will read the Adobe Form. It will fetch the Text Modules from the Adobe Form, and create a file with the Text Modules and existing Text details.
  • Once the file is updated with translations, this file will be fed into tool.
  • Tool will automate SE63 processing for all the Text Objects.
  • Along with that tool will also automate SLXT processing to include translations in a Transport Request.

Swastik_0-1715230454658.png

REPORT ZADOBE_TRANSALATION.


TYPES: BEGIN OF ty_outtab,
text_mod TYPE tdsfname,
lang1 TYPE sy-langu,
tdformat TYPE tdformat,
text_line TYPE string,
END OF ty_outtab.


TYPES: BEGIN OF ty_excel,
text_mod(30) TYPE c,
s_lang(20) TYPE c,
s_tdformat(20) TYPE c,
s_text_line(132) TYPE c,
t_lang(20) TYPE c,
t_tdformat(20) TYPE c,
t_text_line(132) TYPE c,
END OF ty_excel.

DATA: it_outtab TYPE STANDARD TABLE OF ty_outtab,
it_download TYPE STANDARD TABLE OF ty_excel,
it_upload TYPE STANDARD TABLE OF ty_excel.

DATA: wa_outtab TYPE ty_outtab,
wa_upload TYPE ty_excel,
wa_download TYPE ty_excel.

DATA: g_trglang TYPE lxeisolang,
g_ucomm TYPE sy-ucomm.

DATA: g_func_name TYPE rs38l_fnam,
gt_code TYPE STANDARD TABLE OF string.

CONSTANTS: c_slash TYPE c VALUE '\',
c_nodata TYPE c VALUE '/',
c_q TYPE char5 VALUE '???',
c_objtype TYPE lxeobjtype VALUE 'SSF',
c_text_mod TYPE char14 VALUE '%textmodule = ',
c_custmnr TYPE lxecustmnr VALUE '999999'.

SELECTION-SCREEN BEGIN OF BLOCK b0 WITH FRAME.

PARAMETERS: p_dwn RADIOBUTTON GROUP rad1,
p_upload RADIOBUTTON GROUP rad1.

SELECTION-SCREEN END OF BLOCK b0.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-002 .
PARAMETERS: p_form TYPE fpname MODIF ID dwn,
p_langu TYPE sy-langu MODIF ID dwn MATCHCODE OBJECT h_t002 DEFAULT sy-langu,
p_tlang TYPE sy-langu MODIF ID dwn MATCHCODE OBJECT h_t002,
p_down TYPE string OBLIGATORY DEFAULT 'C:\Test.xls' MODIF ID dwn.

SELECTION-SCREEN END OF BLOCK b1.


SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-001 .
PARAMETERS: p_up TYPE string OBLIGATORY DEFAULT 'C:\Test.xls' MODIF ID hid,
p_torder TYPE trkorr MODIF ID hid.

SELECTION-SCREEN END OF BLOCK b2.

INITIALIZATION.

MOVE 'X' TO p_dwn.


AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_down.
PERFORM sub_get_destination_folder.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_up.
PERFORM sub_upload_destination_folder.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_torder.
PERFORM sub_get_transport.

AT SELECTION-SCREEN.

CASE 'X'.
WHEN p_upload.
IF p_up IS INITIAL OR
p_torder IS INITIAL.
MESSAGE TEXT-003 TYPE 'E'.
ENDIF.
WHEN p_dwn.
IF p_form IS INITIAL OR
p_langu IS INITIAL OR
p_tlang IS INITIAL OR
p_down IS INITIAL.
MESSAGE TEXT-004 TYPE 'E'.
ENDIF.
PERFORM sub_validate_form_name USING p_form.
WHEN OTHERS.
ENDCASE.


START-OF-SELECTION.


CASE 'X'.
WHEN p_dwn.

PERFORM sub_fetch_function_module_name USING p_form
CHANGING g_func_name.

PERFORM sub_read_source_code USING g_func_name.

PERFORM sub_get_text_module_names.

PERFORM sub_down_file.

WHEN p_upload.

PERFORM sub_upload_file.

PERFORM sub_update_translation.

* PERFORM sub_translate_text.

PERFORM sub_add_in_transport.

WHEN OTHERS.

ENDCASE.


*&---------------------------------------------------------------------*
*& Form sub_fetch_function_module_name
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM sub_fetch_function_module_name USING ip_form_name TYPE fpname
CHANGING op_func_name TYPE rs38l_fnam.


CALL FUNCTION 'FP_FUNCTION_MODULE_NAME'
EXPORTING
i_name = ip_form_name
IMPORTING
e_funcname = op_func_name
EXCEPTIONS
cx_fp_api_repository = 1
cx_fp_api_usage = 2
cx_fp_api_internal = 3.

IF sy-subrc NE 0.
MESSAGE TEXT-005 TYPE 'E'.
ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form sub_read_source_code
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> G_FUNC_NAME
*&---------------------------------------------------------------------*
FORM sub_read_source_code USING ip_func_name.

DATA: l_pname TYPE tfdir-pname,
l_code TYPE char256,
l_part1 TYPE char256,
l_part2 TYPE char256,
l_include_name TYPE char256,
l_part4 TYPE char256.

DATA: lt_code TYPE STANDARD TABLE OF string.
DATA: lt_code1 TYPE STANDARD TABLE OF string.

SELECT SINGLE pname
FROM tfdir
INTO l_pname
WHERE funcname EQ ip_func_name.


READ REPORT l_pname INTO lt_code.

DATA: lwa_code TYPE string.

LOOP AT lt_code INTO lwa_code.
l_code = lwa_code.
SHIFT l_code LEFT DELETING LEADING ''.
CHECK l_code(1) NE '*'.

SPLIT l_code AT space INTO l_part1 l_part2.
SPLIT l_part2 AT '.' INTO l_include_name l_part4.

READ REPORT l_include_name INTO lt_code1.
APPEND LINES OF lt_code1 TO gt_code.
ENDLOOP.


ENDFORM.

*&---------------------------------------------------------------------*
*& Form sub_get_text_module_names
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM sub_get_text_module_names .

DATA: lwa_code TYPE string.
DATA: l_part1 TYPE char256,
l_part2 TYPE char256,
l_part3 TYPE char256,
l_text_module TYPE char256.

DATA: it_text TYPE tsftext.
DATA: wa_text LIKE LINE OF it_text,
wa_lang TYPE ssfrlang.

wa_lang-langu1 = p_langu.

LOOP AT gt_code INTO lwa_code.

FIND FIRST OCCURRENCE OF c_text_mod IN lwa_code.

CHECK sy-subrc EQ 0.

CONDENSE lwa_code.
SPLIT lwa_code AT '''' INTO l_part1 l_part2.
SPLIT l_part2 AT '''' INTO l_text_module l_part3.

MOVE l_text_module TO wa_outtab-text_mod.
MOVE p_langu TO wa_outtab-lang1.

 

CALL FUNCTION 'SSFRT_READ_TEXTMODULE'
EXPORTING
i_textmodule = wa_outtab-text_mod
i_languages = wa_lang
IMPORTING
* O_LANGU =
o_text = it_text
EXCEPTIONS
error = 1
language_not_found = 2
OTHERS = 3.
IF sy-subrc EQ 0.

CLEAR wa_outtab-text_line.

LOOP AT it_text INTO wa_text.

MOVE wa_text-tdformat TO wa_outtab-tdformat.
MOVE wa_text-tdline TO wa_outtab-text_line.

APPEND wa_outtab TO it_outtab.

ENDLOOP.
CLEAR wa_outtab.

ENDIF.

ENDLOOP.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form sub_down_file
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM sub_down_file .

CLEAR wa_download.

wa_download-text_mod = 'Text Module'.
wa_download-s_lang = 'Source Language'.
wa_download-s_tdformat = 'Source Format'.
wa_download-s_text_line = 'Source Text'.
wa_download-t_lang = 'Target Language'.
wa_download-t_tdformat = 'Target Format'.
wa_download-t_text_line = 'Target Text'.

APPEND wa_download TO it_download.
CLEAR wa_download.

LOOP AT it_outtab INTO wa_outtab.
wa_download-text_mod = wa_outtab-text_mod.
wa_download-s_lang = wa_outtab-lang1.
wa_download-s_tdformat = wa_outtab-tdformat.
wa_download-s_text_line = wa_outtab-text_line.
wa_download-t_lang = p_tlang.
wa_download-t_tdformat = wa_outtab-tdformat.
wa_download-t_text_line = c_q.
APPEND wa_download TO it_download.
CLEAR wa_download.
ENDLOOP.


CALL METHOD cl_gui_frontend_services=>gui_download
EXPORTING
filename = p_down
write_field_separator = 'X'
CHANGING
data_tab = it_download
EXCEPTIONS
file_write_error = 1
no_batch = 2
gui_refuse_filetransfer = 3
invalid_type = 4
no_authority = 5
unknown_error = 6
header_not_allowed = 7
separator_not_allowed = 8
filesize_not_allowed = 9
header_too_long = 10
dp_error_create = 11
dp_error_send = 12
dp_error_write = 13
unknown_dp_error = 14
access_denied = 15
dp_out_of_memory = 16
disk_full = 17
dp_timeout = 18
file_not_found = 19
dataprovider_exception = 20
control_flush_error = 21
OTHERS = 22.

IF sy-subrc EQ 0.
WRITE:/ 'File downloaded to ''', p_down, ''' successfully'.
ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form sub_get_destination_folder
*&---------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
FORM sub_get_destination_folder .

DATA: l_path TYPE string.

CALL METHOD cl_gui_frontend_services=>directory_browse
CHANGING
selected_folder = l_path
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.

IF sy-subrc NE 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

CONCATENATE l_path c_slash 'Test.xls' INTO p_down.


ENDFORM. "get_destination_folder

*&---------------------------------------------------------------------*
*& Form sub_upload_file
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM sub_upload_file .

DATA: lt_up TYPE STANDARD TABLE OF alsmex_tabline.

DATA: lwa_up TYPE alsmex_tabline.

DATA: l_currentrow TYPE alsmex_tabline-row,
l_file TYPE rlgrap-filename.

MOVE p_up TO l_file.

CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = l_file
i_begin_col = '1'
i_begin_row = '1'
i_end_col = '7'
i_end_row = '999'
TABLES
intern = lt_up
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.

IF sy-subrc NE 0.

MESSAGE 'File upload failed !!' TYPE 'E'.
LEAVE LIST-PROCESSING.

ELSE.

SORT lt_up BY row col.

* Get first row retrieved
READ TABLE lt_up INDEX 1 INTO lwa_up.

* Set first row retrieved to current row
l_currentrow = lwa_up-row.

LOOP AT lt_up INTO lwa_up.
* Reset values for next row
IF lwa_up-row NE l_currentrow.
APPEND wa_upload TO it_upload.
CLEAR wa_upload.
l_currentrow = lwa_up-row.
ENDIF.

CASE lwa_up-col.
WHEN '0001'.
wa_upload-text_mod = lwa_up-value.
WHEN '0002'.
wa_upload-s_lang = lwa_up-value.
WHEN '0003'.
wa_upload-s_tdformat = lwa_up-value.
WHEN '0004'.
wa_upload-s_text_line = lwa_up-value.
WHEN '0005'.
wa_upload-t_lang = lwa_up-value.
WHEN '0006'.
wa_upload-t_tdformat = lwa_up-value.
WHEN '0007'.
wa_upload-t_text_line = lwa_up-value.
ENDCASE.

ENDLOOP.

APPEND wa_upload TO it_upload.

ENDIF.


ENDFORM.

*&---------------------------------------------------------------------*
*& Form sub_update_translation
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM sub_update_translation .

DATA: lt_target_text TYPE STANDARD TABLE OF tline.

DATA: lwa_lwrkobj TYPE lwrkobj,
lwa_target_text TYPE tline.

DATA: l_target_lang TYPE lwrkobj-targetlang,
l_objname TYPE lxeobjname,
l_source_lang TYPE lwrkobj-sourcelang.

DATA: lt_lang TYPE STANDARD TABLE OF lxe_t002x.
DATA: lwa_lang TYPE lxe_t002x,
lwa_upload TYPE ty_excel.

DATA: l_slang TYPE lxe_t002x-language,
l_tlang TYPE lxe_t002x-language.

SELECT * FROM lxe_t002x INTO TABLE lt_lang.

DELETE it_upload INDEX 1.

LOOP AT it_upload INTO lwa_upload.

MOVE lwa_upload TO wa_upload.

AT NEW text_mod .
IF wa_upload-text_mod IS NOT INITIAL.
CLEAR lwa_target_text.
MOVE: '/E' TO lwa_target_text-tdformat,
'&%TEXT1&' TO lwa_target_text-tdline.
APPEND lwa_target_text TO lt_target_text.
ENDIF.
ENDAT.


CLEAR lwa_target_text.
MOVE: wa_upload-t_tdformat TO lwa_target_text-tdformat,
wa_upload-t_text_line TO lwa_target_text-tdline.
APPEND lwa_target_text TO lt_target_text.

AT END OF text_mod.

READ TABLE lt_lang INTO lwa_lang WITH KEY r3_lang = wa_upload-t_lang.
IF sy-subrc EQ 0.
MOVE lwa_lang-language TO g_trglang.
ENDIF.

CLEAR lwa_lwrkobj.

MOVE wa_upload-text_mod TO lwa_lwrkobj-objname.
MOVE wa_upload-t_lang TO l_target_lang.
MOVE wa_upload-s_lang TO l_source_lang.

CALL FUNCTION 'SSFTR_SET_TEXT'
EXPORTING
targetlang = l_target_lang
sourcelang = l_source_lang
docstate = 'A'
TABLES
targettext = lt_target_text
CHANGING
tlwrkobj = lwa_lwrkobj
EXCEPTIONS
error_in_update = 1
OTHERS = 2.

IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.

MOVE wa_upload-text_mod TO l_objname.

CALL FUNCTION 'LXE_LOG_WRITE'
EXPORTING
custmnr = c_custmnr
objtype = c_objtype
objname = l_objname
trglang = g_trglang.

REFRESH: lt_target_text.

ENDAT.

ENDLOOP.

ENDFORM.


*&---------------------------------------------------------------------*
*& Form sub_add_in_transport
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM sub_add_in_transport .

DATA: it_seltab TYPE TABLE OF rsparams,
wa_seltab LIKE LINE OF it_seltab.


wa_seltab-selname = 'ST_USER'.
wa_seltab-kind = 'S'.
wa_seltab-sign = 'I'.
wa_seltab-option = 'EQ'.
wa_seltab-low = sy-uname.
APPEND wa_seltab TO it_seltab.
CLEAR wa_seltab.

wa_seltab-selname = 'ST_OBJCT'.
wa_seltab-kind = 'S'.
wa_seltab-sign = 'I'.
wa_seltab-option = 'EQ'.
wa_seltab-low = c_objtype.
APPEND wa_seltab TO it_seltab.
CLEAR wa_seltab.

wa_seltab-selname = 'TORDER'.
wa_seltab-kind = 'P'.
wa_seltab-low = p_torder.
APPEND wa_seltab TO it_seltab.
CLEAR wa_seltab.

wa_seltab-selname = 'REQALL'.
wa_seltab-kind = 'P'.
wa_seltab-low = 'X'.
APPEND wa_seltab TO it_seltab.
CLEAR wa_seltab.

wa_seltab-selname = 'LANG_ISO'.
wa_seltab-kind = 'P'.
wa_seltab-low = g_trglang.
APPEND wa_seltab TO it_seltab.
CLEAR wa_seltab.

wa_seltab-selname = 'AUTO'.
wa_seltab-kind = 'P'.
wa_seltab-low = ''.
APPEND wa_seltab TO it_seltab.
CLEAR wa_seltab.

SUBMIT rs_lxe_log_export WITH SELECTION-TABLE it_seltab AND RETURN.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form sub_upload_destination_folder
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM sub_upload_destination_folder .

DATA: l_file TYPE ibipparms-path .

CALL FUNCTION 'F4_FILENAME'
IMPORTING
file_name = l_file.

MOVE l_file TO p_up.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form sub_get_transport
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM sub_get_transport .

DATA lv_pattern TYPE trkorr.

lv_pattern = sy-sysid && 'K' && '*'.
CALL FUNCTION 'TR_F4_REQUESTS'
EXPORTING
* iv_username = ''
iv_trkorr_pattern = lv_pattern
iv_trfunctions = 'KT'
iv_trstatus = 'D'
IMPORTING
ev_selected_request = p_torder.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form sub_validate_form_name
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> P_FORM
*&---------------------------------------------------------------------*
FORM sub_validate_form_name USING ip_form.

DATA: lwa_tadir TYPE tadir.

SELECT SINGLE *
FROM tadir
INTO lwa_tadir
WHERE pgmid = 'R3TR' AND
object = 'SFPF' AND
obj_name = ip_form.

IF sy-subrc NE 0.
MESSAGE 'Adobe Form Not Found' TYPE 'E'.
ENDIF.


ENDFORM.

 

Conclusion & Key Benefits :

•95% reduction in Manual activities for Adobe Form Language Translation.
•Faster Translation will lead to Faster Delivery with reduced cost.
•0 Human Error, as the Translation will be done through Automation.

 

Labels in this area