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

Langage Delphi Discussion :

Numéro/Nom de variable interdit


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut Numéro/Nom de variable interdit
    Bonjour,

    J'ai un soucis sur une requête qui me met "Numéro nom de variable interdit" J'ai essayé pleins de modifications sans succès :

    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
    26
          oq.Close;
          oq.SQL.Clear;
          oq.SQL.Add('select POIXENT as POIDS from ENTXRES where NUMXENT=:num');
          oq.DeclareAndSet('num', otInteger, StrToInt(sNum));
          TestRequete1(oq, 'OPENREQ', 'Echec recup poixent (UnitPrepCmd - 100)', osOracleSession);
     
          // Calcul poids à soustraire
          dPoids := 0;
          if not oq.Eof then
          dPoids := oq.FieldAsFloat('POIDS');// - (dAncpoids + dNvPoids);   Ne change rien tjs numéro/nom de variable interdit
     
     
          //oq.SQL.Add('update ENTXRES set BLEXENT=''N''');                   code original
          oq.Close;
          oq.SQL.Clear;
          if liRupture>0 then
          begin
            //oq.SQL.Add(', POIXENT=POIXENT - ('''+FloatToStr(dAncpoids)+''' + '''+FloatToStr(dNvPoids)+''')');
            //oq.SQL.Add(', POIXENT=POIXENT - (:APoi + :NPoi)';              code original
            oq.SQL.Add('update ENTXRES set BLEXENT=''N'', POIXENT=:poi where NUMXENT=:inum');
            //oq.DeclareAndSet('Apoi', otFloat, dAncpoids);
            //oq.DeclareAndSet('NPoi', otFloat, dNvPoids);
            oq.DeclareAndSet('poi', otFloat, dPoids);
            oq.DeclareAndSet('inum', otInteger, StrToInt(sNum));
            TestRequete1(oq, 'EXECUTE', 'Echec maj blexent, poixent, regxent, mplxent, calxent (UnitPrepCmd - 051)', osOracleSession);
          end
    D'où cela peut-il venir ?

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 563
    Points : 25 165
    Points
    25 165
    Par défaut
    TestRequete1 curieux nom pour une fonction qui ouvre un execute un SQL

    Comme tu utilises un TOracleQuery, pense à utiliser le forum DOA
    où tu auras une communauté spécialisé dans cette couche d'accès Oracle qui n'est pas standard Delphi !

    Est-ce que Numéro est un champ qui existe ?
    Si ENTXRES est une vue, Numéro en fait-il parti ?
    Quelle est la classe d'exception ?
    l'erreur c'est "numéro/nom de variable interdit" ou "Numéro nom de variable interdit" ?
    Car le 1er cas ferait penser qu'une valeur est mal comprise, peut-être le Float non supporté
    Le 2nd cas ferait penser que c'est le champ 'Numéro' est mal compris

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    TestRequete1 est une procédure me permettant de soit faire un execute ou un .open d'une requête et d'envoyer un mail d'erreur si la requête échoue.

    Quel Numéro ?
    ENTXRES est le nom d'une table, ce n'est pas une vue.

    Je te met l'erreur en pièce jointe.

    Et il se trouve que plus bas j'ai presque la même requête sans l'update du poids et celle ci fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
          begin
            oq.SQL.Add('update ENTXRES set BLEXENT=''N''');
            oq.SQL.Add('where NUMXENT=:inum');
            oq.DeclareAndSet('inum', otInteger, StrToInt(sNum));
            TestRequete1(oq, 'EXECUTE', 'Echec maj blexent, poixent, regxent, mplxent, calxent (UnitPrepCmd - 051)', osOracleSession);
          end;
    Peut être un problème au niveau du otFloat oui .
    Images attachées Images attachées  

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 563
    Points : 25 165
    Points
    25 165
    Par défaut
    tu notes que le message est
    "numéro/nom de variable interdit
    "
    Pourquoi un retour charriot ?
    Est-ce un nom vide ?

    Dans ton premier message, c'est FieldAsFloat qui fait une exception après le SELECT
    Dans ton second message, tu évoques un UPDATE
    Tu nous embrouilles !

    As-tu essayé sans l'alias POIDS dans le SELECT POIXENT
    Et de faire un FieldAsFloat('POIXENT');

    Tu envoie un mal à chaque echec de SQL, ouch, n'est-ce pas un peu violent ?
    Je suppose que tu n'actives pas cela en Debug
    je sais par expérience qu'envoyer un mail est bien plus long que consulter la DB !
    Perso, je me contente d'un fichier LOG local

    ORA-01036: illegal variable name/number
    Cause: Unable to find bind context on user side
    Action: Make sure that the variable being bound is in the sql statement.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    Non je crois que c'est juste un message Delphi ... Voici en exemple le mail que je reçois suite à l'erreur (grâce à ma fonction TestRequete1) :

    Logiciel : GEORADIO
    Nom PC : DESKTOP-JUJU1988
    Message : Echec maj blexent, poixent, regxent, mplxent, calxent (UnitPrepCmd - 051) Erreur : ORA-01036: numéro/nom de variable interdit

    SQL : update ENTXRES set BLEXENT='N' where NUMXENT=:num

    Non désolée pour le manque de clarté mon erreur intervient bien au moment de l'exécution de mon update...

    Pour le POIXENT j'avais testé au début mais je vais retenter..

    J'envoi un mail à chaque erreur d'exécution de ce type là ... si la requête ne comporte aucun enregistrement cela n'envoi pas de mail

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    Oh purée !!! En mettant POIXENT au lieu de l'alias POIDS cela fonctionne ....

    Mais pourquoi ?

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 563
    Points : 25 165
    Points
    25 165
    Par défaut
    Peut-être que le FieldAsFloat du TOracleQuery ne supporte pas les Alias !
    POIDS comme mot clé, serait TRES étrange !
    Faudrait tester avec TOTO comme alias

    si la requête ne comporte aucun enregistrement cela n'envoi pas de mail
    Si elle échoue, comment peux-tu déterminer si elle contient un enregistrement ou pas ?
    Pense que ton mail pourrait lui aussi échouer si par exemple le SQL échoue à cause d'une coupure réseau !
    Pense qu'en production, ton application devra utiliser un serveur SMTP approuvé par l'admin réseau qui gère le parc où sont installés de programme
    Si c'est un développement interne d'une société, OK pas de soucis
    Si c'est un logiciel commercial largement distribué, penses à faire un écran de configuration du Server SMTP, Port, login, pw pour éviter les problèmes connus entre SMTP et FAI

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    J'ai mis TOTO en alias et cela fonctionne toujours.

    mais j'aiune erreur, la même mais pour cette requête là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    oq.SQL.Add('update ENTXRES set BLEXENT=''N''');
            oq.SQL.Add('where NUMXENT=:inum');
            oq.DeclareAndSet('inum', otInteger, StrToInt(sNum));
            TestRequete1(oq, 'EXECUTE', 'Echec maj blexent, poixent, regxent, mplxent, calxent (UnitPrepCmd - 051)', osOracleSession);
    Voici le code avec mes trois conditions :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
         oq.Close;
          oq.SQL.Clear;
          oq.SQL.Add('select POIXENT as TOTO from ENTXRES where NUMXENT=:num');
          oq.DeclareAndSet('num', otInteger, StrToInt(sNum));
          TestRequete1(oq, 'OPENREQ', 'Echec recup poixent (UnitPrepCmd - 100)', osOracleSession);
    
          // Calcul poids à soustraire
          dPoids := 0;
          if not oq.Eof then
          dPoids := oq.FieldAsFloat('TOTO');// - (dAncpoids + dNvPoids);   Ne change rien tjs numéro/nom de variable interdit
    
    
          //oq.SQL.Add('update ENTXRES set BLEXENT=''N''');                   code original
          oq.Close;
          oq.SQL.Clear;
          if liRupture>0 then
          begin
            //oq.SQL.Add(', POIXENT=POIXENT - ('''+FloatToStr(dAncpoids)+''' + '''+FloatToStr(dNvPoids)+''')');
            //oq.SQL.Add(', POIXENT=POIXENT - (:APoi + :NPoi)';              code original
            oq.SQL.Add('update ENTXRES set BLEXENT=''N'', POIXENT=:poi where NUMXENT=:num');
            //oq.DeclareAndSet('Apoi', otFloat, dAncpoids);
            //oq.DeclareAndSet('NPoi', otFloat, dNvPoids);
            oq.DeclareAndSet('poi', otFloat, dPoids);
            oq.DeclareAndSet('num', otInteger, StrToInt(sNum));
            TestRequete1(oq, 'EXECUTE', 'Echec maj blexent, poixent, regxent, mplxent, calxent (UnitPrepCmd - 051)', osOracleSession);
          end
          else
          if bRuptureTotale=True then
          begin
            oq.SQL.Add('update ENTXRES set BLEXENT=''N''');
            oq.SQL.Add(',REGXENT=0,MPLXENT=0,CALXENT=''Y''');
            oq.SQL.Add('where NUMXENT=:inum');
            oq.DeclareAndSet('inum', otInteger, StrToInt(sNum));
            TestRequete1(oq, 'EXECUTE', 'Echec maj blexent, poixent, regxent, mplxent, calxent (UnitPrepCmd - 051)', osOracleSession);
          end
          else
          begin
            oq.SQL.Add('update ENTXRES set BLEXENT=''N''');
            oq.SQL.Add('where NUMXENT=:inum');
            oq.DeclareAndSet('inum', otInteger, StrToInt(sNum));
            TestRequete1(oq, 'EXECUTE', 'Echec maj blexent, poixent, regxent, mplxent, calxent (UnitPrepCmd - 051)', osOracleSession);
          end;
    Sachant que celui qui ne fonctionne pas maintenant est le dernier en gras snif je vais pas y arriver

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 563
    Points : 25 165
    Points
    25 165
    Par défaut
    Citation Envoyé par juju1988 Voir le message
    J'ai mis TOTO en alias et cela fonctionne toujours.
    toujours ?
    toujours pas ?
    Je penche pour toujours pas puisque Ne change rien tjs numéro/nom de variable interdit

    Cela confirme que les Alias ne fonctionne pas dans ce TOracleQuery


    Est-ce que les deux autres UPDATE fonctionnent ?
    Où tu teste juste le cas du liRupture <= 0 and not bRuptureTotale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            oq.SQL.Add('update ENTXRES set BLEXENT = :pBLEXENT');
            oq.SQL.Add('where NUMXENT= :pNUMXENT');
            oq.DeclareAndSet('pBLEXENT', otString, 'N');
            oq.DeclareAndSet('pNUMXENT', otInteger, StrToInt(sNum));

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    Non avec TOTO cela a fonctionné...

    Oui les autres fonctionnent. Du coup ce que j'ai fait c'est que j'utilise une requête à part pour mon dernier cas et là ça fonctionne :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
          oq.Close;
          oq.SQL.Clear;
          oq.SQL.Add('select POIXENT from ENTXRES where NUMXENT=:num');
          oq.DeclareAndSet('num', otInteger, StrToInt(sNum));
          TestRequete1(oq, 'OPENREQ', 'Echec recup poixent (UnitPrepCmd - 100)', osOracleSession);
     
          // Calcul poids à soustraire
          dPoids := 0;
          if not oq.Eof then
          dPoids := oq.FieldAsFloat('POIXENT');
     
          oq.Close;
          oq.SQL.Clear;
          if liRupture>0 then
          begin
            oq.Close;
            oq.SQL.Clear;
            oq.SQL.Add('update ENTXRES set BLEXENT=''N'', POIXENT=:poi where NUMXENT=:num');
            oq.DeclareAndSet('poi', otFloat, dPoids);
            oq.DeclareAndSet('num', otInteger, StrToInt(sNum));
            TestRequete1(oq, 'EXECUTE', 'Echec maj blexent, poixent, regxent, mplxent, calxent (UnitPrepCmd - 051)', osOracleSession);
          end
          else if bRuptureTotale=True then
          begin
            oq.Close;
            oq.SQL.Clear;
            oq.SQL.Add('update ENTXRES set BLEXENT=''N''');
            oq.SQL.Add(',REGXENT=0,MPLXENT=0,CALXENT=''Y''');
            oq.SQL.Add('where NUMXENT=:inum');
            oq.DeclareAndSet('inum', otInteger, StrToInt(sNum));
            TestRequete1(oq, 'EXECUTE', 'Echec maj blexent, poixent, regxent, mplxent, calxent (UnitPrepCmd - 051)', osOracleSession);
          end
          else
          begin
            oqTest:=TOracleQuery.Create(Nil);
            oqTest.Session := osOracleSession;
     
            oqTest.Close;
            oqTest.SQL.Clear;
            oqTest.SQL.Add('update ENTXRES set BLEXENT=''N''');
            oqTest.SQL.Add('where NUMXENT=:numx');
            oqTest.DeclareAndSet('numx', otInteger, StrToInt(sNum));
            TestRequete1(oqTest, 'EXECUTE', 'Echec maj blexent, poixent, regxent, mplxent, calxent (UnitPrepCmd - 051)', osOracleSession);
          end;

  11. #11
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 563
    Points : 25 165
    Points
    25 165
    Par défaut
    Citation Envoyé par juju1988 Voir le message
    Non avec TOTO cela a fonctionné...
    Tu n'es vraiment pas clair du tout !
    Citation Envoyé par juju1988 Voir le message
    dPoids := oq.FieldAsFloat('TOTO');// - (dAncpoids + dNvPoids); Ne change rien tjs numéro/nom de variable interdit
    Citation Envoyé par juju1988 Voir le message
    Oui les autres fonctionnent. Du coup ce que j'ai fait c'est que j'utilise une requête à part pour mon dernier cas et là ça fonctionne :
    Cela doit survenir venir des tes DeclareAndSet qui s’emmêle !

    Lorsque tu utilises le même TOracleQuery utilise DeleteVariables() ou ClearVariables() en même temps que le SQL.Clear()

    En plus c'est écrit dans la documentation Direct Oracle Access 4.0
    User’s Guide


    Citation Envoyé par Direct Oracle Access 4.0 - User's Guide - Page 85
    If you declare variables that are not included in the SQL text (as :variable), you will get the
    following error:
    ORA-01036: illegal variable name/number

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    Excuse moi ce commentaire était pour le calcul de mon poids et non pas pour la variable toto.

    Ok ça marche je vais utiliser ces méthodes.

    Merci Shai

    EDIT : Je suis revenue du coup avec ma requête ayant le même nom pour les trois cas mais malgré les ClearVariables() même erreur

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

Discussions similaires

  1. ORA-01036 : numéro/nom de variable interdit
    Par Crowww dans le forum VB.NET
    Réponses: 13
    Dernier message: 28/05/2013, 12h11
  2. ORA-01036:numéro/nom de variable interdit
    Par ahmedige dans le forum VB.NET
    Réponses: 1
    Dernier message: 18/05/2011, 16h18
  3. Réponses: 10
    Dernier message: 11/05/2011, 18h14
  4. ORA-01036: numéro/nom de variable interdit
    Par cnguyen dans le forum SQL
    Réponses: 11
    Dernier message: 25/03/2010, 16h01
  5. Erreur ORA-01036 - numéro/nom de variable interdit
    Par Daikyo dans le forum Windows Forms
    Réponses: 1
    Dernier message: 11/06/2008, 02h25

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