/* POPUP INI */
/* POPUP FIM */

Conteúdo

Alterar valor no programa origem na chamada de uma exit, função, etc


Digamos que o programa em execução tem uma variável chamada V_BANANA que está com o valor SAP, porém o programa é standard e vc precisa alterar ela para SAPeiros. Não tem exit ou função onde você possa alterar este campo por ele não estar parametrizado. Porém sabe que existe uma exit, função, ou enhancement onde você pode manipular os dados.

Então que novamente FIELD-SYMBOLS e ASSIGN entram na jogada.

No exemplo abaixo temos um programa e uma função, onde na chamada da função vamos alterar o valor da variável do programa.

Programa:
REPORT ZSAPeiros.
DATA v_banana(10) TYPE c.
v_banana = 'SAP'.
WRITE:/ v_banana.
CALL FUNCTION 'ZSAPeiros'.
WRITE:/ v_banana.

Função:
FUNCTION ZSAPeiros.
  DATA lv_banana TYPE string.
  FIELD-SYMBOLS <fv_banana> TYPE any.
* Busca no Programa ZSAPeiros a variável v_banana
  lv_banana = '(ZSAPeiros)v_banana'.
  ASSIGN (lv_banana) TO <fv_banana>.
  <fv_banana> = 'SAPeiros'.
ENDFUNCTION.

Field Symbol - Assigning

FIELD-SYMBOLS nada mais é que um ponteiro/espelho e o ASSIGNING é a atribuição. Digamos que você precise alterar um valor de uma tabela já populada. Em vez de dar um loop na tabela interna e jogar em uma estrutura, afim de modificá-la (dentro do loop por exemplo), você pode utilizar field-symbol, pois com isto não precisaria atribuir valor à estrutura, e a tabela seria automaticamente atualizada naquele momento.

Ou um exemplo mais simples seria você imaginar você se olhando em um espelho. Imagine que o espelho fica parado e a cada reação sua é refletida no espelho.

rs Não sei se ajudei ou compliquei com essa do espelho. Malz ae se piorei. kkkk

No exemplo abaixo a tabela terá o conteúdo do registro ERSDA atualizado com a data atual. Veja que não tem nenhum modify.
REPORT ZSAPeiros.

DATA: lt_mara     TYPE TABLE OF mara, "Tabela Mara
      lv_ersda    TYPE mara-ersda.    "Dt crianção

FIELD-SYMBOLS: <lt_mara> TYPE mara.

SELECT *
  FROM mara
  INTO TABLE lt_mara
  UP TO 10 ROWS.

SORT lt_mara BY ersda.

* Exemplo com Loop
* Vai alterar o campo ERSDA com o valor da data atual + contador
LOOP AT lt_mara ASSIGNING <lt_mara>.
  <lt_mara>-ersda = sy-datum + sy-tabix.
ENDLOOP.

* Exemplo com Read Table
* Vai alterar o campo ERSDA com o valor da data atual apenas do terceiro registro do loop acima
lv_ersda = sy-datum + 3.

READ TABLE lt_mara
  WITH KEY ersda = lv_ersda
           BINARY SEARCH ASSIGNING <lt_mara>.

IF sy-subrc IS INITIAL.
  <lt_mara>-ersda = sy-datum.
ENDIF.
/* POPUP INI */ /* POPUP FIM */