BookmarkSubscribeRSS Feed
DaniloTrindade
Fluorite | Level 6

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.

2 REPLIES 2
cepmiranda
SAS Employee

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):

 

cepmiranda_0-1638563557907.png

 

Espero ter contribuído.

Mas, se eu não tiver, comente aqui e a comunidade poderá nos ajudar.

 

atte.

Carlos Miranda

 

DaniloTrindade
Fluorite | Level 6

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

SAS Innovate 2025: Call for Content

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!

Submit your idea!

Discussion stats
  • 2 replies
  • 897 views
  • 2 likes
  • 2 in conversation