2016-07-20 4 views
1

У меня есть функция, которая вызывает макрос SAS, который отвечает за вызов API и получает ваш ответ. Эта функция вызывается из данных шага, передавая параметр.Не могу получить возвращаемое значение из пользовательских функций в SAS

Весь процесс работает правильно, за исключением того, что я не могу получить значение ответа в datastep.

Если я запускаю макрос отдельно, я могу записать в журнал ответ API, поэтому я понимаю, что он сможет вернуться к моему файлу datastep.

Любые идеи?

Вот код

Макро

%macro acortador(); 
%put &url_larga; 

data _null_; 
length url $ 2048; 
url = catt(
'http:XXXXXX',urlencode(trimn(&url_larga))); 
call symputx('REQUEST_URL', url); 
run; 

%put &REQUEST_URL; 

/* API request */ 
filename out "XXXXXXXX.xml"; 

proc http 
    out=out   
    url= "%superq(REQUEST_URL)" 
    method="get"; 
run; 

/* response xml */ 
filename data 'XXXXXXX.xml'; 

data _null_; 
    infile data lrecl = 32000 truncover scanover; 
     input      
      @"<status>" shorturl $255. @@; 
     shorturl = substr(shorturl,1,index(shorturl,'</')-1); 
     call symputx('r', shorturl); 
run; 

%put &r; 

%mend acortador; 

Функция

proc fcmp outlib=work.funcs.test; 
function acortador(url_larga $) $ 300; 
rc = run_macro('acortador', url_larga, r); 
    return (r); 
endsub; 
quit; 

options cmplib=work.funcs; 

Datastep

data test; 
    set work.origin_table; 
    r = acortador(some_parameter); 
run; 
+0

Что такое 'run_macro'? Это еще одна функция? –

+0

Вам нужно было вызвать макрос. [Support.sas] (http://support.sas.com/documentation/cdl/en/proc/65145/HTML/default/viewer.htm#n19ylmyrvhp7y6n1889zmwsv9nuh.htm) – Bigandrew

+0

Спасибо, я еще не видел эту функцию вызова , –

ответ

1

Вопрос с возвратной переменной r используется в RUN_MACRO. Вы не назначили ему длину, по умолчанию SAS предполагает, что это число, и, следовательно, вы можете получить a. (число отсутствует). Если вы попытаетесь создать макроспределение генерации, скажем,% let r = 1; то вы получите возвращаемое значение 1 в вашем текущем коде. Но так как мы смотрим на получение измененной строки ответа. Чтобы получить значение символа, просто добавьте длину для r перед первым использованием.

length r $ 32767; 
rc = run_macro('acortador', url_larga, r); 

Надеюсь, это поможет.

+0

спасибо, много! его работы прекрасны! – Bigandrew

Смежные вопросы