[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Jan 2005
    Beiträge
    90

    CLLE Variable mit VARLEN?

    Hallo zusammen,

    es klappt so gut mit euch.
    Da wollte ich es bei meinem letzten Problem für diese Woche nochmal versuchen.
    Ich habe ein CL (CLLLE) das ich von extern aufrufen will.
    Dieses CL hat 3 Parameter.
    1. 10 Zeichen
    2. 6 Zeichen
    3. 9999 Zeichen
    Wenn ich von extern dieses CL aufrufe, und der erste Parm nur 3 Zeichen enthält, wird dieser mit den nächsten Zeichen des 2. Parameters und ggf. je nach Länge des 2. Parameters mit Werten aus dem 3. Parameter aufgefüllt.
    Ich vermute dass das ganze irgendwie mit der Reservierung bzw. Speicherverwaltung zusammen hängt.

    Gibt es eine Möglichkeit von außen "variable Längen" an das CL weiter zu geben?
    So dass auch im ersten Parm wirklich nur DAS steht was i übermittelt habe?

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.248
    Kommt darauf an, wie du das Programm aufrufst.
    Wenn die Parameter so definiert sind, dann darfst du das auch nicht anders aufrufen.
    Leider gibt es keine Aufrufprüfung für Parameter.

    Sicherlich werden die Parameter beim Call aus der Kommandozeile hintereinander abgelegt.

    Es war schon immer so, wenn die Übergabe nicht passt wird auf Speicher der einem nicht gehört zugegriffen.

    Wenn du variable Felder benötigst, so solltest du halt eine Längeninformation voranstellen.
    Im RPGLE als "varying" definiert, steht in 2 Bytes vorneweg die Länge.

    In CLLE kann man dann per %bin die Länge auswerten und mit %sst dann auf den Teilstring zugreifen.
    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

  3. #3
    Registriert seit
    Jan 2005
    Beiträge
    90
    Aber ILE kann keine Variablen Entry-Parms oder?

    hast du ggf. ein konkretes Beispiel?

  4. #4
    Registriert seit
    Nov 2003
    Beiträge
    2.308
    Am besten geht das mit einem selbst erstellten Befehl (CMD) mit Parametern, der dann die Paramter immer in der entsprechenden Länge an das CL-Programm weitergibt:

    PHP-Code:
    CMD                                                      
    PARM       KWD
    (NAMETYPE(*CHARLEN(10)   PROMPT('Name')
    PARM       KWD(FACHTYPE(*CHARLEN(6)    PROMPT('Fach')
    PARM       KWD(TEXTTYPE(*CHARLEN(9999PROMPT('Text'

  5. #5
    Registriert seit
    Jan 2005
    Beiträge
    90
    Muss der Command dann vom Kunden gestartet werden?
    Also
    PHP-Code:
    CMD 
    PARM KWD
    (NAMETYPE(*CHARLEN(10PROMPT('Name'
    PARM KWD(FACHTYPE(*CHARLEN(6PROMPT('Fach'
    PARM KWD(TEXTTYPE(*CHARLEN(9999PROMPT('Text'
    Oder wie muss das passieren?
    Ich kenne das noch nicht.

  6. #6
    Registriert seit
    Nov 2003
    Beiträge
    2.308
    Ein eigener Befehl wird mit "Befehl erstellen (CRTCMD)" erstellt. Eventuell mußt das Befehlverarbeitungsprogramm qualifiziert mit Bibliothek angegeben werden, damit es später gefunden wird. Der Befehl wird dann genauso aufgerufen, wie die von IBM gelieferten Befehle, zum Beispiel WRKACTJOB, WRKSPLF, DSPMSG usw.

  7. #7
    Registriert seit
    Apr 2005
    Beiträge
    385
    Pointer wären eine Lösung. Wen aus RPGLE das CL aufgerufen wird, kannst du auch Pointer übermitteln!

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.248
    Auch Pointer lösen das Problem nicht, da an das aufgerufene Programm sowieso nur Pointer übergeben werden.

    Aufrufparameter stellen eine Konvention dar, die genauestens einzuhalten ist.
    Eine Laufzeitprüfung über den Typ gibt es leider nicht.

    Bei CLP's wird zumindest die Anzahl der Parameter festgelegt (siehe DSPPGM), bei HLL's (COBOL, RPGLE) noch nicht mal das. Hier kann man zwischen 0 und 255 Parametern übergeben, egal ob sie gebraucht werden oder nicht.

    Eine Typisierung bzw. Typprüfung wird nicht unterstützt, man kann nocht nicht mal die Art der Definition (Zeichen, Numerisch, usw.) per Programm prüfen außer per MONMSG (bzw. Monitor-Anweisung) eine MCH-Überwachung zu programmieren.

    Ich habe mir des öfteren Wrapper-CLP's geschrieben, die die Parameter nur mit CHAR(1) definiert haben, um dann die "Adressen" der Parameter an die nächste Ebene zu üergeben.

    CMD's sind eine gute Lösung dieses Problem zu lösen, wenn das Programm per Kommandozeile oder QCMDEXC aufgerufen wird.
    Zumal sich mit optionalen Parametern dann Defaults übergeben lassen.

    Aufgerufen wird dann nicht das Kommando CALL sondern das per CRTCMD erstellte Kommando (genau wie alle anderen Kommandos des Systems).
    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

  9. #9
    cbe is offline [professional_User]
    Registriert seit
    May 2005
    Beiträge
    392
    Oder man macht es wie IBM: Das CL nimmt 2 Parameter entgegen, der eine enthält die Zeichenkette, der andere die Anzahl übergebener Bytes.

    Berühmtestes Beispiel dafür wäre:
    CALL QCMDEXC ('DSPMSG' 6)


    Kommandos sind praktisch, aber ich finde sie aus RPG heraus so schlecht aufrufbar.


    Hier ein paar technische Details zu Parametern:
    Bei einem Call werden für Parameter nur Pointer übergeben. Diese zeigen auf den Speicherbereich, der im rufenden Programm festgelegt wird.
    Es kann passieren, dass das gerufene Programm in einem zu lang definierten Parameter Daten sieht, die nicht für diesen Parameter bestimmt sind.
    Wenn man also weiß wie lang Daten gefüllt sind, kann man das mit %SST rausziehen.


    Nebenbei: Lustig bei Parametern ist auch, wenn man im rufenden Programm eine Variable _mehrfach_ angibt.
    Dann ist im gerufenen Programm der Effekt, dass wenn der eine Parameter verändert wird, der andere wie von Geisterhand ebenfalls geändert ist. (Da habe ich mal lange debuggt und war fast verzweifelt...)

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.248
    Das kann bei ILE nicht mehr passieren, wenn der Parameter als CONST definiert wird.
    Dann legt der Compiler eine Kopie an und kopiert den Inhalt.
    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. exec sql drop variable
    By Robi in forum NEWSboard Programmierung
    Antworten: 23
    Letzter Beitrag: 17-01-13, 15:31
  2. "Environment variable not found"
    By Kampi4 in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 09-10-06, 10:19
  3. Variable Zahlenkonvertieren
    By Xanas in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 28-08-06, 12:21
  4. cl declare variable
    By TARASIK in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 24-08-06, 10:09
  5. String mit HexInhalt muss als Hex-Wert in Variable
    By cheffe1008 in forum NEWSboard Programmierung
    Antworten: 7
    Letzter Beitrag: 16-05-06, 07:45

Berechtigungen

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