1
 2
 3
 4
 5
 6
 7
 8
 9
10
* Как перед запуском макроса проверить наличие наблюдений в файле?
* Автор: Raynald Levesque, 13.11.2005, www.spsstools.net.

***************************.
*Шаг 1 (выполняется один раз):
***************************.

* Сохраните этот программный блок в файл "c:\\temp\\Run local if there are cases.SPS".
*---------------------------------.
BEGIN PROGRAM python.
11
12
13
14
15
import spss
if spss.GetCaseCount() == 0:	# т.е. пусто; макрос !local не запускаем, печатаем сообщение и выходим.
	spss.Submit("TITLE *Файл пуст, макрос запущен не будет")
else:
	spss.Submit("!local.")	# передаём в SPSS команду на запуск !local
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
END PROGRAM.

*Код, расположенный выше, назовём "программным блоком".

***************************.
* Шаг 2 (выполняется один раз):
***************************.

* Включим определение этого макроса в файл синтаксиса, исполняющийся при каждой загрузке SPSS.
*(как сделать такой файл? См. http://www.spsstools.ru/Scripts/Utils/AutomaticallyRunAscriptOrSyntaxWhenSPSSstarts.txt).
DEFINE !RunIfCase().
INSERT FILE="c:\\temp\\Run local if there are cases.SPS".
!ENDDEFINE.

*Примеч.: программные блоки не могут включаться внуть определения макроса, но 
вариант, предложенный выше, работает.


* ПРИМЕР №1.

*Допустим, исходный синтаксис таков. 
GET FILE="C:\\Program Files\\SPSS\\employee data.sav".
SELECT IF jobcat=10.
GRAPH /BAR(SIMPLE)=COUNT BY jobcat .
FREQ VAR= gender.

*Модифицируем его следующим образом.

GET FILE="C:\\Program Files\\SPSS\\employee data.sav".
SELECT IF jobcat=3.
EXECUTE. 
/* Тут необходима вставка EXECUTE чтобы обновить информацию о числе наблюдений в файле после отбора. */
DEFINE !local()
GRAPH /BAR(SIMPLE)=COUNT BY educ .
FREQ VAR= gender.
!ENDDEFINE
!RunIfCase.


* ПРИМЕР №2.

GET FILE='C:\\Program Files\\SPSS\\employee data.sav'.
SET MPRINT=NO.
SELECT IF 1=0 /* Чтобы получить пустой набор данных и убедиться, что макрос сработал как надо */ .
EXE.	
*Следующий макрос содержит код, который должен быть исполнен лишь при непустом наборе данных.
DEFINE !local()
SET MPRINT=YES.
GRAPH /BAR(SIMPLE)=COUNT BY jeduc .
!ENDDEFINE.

!RunIfCase.