Макропеременные: очевидная символьная ссылка не разрешена

У меня проблема с неразрешенной макропеременной в следующем (части) макроса:

DATA _NULL_;
  SET TempVarFormat END=Last;
  LENGTH FormatValues $10000;
  RETAIN FormatValues;
  IF &OnlyNumeric = 1 THEN
    FormatValues = CATX(" ",FormatValues,STRIP(LookUpValue)||
    " = "||CATQ("A",TRIM(LookupDescription)));
  ELSE
    FormatValues = CATX(" ",FormatValues,CATQ("A"
    ,LookUpValue)||" = "||CATQ("A"
    ,TRIM(LookupDescription)));
  Test = STRIP(FormatValues);
  PUT Test /* To test buildup of variable */;
  IF Last THEN CALL SYMPUT('FormatValuesM',STRIP(FormatValues));
  IF Last THEN CALL SYMPUT('DataCollectionFK',DataCollectionFK);
RUN;
/* Make format with PROC FORMAT*/
%IF &OnlyNumeric = 1 %THEN %DO;
  PROC FORMAT LIB=WORK;
  VALUE DC&DataCollectionFK.A&AttributeFK.Format &FormatValuesM;
  RUN;
%END;
%ELSE %IF &OnlyNumeric = 0 %THEN %DO;
  PROC FORMAT LIB=WORK;
  VALUE $DC&DataCollectionFK.A&AttributeFK.Format &FormatValuesM;
  RUN;
%END;

Я получаю следующее предупреждение

Apparent symbolic reference FORMATVALUESM not resolved.

И если я посмотрю в журнал, & DataCollectionFK разрешен, а & FormatValues ​​- нет.

PROC FORMAT LIB=WORK; VALUE DC170A570Format &FormatValuesM;

Может кто-нибудь посоветовать? Это сводит меня с ума.

Я тестировал его также без функции STRIP () и заменил CALL SYMPUT на PUT, чтобы увидеть, присвоено ли переменной значение. Все работает нормально.

Копия журнала (как указано в комментарии)

4         +
      DATA _NULL_; SET TempVarFormat END=Last; LENGTH

5         + FormatValues $10000; RETAIN FormatValues; IF 1 = 1 THEN FormatValues = CATX(" 
",FormatValues,STRIP(LookUpValue)|| " = "||CATQ("A",TRIM(LookupDescription))); ELSE 
FormatValues = CATX(" ",FormatValues,CATQ("A" ,LookUpValue)||" = "||CATQ("A" ,TRIM
6         +(LookupDescription))); Test = STRIP(FormatValues); PUT Test ; IF Last THEN CALL 
SYMPUT('DataCollectionFK',DataCollectionFK); IF Last THEN CALL SYMPUT('FormatValuesM',Test); 
RUN;

NOTE: Numeric values have been converted to character values at the places given by: 
      (Line):(Column).
      6:107   
1 = "Ja"
1 = "Ja" 0 = "Nee"
NOTE: There were 2 observations read from the data set WORK.TEMPVARFORMAT.
NOTE: DATA statement used (Total process time):
      real time           0.00 seconds
      cpu time            0.00 seconds

6         +
        PROC FORMAT LIB=WORK;  VALUE DC170A1483Format &FormatValuesM;  RUN;;

NOTE: Format DC170A1483FORMAT is already on the library.
NOTE: Format DC170A1483FORMAT has been output.
NOTE: PROCEDURE FORMAT used (Total process time):
      real time           0.00 seconds
      cpu time            0.00 seconds

ЖУРНАЛ MPRINT

MPRINT(CONSTRUCTVARIABLEFORMAT):   DATA TestDataSetFormat;
MPRINT(CONSTRUCTVARIABLEFORMAT):   SET TempVarFormat END=Last;
MPRINT(CONSTRUCTVARIABLEFORMAT):   LENGTH FormatValues $10000;
MPRINT(CONSTRUCTVARIABLEFORMAT):   RETAIN FormatValues;
MPRINT(CONSTRUCTVARIABLEFORMAT):   IF 1 = 1 THEN FormatValues = CATX(" 
",FormatValues,STRIP(LookUpValue)|| " = "||CATQ("A",TRIM(LookupDescription)));
MPRINT(CONSTRUCTVARIABLEFORMAT):   ELSE FormatValues = CATX(" ",FormatValues,CATQ("A" 
,LookUpValue)||" = "||CATQ("A" ,TRIM(LookupDescription)));
MPRINT(CONSTRUCTVARIABLEFORMAT):   Test = STRIP(FormatValues);
MPRINT(CONSTRUCTVARIABLEFORMAT):   PUT Test ;
MPRINT(CONSTRUCTVARIABLEFORMAT):   IF Last THEN CALL 
SYMPUT('DataCollectionFK',DataCollectionFK);
MPRINT(CONSTRUCTVARIABLEFORMAT):   IF Last THEN CALL SYMPUT('FormatValuesM',Test);
MPRINT(CONSTRUCTVARIABLEFORMAT):   RUN;
MPRINT(CONSTRUCTVARIABLEFORMAT):   PROC FORMAT LIB=WORK;
WARNING: Apparent symbolic reference FORMATVALUESM not resolved.
MPRINT(CONSTRUCTVARIABLEFORMAT):   VALUE DC170A1483Format &FormatValuesM;
MPRINT(CONSTRUCTVARIABLEFORMAT):   RUN;

ИЗМЕНИТЬ, сделав еще несколько попыток: проблема заключается в том, что макропеременная по какой-то причине не получает значение во время этапа обработки данных. Загрузка макропеременной с пустым значением перед запуском макроса приводит к тому, что сценарий не выдает ошибку. Но переменная разрешается как пустая переменная.

удаление частей IF Last THEN также не влияет на результат.


person Wietze314    schedule 08.05.2014    source источник
comment
Я не могу воссоздать ошибку. Не могли бы вы опубликовать часть журнала, относящуюся к шагу данных?   -  person mjsqu    schedule 08.05.2014
comment
Спасибо за помощь. Я добавил журнал, как вы просили @mjsqu   -  person Wietze314    schedule 08.05.2014
comment
Куда пропал ERROR ?!   -  person mjsqu    schedule 08.05.2014
comment
Ошибка отображается над этими блоками. Сколько раз выполняется макрос. Как вы можете видеть в журнале, строка PROC FORMAT LIB=WORK; VALUE DC170A1483Format &FormatValuesM; RUN; одна из макропеременных не разрешена. Значит форматы пустые.   -  person Wietze314    schedule 08.05.2014
comment
Можете ли вы запустить его снова с включенным OPTIONS MPRINT;? Строка в журнале не обязательно будет содержать значение &FormatValuesM, если эта опция не включена.   -  person mjsqu    schedule 08.05.2014
comment
Я думаю, СИМВОЛГЕН - более подходящий вариант. Я не вижу сообщения о том, что проблема не решена. Если у вас нет проблем с макроскопической областью, я не думаю, что это должно быть проблемой.   -  person Joe    schedule 08.05.2014
comment
Вы делаете все это только для создания формата из набора данных? Есть гораздо более простой способ.   -  person Joe    schedule 08.05.2014
comment
Привет, Джо. Более легкий путь мне не известен. Я делаю процедуру, которая автоматически собирает динамические данные из хранимой процедуры SQL-сервера. Форматы также хранятся в базе данных как пары значение-описание. Они динамически собираются в зависимости от того, какой набор данных запрашивается с сервера.   -  person Wietze314    schedule 08.05.2014
comment
Журнал MPRINT добавлен. Это показывает, что переменная не разрешена.   -  person Wietze314    schedule 08.05.2014
comment
Вы должны иметь возможность делать это полностью без макросов (возможно, с одной или двумя макропеременными, если у вас есть параметры); Для этого вовсе не должны быть необходимы операторы макроязыка. Все, что вы делаете выше, может быть легко выполнено на этапе данных (да, даже при одновременном использовании нескольких форматов, даже при использовании некоторых символов char / some not char).   -  person Joe    schedule 08.05.2014
comment
Кроме того, Enterprise-guide не подходит для этого вопроса, независимо от того, используете ли вы его здесь, не имеет отношения к результат.   -  person Joe    schedule 08.05.2014


Ответы (1)


Конечно, будет проще / проще использовать параметр cntlin= для PROC FORMAT для передачи набора данных, содержащего соответствующее имя формата, начало, конец, значения метки ...

Простой пример ...

/* Create dummy format data */
data formats ;
  fmtname = 'MYCHARFMT' ;
  type = 'C' ;
  do n1 = 'A','B','C','D','E' ;
    start = n1 ;
    label = repeat(n1,5) ;
    output ;
  end ;
  fmtname = 'MYNUMFMT' ;
  type = 'N' ;
  do n2 = 1 to 5 ;
    start = n2 ;
    label = repeat(strip(n2),5) ;
    output ;
  end ;
  drop n1 n2 ;
run ;

/* dummy data looks like this... */
 fmtname     type    start    label

MYCHARFMT     C        A      AAAAAA
MYCHARFMT     C        B      BBBBBB
MYCHARFMT     C        C      CCCCCC
MYCHARFMT     C        D      DDDDDD
MYCHARFMT     C        E      EEEEEE
MYNUMFMT      N        1      111111
MYNUMFMT      N        2      222222
MYNUMFMT      N        3      333333
MYNUMFMT      N        4      444444
MYNUMFMT      N        5      555555

/* Build formats from dataset */
proc format cntlin=formats library=work ; run ;

Есть несколько других полей, которые могут быть определены в вашем наборе данных формата для обслуживания низких / высоких / отсутствующих значений, диапазонов и т. Д.

См. Документацию SAS> http://support.sas.com/documentation/cdl/en/proc/61895/HTML/default/viewer.htm#a002473464.htm

person Chris J    schedule 08.05.2014
comment
Удивительный. Я не знал об этом варианте ... Обязательно разберусь в этом дальше. Тем не менее я не понимаю, почему мой макрос не работает. - person Wietze314; 08.05.2014
comment
Я бы просто не беспокоился об этом. Ваш код был не очень хорошим способом сделать это; возможно, что-то не так в вашем макросе (возможно, проблемы с областью видимости, возможно, что-то еще, что вы не включаете в свой вопрос). Просто сделай это лучше :) - person Joe; 08.05.2014
comment
Хотя этот ответ не дал ответа на этот вопрос, он дал гораздо лучшее предложение. Спасибо за понимание, в чем был план, и за то, что указали мне гораздо лучшее направление. Работает как часы! - person Wietze314; 08.05.2014