**************************************************. ** Вопрос. **************************************************. Ломаю голову над следующим макросом: --------------- Начало ------------------------- define !compint (!pos !tokens(1) /!pos !tokens(1)). compute nobreak = 1. exec. aggregate outfile ='c:\\windows\\temp\\SPSS_002.tmp' /break= nobreak /minv1 = min(!1) /maxv1 = max(!1) /minv2 = min(!2) /maxv2 = max(!2). match files /file=* /table= 'c:\\windows\\temp\\SPSS_002.tmp' /by= nobreak. do if ($casenum=1). write outfile= 'c:\\windows\\temp\\minmax.sps' /'define min1() ' minv1 ' !enddefine.' /'define max1() ' maxv1 ' !enddefine.' /'define min2() ' minv2 ' !enddefine.' /'define max2() ' maxv2 ' !enddefine.'. end if. execute. include file='c:\\windows\\temp\\minmax.sps'. !do !i = min1 !to max1. !do !j = min2 !to max2. !let !varnam = !concat(i,!1,!2,!i,!j). numeric !varnam (f1). !let !lab = !quote(!concat(!1, ' cat-',!i,' & ',!2,' cat-',!j)). variable label !varnam !lab. !doend. exec. !doend. match files /file=* /drop= nobreak minv1 minv2 maxv1 maxv2. exec. !enddefine. data list free / x z. begin data 1 2 1 3 1 1 2 3 2 3 2 1 1 2 end data. !compint x z. ---------------- Конец макроса/синтаксиса ----------------------------------- Задача приведённого выше макроса - создать новые переменные как комбинации всех пар категорий для переменных X и Z. Результат должен выглядеть так (новые переменные): ixz11 ixz12 ixz13 ixz21 ixz22 ixz23 Но когда запускаю макрос, появляется ошибка (Error # 1. Command name: !ERROR_MACRO ...) Что я делаю неправильно? **************************************************. ** Решение размещено Реем в SPSSX-L 26.09.2001. **************************************************. Попытка в рамках ОДНОГО И ТОГО ЖЕ макроса 1) определить новый макрос, 2) включить его через 'include' и 3) использовать его - сложный путь решения проблемы. * Разбивка действий на 2 макроса и использование функции !EVAL при ссылке на динамически определяемый макрос, решит все вопросы. * Вот пересмотренный синтаксис. SET MPRINT=no. *////////////////////. define !compint (!pos !tokens(1) /!pos !tokens(1)) compute nobreak = 1. aggregate outfile ='c:\\temp\\SPSS_002.tmp' /break= nobreak /minv1 = min(!1) /maxv1 = max(!1) /minv2 = min(!2) /maxv2 = max(!2). match files /file=* /table= 'c:\\temp\\SPSS_002.tmp' /by= nobreak. do if ($casenum=1). write outfile= 'c:\\temp\\minmax.sps' /'define min1() ' minv1 ' !enddefine.' /'define max1() ' maxv1 ' !enddefine.' /'define min2() ' minv2 ' !enddefine.' /'define max2() ' maxv2 ' !enddefine.'. end if. execute. include file='c:\\temp\\minmax.sps'. EXECUTE. !compin2 !1 !2. !enddefine. *////////////////////. *////////////////////. define !compin2(!pos=!tokens(1) /!pos=!tokens(1)) !do !i = !EVAL(min1) !to !EVAL(max1) !do !j = !EVAL(min2) !to !EVAL(max2) !let !varnam = !concat(i,!1,!2,!i,!j) numeric !varnam (f1). !let !lab = !quote(!concat(!1, ' cat-',!i,' & ',!2,' cat-',!j)) variable label !varnam !lab. !doend. exec. !doend. match files /file=* /drop= nobreak minv1 minv2 maxv1 maxv2. exec. !enddefine. *////////////////////. data list free / x z. begin data 1 2 5 8 1 1 2 3 2 3 2 1 1 2 end data. FORMATS x z (F1.0). SET MPRINT=yes. !compint x z.