[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Also, die "einfachste" Variante für ILE-Cobol, ist, die OPM-Programme einfach nur auf ILECBL umzustellen und zu wandeln. Beim Erstellen gib einfach eine ACTGRP mit Namen und nicht mit *CALLER an.
    Beende die Programme grundsätzlich mit EXIT PROGRAM. Ich habe früher immer EXIT PROGRAMM und GOBACK direkt hintereinander verwendet, so dass das PGM sowohl als Upro als auch als Hauptprog verwendet werden konnte.
    Beachte allerdings bei wiederholten Aufrufen den Status geöffneter Dateien.

    RUN UNIT ist das alte COBOL-Problem (was RPG'ler nicht kennen), dass STOP RUN alle Programme der RUN UNIT beendet (PGMA->PGMB->PGMC->... STOP RUN: bis einschließlich PGMA beendet). Mit ACTGRP's gibt es eben eine RUN UNIT pro ACTGRP.

    Service-PGM'e sind im ersten Schritt nicht erforderlich. Dies sind Programme, die häufig benötigte Routinen enthalten sollen. Alle SQLxxx-Funktionen liegen z.B. in Service-PGM'en.

    Wenn man mit CALL PROCEDURE arbeitet, sind das sog. STATIC-Calls, da der Name nicht in einer Variablen stehen kann und bereits zum Aufrufzeitpunkt (Service-PGM'e) bzw. zur Compile-Zeit die Adresse zum Modul / zur Routine ermittelt wird.

    Mit CALL aufgerufene PGM'e sind dynamisch, da erst zur Laufzeit das externe Programm über die Libliste ermittelt wird. Dabei ist es unerheblich, ob ein OPM- oder ILE-Programm aufgerufen wird.

    Nun zu deinem Test:

    Dieses Vorgehen (ich bitte um Entschuldigung) war ja sowas von unsinnig !!!
    Mit 19 Millisekunden pro Satz bist du doch noch relativ fix gewesen, wenn man sich mal vorstellt, was da alles ablaufen musste.

    Beim Erstellen der DTAQ ist zu beachten, ob jeder QSNDDTAQ unbedingt auf die Platte geschrieben werden muss. Dies sollte man abschalten, da es nach diesem Verfahren keinen Sinn macht, DTAQ-Inhalte über IPL hinweg aufzuheben.

    Und was sollte diese Funktion bringen ?

    Wenn nur Daten gelesen werden sollen, ist keine SQL-Prozedur erforderlich, da ein direkter Select/Fetch BEDEUTEND schneller abgewickelt wird !!!
    Das gleiche gilt auch für INSERT/UPDATE/DELETE !!!
    Insbesonders im Multiuser-Betrieb würde eigentlich jeder User einen solchen Batchjob benötigen, da du sonst Satzsperren nicht unter Kontrolle hast (UPDATE ohne READ).

    SQL-Prozeduren sind nur dann sinnvoll, wenn ein komplexer Vorgang KOMPLETT auf den Server verlagert werden kann. Will heißen, dass durch Parameter gezielt bestimmte Funktionen ausgelöst werden (z.B. ein Buchungsvorgang über mehrere Dateien) und nur das Ergebnis (falls überhaupt) wieder benötigt wird.

    Es kann auch sinnvoll sein, wenn z.B. eine Subfile (Liste) gefüllt werden muss und die Daten nicht einfach durch einen Select (egal wie komplex) ermittelt werden können.

    Untersuche deine Programme doch mal nach folgenden Kriterien:
    1. Dialog-Programme
    Diese kann man einfach erstmal auf SQL umstellen, wobei ggf. geprüft werden sollte, welche Felder einer Datei überhaupt benötigt werden (Crossref) um die Selects/Updates zu verkürzen.

    2. Unterprogramme
    Dies sind typischerweise Programme, die als SQL-Prozeduren in Frage kommen, da sie keine Benutzeraktion benötigen und die Paramter (Ein-/Ausgabe) per Linkage-Section ja vorgegeben sind.
    Dies können natürlich auch CLP's sein, die z.B. einen SBMJOB für Batch auslösen.

    Teste doch mal deinen START / READ NEXT / READ INVALID direkt als SQL-Programm in 2 Varianten:
    1. mit komplettem Satz
    2. nur mit relevanten Feldern (max. 10)

    Für START/READ NEXT benötigst du einen Cursor (OPEN/FETCH into, hier ist auch Blocken möglich).
    Für READ INVALID benötigts du keinen Cursor, da ein direktes SELECT INTO möglich ist.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  2. #2
    Registriert seit
    Jul 2004
    Beiträge
    50
    @Fuerchau

    Habe heute mal die 'einfachste' Methode ausprobiert. Hat nach einigen mir nicht erklärlichen Problemen dann doch funktioniert.

    Merkwürdigerweise funktionierte es mit CRTBNDPGM inkl. Angabe der ACTGRP nicht. Erst mit CRTCBLMOD und anschließendem CRTPGM mit Angabe der ACTGRP funktionierte es das das Programm im Hauptspeicher gehalten wurde.
    Zunächst wurde ein OPEN durchgeführt und bei den Folge-Aufrufen dann wieder READ's und zum Schluß dann ein CLOSE und STOP RUN. Dann war die ACTGRP auch weg.
    Aber irgendwie hatte ich Probleme mit dem Befehl EXIT PROGRAM. Der Befehl wurde einfach ignoriert und das Programm linear fortgesetzt. Erst die Änderung in 'EXIT PROGRAM AND CONTINUE RUN UNIT' als ALLERLETZTE Zeile im Cobol-Programm brachte den gewünschten Erfolg.
    Ich frage mit ob ich da etwas falsch mache? Bin noch nicht dazugekommen das mit weiteren Unterprogrammen zu probieren ... mal sehen wie es dort ausschaut.


    Zum Test mit der DTAQ und dem Lesen von 1000 Sätzen: Mag sein das der Test *SO* nicht sehr sinnvoll war. Ging auch primär erstmal darum zu testen ob das technisch so funktioniert ... bin wie gesagt kein AS/400 Freak und habe gestern zum ersten Mal DTAQ's "gesehen"
    Und du hast völlig recht: External-Prozeduren machen erst Sinn wenn komplexere Verarbeitungen auf der AS/400 durchgeführt werden sollen!! Ganz klar!!
    Und das ist ja auch mein Ziel!!
    So viel wie eben möglich auf der AS/400 ablaufen lassen und so wenig wie eben möglich auf dem PC.


    Zu deinem Vorschlag was ich mal testen soll:
    Was meinst du mit 'direktem SQL-Programm'?

    Beste Grüße
    Neptun

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Das "AND CONTINUE RUN UNIT" war mir noch nicht bekannt, aber ist genau das was du brauchst. Ob unbedingt als allerletzte Zeile oder als letzter Befehl einer Section ist wohl nicht so entscheidend. Du musst schließlich unterscheiden können ob die RunUnit aktiv bleiben soll oder nicht. Bei EOF könnte man durchaus EXIT PROGRAM ansonsten halt mit AND CONTINUE ...

    CRTCBLMOD mit anschließendem CRTPGM ist so die korrekte Vorgehensweise (COBOL ist nun mal doch etwas anders als RPG, wo vieles einfacher ist).

    Direktes SQL meine ich ein Programm auf dem PC, dass die SQL's (embed oder nicht) per ODBC absetzt und zwar in den beiden Varianten. Es gibt häufig Dateien mit mehr als 100 Feldern, die aber vom Programm nicht benötigt werden. Warum also nicht benötigte Daten überhaupt erst lesen ?
    Für eine performante Lösung muss man auch schon mal die Funktionalität prüfen, ob nicht z.B. eine Leseschleife über mehr als 1 Datei nicht auch als Join direkt aufgelöst werden kann.
    Zu prüfen ist auch, ob bestimmte Berechnungen der Daten nicht bereits per SQL erledigt werden können, man braucht manchmal nur das Ergebnis aber nicht die 2 - 5 Felder der Berechnung usw. usw.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  4. #4
    Registriert seit
    Jul 2004
    Beiträge
    50
    @Fuerchau

    Besten Danke für deine erstklassige Hilfestellung! Fühle mich schon fast als halber AS/400-Experte, *LOL*

    Also der Exit Program reicht tatsächlich als letztes Statement in einer Section, hatte da etwas übersehen.
    Gibt es eigentlich etwas Spezielles zu beachten wenn man umstellt von OPM Cobol auf ILE Cobol? Vermute mal nicht ...
    Ich konnte im Handbuch nicht herausfinden wie man einen anderen ENTRY POINT als den normalen Programmstartpunkt, also die erste Zeile nach PROCEDURE DIVISION, bestimmen kann. Und als ich dann mit SET {Procedure-Pointer} ENTRY {PGM1} und anschließendem CALL {Procedure-Pointer} kam die Meldung das rekursiver Aufruf nicht zugelassen ist. Ich frage mich nun wo liegt da der Unterschied zum herkömmlichen dynamischen CALL?
    Offenbar ist es wohl nicht möglich wenn eine Aufrufkette von PGM1 -> PGM2 -> PGM3 -> PGM4 besteht direkt aus PGM4 zurück zum PC zu gehen. Man muss offenbar rückwärts durch alle Programme gehen bis zum Hauptprogramm (aufgerufen durch die External Procedure) um zurück zum PC zu kommen!?!? Oder gibt es doch eine Möglichkeit? (STOP RUN geht natürlich, aber dann ist die ganze ACTGRP weg)
    Interesssant wäre z.B. die Möglichkeit von einer beliebigen Stelle in einem beliegen Cobol-Programm der RUN UNIT zurück zum PC zu verzweigen und nach Verarbeitung auf dem PC einfach mit der nächsten Programmzeile (oder auch einem ENTRY POINT) weiterzumachen.
    Was mir auch noch unklar ist warum folgendes Szenario nicht funktioniert hat:
    CRTCBLMOD PGM1
    CRTCBLMOD PGM2
    CRTPGM PGM1 mit Angabe von PGM1 und PGM2 als Module
    Wenn man nun vom PC aus per External Procedure PGM1 startet und PGM1 versucht PGM2 aufzurufen (dynamischer CALL) dann wird PGM2 nicht gefunden (Auflösung nicht möglich ...)

    Habe dann immer CRTCBLMOD PGM1, CRTCBLMOD PGM2, CRTPGM PGM1 und CRTPGM PGM2 gemacht. Dann funktionierte es. Ist das die normale Vorgehensweise?



    Das mit dem direkten SQL-Programm ist sicher mittel- bis langfristig die bessere Lösung. Denn das wäre definitiv eine Lösung die dann auch auf allen Datenbanken funktioniert. Vorraussetzung für eine gute Performance ist da sicherlich eine kritische Analyse der Datenzugriffe und einer vernünftigen Anpassung.

    Vermutlicherweise wird dennoch eine Lösung ohne Umsetzung der Dateizugriffe auf SQL-Basis nötig werden, da diese Lösung für uns einfach schneller fertigzustellen wäre und sich da ein Termindruck andeutet ...

    Beste Grüße
    Neptun

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Man unterscheidet zwischen CALL "Extern" bzw CALL PROCEDURE "INTERN" !
    Entry-Point's gibts nicht.

    SQL betrachtet das ganze wie einen OPM-Aufruf.
    Ein EXIT-Program muss natürlich durch alle Ebenen zurück !

    Recursive geht irgendwo bei der Deklaration Identification bzw. Configuration.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

Similar Threads

  1. Tools von Avenum Technologie GmbH
    By Kirsten Steer in forum NEWSboard Server Software
    Antworten: 0
    Letzter Beitrag: 11-12-06, 08:45
  2. VARPG Connection-Pooling
    By stef2 in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 07-04-06, 18:01
  3. MQSeries for AS/400 (QMQM)
    By RobertMack in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 28-06-04, 14:52
  4. CeBIT - Unternehmensübergreifende Kommunikation durch Movex
    By Burgy Zapp in forum Archiv NEWSboard Events
    Antworten: 0
    Letzter Beitrag: 15-03-04, 11:35
  5. Kommunikation mit Exchange-Server
    By Jens Falk in forum NEWSboard Server Software
    Antworten: 4
    Letzter Beitrag: 12-02-02, 12:23

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •