[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Sep 2008
    Beiträge
    70

    Question API Call mit external SQL Procedure

    Hallo,

    für unser Anwendungsmodernisierungsprojekt benötige ich die Möglichkeit, aus einer C# Anwendung heraus das Kennwort des eigenen Benutzerprofils zu ändern, sei es weil es abgelaufen ist oder der Anwender von sich aus ändern möchte. Als notwendigen Wrapper, wollte ich eine SQL-Prozedur verwenden.

    Seitens API habe ich die QSYCHGPW u. ihre Definition gefunden und mich dann an einer external SQL Procedure versucht.(https://www.ibm.com/support/knowledg...s/QSYCHGPW.htm)

    Code:
    -- Erstellen 'QSYS/QSYCHGPW'
    CREATE PROCEDURE ChgPwd(IN UserId CHAR(10), IN CurrentPwd CHAR(10), IN NewPwd CHAR(10), INOUT ErrorCode CHAR(15))
        LANGUAGE C MODIFIES SQL DATA
        EXTERNAL NAME 'QSYS/QSYCHGPW'
        PARAMETER STYLE GENERAL;
    
    -- CALL
    CALL ChgPwd('MEINUSR', 'PWALT', 'PWNEU', '');
    Leider ohne Erfolg. Ebenso habe ich die optionale Parametergruppe als Parameter implementiert u. diverse Versuche unternommen - letztendlich alle ohne Erfolg. Einen konkrete Verdacht habe ich nicht, lediglich die Vermutung, dass es evtl. am letzten Parameter oder den optionalen liegen könnte.

    Eine SQL Prozedur für den Aufruf der QSYS2.QCMDEXC analog dazu hat funktioniert, jedoch existieren hier nur IN-Parameter.

    Den Hinweis zu den External SQL Procedures habe ich u.a. im folgenden gefunden:
    http://www-01.ibm.com/support/docvie...d=nas8N1017493

    Die Frage ist auch, ob es über meinen Weg funktionieren kann, oder ich ein RPGLE dafür schreiben müsste (in Anlehnung an: http://www-01.ibm.com/support/docvie...d=nas8N1014053 oder http://www.code400.com/forum/forum/t...chgpw-qwcrsval)

  2. #2
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Hallo,

    Die Blanks sind hier wichtig:
    Code:
    CALL ChgPwd('MEINUSR   ', 'PWALT     ', 'PWNEU     ', '');
    So funktioniert es zumindest bei mir.
    Wobei ich für testzwecke den IN/OUT Parameter in IN umgeändert habe, damit ich kein PGM schreiben muss:
    Code:
    CREATE OR replace PROCEDURE pranlib.ChgPwd
    (IN UserId CHAR(10), IN CurrentPwd CHAR(10), IN NewPwd CHAR(10), IN ErrorCode CHAR(15))
    Hoffe das Hilft dir weiter.
    lg Andreas

  3. #3
    Registriert seit
    Mar 2002
    Beiträge
    5.286
    ... was heißt "ohne Erfolg" genau? Jedenfalls ist modifies SQL Data schon mal falsch.

    D*B

    Zitat Zitat von Gutmann Beitrag anzeigen
    Hallo,

    für unser Anwendungsmodernisierungsprojekt benötige ich die Möglichkeit, aus einer C# Anwendung heraus das Kennwort des eigenen Benutzerprofils zu ändern, sei es weil es abgelaufen ist oder der Anwender von sich aus ändern möchte. Als notwendigen Wrapper, wollte ich eine SQL-Prozedur verwenden.

    Seitens API habe ich die QSYCHGPW u. ihre Definition gefunden und mich dann an einer external SQL Procedure versucht.(https://www.ibm.com/support/knowledg...s/QSYCHGPW.htm)

    Code:
    -- Erstellen 'QSYS/QSYCHGPW'
    CREATE PROCEDURE ChgPwd(IN UserId CHAR(10), IN CurrentPwd CHAR(10), IN NewPwd CHAR(10), INOUT ErrorCode CHAR(15))
        LANGUAGE C MODIFIES SQL DATA
        EXTERNAL NAME 'QSYS/QSYCHGPW'
        PARAMETER STYLE GENERAL;
    
    -- CALL
    CALL ChgPwd('MEINUSR', 'PWALT', 'PWNEU', '');
    Leider ohne Erfolg. Ebenso habe ich die optionale Parametergruppe als Parameter implementiert u. diverse Versuche unternommen - letztendlich alle ohne Erfolg. Einen konkrete Verdacht habe ich nicht, lediglich die Vermutung, dass es evtl. am letzten Parameter oder den optionalen liegen könnte.

    Eine SQL Prozedur für den Aufruf der QSYS2.QCMDEXC analog dazu hat funktioniert, jedoch existieren hier nur IN-Parameter.

    Den Hinweis zu den External SQL Procedures habe ich u.a. im folgenden gefunden:
    http://www-01.ibm.com/support/docvie...d=nas8N1017493

    Die Frage ist auch, ob es über meinen Weg funktionieren kann, oder ich ein RPGLE dafür schreiben müsste (in Anlehnung an: http://www-01.ibm.com/support/docvie...d=nas8N1014053 oder http://www.code400.com/forum/forum/t...chgpw-qwcrsval)
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  4. #4
    Registriert seit
    Sep 2008
    Beiträge
    70

    Question

    Zitat Zitat von andreaspr@aon.at Beitrag anzeigen
    So funktioniert es zumindest bei mir.
    Hallo Andreas,

    danke für die schnelle Antwort. Ich habe das mit den Leerzeichen mal so für meinen Benutzer übernommen. Es ist korrekt, dass er das Statement dann ausführt, allerdings wenn ich mich dann am Green-Screen versuche mit diesem Benutzer anzumelden, ist immer noch das "alte" Kennwort richtig. Ändert er wirklich bei dir das Kennwort?

    Zum Ausführen des Statements habe ich bewusst den Test-Benutzer verwendet, für den ich auch das Kennwort ändern möchte. Als Release verwenden wir V7R2...

  5. #5
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Ja, es hat das Passwort wirklich geändert.
    Probiere es auch mal mit den Error-Code als IN Parameter zu ändern.
    Bei einem Fehler wird sowieso eine SQL Exception geworfen die du im Programm auswerten kannst.

  6. #6
    Registriert seit
    Sep 2008
    Beiträge
    70

    Question

    Zitat Zitat von BenderD Beitrag anzeigen
    ... was heißt "ohne Erfolg" genau? Jedenfalls ist modifies SQL Data schon mal falsch.

    D*B
    Ohne Erfolg heißt in dem Fall, das Statement im Tool "Run SQL Scripts" zwar erfolgreich ausgeführt, aber das Kennwort nicht geändert wird.

    Code:
    Return Code = 0
     Statement     ran successfully   (15 ms)
    Die jetzige Prozedurdefinition habe ich um die "Richtung" IN für den Parameter 4 ErrorCode geändert sowie das "Modifies SQL Data" erleichtert.

    Letzter Stand:
    Code:
    CREATE PROCEDURE ChgPwd(IN UserId CHAR(10), IN CurrentPwd CHAR(10), IN NewPwd CHAR(10), IN ErrorCode CHAR(15))
        LANGUAGE C 
        --MODIFIES SQL DATA
        EXTERNAL NAME 'QSYS/QSYCHGPW'
        PARAMETER STYLE GENERAL;
        
     CALL ChgPwd('USERX     ', 'A234567890', 'TEST      ', '');
    Aber es ist nach wie vor so, dass ich mich am Green-Screen nicht mit dem neuen Passwort anmelden kann, obwohl keine Exception oder ein Return-Code != 0 kommt.
    Wenn ich die API richtig verstanden habe, kann ich zumindest bei fehlenden Rechten *SECOFR usw. mein eigenes PWD ändern?

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Wenn man die (meist optionale) Error-Struktur angibt, wird eben keine Exception ausgeworfen, da diese ja im Zweifel in der Error-Struktur steht.
    Einen Fehler gibt es nur, wenn man die Error-Struktur weglässt.
    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

  8. #8
    Registriert seit
    Mar 2002
    Beiträge
    5.286
    ... ist denn sichergestellt, dass das nicht an der Berechtigung scheitert? Wenn im Benutzer nicht *CURRENT steht braucht man SECOFR!
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  9. #9
    Registriert seit
    Sep 2008
    Beiträge
    70
    Die Errorstruktur - Parameter 4 - kann man soweit ich gelesen bzw. getestet habe in dem Fall nicht weglassen. Jedoch kommt auch kein CPF / Error bzw. Return Code zurück.

  10. #10
    Registriert seit
    Sep 2008
    Beiträge
    70
    Hallo Hr. Bender,
    wegen der Berechtigung - ich hab es daraufhin im GreenScreen über den Befehl CHGPWD probiert, dieser funktioniert. Die Einstellung die sie meinen finde ich im DSPUSRPRF?
    Code:
    Kennwortüberprüfungen nicht gültig . . . . :   0                 
    Status . . . . . . . . . . . . . . . . . . :   *ENABLED          
    Datum der letzten Kennwortänderung . . . . :   04.12.06  10:20:02
    Kennwort ist *NONE . . . . . . . . . . . . :   *NO               
    Intervall für Kennwortablauf . . . . . . . :   *SYSVAL           
    Kennwort durch Bef. auf abgelaufen gesetzt :   *NO               
    Kennwortänderung blockieren  . . . . . . . :   *SYSVAL           
    Lokale Kennwortverwaltung  . . . . . . . . :   *YES

  11. #11
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    Zwei Fragen:
    1. Hast Du die Stored Procedure auch mal testweise unter STRSQL ausgeführt? Gleiches Ergebnis oder nicht?
    2. Könnte irgendwo ein (fehlender) Commit irgendetwas blockieren?

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  12. #12
    Registriert seit
    Sep 2008
    Beiträge
    70
    Hallo Frau Hauser,

    Den Commit habe ich zunächst im "SQL Prozeduren Ausführen" probiert, jedoch ohne Erfolg.

    Unter STRSQL im Green-Screen sehe ich einen Fehler. Das System hat Probleme mit Parameter 4:
    Code:
    Nachrichten-ID . . . . :   SQL0469                                           
                                                                                 
                                                                                 
    Nachricht . . . :   Attribut IN, OUT oder INOUT für Parameter 4 in Prozedur  
      CHGPWD in ED14LIB ungültig.                                                
                                                                                 
    Ursache  . . . . :  Das Attribut IN, INOUT oder OUT, das für Parameter 4 bei 
      der Definition der Prozedur angegeben wurde, ist nicht gültig. Der         
      Parametername ist ERRORCODE. Einer der folgenden Fehler ist aufgetreten:   
        -- Für einen Parameter OUT kann kein Standardwert angegeben werden.      
        -- Das Attribut ist mit dem Parameter in der Anweisung CALL nicht        
      konsistent. Wurde der Parameter als INOUT oder OUT deklariert, muss der    
      Parameter in der Anweisung CALL als Host-Variable oder globale Variable    
      angegeben werden.                                                          
        -- Das Attribut wurde als INOUT oder OUT angegeben und REXX wurde als    
      Sprache angegeben. Wird REXX angegeben, muss das Attribut IN lauten.       
                                                                      Weitere ...
    Wie muss ich den vierten Parameter definieren u. wie hat der CALL auszusehen?

    Ich habe es bereits mit IN/INOUT/OUT versucht.
    Code:
    , OUT ErrorCode CHAR(15))
    Beim Aufruf habe ich auch entsprechend Kombinationen von 15 * BLANKS, dem Schlüsselwort "default", "null" oder auch "?" auf Gut Glück versucht, alles ähnlich.

Similar Threads

  1. PList, Parm und Call in Free.
    By Wavum in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 14-07-16, 12:52
  2. AS400 CALL's aus Mircrosoft Access
    By Franz.Rung in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 18-08-15, 17:13
  3. Cobol und Call und Variablen
    By KingofKning in forum NEWSboard Programmierung
    Antworten: 13
    Letzter Beitrag: 19-02-15, 17:42
  4. Call Programm vs. Service-PGM
    By malzusrex in forum NEWSboard Programmierung
    Antworten: 17
    Letzter Beitrag: 15-11-13, 12:21
  5. Remote Function Call -> SAP
    By areichelt in forum NEWSboard SAP
    Antworten: 2
    Letzter Beitrag: 24-02-02, 17:44

Tags for this Thread

Berechtigungen

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