Saudações,
Gostaria de compartilhar uma dificuldade que enfrentei durante os estudos sobre tarefas customizadas utilizando a ferramenta SAS Studio e como a resolvi. Trata-se de um erro na documentação ou erro de interpretação de minha parte ao utilizar a documentação para estudar. Se puder me ajude a entender.
Após finalizar o curso Writing a Custom Task for SAS Studio decidi fazer o que sempre faço para fixar o conteúdo, escrever anotações. Desta vez escrevi um arquivo mostrando os passos para criar uma task customizada, explicando com minhas palavras o processo que entendi nas aulas e documentação.
Identificando e Resolvendo o Primeiro Erro
O primeiro erro que apareceu durante o estudo foi com relação ao código reescrito para mostrar a facilidade de usar macro variáveis em um código SAS. Observe o problema, no curso foi apresentado o seguinte exemplo:
%let inDS = work.character;
%let outDS = work.numDates;
%let convert = EnrollDate;
%let newCol=&convert.New;
%let informat = ddmmyy10;
data &outDS;
set &inDS;
&newCol = input(&convert, &informat..);
run;
Observa-se claramente que para cada entrada na etapa do processo DATA há uma macro variável correspondente, ou seja, output, input, newColumn, convert e informat. Tudo certo neste exemplo.
Já na documentação está faltando uma macro variável no exemplo que é ensinado, ou seja, não há a macro variável de saída. Observe o código abaixo, ele deu origem a um erro justamente por não ter a macro variável que define o destino de saída dos dados, uma outlibname, mas ela foi utilizada no código, mesmo sem ser definida.
%let inlibname = work;
%let indsname = character;
%let invarname = date;
%let outdsname = character_out;
%let informat = ddmmyy10;
data &outlibname.&outdsname;
set &inlibname..&indsname;
&invarname._new = input(&invarname,&informat..);
run;
Além disso, também está faltando mais um ponto que é responsável por informar a biblioteca que o arquivo será salvo na etapa de saída dos dados, ou seja, &outlibname.&outdsname.
Para resolver este problema e fazer o código funcionar sem erros, precisei corrigir alguns pontos para rodar o programa com sucesso, para isso realizei as seguintes alterações:
Criei a macro variável que não foi criada na documentação, a outlibname.
%let outlibname = work;
Adicionei mais um ponto entre &outlibname e &outdsname na demonstração de saída.
data &outlibname..&outdsname;
Um ponto serve para que a variável funcione, e o outro para acessar um arquivo dentro de uma biblioteca específica, neste caso, a biblioteca que irá receber o arquivo de saída.
Erro na Aplicação do Apache Velocity
Ao implementar o elemento CodeTemplate com a linguagem Apache Velocity, segundo o exemplo mostrado na documentação, o código deveria funcionar exatamente como mostra o código abaixo. Mas ele gera um erro por não encontrar a variável "charvar". Onde ela foi definida?
#set($character=$invarname.get(0))
#set($informat = "${informatType}${informatWidth}.")
data $outputDSName;
#if ($samename == '1')
#set($newCol = "${charvar}_old")
set $inlibname(rename = $charvar=$newCol);
$charvar = input($newCol, $informat);
drop $newCol;
#else
#set($newCol = "${charvar}_new")
set $inlibname;
$newCol = input($charvar, $informat);
#end
run;
Este é o código gerado quando não será necessário renomear coluna.
data WORK.Test0001;
set WORK.CHARACTER;
${chavar}_new=input($charvar, BEST10.);
run;
Este é o código gerado quando será necessário renomear coluna.
data WORK.Test0001;
set WORK.CHARACTER(rename=$charvar=${charvar}_old);
$chavar=input(${charvar}_old, BEST10.);
drop ${charvar}_old;
run;
Analisando o restante do documento CTM, mais precisamente no elemento DataSource, percebi que essa variável deveria receber a informação que vem do campo invarname. Com isso, ali na primeira linha do Velocity estamos definindo que &character irá receber o valor que vem desse campo. Portanto, todas as variáveis destacadas deveriam ser character e não charvar. Mas isso é explicado em que ponto na documentação?
Fiz as mudanças e o programa funcionou corretamente, as alterações realizadas poderá ser conferida no código a seguir.
#set($character=$invarname.get(0))
#set($informat = "${informatType}${informatWidth}.")
data $outputDSName;
#if ($samename == '1')
#set($newCol = "${character}_old")
set $inlibname(rename = $character=$newCol);
$character = input($newCol, $informat);
drop $newCol;
#else
#set($newCol = "${character}_new")
set $inlibname;
$newCol = input($character, $informat);
#end
run;
Este é o código do script corrigido quando não será necessário renomear a coluna.
data WORK.Test0001;
set WORK.CHARACTER;
EnrollDate_new=input(EnrollDate, BEST10.);
run;
Este é o código do script corrigido quando for necessário renomear a coluna.
data WORK.Test0001;
set WORK.CHARACTER(rename=EnrollDate=EnrollDate_old);
EnrollDate=input(EnrollDate_old, BEST10.);
drop EnrollDate_old;
run;
Analisando essas informações com calma você acha que realmente a documentação precisa ser corrigida nesses pontos ou é apena um equívoco de minha parte?
Você pode verificar a veracidade das informações que apresentei analisando a própria documentação nesses links. Confira também o resultado deste meu estudo completo neste post.
About the SAS Program for This Example
Step 5: Add the Apache Velocity Code
Obrigado pela atenção e ajuda.
Olá Danilo.
Boa tarde.
Agradeço por nos alertar das suas desconfianças de erros da documentação.
Com relação ao primeiro erro relatado (uso de outlibname como macro sem declarar e sem o ponto adicional), eu tive a mesma impressão que você: estes detalhes parecem faltar na documentação.
Já enviei o seu comentário para o time que prepara documentações e, creio, isso deve ser corrigido em breve.
Com relação ao segundo, creio que ele já foi corrigido (com todas as menções sendo a $charvar):
Espero ter contribuído.
Mas, se eu não tiver, comente aqui e a comunidade poderá nos ajudar.
atte.
Carlos Miranda
Olá Carlos.
Boa noite.
Agradeço pelo retorno e aproveito para informar que esses comentários foram feitos a partir das tentativas que apliquei, onde não estava funcionando, com as mudanças, passou a funcionar. Então, observando a própria documentação encontrei essas discrepâncias e decidi compartilhar para que outras pessoas mais próximas ao SAS (sou apenas um mero estudante independente) possam analisar e ver se realmente a documentação de fato precisa de uma correção nesses pontos.
Além disso, a imagem que compartilhou da documentação mostra que a variável charvar continua sendo usada quando, na verdade, deveria utilizar, em todos os pontos que destaquei, a variável character que, inclusive, recebeu a propriedade definida na Rule capturando a coluna a ser utilizada (campo requirido). Com isso, na imagem que compartilhou não parece que as mudanças foram realizadas, pois "charvar" continua lá.
Eu fiz todos os testes, realizei as mudanças e compartilhei tudo funcionando no PDF anexo a neste post e por este motivo acredito que a documentação precisa ser alterada esses pontos.
Grato,
Danilo Castro
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!