Advertisement
Dronky

pr

Jul 20th, 2016
3,120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rexx 7.79 KB | None | 0 0
  1. /* rexx */    
  2. /* Обязательный комментарий, чтобы интерпретатор определил, что программа написана на языке REXX. Должен стоять на месте 1й строки. */
  3. /* Определить переменную, для хранения имени диска */
  4. VOLSER='Z1DBMR'    
  5. /* Вызов основной процедуры FIND */                                      
  6. CALL FIND        
  7. /* Вывод результатов */                                        
  8. SAY TAPENAME SEQ      
  9. /* Прекращение работы программы */                                    
  10. EXIT 0                                                    
  11. /* Начало процедуры */
  12. /* Определение списка глобальных переменных */                                      
  13. FIND: PROCEDURE EXPOSE VOLSER TAPENAME SEQ
  14. /* Запись информации о наличии набора данных */
  15. /* в переменную */                
  16. DSNLOG=SYSDSN("'SOFT.SUPPORT("VOLSER")'")                
  17. /* Проверка на наличие указанного диска */
  18. /* в библиотеке SOFT.SUPPRT */                                          
  19. IF DSNLOG='OK' THEN                                      
  20. DO    
  21. /* В случае, когда такой раздел существует: */
  22. /* с помощью потокового вывода, данные */
  23. /* записываются в массив строк VOL. */                                                  
  24.   "alloc da('SOFT.SUPPORT("VOLSER")') F(INPUT) shr reuse"
  25.   "execio * diskr INPUT (stem VOL. finis"                
  26.   "FREE F(INPUT)"                                        
  27. /* С помощью строковой команды, берется имя ленты, */ /* на которой хранится последний бэкап */
  28.   TAPENAME=SUBSTR(VOL.3,57,6)                            
  29.   /* Если временный файл LIB1 существует, */                          
  30.   /* то он удаляется */                                    
  31. if sysdsn("'LIB1'")='OK' THEN                                      
  32. DO                                                                
  33. ADDRESS TSO "DELETE 'LIB1'"                                        
  34. END                                                                
  35. /* Создается файл LIB1 и в него записывается */       /* информация о хранимых на ленте дисках */                        
  36. "HSEND LIST DUMPVOLUME("TAPENAME") ODS('LIB1')"                                                              
  37. /* Команда ожидания, для успешного чтения файла LIB1 */                                
  38. ADDRESS SYSCALL 'sleep 1'                                          
  39. "alloc da('LIB1') F(indd) shr reuse"          
  40. /* Запись строк в массив strings. */                    
  41. "execio * diskr indd (stem strings. finis"                        
  42. "free f(indd)"                                                    
  43. /* P - Переменная, для увеличения массивов строк */
  44. /* и проверки результатов поиска */
  45. P=0                                                                
  46. DO I=1 TO STRINGS.0                  
  47. /* Поиск диска в массиве (результате команды HSEND) */                              
  48. IF INDEX(STRINGS.I,' 'VOLSER' ') /= 0 THEN                        
  49.   DO                                                              
  50.     P=P+1                                                          
  51.     STRS.0=P                                                      
  52.     STRSFULL.0=P                                                  
  53.       STRS.P=SUBSTR(STRINGS.I,25,3)                    
  54.       STRSFULL.P=STRINGS.I                            
  55.     END                                                
  56.   END  
  57. /* Если найдено 1 и более строк */                                              
  58.   IF P /= 0 THEN                                      
  59.   DO    
  60. /* Если найдено более 1 строки */  
  61. /* Происходит выбор строки с последней датой */                                            
  62.     IF P>1 THEN                                        
  63.     DO                                                
  64. /* Устанавливаются начальные значения YYYY/MM/DD */  
  65.       Y=SUBSTR(STRSFULL.1,50,4)                        
  66.       M=SUBSTR(STRSFULL.1,55,2)                        
  67.       D=SUBSTR(STRSFULL.1,58,2)                        
  68.       SEQ=SUBSTR(STRSFULL.1,25,3)                      
  69.       DO I=2 TO STRS.0        
  70. /* Сравнение найденной даты с текущими */                    
  71.         IF SUBSTR(STRSFULL.I,50,4)>Y THEN              
  72.         DO                                            
  73.           Y=SUBSTR(STRSFULL.I,50,4)                    
  74.           M=SUBSTR(STRSFULL.I,55,2)                    
  75.           D=SUBSTR(STRSFULL.I,58,2)                    
  76.           SEQ=SUBSTR(STRSFULL.I,25,3)                
  77.         END                                      
  78.         ELSE                                    
  79.         IF SUBSTR(STRSFULL.I,50,4)=Y THEN        
  80.         DO                                      
  81.           IF SUBSTR(STRSFULL.I,55,2)>M THEN      
  82.           DO                                    
  83.             M=SUBSTR(STRSFULL.I,55,2)            
  84.             D=SUBSTR(STRSFULL.I,58,2)            
  85.             SEQ=SUBSTR(STRSFULL.I,25,3)          
  86.           END                                    
  87.           ELSE                                  
  88.           IF SUBSTR(STRSFULL.I,55,2)=M THEN      
  89.           DO                                    
  90.             IF SUBSTR(STRSFULL.I,58,2)>D THEN    
  91.             DO                                  
  92.               D=SUBSTR(STRSFULL.I,58,2)    
  93. /* С помощью строчных команд берется номер блока */    
  94.               SEQ=SUBSTR(STRSFULL.I,25,3)    
  95.             END                                  
  96.           END                                    
  97.         END                                      
  98.        END
  99. /* Номер блока подставляется в формулу и находится */
  100. /* позиция заданного диска на ленте*/
  101.        SEQ=2+(SEQ-1)*3
  102.        SAY 'LAST DATE:'||Y||'/'||M||'/'||D||
  103.        RETURN 1                                      
  104.      END                                              
  105.      ELSE                                            
  106.      DO  
  107. /* Если была найдена одна строка и сортировки */
  108. /* по дате не было, сразу же берется номер блока */                                            
  109.      SEQ=SUBSTR(STRSFULL.1,25,3)
  110.      SEQ=2+(SEQ-1)*3                
  111.      RETURN 1                                        
  112.      END                                              
  113.    END                                                
  114.    ELSE
  115. /* Если не найдено ни 1 строки - прекращение работы */                                              
  116.    EXIT 0                                            
  117.  END                                                  
  118.  ELSE                                                
  119.  DO                                                  
  120.  SAY VOSLER 'NOT FOUND ON SOFT.SUPPORT'              
  121.  RETURN 0                                            
  122.  END                                                  
  123.  EXIT 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement