Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Macro variáveis x macro funções

Olá tudo bem?

Gostaria de saber sobre um pequeno detalhe que não foi comentado neste vídeo sobre macro funções. Trata-se da macro variável. Com base no código abaixo podemos afirmar que ao passar o parâmetro para a função estamos alterando o valor da macro variável?

Caso a resposta seja SIM é um pouco estranho, pois não estamos atribuindo valores na macro variável safra, estamos apenas usando esse nome como parâmetro da macro função. Concordam?

Faço esse questionamento porque no vídeo que antecede falando especificamente sobre a macro variável ele falou que teríamos que mudar o VALOR que está sendo atribuído. Neste caso a macro variávelsafra é descartável? Esse ponto ficou um pouco confuso.

%let safra = 201710;

%macro cruza_clientes_jogos(safra);

proc sql;
    create table cadastro_cliente_jogos_&safra as
    select 
        a.*,
        b.total_contratos_2017T4 as total_contratos_&safra,
        b.contratos_validos_2017T4 as contratos_validos_&safra
    from alura.cadastro_cliente_v3 as A
    left join operacoes_&safra._consolidada as B
    on input(substr(a.cpf,1,11),commax11.0) = b.cpf
;quit;

%mend cruza_clientes_jogos;

/* Chamando a macro função 3x com parâmetros diferentes */
%CRUZA_CLIENTES_JOGOS(201710);
%CRUZA_CLIENTES_JOGOS(201711);
%CRUZA_CLIENTES_JOGOS(201712);

Será que o parâmetro da macro função sobrescreve o valor da macro variável?

Obrigado pela ajuda e esclarecimentos. Curso top!

2 respostas
solução!

Boa tarde,

Criar macro variáveis e macro parâmetros com o mesmo nome gera muita confusão. Os parâmetros de uma macro são variáveis locais que existem apenas dentro da macro (a menos que sejam configurados de outra forma).

O código como está não irá gerar um erro, mas a primeira declaração da variável safra não é utilizada em nenhum momento, pois a macro irá priorizar o uso do parâmetro local. Tanto que se você checar o valor dela após a execução do código, ela continua com o valor 201710.

Uma outra forma de fazer essa macro seria fazer com que ela não tivesse parâmetro (%macro cruza_clientes_jogos;, etc) , mas assim ele teria que ser declarado antes de todas as chamadas da macro:

%let safra = 201710;
%CRUZA_CLIENTES_JOGOS

Ou se você quiser usar a macro variável declarada inicialmente como parâmetro da macro, basta passá-la na chamada da macro:

%let safra1 = 201710;
%CRUZA_CLIENTES_JOGOS(&safra1.)

De qualquer forma, evite usar nomes iguais para variáveis diferentes.

Entendi. Obrigado.