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

Bases de données Delphi Discussion :

delphi procedure stockée


Sujet :

Bases de données Delphi

  1. #1
    Membre habitué Avatar de colfire_dev
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Novembre 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Novembre 2007
    Messages : 244
    Points : 195
    Points
    195
    Par défaut delphi procedure stockée
    j'ai une erreur E2171 la variable self est inaccessible ici du fait de l'optimisation, voila mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if qPost.State = dsInsert then
        begin
          proc1.ExecProc;
          qPost.FieldByName('idpost').AsInteger := proc1.FieldByName('NEW_VALUE').AsInteger;
        end;
    Dans ma base interbase idpost est declaré comme integer autoinc
    A la Recherche du Parfait il faut faire et refaire
    L'homme sage apprend de ses erreurs. L'homme encore plus sage apprend des erreurs des autres.

  2. #2
    Membre chevronné Avatar de chaplin
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 215
    Points : 1 819
    Points
    1 819
    Par défaut
    Ta procédure stockée renvoie comment les données ?

  3. #3
    Membre habitué Avatar de colfire_dev
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Novembre 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Novembre 2007
    Messages : 244
    Points : 195
    Points
    195
    Par défaut
    Voilà
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    BEGIN
      NEW_VALUE = GEN_ID(POST_IDPOST_GEN, 1);
    END
    A la Recherche du Parfait il faut faire et refaire
    L'homme sage apprend de ses erreurs. L'homme encore plus sage apprend des erreurs des autres.

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    n'est-ce pas étrange d'affecter une valeur à un champ (idpost) autoincrémenté ?
    mais les BDD ne sont pas mon domaine !
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 688
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    Cette erreur est une erreur du debuger et n'a rien à voir avec le code.
    Tu as mis un point d'arrêt et tu essayes de connaître la valeur d'une variable qui n'est plus considérée comme "vivante" (le point d'arrêt est placé après la dernière utilisation de cette variable).

    Soit tu remontes ton point d'arrêt de plusieurs lignes, soit tu édites les options du projet et tu décoches Optimisation dans la section Compilateur.

  6. #6
    Membre habitué Avatar de colfire_dev
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Novembre 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Novembre 2007
    Messages : 244
    Points : 195
    Points
    195
    Par défaut
    là j'ai enlevé le point d'arrêt j'ai ce messsage d'erreur :
    violation of PRIMARY or UNIQUE KEY constraint "INTEG_30" on Table "Post"

    j'essayais de cherher d'où venait l'erreur c'est pour cela que j'ai mis le point d'arrêt.
    j'essaye de créer un autoinc avec interbase comme il ne le gere pas j'ai du passer par cette procedure
    A la Recherche du Parfait il faut faire et refaire
    L'homme sage apprend de ses erreurs. L'homme encore plus sage apprend des erreurs des autres.

  7. #7
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 688
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    Il te manque peut-être alors simplement un +1.

    Le message te dit que tu essayes d'insérer une nouvelle ligne avec une valeur qui est déjà utilisée dans la colonne idpost. (champ qui doit être unique à travers toute la base de données)

  8. #8
    Membre habitué Avatar de colfire_dev
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Novembre 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Novembre 2007
    Messages : 244
    Points : 195
    Points
    195
    Par défaut
    NEW_VALUE renvoie toujours 0 bizzare comme même
    A la Recherche du Parfait il faut faire et refaire
    L'homme sage apprend de ses erreurs. L'homme encore plus sage apprend des erreurs des autres.

  9. #9
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Sous Interbase, les champs AutoInc comme ceux de Paradox ou Access n'existe pas vraiment.
    Pour en avoir un, il faut recourir à l'utilisation d'un generator et un Trigger before Insert sur la table en question.
    Donc normalement, il y a 2 solution :
    1° soit tu laisse la base gerer l'autoincrement . Ceci dans le cas ou tu n'as pas besoin de la valeur du champs autoinc.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TRIGGER POST_BI FOR POST
    ACTIVE BEFORE INSERT POSITION 0
    AS
    BEGIN
      IF (NEW.IDPOST IS NULL) THEN
        NEW.IDPOSTE = GEN_ID(POST_IDPOST_GEN, 1);
    END
    2° Soit tu as besoin de la valeur du champs autoinc. Dans ce cas je te conseil de créer une procédure Stocké sous IB et d'appeler cette procédure pour récupérer la valeur du champs autoinc.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE PROCEDURE GET_POST_IDPOST
    RETURNS ( ID INTEGER)
    AS
    BEGIN
      ID = GEN_ID(POST_IDPOST_GEN, 1);
    END
    Voilà.
    On progresse .....

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    pour obtenir le numéro pas besoin de procédure stockée , un sql doit suffire
    select gen_id(POST_IDPOST_GEN,1) from RDB$DATABASE
    attention , ceci incrémente le compteur

    d'autre part il me semble, mais je n'ai pas vérifié, que execproc est un peu comme execsql l'instruction ne renvoie pas de résultat donc pour obtenir le résultat via un procédure stockée cela devrait être quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM GET_POST_IDPOST
    avec un open et non un execsql

    ce qui revient à ce qui a été indiqué plus haut avec un vavnatage pour la première , pas besoin de PS
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  11. #11
    Membre habitué Avatar de colfire_dev
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Novembre 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Novembre 2007
    Messages : 244
    Points : 195
    Points
    195
    Par défaut
    j'ai toujours cette erreur malgré tout
    violation of PRIMARY or UNIQUE KEY constraint "INTEG_30" on Table "Post"
    A la Recherche du Parfait il faut faire et refaire
    L'homme sage apprend de ses erreurs. L'homme encore plus sage apprend des erreurs des autres.

  12. #12
    Membre habitué Avatar de colfire_dev
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Novembre 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Novembre 2007
    Messages : 244
    Points : 195
    Points
    195
    Par défaut
    il y a quelque chose qui va pas ds ma procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure Tdm.qPostBeforePost(DataSet: TDataSet);
    begin
      if qPost.State = dsInsert then
        begin
          proc1.ExecProc;
          qPost.FieldByName('idpost').AsInteger := proc1.FieldByName('ID').AsInteger;
        end;
    end;
    A la Recherche du Parfait il faut faire et refaire
    L'homme sage apprend de ses erreurs. L'homme encore plus sage apprend des erreurs des autres.

  13. #13
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    reprenons depuis le début.

    soit tu as fait comme indiqué par Andry partie 1 auquel cas tu n'as aucun besoin d'appeler de procédure stockée . Si tu obtiens toujours l'erreur c'est que le compteur n'est pas bon . A toi alors de vérifier, via ton client IB préféré les valeurs qui doivent être identiques
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT MAX(IDPOST) FROM POST_BI
    et
    SELECT GEN_ID(POST_IDPOST_GEN,0) from RDB$DATABASE
    il faut , pour le moins que la valeur retournée par le SQL1 soit < au SQL2
    Toujours dans cette hypothèse ton code ne sert à rien

    Soit tu veux gérer toi même l'incrément
    dans ce cas ce n'est toujours pas execproc qu'il faut utiliser mais comme je l'ai déjà dit un SQL .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure Tdm.qPostBeforePost(DataSet: TDataSet);
    begin
      if qPost.State = dsInsert then
        begin
          Query1.SQL.Clear;
          Query1.SQL.Add('SELECT GEN_ID(POST_IDPOST_GEN,1) from RDB$DATABASE'); // notes bien qu'ici je fais l'incrément de 1
          Query1.open;
          qPost.FieldByName('idpost').AsInteger:=Query1.Fields[0].asInteger;      end;
    end;
    ceci dit cela revient au même que la solution d'Andry de loin préférable. A un différence près cependant , on obtient la valeur du champ idpost si l'on voulait faire un affichage de cette dernière
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  14. #14
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    peut être avec un suspend
    Citation Envoyé par colfire_dev Voir le message
    Voilà
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    BEGIN
      NEW_VALUE = GEN_ID(POST_IDPOST_GEN, 1);
      suspend; 
    END
    pour ma part je ne préfére pas utilisé TIBProc, et pour le incrémént, 3 possibilité
    1-tu laisse le composant IBQuery le géré (Generatorfield)
    2-utilisation de trigger
    3-dans le TIBquery directrement dans la propriété insertquery t'as par example
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    insert into VILLES
      (CODE, VILLE)
    values
      (GEN_ID(POST_IDPOST_GEN, 1), :VILLE)
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  15. #15
    Membre habitué Avatar de colfire_dev
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Novembre 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Novembre 2007
    Messages : 244
    Points : 195
    Points
    195
    Par défaut
    oh! merci Edam avec la requête insert ça marche impeccable .
    Pour ma curiosité j'aimerais savoir si ces différentes manières de gérer l'autoinc différent en performance ou en faisabilité
    A la Recherche du Parfait il faut faire et refaire
    L'homme sage apprend de ses erreurs. L'homme encore plus sage apprend des erreurs des autres.

  16. #16
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    Citation Envoyé par colfire_dev Voir le message
    oh! merci Edam avec la requête insert ça marche impeccable .
    Pour ma curiosité j'aimerais savoir si ces différentes manières de gérer l'autoinc différent en performance ou en faisabilité
    Attention avec la 2éme et 3éme méthode , si tu doit utilisé ce champs directement aprés insert je crois que tu doit réouvrir ton TIBQuery,
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/09/2009, 11h41
  2. Erreur creation procedure stockées (Firebird1.5+delphi 7)
    Par nassoft dans le forum Bases de données
    Réponses: 3
    Dernier message: 18/05/2007, 12h30
  3. Procedure Stocké sous FB et execution sous Delphi
    Par Andry dans le forum Bases de données
    Réponses: 4
    Dernier message: 10/07/2006, 15h02
  4. [Firebird D7] Modifier une procedure stocké via Delphi
    Par EGI dans le forum Connexion aux bases de données
    Réponses: 4
    Dernier message: 30/03/2005, 15h54
  5. créer une procedure stockée sous delphi
    Par gudul dans le forum Bases de données
    Réponses: 1
    Dernier message: 09/11/2004, 14h06

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