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 :

Opération de variant incorrecte


Sujet :

Bases de données Delphi

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 142
    Par défaut Opération de variant incorrecte
    Bonjour à tous,

    Voici ma requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SQL.Clear;
    SQL.Add('SELECT COUNT(*) AS NBRE,CHAMP_1);
    SQL.Add('FROM MATABLE');
    SQL.Add('WHERE CHAMP_2 = :CHAMP_2);
    SQL.Add('GROUP BY CHAMP_1);
    // Paramètres en entrée
    ParamByName('CHAMP_2').AsString := Valeur;
    Open;
    Pour tester le cas ou aucun enreg. ne correspond à ma sélection, j'ai codé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if FieldValues['Nbre'].IsNull then CHAMP_1 := '';
    Et à l'éxecution, je me plante lamentablement avec le message :
    "Opération de variant incorrecte".

    Je ne comprends pas quelle erreur j'ai pu faire... Comment pourrais-je coder ce cas ou aucun enreg. n'existe ?

    Merci.

  2. #2
    Membre émérite
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Par défaut
    c'est quoi CHAMP_1 ? un TField ? Si c'est le cas, utilise la méthode Clear.

    Bloon

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 142
    Par défaut
    Salut,

    Excuse-moi, j'ai écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if FieldValues['Nbre'].IsNull then CHAMP_1 := '';
    alors qu'il s'agit de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if FieldValues['Nbre'].IsNull then Nom_Variable := '';
    Nom_Variable est une String.

  4. #4
    Membre émérite
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Par défaut
    Elle sert à quoi cette ligne ? c'est quoi le rapport avec la requête ? Tu peux mettre tout le code de la procédure ?

    Bloon

  5. #5
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 142
    Par défaut
    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
     
    procedure CountSalar(Nom:string; var Matricule:string);
    ...
              SQL.Clear;
              SQL.Add('SELECT COUNT(*) AS NBRE,MAT_SLR');
              SQL.Add('FROM SALARIE');
              SQL.Add('WHERE NOM_SLR = :NOM_SLR');
               SQL.Add('GROUP BY MAT_SLR');
    // Paramètres en entrée
              ParamByName('NOM_SLR').AsString := Nom;
              Open;
    //Pas de salarié portant ce nom
            if FieldValues['Nbre'].IsNull then Matricule := ''
              else
    // Plusieurs salariés portent ce nom   
              if FieldValues['Nbre']> 1  then Matricule := '' 
    // Le nom du salarié portant ce nom est unique
              else  Matricule := FieldValues['MAT_SLR'];
           ...
    1) l'utilisateur rentre le nom d'1 salarié (cf. l'entête de procédure)
    2) Je teste si le nom existe dans la base. Si le nom est trouvé et s'il est unique, je récupère son matricule
    3) Si le nom n'est pas trouvé (ds ce cas, j'aurais souhaité mettre le matricule à : '' pour le tester en retour de la proc.) ou s'il y a plusieurs salariés portant le même nom, je déclenche une autre procédure qui propose dans une ListBox les noms et les matricules d'un sous-ensemble déterminé de salariés.

    La procédure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    procedure CountSalar(Nom:string; var Matricule:string);
    existe déjà. Je comptais la ré-employer plutôt que d'en écrire une autre de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    procedure CountSalar(Nom:string; var Nbre);
    Avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     SQL.Add('SELECT COUNT(*) AS NBRE);
    et pour laquelle je n'aurais plus de pb de variant.

    Mais je trouve tout de même bizarre cette erreur. En tout cas, je ne la comprends pas. Dans l'absolu, comment tester une telle condition ?

    Si tu as une explication...

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 119
    Par défaut
    En mettant plutot cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if Fields[0].asinteger = 0 then CHAMP_1 := '';
    A verifier

  7. #7
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 142
    Par défaut
    Merci Mika de t'être intéressé au problème , mais ta solution ne fonctionne pas. En effet, lorqu'on a 1 requête de type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT COUNT(*) AS NBRE
    FROM TABLE
    WHERE ...
    on récupère 0 dans NBRE si aucune ligne ne correspond à la requête. Par contre, si on fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT COUNT(*) AS NBRE, CHAMP_1
    FROM TABLE
    WHERE ...
    GROUP BY CHAMP_1
    On récupère cette fois Null dans NBRE et dans CHAMP_1.

    Je ne sais pas si j'ai été clair, mais ma question est : pourquoi lorsque je fais :
    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
     
    procedure CountSalar(Nom:string; var Matricule:string); 
    ... 
              SQL.Clear;
              SQL.Add('SELECT COUNT(*) AS NBRE,MAT_SLR'); 
              SQL.Add('FROM SALARIE'); 
              SQL.Add('WHERE NOM_SLR = :NOM_SLR'); 
              SQL.Add('GROUP BY MAT_SLR'); 
    // Paramètres en entrée 
              ParamByName('NOM_SLR').AsString := Nom; 
              Open; 
    //Pas de salarié portant ce nom 
            if FieldValues['Nbre'].IsNull then Matricule := '' 
            else 
    // Plusieurs salariés portent ce nom    
              if FieldValues['Nbre']> 1  then Matricule := '' 
    // Le nom du salarié portant ce nom est unique 
              else  Matricule := FieldValues['MAT_SLR'];
    je récupère un message d'erreur : "Opération de variant incorrect"...

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 119
    Par défaut
    en faisant un pas à pas ton erreur se situe où.
    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
     
     
    procedure CountSalar(Nom:string; var Matricule:string); 
    ... 
              SQL.Clear; 
              SQL.Add('SELECT COUNT(*) AS NBRE,MAT_SLR'); 
              SQL.Add('FROM SALARIE'); 
              SQL.Add('WHERE NOM_SLR = :NOM_SLR'); 
              SQL.Add('GROUP BY MAT_SLR'); 
    // Paramètres en entrée 
              ParamByName('NOM_SLR').AsString := Nom; 
              Open; 
    //Pas de salarié portant ce nom 
            if FieldValues['Nbre'].IsNull then Matricule := '' 
            else 
    // Plusieurs salariés portent ce nom    
              if FieldValues['Nbre']> 1  then Matricule := '' 
    // Le nom du salarié portant ce nom est unique 
              else  Matricule := FieldValues['MAT_SLR'];
    Moi pour la dernière ligne je ferais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Matricule := FieldbyName('MAT_SLR').as string;

  9. #9
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 142
    Par défaut
    Salut,

    Excuse-moi pour la réponse tardive. J'ai refait ma procedure de telle sorte que je n'ai plus de valeur nulle.

    Mais le problème se pose toujours même si je l'ai contourné.

    Pour répondre à ta question :
    en faisant un pas à pas ton erreur se situe où.
    Au moment du test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if FieldValues['Nbre'].IsNull then Matricule := ''
    Voilà...

  10. #10
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 142
    Par défaut
    Ah ! Ben, je m'aperçois que Sondo a le même problème...
    J'ai l'impression d'être un peu moins c....

  11. #11
    Rédacteur

    Inscrit en
    Mars 2005
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 38
    Par défaut
    "... Comment pourrais-je coder ce cas ou aucun enreg. n'existe ":

    Avec la fonction "VarIsNull"ou "VarIsEmpty" ça devrait marcher nickel...
    car ce n'est pas une "methode" sur un object éventuellement null/nil; c'est de simples fonctions pour les variants...

    Chaps

  12. #12
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 142
    Par défaut
    Merci de ta réponse, Chaps, je retiens la "combine".

    A+

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

Discussions similaires

  1. Message d'erreur 'opération de pointeur incorrecte'
    Par Clotilde dans le forum Langage
    Réponses: 3
    Dernier message: 05/06/2008, 09h40
  2. Conversion de type variant incorrecte
    Par kiminfor dans le forum Bases de données
    Réponses: 2
    Dernier message: 04/06/2008, 16h52
  3. Erreur "Opération de variant incorrecte"
    Par padechance dans le forum Delphi
    Réponses: 4
    Dernier message: 29/12/2006, 17h24
  4. locate - type variant incorrect
    Par lol_adele dans le forum Bases de données
    Réponses: 8
    Dernier message: 24/10/2005, 15h54
  5. Réponses: 2
    Dernier message: 03/08/2005, 00h39

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