Kurs REXX cz. 7: Odczytywanie i zapisywanie danych

Odczyt zbiorów sekwencyjnych czy partycjonowanych należy do najczęściej wykonywanych operacji. Użyteczność programu, który nie może zapisać efektów swojego działania czy też ich odczytać jest znikoma. Dlatego w tej części kursu o odczycie i zapisie danych z i do zbiorów.

  <<Następna część kursu |Poprzednia część kursu>>

1.Wstęp

Najczęstszym sposobem odczytu zbioru na mainframe jest użycie komendy TSO – EXECIO, jest to tak zwana metoda tradycyjna. EXECIO nie odczytuje zbiorów po ich nazwie tylko po zdaniu DD, ze względu na tą właściwość zbiór przed użyciem musimy zaalokować. Niestety za pomocą EXECIO nie odczytamy zbiorów VSAM.

2.Składnia komendy EXECIO
EXECIO parm_1 parm_2 parm_3 parm_4 (parm_5)

parm_1 – to ilość wiersza jaka ma być zapisana/odczytana (* oznacza wszystkie)

parm_2 – to DISKR (odczyt), DISKW (zapis) lub DISKRU (odczyt z aktualizacją)

parm_3 – nazwa DD zbioru do odczytu/zapisu

parm_4 – nr linii od której odczytujemy zbiór (dot. tylko DISKR)

parm_5 – są to parametry zależne od parm_2:

  • dla DISKR oraz DISKRU:

(parm_5_1 OPEN FINIS SKIP)

    • parm_5_1 – to FIFO, LIFO lub STEM nazwa_zmiennej. – czyli umieszcza dane w stosie lub w zmiennej łańcuchowej
    • OPEN – otwiera zbiór jeśli jeszcze nie został otwarty – parametr ten nie jest wymagany
    • FINIS – zamyka zbiór kiedy EXECIO zakończy swoje działanie, parametr nie jest wymagany, ale bez niego zbiór pozostanie otwarty
    • SKIP – pomijane rekordy
  • dla DISKW:

(parm_5_1 OPEN FINIS)

  • parm_5_1 – STEMnazwa_zmiennej.
  • OPEN – otwiera zbiór jeśli jeszcze nie został otwarty – parametr ten nie jest wymagany
  • FINIS – zamyka zbiór kiedy EXECIO zakończy swoje działanie, parametr nie jest wymagany, ale bez niego zbiór pozostanie otwarty

Klika przykładów aby lepiej zrozumieć komendę:

EXECIO * DISKR SYSUT1’
EXECIO * DISKR INPUT (STEM line.’
EXECIO line.0 DISKW OUTDD (STEM line. FINIS’
3.Praktyczny przykład

Na koniec jako przykład napiszemy skrypt kopiujący zbiór:

/* Rexx skrypt kopiujący zbiór */

 

copyIn = "USER.DATA.IN";

 

copyOut = "USER.DATA.OUT";

 

Signal On Error; /* obsługa błędów */

 

/* alokacja zbiorów */
'ALLOC DA ('copyIn') FI (DSIN) SHR';
'ALLOC DA ('copyOut') FI (DSOUT) OLD';

 

/* odczyt zbioru */
'EXECIO * DISKR DSIN (STEM line. FINIS';
Say "Odczytano "line.0" linii ze zbioru "copyIn;

 

Say "Kopiuję do zbioru "copyOut;

 

/* zapis do zbioru */
'EXECIO 'line.0' DISKW DSOUT (STEM line. FINIS';
Say "Gotowe";

 

/* zwolnienie zaalokowanych zbiorów */
'FREE FI(DSIN DSOUT)';

 

Exit;

 

Error:

 

Say "Wystąpił błąd w linii "sigl". Kod powrotu: "RC;

 

Exit 8;
Autor: Dawid Morawiec

Komentarze

Brak komentarzy

The comments are closed.

Follow

Otrzymuj każdy nowy wpis na swoją skrzynkę e-mail.

Subskrybuj RSS