REPORT z_caixa_de_texto.
* Opa pessoal, quando vamos montar telas para os nossos queridos User
* colocamos sempre os campos da tabela que estamos trabalhando e na maioria
* das vezes só os campos mais importantes, só que as vezes esses mesmos
* users querem uma caixa de texto lateral ou abaixo das informações para
* principais para que seja possível incluir observações sobre o processo,
* documento ou qualquer outra coisa que esteja fazendo... Até aí sem problema.
* O problema começa quando o objeto de caixa de texto não é existe na caixa
* de ferramentas da edição da screen, nesse momento vamos descobrir a usar
* a classe CL_GUI_TEXTEDIT.
* No final contem os prints de tela.
* Caso não lembre como ver os dados gravados em um Objeto de texto.
* Como em todos os posts estarei fazendo os comentários no meio do código,
* bons estudos =).
DATA :
o_docking TYPE REF TO cl_gui_docking_container,
o_editor TYPE REF TO cl_gui_textedit.
* Tela Principal
CALL SCREEN 9000.
*&---------------------------------------------------------------------*
*& Module INIT OUTPUT
*&---------------------------------------------------------------------*
MODULE init OUTPUT.
CREATE OBJECT o_docking
EXPORTING
repid = sy-repid " Report to Which This Docking Control is Linked
dynnr = '9000'. " Screen to Which This Docking Control is Linked
IF o_editor IS NOT BOUND.
* Limite do docking que conterá o textedit
o_docking->set_extension( 400 ).
* Criação do objeto da caixa de texto com limitações de quantidade total e
* quantidade total por linha.
CREATE OBJECT o_editor
EXPORTING
max_number_chars = 100
parent = o_docking
wordwrap_mode = cl_gui_textedit=>wordwrap_at_fixed_position
wordwrap_position = 25
wordwrap_to_linebreak_mode = cl_gui_textedit=>true.
* Abaixo eu criei um perform para dar get e set na caixa de texto pois
* o mesmo usaria as mesmas variaveis no read_text e save_text, sendo o
* o primeiro parametro ( que nesse caso é o 'SET' como chave para o processo
* READ_TEXT -> SET_TEXT_AS_R3TABLE
PERFORM f_get_set_text_to_editor USING 'SET' o_editor.
ENDIF.
ENDMODULE. " INIT OUTPUT
*&---------------------------------------------------------------------*
*& Module STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
MODULE status_9000 OUTPUT.
SET PF-STATUS 'PF_9000'.
ENDMODULE. " STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_9000 INPUT
*&---------------------------------------------------------------------*
MODULE user_command_9000 INPUT.
CASE sy-ucomm.
WHEN 'SAVE'.
* GET_TEXT_AS_R3TABLE -> SAVE_TEXT
PERFORM f_get_set_text_to_editor USING 'GET' o_editor.
WHEN 'BACK'.
LEAVE TO SCREEN 0.
WHEN 'EXIT' OR 'CANCEL'.
LEAVE PROGRAM.
WHEN OTHERS.
ENDCASE.
ENDMODULE. " USER_COMMAND_9000 INPUT
*&---------------------------------------------------------------------*
*& Form F_GET_SET_TEXT_TO_EDITOR
*&---------------------------------------------------------------------*
FORM f_get_set_text_to_editor
USING action
editor TYPE REF TO cl_gui_textedit.
DATA :
lt_lines TYPE TABLE OF tline,
lst_lines LIKE LINE OF lt_lines,
lst_header TYPE thead.
lst_header-tdid = 'ST'.
lst_header-tdspras = sy-langu.
lst_header-tdobject = 'TEXT'.
CONCATENATE 'ZTEXTO_TESTE' sy-uname INTO lst_header-tdname
SEPARATED BY '_'.
DATA :
lt_table TYPE TABLE OF char256,
lst_table LIKE LINE OF lt_table.
BREAK-POINT.
CASE action.
WHEN 'SET'.
* Leitura do Objeto
CALL FUNCTION 'READ_TEXT'
EXPORTING
id = lst_header-tdid
language = lst_header-tdspras
name = lst_header-tdname
object = lst_header-tdobject
TABLES
lines = lt_lines
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.
* SET no Editor
IF lt_lines[] IS NOT INITIAL.
LOOP AT lt_lines INTO lst_lines.
MOVE lst_lines-tdline TO lst_table.
APPEND lst_table TO lt_table.
ENDLOOP.
* Esse metodo informa o texto que irá mostrar na caixa de texto.
editor->set_text_as_r3table( lt_table ).
ENDIF.
WHEN 'GET'.
* GET no Editor
* Esse metodo pega as informações contidas dentro da caixa de texto.
o_editor->get_text_as_r3table(
EXPORTING
only_when_modified = space " get text only when modified
IMPORTING
table = lt_table " text as R/3 table
* is_modified = " modify status of text
EXCEPTIONS
error_dp = 1
error_cntl_call_method = 2
error_dp_create = 3
potential_data_loss = 4
OTHERS = 5
).
* Atualização do Objeto de texto.
IF lt_table[] IS NOT INITIAL.
LOOP AT lt_table INTO lst_table.
MOVE lst_table TO lst_lines-tdline.
APPEND lst_lines TO lt_lines.
ENDLOOP.
CALL FUNCTION 'SAVE_TEXT'
EXPORTING
client = sy-mandt
header = lst_header
TABLES
lines = lt_lines
EXCEPTIONS
id = 1
language = 2
name = 3
object = 4
OTHERS = 5.
ENDIF.
ENDCASE.
ENDFORM. " F_GET_SET_TEXT_TO_EDITOR
* Opa pessoal, quando vamos montar telas para os nossos queridos User
* colocamos sempre os campos da tabela que estamos trabalhando e na maioria
* das vezes só os campos mais importantes, só que as vezes esses mesmos
* users querem uma caixa de texto lateral ou abaixo das informações para
* principais para que seja possível incluir observações sobre o processo,
* documento ou qualquer outra coisa que esteja fazendo... Até aí sem problema.
* O problema começa quando o objeto de caixa de texto não é existe na caixa
* de ferramentas da edição da screen, nesse momento vamos descobrir a usar
* a classe CL_GUI_TEXTEDIT.
* No final contem os prints de tela.
* Caso não lembre como ver os dados gravados em um Objeto de texto.
* Como em todos os posts estarei fazendo os comentários no meio do código,
* bons estudos =).
DATA :
o_docking TYPE REF TO cl_gui_docking_container,
o_editor TYPE REF TO cl_gui_textedit.
* Tela Principal
CALL SCREEN 9000.
*&---------------------------------------------------------------------*
*& Module INIT OUTPUT
*&---------------------------------------------------------------------*
MODULE init OUTPUT.
CREATE OBJECT o_docking
EXPORTING
repid = sy-repid " Report to Which This Docking Control is Linked
dynnr = '9000'. " Screen to Which This Docking Control is Linked
IF o_editor IS NOT BOUND.
* Limite do docking que conterá o textedit
o_docking->set_extension( 400 ).
* Criação do objeto da caixa de texto com limitações de quantidade total e
* quantidade total por linha.
CREATE OBJECT o_editor
EXPORTING
max_number_chars = 100
parent = o_docking
wordwrap_mode = cl_gui_textedit=>wordwrap_at_fixed_position
wordwrap_position = 25
wordwrap_to_linebreak_mode = cl_gui_textedit=>true.
* Abaixo eu criei um perform para dar get e set na caixa de texto pois
* o mesmo usaria as mesmas variaveis no read_text e save_text, sendo o
* o primeiro parametro ( que nesse caso é o 'SET' como chave para o processo
* READ_TEXT -> SET_TEXT_AS_R3TABLE
PERFORM f_get_set_text_to_editor USING 'SET' o_editor.
ENDIF.
ENDMODULE. " INIT OUTPUT
*&---------------------------------------------------------------------*
*& Module STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
MODULE status_9000 OUTPUT.
SET PF-STATUS 'PF_9000'.
ENDMODULE. " STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_9000 INPUT
*&---------------------------------------------------------------------*
MODULE user_command_9000 INPUT.
CASE sy-ucomm.
WHEN 'SAVE'.
* GET_TEXT_AS_R3TABLE -> SAVE_TEXT
PERFORM f_get_set_text_to_editor USING 'GET' o_editor.
WHEN 'BACK'.
LEAVE TO SCREEN 0.
WHEN 'EXIT' OR 'CANCEL'.
LEAVE PROGRAM.
WHEN OTHERS.
ENDCASE.
ENDMODULE. " USER_COMMAND_9000 INPUT
*&---------------------------------------------------------------------*
*& Form F_GET_SET_TEXT_TO_EDITOR
*&---------------------------------------------------------------------*
FORM f_get_set_text_to_editor
USING action
editor TYPE REF TO cl_gui_textedit.
DATA :
lt_lines TYPE TABLE OF tline,
lst_lines LIKE LINE OF lt_lines,
lst_header TYPE thead.
lst_header-tdid = 'ST'.
lst_header-tdspras = sy-langu.
lst_header-tdobject = 'TEXT'.
CONCATENATE 'ZTEXTO_TESTE' sy-uname INTO lst_header-tdname
SEPARATED BY '_'.
DATA :
lt_table TYPE TABLE OF char256,
lst_table LIKE LINE OF lt_table.
BREAK-POINT.
CASE action.
WHEN 'SET'.
* Leitura do Objeto
CALL FUNCTION 'READ_TEXT'
EXPORTING
id = lst_header-tdid
language = lst_header-tdspras
name = lst_header-tdname
object = lst_header-tdobject
TABLES
lines = lt_lines
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.
* SET no Editor
IF lt_lines[] IS NOT INITIAL.
LOOP AT lt_lines INTO lst_lines.
MOVE lst_lines-tdline TO lst_table.
APPEND lst_table TO lt_table.
ENDLOOP.
* Esse metodo informa o texto que irá mostrar na caixa de texto.
editor->set_text_as_r3table( lt_table ).
ENDIF.
WHEN 'GET'.
* GET no Editor
* Esse metodo pega as informações contidas dentro da caixa de texto.
o_editor->get_text_as_r3table(
EXPORTING
only_when_modified = space " get text only when modified
IMPORTING
table = lt_table " text as R/3 table
* is_modified = " modify status of text
EXCEPTIONS
error_dp = 1
error_cntl_call_method = 2
error_dp_create = 3
potential_data_loss = 4
OTHERS = 5
).
* Atualização do Objeto de texto.
IF lt_table[] IS NOT INITIAL.
LOOP AT lt_table INTO lst_table.
MOVE lst_table TO lst_lines-tdline.
APPEND lst_lines TO lt_lines.
ENDLOOP.
CALL FUNCTION 'SAVE_TEXT'
EXPORTING
client = sy-mandt
header = lst_header
TABLES
lines = lt_lines
EXCEPTIONS
id = 1
language = 2
name = 3
object = 4
OTHERS = 5.
ENDIF.
ENDCASE.
ENDFORM. " F_GET_SET_TEXT_TO_EDITOR
Toda vez que testo o programa não funciona, estou deixando de fazer algo, já criei a tela 9000, mas não aparece de acordo com seu print.
ResponderExcluirColoca o código abaixo na sua tela 9000.
ResponderExcluirPROCESS BEFORE OUTPUT.
MODULE status_9000.
MODULE init.
*
PROCESS AFTER INPUT.
MODULE user_command_9000 AT EXIT-COMMAND.
Tks
ExcluirComo faço para "limpar" essa caixa de texto? No meu acabou ficando uma sujeira e não consegui identificar onde ela está
ResponderExcluir