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.
... View more