Fala pessoas!
Hoje vou falar de uma coisa simples e besta mas que é, no mínimo, interessante.
Antes de iniciarmos, vamos rever algumas coisas que já sabemos:
Tudo certo quanto ao nosso conhecimento? Nem tanto...
Seja esse código abaixo:
DATA: lv_num1 TYPE i.
lv_num1 = 10.
WRITE: lv_num1, ' = variável início'.
NEW-LINE.
lv_num1 = 10.
PERFORM z_using USING lv_num1.
WRITE: lv_num1, ' = variável using'.
NEW-LINE.
lv_num1 = 10.
PERFORM z_using_value USING lv_num1.
WRITE: lv_num1, ' = variável using value'.
NEW-LINE.
lv_num1 = 10.
PERFORM z_changing CHANGING lv_num1.
WRITE: lv_num1, ' = variável changing'.
NEW-LINE.
lv_num1 = 10.
PERFORM z_changing_value CHANGING lv_num1.
WRITE: lv_num1, ' = variável changing value'.
NEW-LINE.
FORM z_using USING pe_num TYPE i.
pe_num = pe_num * 2.
ENDFORM.
FORM z_using_value USING VALUE(pe_num) TYPE i.
pe_num = pe_num * 2.
ENDFORM.
FORM z_changing CHANGING pc_num TYPE i.
pc_num = pc_num * 2.
ENDFORM.
FORM z_changing_value CHANGING VALUE(pc_num) TYPE i.
pc_num = pc_num * 2.
ENDFORM.
Esse exemplo (mais besta do que simples) testa as possibilidades de parâmetros com a utilização do USING e CHANGING, mesclando as passagens por REFERÊNCIA e VALOR.
Apenas lendo o código, podemos definir o resultado como:
10 = variável início
10 = variável using
10 = variável using value
20 = variável changing
20 = variável changing value
Certo??? Não!!!!
O retorno do programa é:
10 = variável início
20 = variável using
10 = variável using value
20 = variável changing
20 = variável changing value
Reparem que a utilização do USING por REFERÊNCIA realiza a alteração do valor.
Aí você me pergunta: mas como assim a passagem utilizando USING, ou seja, passando um valor de ENTRADA, tem seu valor alterado?
Então eu respondo: Simples, porque sim (eu sei que a resposta é cretina, mas é a pura realidade, dessa vez o "Porque sim Zequinha" é válido).
Por definição, para que o valor não seja alterado quando utilizado via USING, o mesmo deve ser passado por VALOR (explicitando o VALUE) e não por REFERÊNCIA (implícito).
Resumindo, tanto os parâmetros de USING ou CHANGING podem ter o seu valor alterado.
Com isso, você começa a se questionar:
Então meu código funcionará corretamente, caso eu simplesmente arrancar todos os CHANGINGs do código?
Se você quiser alterara a variável de origem, sim.
E eu posso fazer isso?
Sim e não. Sim, irá funcionar. Não, pois isso envolve a metodologia de programação, sendo um modo para passagem de entrada e outro para passagem de saída. É quase igual a você entrar no seu carro pela porta do passageiro. Você pode fazer isso e funciona do mesmo modo, mas você tem um porta ao seu lado que serve para isso.
E o que isso vai mudar minha vida?
Em absolutamente nada!
Mas se isso não vai mudar nada, então por que é interessante eu saber disso?
Somente para você saiba que quando um determinado valor estiver sendo alterado inexplicavelmente, vale a pena verificar se você usou a variável desse valor como passagem de entrada (USING) em um FORM e realizou algo com ela.
Antes de iniciarmos, vamos rever algumas coisas que já sabemos:
- Todos nós já sabemos que podemos realizar a passagem de parâmetros para um FORM usando as opções USING e CHANGING.
- Também sabemos que temos a opção de passar variáveis por REFERÊNCIA ou por VALOR, assim como em inúmeras outras linguagens de programação.
- Finalmente, sabemos que o "USING" é destinado aos parâmetros de ENTRADA e, por "pseudo-lógica", não tem seu valor alterado, já o CHANGING é destinado aos parâmetros de SAÍDA e tem seu valor alterado.
Tudo certo quanto ao nosso conhecimento? Nem tanto...
Seja esse código abaixo:
DATA: lv_num1 TYPE i.
lv_num1 = 10.
WRITE: lv_num1, ' = variável início'.
NEW-LINE.
lv_num1 = 10.
PERFORM z_using USING lv_num1.
WRITE: lv_num1, ' = variável using'.
NEW-LINE.
lv_num1 = 10.
PERFORM z_using_value USING lv_num1.
WRITE: lv_num1, ' = variável using value'.
NEW-LINE.
lv_num1 = 10.
PERFORM z_changing CHANGING lv_num1.
WRITE: lv_num1, ' = variável changing'.
NEW-LINE.
lv_num1 = 10.
PERFORM z_changing_value CHANGING lv_num1.
WRITE: lv_num1, ' = variável changing value'.
NEW-LINE.
FORM z_using USING pe_num TYPE i.
pe_num = pe_num * 2.
ENDFORM.
FORM z_using_value USING VALUE(pe_num) TYPE i.
pe_num = pe_num * 2.
ENDFORM.
FORM z_changing CHANGING pc_num TYPE i.
pc_num = pc_num * 2.
ENDFORM.
FORM z_changing_value CHANGING VALUE(pc_num) TYPE i.
pc_num = pc_num * 2.
ENDFORM.
Esse exemplo (mais besta do que simples) testa as possibilidades de parâmetros com a utilização do USING e CHANGING, mesclando as passagens por REFERÊNCIA e VALOR.
Apenas lendo o código, podemos definir o resultado como:
10 = variável início
10 = variável using
10 = variável using value
20 = variável changing
20 = variável changing value
Certo??? Não!!!!
O retorno do programa é:
10 = variável início
20 = variável using
10 = variável using value
20 = variável changing
20 = variável changing value
Reparem que a utilização do USING por REFERÊNCIA realiza a alteração do valor.
Aí você me pergunta: mas como assim a passagem utilizando USING, ou seja, passando um valor de ENTRADA, tem seu valor alterado?
Então eu respondo: Simples, porque sim (eu sei que a resposta é cretina, mas é a pura realidade, dessa vez o "Porque sim Zequinha" é válido).
Por definição, para que o valor não seja alterado quando utilizado via USING, o mesmo deve ser passado por VALOR (explicitando o VALUE) e não por REFERÊNCIA (implícito).
Resumindo, tanto os parâmetros de USING ou CHANGING podem ter o seu valor alterado.
Com isso, você começa a se questionar:
Então meu código funcionará corretamente, caso eu simplesmente arrancar todos os CHANGINGs do código?
Se você quiser alterara a variável de origem, sim.
E eu posso fazer isso?
Sim e não. Sim, irá funcionar. Não, pois isso envolve a metodologia de programação, sendo um modo para passagem de entrada e outro para passagem de saída. É quase igual a você entrar no seu carro pela porta do passageiro. Você pode fazer isso e funciona do mesmo modo, mas você tem um porta ao seu lado que serve para isso.
E o que isso vai mudar minha vida?
Em absolutamente nada!
Mas se isso não vai mudar nada, então por que é interessante eu saber disso?
Somente para você saiba que quando um determinado valor estiver sendo alterado inexplicavelmente, vale a pena verificar se você usou a variável desse valor como passagem de entrada (USING) em um FORM e realizou algo com ela.
Até mais e obrigado pelos peixes.