PDA

View Full Version : SQL-Statement prüfen => eMail senden



marty
31-10-11, 15:35
Hallo zusammen,

ich möchte regelmäßig (scheduled) prüfen, ob ein bestimmtes SQL-SELECT eine leere Menge liefert und falls nein, mir eine Mail mit dem Ergebnis des SELECT senden.

Meine erste Idee war, das ich in einem CL den Query Manager benutze um eine Datei zu schreiben, prüfe ob die Datei leer ist und dann eine Mail sende.

Das erscheint mir aber sehr umständlich, gibt's einen einfacheren Weg?

Fuerchau
31-10-11, 15:41
Der weg ist nicht umständlich sondern der Richtige.
Was nützt mir ein vorheriger "Select count(*) ...", wenn ich im Falle von > 0 dann doch den kompletten Select benötige.
Anders mache ich das ja auch nicht.

B.Hauser
31-10-11, 16:28
gelöscht!!!

Birgitta

marty
31-10-11, 17:48
Fein, dann stimmt meine Richtung schonmal :-)

Ich führe also die QMQRY aus und schreibe das Ergebnis in einen Member (*REPLACE). Das Ergebnis kopiere ich mittels CPYTOPMPF ins IFS und prüfe dabei gleich ob die Quelle Datensätze enthält:

MONMSG MSGID(CPF2817) CMPDTA(CPF2869) EXEC( +
SNDDST TYPE(*LMSG) TOINTNET(('meine@mail.de' *PRI)) +
DSTD(File empty) LONGMSG('Das Ergebnis der QMQRY war leer '))
ENDDO

Das funktioniert aber nicht, ich vermute mal das keine oder eine andere Escape-Message als 2817 gesendet wird? Macht das nur CPYF und CPYTOPMPF sendet vielleicht eine andere Escape-Message?

Schönen Feiertag schonmal!

Pikachu
31-10-11, 18:42
RTVMBRD mit Parameter NBRCURRCD() liefert die Anzahl Datensätze in einer Teildatei.

Khholm
31-10-11, 20:31
der CPYTOIMPF sendet keine Escape-Message, wenn die Ausgangsdatei keine Datensätze enthält. Es gibt nur die Meldung:
Alle Sätze aus Datei xxx in Bibliothek kopiert, auch wenn keine zum Kopieren vorhanden waren (V5R4)

Es bleibt also wohl nur der Weg mit RTVMBRD

KH

RobertPic
02-11-11, 21:23
Da QMQRY immer eine Datei erzeugt, verwende folgende "einfach" Trick um die Datei auf den Inhalt zu prüfen:



PGM PARM(&QMNAME &USER)
/* */
/* UPRO für das Ausführen von QM-Abfragen und der Versendung */
/* an einen Benutzer wenn Daten gefunden wurden. */
/* */
DCL VAR(&QMNAME) TYPE(*CHAR) LEN(10)
DCL VAR(&USER) TYPE(*CHAR) LEN(10)

MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(FEHLER))
/* */
/* Altes ev. vorhandene Ausgabedatei weglöschen */
DLTF FILE(QRYOBJ/&QMNAME)
MONMSG MSGID(CPF0000)
/* */
/* QM-Query ausführen, Ausgabedatei gleich benennen */
STRQMQRY QMQRY(QRYOBJ/&QMNAME) OUTPUT(*OUTFILE) +
OUTFILE(QRYOBJ/&QMNAME)
/* */
/* Tricklösung: Um keine leeren Dateien zu verschicken */
/* mit RGZPFM einen CPF bei leerer Datei provozieren */
RGZPFM FILE(QRYOBJ/&QMNAME)
MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ENDE))
CVT2PC LIB(QRYOBJ) FILE(&QMNAME) USER(&USER) /* +
Outfile an übergebenen Benutzer schicken */
GOTO CMDLBL(ENDE)
/* */
FEHLER: SNDMSG MSG('Fehler in CHKLAGUPCL!') TOMSGQ(ZENERRQ)
/* */
ENDE: ENDPGM

Statt dem CVT2PC (Eigenbau für Exceloutput) kannst du dann das SNDDST einsetzen.

Da wir relativ viele Kontrollabfragen benötigen, habe ich das in ein Upro ausgelagert. Damit reduziert sich der Abruf auf:
CALL PGM(....UPCL) PARM(QMQERY USER)

Fuerchau
03-11-11, 17:26
Ein einfacher RTVMBRD NBRCURRCD (Anzahl Sätze) ist da erheblich einfacher und man braucht keine Tricks!

marty
04-11-11, 17:26
Hab's mit RTVMBRD und NBRCURRCD implementiert, funzt einwandfrei.
Danke allen!