Folgende Anfrage kam von einem Kunden: Wie kann man alle aktiven Jobs ermitteln, die einen bestimmten Status haben? Insbesondere geht es um Jobs, die den Status MSGW (Message Waiting) haben und deshalb auf eine Antwort durch den Administrator warten.

Die Lösungen

Zur Lösung der Aufgabe gibt es verschiedene Ansätze und Möglichkeiten. Neben der manuellen Variante mit WRKACTJOB kann dies mit SQL und auch als CL-Programm mit ‘Embedded SQL‘ erfolgen. Eine weitere Variante wäre die Lösung mit Db2 Web Query, die hier nicht behandelt wird. Schauen wir uns die einzelnen Varianten an.

Lösung-1 – Manuell mit WRKACTJOB

Mit dem CL-Befehl WRKACTJOB werden standardmäßig alle aktiven Jobs angezeigt. Unter anderem ist eine Selektion nach Subsystem möglich. Es besteht aber keine Möglichkeit, über einen Parameter Jobs mit dem Status MSGW herauszufiltern. Dazu sind manuelle Eingriffe erforderlich.

Mit der Funktionstaste F20 können Sie die Sortierfolge in *STS ändern. Und danach mit F7 die Zeichenfolge MSGW in der Spalte *STS suchen.

Alle Jobs mit dem Status ‘MSGW‘ suchenQuelle: Bär

Alle Jobs mit dem Status ‘MSGW‘ suchen

 

Der CL-Befehl WRKACTJOB bietet noch eine andere Möglichkeit:

  • Starten Sie den Befehl, indem Sie ihn mit F4 prompten.
  • Mit F10 werden zusätzliche Parameter angezeigt. Der Parameter Folge…SEQ ist standardmäßig mit *SBS (= Subsystem) vorbelegt.
  • Ändern Sie diesen Parameter in *STS (= Status). Dadurch wird die Sortierfolge nach Job-Status aufsteigend geändert.
  • Danach können Sie mit F7 die Zeichenfolge MSGW in der Spalte *STS suchen.

 

Lösung-2 – Mit SQL

Die Db2 enthält in der Bibliothek QSYS2 einen Service ACTIVE_JOB_INFO als Tabellen-Funktion. Die Funktion erzeugt für jeden aktiven Job eine Zeile. Die so zurückgegebenen Informationen sind ähnlich denen des CL-Befehl WRKACTJOB und dem API QUSLJOB.

Weitere Details zu der Tabellen-Funktion finden Sie unter:

https://www.ibm.com/support/pages/qsys2activejobinfo

https://www.ibm.com/docs/en/i/7.3?topic=services-active-job-info-table-function

Für die Ausführung der Funktion können Sie die Unterstützung von IBM i ACS heranziehen.

Wählen Sie dazu aus dem Hauptportal von ACS aus:

Datenbank –> Schemata –> QSYS2 –> Funktionen –> ACTIVE_JOB_INFO

Aus dem zugehörigen Kontextmenü wählen Sie dann: Anfrage in SQL-Scripts ausführen.

Auswahl aus KontextmenüQuelle: Bär

Auswahl aus Kontextmenü

 

Damit wird eine neue Sitzung in SQL-Scripts ausführen geöffnet und eine SELECT-Anweisung mit allen Spalten und Parametern der Tabellen-Funktion eingefügt.

In der folgenden SQL-Anweisung wurden nur einige der zahlreichen Spalten angegeben.

SELECT
ORDINAL_POSITION,                   /* INTEGER           */
JOB_NAME,                           /* VARCHAR(28)       */
JOB_NAME_SHORT,                     /* VARCHAR(10)       */
JOB_USER,                           /* VARCHAR(10)       */
JOB_NUMBER                         /* VARCHAR(6)        */

FROM TABLE(QSYS2.ACTIVE_JOB_INFO(
RESET_STATISTICS         => ‚NO‘,    /* VARCHAR(3)    NO, YES – Default: NO                                                             */
SUBSYSTEM_LIST_FILTER    => NULL,    /* VARCHAR(274)  up to 25 names with exactly one comma between names – Default: all subsystems     */
JOB_NAME_FILTER          => NULL,    /* VARCHAR(10)   unqualified job name, generic name, *, *ALL, *CURRENT, *SBS, *SYS – Default: *ALL */
CURRENT_USER_LIST_FILTER => NULL,    /* VARCHAR(109)  up to 10 names with exactly one comma between names – Default: all users          */
DETAILED_INFO            => ‚NONE‘   /* VARCHAR(5)    ALL, NONE, QTEMP, WORK – Default: NONE                                            */
)
);

 

Mit den folgenden SQL-Beispielen erhalten Sie Informationen zu den Jobs und den Jobs-Stati:

— alle Jobs anzeigen
Select *
From Table (
Qsys2.Active_Job_Info(Detailed_Info => ‚ALL‘)
)
;

 

— welche Stati gibt es?  –> Auswahlliste für Parameter Status
 Select distinct Job_Status
From Table (
Qsys2.Active_Job_Info(Detailed_Info => ‚ALL‘)
)
order by Job_Status;

 

— wieviele Stati gibt es?
 Select count(distinct Job_Status)
From Table (
Qsys2.Active_Job_Info(Detailed_Info => ‚ALL‘)
);  — 16

 

— Jobs mit Status als Parameter
Select *
From Table (
Qsys2.Active_Job_Info(Detailed_Info => ‚ALL‘)
)
Where Job_Status = ?;  — mit Parameter zum Testen

 

Die folgende SQL-Anweisung liefert die gewünschte Lösung:

— Jobs mit Status MSGW
Select *
From Table (
Qsys2.Active_Job_Info(Detailed_Info => ‚ALL‘)
)
Where Job_Status = ‚MSGW‘;

 

Neben der Anzeige des Jobs, der sich im Status MSGW befindet, kann auch noch die Nachricht angezeigt werden, auf die der Job wartet. Dazu kann wiederum ein SQL-Service verwendet werden:

qsys2.message_queue_info 

Das folgende Beispiel zeigt, wie dieser Service zusammen mit der obigen Tabellen-Funktion das gewünschte Ergebnis liefert:

–Find active jobs (in any subsystem) that are in message wait status, and find the message that they’re waiting on

with msgw_jobs (jn) as (
select job_name
from table (
qsys2.active_job_info()
) x
where job_status = ‚MSGW‘
)
select from_job as job, from_user as user_name,
message_timestamp, message_id, message_type, message_text,
severity, message_key
from msgw_jobs, lateral (select * from qsys2.message_queue_info a
where from_job = jn
order by message_timestamp asc);

 

Und hier ist das Ergebnis:

Job mit Status MSGW und der zu beantwortenden NachrichtQuelle: Bär

Job mit Status MSGW und der zu beantwortenden Nachricht

 

Lösung-3 – Mit CL-Programm

Die zuvor ermittelte SQL-Anweisung kann auch in einem CL-Programm mit dem CL-Befehl RUNSQL eingesetzt werden. Hier ist die Programm-Quelle:

/* CL-Programm JOBSMSGW */

 

pgm

RUNSQL     SQL(‚drop table qtemp.jobsmsgw if exists‘) +

COMMIT(*NONE)

 

 

RUNSQL     SQL(‚CREATE TABLE qtemp.jobsmsgw AS (SELECT +

Job_Status, Job_Name, Subsystem  +

FROM Table +

(Qsys2.Active_Job_Info(Detailed_Info => +

“ALL“))                               +

Where Job_Status = +

“MSGW“)                                   –

WITH DATA‘) COMMIT(*NONE) NAMING(*SQL)

 

RUNQRY     QRYFILE((QTEMP/JOBSMSGW))

 

endpgm

 

Mit dem Einsatz einer Variablen für die Spalte Job_Status kann das Programm auch für die Abfrage von anderen Stati verwendet und damit auch flexibler verwendet werden.

 

Vorschau:

Im nächsten Artikel geht es um weitere Anfragen von Kunden.

Bis dahin wünsche ich Ihnen weiterhin viel Spaß beim Vermehren Ihrer Fertigkeiten.

 

Der Autor Theo Bär schreibt regelmäßig für den TechKnowLetter.

Sie erreichen ihn unter

EDV-Beratung Theo Bär

Ringmauerweg 1

69250 Schönau

Tel.: (+49) 6228 912 630

E-Mail: [info@edv-baer.com]

Sechs Ausgaben des TechKnowLetters erhalten Sie hier für 88 Euro.