quarta-feira, 27 de janeiro de 2016

Trabalhando com Caixa de Texto - CL_GUI_TEXTEDIT

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



4 comentários:

  1. 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.

    ResponderExcluir
  2. Coloca o código abaixo na sua tela 9000.

    PROCESS BEFORE OUTPUT.
    MODULE status_9000.
    MODULE init.
    *
    PROCESS AFTER INPUT.
    MODULE user_command_9000 AT EXIT-COMMAND.

    ResponderExcluir
  3. Como faço para "limpar" essa caixa de texto? No meu acabou ficando uma sujeira e não consegui identificar onde ela está

    ResponderExcluir