Wie du siehst gibts noch eine Runtimeebene dazwischen, QRNXIO.
Aus OPM wird aber QDBUDR direkt aufgerufen.
Und wie siehts bei SQL oder UPDDTA aus?

Ich habe mir dafür mal eine kleine Routine geschrieben, die den CALL-Stack (API) nach oben durchläuft und das 1. Programm sucht, dass nicht in einer Q-Lib liegt und nicht mit Q beginnt.
Denn dein SNDPGMMSG kann da nicht alle Varianten durchtesten, denn man muss wirklich mit der höchsten Variante anfangen. Aber wer sagt dir denn, dass nicht durch mehrere Trigger und diversen Zwischenstufen nicht das QRNXIO sehr viel höher liegt als der aktuelle Verursacher?
Ohne eine Stackuntersuchung ist das SNDPGMMSG-Verfahren nur noch für OPM ohne SQL gültigt.

Und noch eine Variante:
Die Anwendung benutzt Filehandler-Programme. Wenn nun jedesmal der Filehandler auftaucht ist der tatsächliche Verursacher nur zu finden, wenn man den Aufrufer des Filehandlers ermittelt.
Deshalb habe ich die CALL-Stackanalyse auch in jedem Trigger individualisiert.