Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* rexx */
- /* Обязательный комментарий, чтобы интерпретатор определил, что программа написана на языке REXX. Должен стоять на месте 1й строки. */
- /* Определить переменную, для хранения имени диска */
- VOLSER='Z1DBMR'
- /* Вызов основной процедуры FIND */
- CALL FIND
- /* Вывод результатов */
- SAY TAPENAME SEQ
- /* Прекращение работы программы */
- EXIT 0
- /* Начало процедуры */
- /* Определение списка глобальных переменных */
- FIND: PROCEDURE EXPOSE VOLSER TAPENAME SEQ
- /* Запись информации о наличии набора данных */
- /* в переменную */
- DSNLOG=SYSDSN("'SOFT.SUPPORT("VOLSER")'")
- /* Проверка на наличие указанного диска */
- /* в библиотеке SOFT.SUPPRT */
- IF DSNLOG='OK' THEN
- DO
- /* В случае, когда такой раздел существует: */
- /* с помощью потокового вывода, данные */
- /* записываются в массив строк VOL. */
- "alloc da('SOFT.SUPPORT("VOLSER")') F(INPUT) shr reuse"
- "execio * diskr INPUT (stem VOL. finis"
- "FREE F(INPUT)"
- /* С помощью строковой команды, берется имя ленты, */ /* на которой хранится последний бэкап */
- TAPENAME=SUBSTR(VOL.3,57,6)
- /* Если временный файл LIB1 существует, */
- /* то он удаляется */
- if sysdsn("'LIB1'")='OK' THEN
- DO
- ADDRESS TSO "DELETE 'LIB1'"
- END
- /* Создается файл LIB1 и в него записывается */ /* информация о хранимых на ленте дисках */
- "HSEND LIST DUMPVOLUME("TAPENAME") ODS('LIB1')"
- /* Команда ожидания, для успешного чтения файла LIB1 */
- ADDRESS SYSCALL 'sleep 1'
- "alloc da('LIB1') F(indd) shr reuse"
- /* Запись строк в массив strings. */
- "execio * diskr indd (stem strings. finis"
- "free f(indd)"
- /* P - Переменная, для увеличения массивов строк */
- /* и проверки результатов поиска */
- P=0
- DO I=1 TO STRINGS.0
- /* Поиск диска в массиве (результате команды HSEND) */
- IF INDEX(STRINGS.I,' 'VOLSER' ') /= 0 THEN
- DO
- P=P+1
- STRS.0=P
- STRSFULL.0=P
- STRS.P=SUBSTR(STRINGS.I,25,3)
- STRSFULL.P=STRINGS.I
- END
- END
- /* Если найдено 1 и более строк */
- IF P /= 0 THEN
- DO
- /* Если найдено более 1 строки */
- /* Происходит выбор строки с последней датой */
- IF P>1 THEN
- DO
- /* Устанавливаются начальные значения YYYY/MM/DD */
- Y=SUBSTR(STRSFULL.1,50,4)
- M=SUBSTR(STRSFULL.1,55,2)
- D=SUBSTR(STRSFULL.1,58,2)
- SEQ=SUBSTR(STRSFULL.1,25,3)
- DO I=2 TO STRS.0
- /* Сравнение найденной даты с текущими */
- IF SUBSTR(STRSFULL.I,50,4)>Y THEN
- DO
- Y=SUBSTR(STRSFULL.I,50,4)
- M=SUBSTR(STRSFULL.I,55,2)
- D=SUBSTR(STRSFULL.I,58,2)
- SEQ=SUBSTR(STRSFULL.I,25,3)
- END
- ELSE
- IF SUBSTR(STRSFULL.I,50,4)=Y THEN
- DO
- IF SUBSTR(STRSFULL.I,55,2)>M THEN
- DO
- M=SUBSTR(STRSFULL.I,55,2)
- D=SUBSTR(STRSFULL.I,58,2)
- SEQ=SUBSTR(STRSFULL.I,25,3)
- END
- ELSE
- IF SUBSTR(STRSFULL.I,55,2)=M THEN
- DO
- IF SUBSTR(STRSFULL.I,58,2)>D THEN
- DO
- D=SUBSTR(STRSFULL.I,58,2)
- /* С помощью строчных команд берется номер блока */
- SEQ=SUBSTR(STRSFULL.I,25,3)
- END
- END
- END
- END
- /* Номер блока подставляется в формулу и находится */
- /* позиция заданного диска на ленте*/
- SEQ=2+(SEQ-1)*3
- SAY 'LAST DATE:'||Y||'/'||M||'/'||D||
- RETURN 1
- END
- ELSE
- DO
- /* Если была найдена одна строка и сортировки */
- /* по дате не было, сразу же берется номер блока */
- SEQ=SUBSTR(STRSFULL.1,25,3)
- SEQ=2+(SEQ-1)*3
- RETURN 1
- END
- END
- ELSE
- /* Если не найдено ни 1 строки - прекращение работы */
- EXIT 0
- END
- ELSE
- DO
- SAY VOSLER 'NOT FOUND ON SOFT.SUPPORT'
- RETURN 0
- END
- EXIT 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement