1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
*Пример вызова синтаксиса для тех файлов данных, имена которых автоматически определяются,
* исходя из содержимого основного файла данных.
*Допустим, у нас несколько файлов данных содержат какую-то информацию о разных домах (с номерами 202, 300, 509 и т.д.).
*Имя файла содержит в себе номер дома, которому он соответствует.
*А в файле hhnumbers у нас есть перечень номеров домов, информацию о которых надо подвергнуть
* обработке. Ниже показано, как можно автоматически открывать поочерёдно нужные файлы и применять
* к ним одни и те же команды обработки.

* Создадим несколько примеров файлов с информацией о разных домах.
DATA LIST LIST /hnumb(F8) usedeal(F8) korting(F8) shoptr1(F8) wfk(F8).
BEGIN DATA
202 2 2 5 110
202 1 3 5 110
202 3 2 2 3
END DATA.
SAVE OUTFILE='c:\\temp\\hh202pc2.sav'.

DATA LIST LIST /hnumb(F8) usedeal(F8) korting(F8) shoptr1(F8) wfk(F8).
BEGIN DATA
300 2 7 5 110
300 2 8 1 110
END DATA.
SAVE OUTFILE='c:\\temp\\hh300pc2.sav'.

DATA LIST LIST /hnumb(F8) usedeal(F8) korting(F8) shoptr1(F8) wfk(F8).
BEGIN DATA
509 2 75 1 110
509 2 75 1 110
509 2 75 1 0
END DATA.
SAVE OUTFILE='c:\\temp\\hh509pc2.sav'.

 * Определим файл с номерами домов, информация по которым требует обработки.
DATA LIST LIST /hnumb(F8).
BEGIN DATA.
202
300
509
END DATA.
LIST.
 
SAVE OUTFILE='c:\\temp\\hnumbers.sav'.

*******.
SET MPRINT=on.

* Определим макрос, который будет проводить анализ отдельного дома.
* Т.е. это ваш рабочий синтаксис со следующими изменениями
1. добавлена строка DEFINE в начале
2. добавлена строка ENDDEFINE в конце
3. добавлены две команды 'let', которые определяют имена файлов
4. изменены пути, чтобы соответствовать действительному расположению файлов
   Я использовал короткие пути для проверки этого синтаксиса. Ray.

*///////////////////////////////////////////////////////.
DEFINE !do_job(hnumb=!TOKENS(1))
!LET !file1=!QUOTE(!CONCAT('C:\\temp\\hh',!hnumb,'pc2.sav')).
GET FILE=!file1.
EXECUTE .

IF (MISSING(usedeal) and korting >=0.05) usedeal=11.
IF (MISSING(usedeal) and korting < 0.05) usedeal=5.
EXECUTE.

SAVE OUTFILE=!file1.


FILTER OFF.
USE ALL.
SELECT IF(wfk=110).
EXECUTE .

IF (( missing(LAG(shoptr1))|(LAG(shoptr1)~=shoptr1)))record2=1.
EXECUTE.

!LET !file2=!QUOTE(!CONCAT('C:\\temp\\result_hh',!hnumb,'pc2 4.sav')).
SAVE OUTFILE=!file2 /KEEP=hnumb usedeal korting
 /COMPRESSED.
!ENDDEFINE.
*///////////////////////////////////////////////////////.


*Теперь запишем синтаксис, который будет вызывать определённый выше макрос для файла данных
* по каждому отдельному дому.
GET FILE='C:\\temp\\hnumbers.sav'.
WRITE OUTFILE='C:\\temp\\do the job.sps'
/ '!Do_job hnumb=' hnumb '.'.
Execute.
New file.

* Эта строка запускает всю процедуру анализа.
INCLUDE 'C:\\temp\\do the job.sps'.