SPSS 中的嵌套宏和以计算为条件的 !IF-!THEN 命令

Nested macros in SPSS and !IF-!THEN command with calculation as a condition

我需要计算几年。我当然可以分别调用每年的宏。但是,我更愿意只调用一次宏并使用额外的嵌套索引循环 (!DO !var = x !TO y).

我现在的问题是我还需要一个包含计算的 !IF-!THEN 条件:!IF (!year = !prev_year+1) !THEN 然而,这似乎是不可能的。然后我用一个额外的语法编写了计算的第二部分,然后插入。它有效,但不正确。您可以在下面找到带有示例的语法。

DEFINE !change_hh (lastyear = !TOKENS(1) / lastyear_minus_1=!TOKENS(1) / bedingung = !TOKENS(1) / eyear = !TOKENS(1))
!DO !year= 2011 !TO !lastyear.
    !DO !prevyear= 2010 !TO !lastyear_minus_1.
    COMPUTE prevyear= !year-1.
    exe.
    ALTER TYPE prevyear (F4.0).
    DO IF $casenum = 1.
    WRITE OUTFILE=!QUOTE(!CONCAT("path\anyname_",!year,".sps"))
     /"DEFINE @bedingung() ", prevyear, " !ENDDEFINE.".
    END IF.
    EXE.  

    INSERT FILE = !QUOTE(!CONCAT("path\anyname_",!year,".sps")). 
        !IF (!prevyear= !EVAL(!bedingung)) !THEN
                COMPUTE !CONCAT("test_year_",!eyear) = !eyear.
                COMPUTE !CONCAT("test_prevyear_",!prevyear) = !prevyear.
                exe.
        !IFEND.
    !DOEND.
!DOEND.
EXE.
!ENDDEFINE.
!change_hh lastyear_minus_1 = 2014 lastyear= 2015 bedingung = @bedingung eyear = @jahr.

我只得到变量test_year_2015test_prevyear_2014。怎么了?我只是不明白。 我认为它首先适用于 year = 2011 并经历所有前几年。之后,它使用 year = 2012 并再次遍历所有前几年。等等。

SPSS 宏只能使用宏参数作为(文本)构建块来创建语法。除其他限制外,这意味着宏不能像 !IF (!year = !prev_year+1) !then 那样对参数执行数学运算。

SPSS 宏的另一个限制使得很难在两个单独的日期数组上循环 - 这将是一个自然的解决方案 ()。

STILL - 这里是关于如何在此处获得相同效果的可能建议:

define ....
.....
!let !prevyr="2010"
!do !year= 2011 !to !lastyear.
  ... use arguments !year and !prevyr ....
  !let !prevyr=!year
!doend

在此循环中,在每次迭代结束时,!prevyr 参数接收值或 !year 参数并为下一次迭代做好准备。