IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AS/400 Discussion :

Appeler un programme de service via une procédure stockée


Sujet :

AS/400

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 57
    Par défaut Appeler un programme de service via une procédure stockée
    Bonjour,

    J'ai un programme de service (TRAN000M) qui contient plusieurs fonctions, dont une déclarée comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    P TRA_Recalcul    B                   EXPORT    
                                                    
    D TRA_Recalcul    PI                            
    D  PBZDZ                         8S 0 CONST
    Je voudrais appeler cette fonction via une procédure stockée, que j'ai déclaré comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE PROCEDURE TRAN000( IN PDATE DEC (8, 0))                                              
    LANGUAGE RPGLE NOT DETERMINISTIC CONTAINS SQL                      
    EXTERNAL NAME TRAN000M(TRA_Recalcul) PARAMETER STYLE GENERAL
    Si j'appelle cette procédure, la fonction du programme de service est bien appelée, mais la zone PBZDZ en entrée contient des caractères incorrects.

    Auriez-vous une idée pour corriger ça ?
    Merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 57
    Par défaut
    J'ai tenté un passage de paramètre en alphanumérique, puis une conversion numérique dans la fonction.
    ça fonctionne dans ce cas, le paramètre est bien reçu, et la conversion se fait bien.

    Je pense qu'il y a un problème de conversion des zones numériques entre SQL et le programme de service.
    C'est d'autant plus étonnant que ça fonctionne parfaitement entre SQL et un programme RPGLE.

    Il faut peut-être modifier quelque chose au niveau de la déclaration, peut-être au niveau du LANGUAGE.

  3. #3
    Membre émérite
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    727
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 727
    Par défaut
    La réponse est simple.
    La procédure utilise le type "Decimal" qui est équivalent au "packé"
    Le programme utilise le type numérique étendu (Zoned)
    Pour que la procédure colle au programme il aurait fallu faire la déclaration du paramètre en NUMERIC et non DECIMAL

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 57
    Par défaut
    Merci pour cette réponse.
    Mais je n'arrive pas à tester ce que tu indiques.

    Une fois déclaré en Numeric, l'appel direct via SQL ne fonctionne plus, il indique une erreur de conversion. [CALL TRAN000( 20230413 )]
    Même chose lors de mon appel via mon appli ASP.NET, il n'arrive pas à convertir la zone numérique dans le format attendu par la procédure.

    Je ne sais pas à quoi correspond le NUMERIC du coup...

  5. #5
    Membre émérite
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    727
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 727
    Par défaut
    Pour ma part çà fonctionne parfaitement, entre VB.NET et mes programmes / procédures en RPGLE

    Exemple testé à l'instant avec une procédure de Test
    Dans le RPG :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    '*-------------------------------------------------------------------*                   
    '* Tst_Numeric     Test champ Numeric                                *                   
    '*-------------------------------------------------------------------*                   
    D Tst_Numeric     PI                                                       Code retour   
    D    p_NumFld                    8S 0 Const                                champ Numeric 
    D    p_RetCod                   10i 0                                      champ retour
    La procédure a été créée ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE PROCEDURE MYBIB.TSTNUM ( 
    	IN FLDNUM NUMERIC(8, 0) , 
    	INOUT RETNUM INTEGER ) 
    	LANGUAGE RPGLE 
    	SPECIFIC MYBIB.TSTNUM 
    	NOT DETERMINISTIC 
    	MODIFIES SQL DATA 
    	CALLED ON NULL INPUT 
    	EXTERNAL NAME 'MYBIB/TSTNUM' 
    	PARAMETER STYLE GENERAL ; 
      
    GRANT EXECUTE   
    ON SPECIFIC PROCEDURE MYBIB.TSTNUM 
    TO PUBLIC ;
    Et dans le VB :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    nexion.
            Dim Cmd As New IBM.Data.DB2.iSeries.iDB2Command
            Cmd.Connection = cnn
            Cmd.CommandTimeout = 0
    
            Cmd.CommandText = "CALL MYBIB.TSTNUM(?, ?)"
    
            Cmd.Parameters.Add("@numFld", iDB2DbType.iDB2Numeric, 8, 0)
            Cmd.Parameters.Add("@retCod", iDB2DbType.iDB2Integer)
    
            Cmd.Parameters("@numFld").Value = 10
            Cmd.Parameters("@numFld").Direction = ParameterDirection.Input
            Cmd.Parameters("@retCod").Value = 0
            Cmd.Parameters("@retCod").Direction = ParameterDirection.InputOutput
    
            ' Si aucune erreur valide, sinon annule
            Try
                If (Cmd.ExecuteNonQuery = 0) Then    ' Exécute la requête. Si erreur...
                    MessageBox.Show("Erreur lors de la récupération du paramètre ")
                Else
                    MessageBox.Show("Paramètre reçu " & CType(Cmd.Parameters("@retCod").Value, String))
                End If
            Catch ex As Exception
                MessageBox.Show("Erreur lors de l'appel ")
            End Try

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 57
    Par défaut
    Merci pour cet exemple. C'est ce qu'il me manquait pour comprendre comment déclarer la procédure avec le NUMERIC.

    Effectivement, avec la bonne déclaration ça marche parfaitement.

    Merci !!!

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/10/2014, 19h40
  2. Donner un nom à une sauvegarde via une procédure stockée
    Par arthuro45 dans le forum Administration
    Réponses: 1
    Dernier message: 28/09/2010, 12h32
  3. Réponses: 6
    Dernier message: 15/07/2010, 13h39
  4. Lancement DTSRun via une procédure stockée
    Par dut-dut dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 12/12/2007, 16h57
  5. Appel d'un script SQL dans une procdure stockée
    Par doudou10000 dans le forum Oracle
    Réponses: 10
    Dernier message: 01/12/2004, 10h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo