Problème avec ADOQuery.Locate et opération incorrecte!

Signaler
Messages postés
301
Date d'inscription
jeudi 18 décembre 2003
Statut
Membre
Dernière intervention
9 février 2010
-
Messages postés
139
Date d'inscription
mardi 27 novembre 2007
Statut
Membre
Dernière intervention
10 mai 2010
-
Bonjour à tous,
j'utilise le résultat d'un ADOQuery.Locate dans un if mais lors de l'exécution, ça m'affiche 'Opération de variant incorrecte'
mon locate est le suivant :
ADOQuery.Locate('Code', Chaine, [])

sachant que chaine et de type string...
j'ai essayé plusieurs méthodes mais ça n'a pas marché.
c'est quoi le problème SVP?
Merci

11 réponses

Messages postés
301
Date d'inscription
jeudi 18 décembre 2003
Statut
Membre
Dernière intervention
9 février 2010

ReBonjour,
j'ai utilisé toutes les possibilités mais sans succès!
SVP aidez moi!!
merci à vous!
Messages postés
4715
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
12
çà ressemble à un souci de conversion..

ADOQuery.Locate('Code', Chaine, []) 
Code est vraisemblablement de type integer
donc essaie StrToInt(Chaine).

cantador
Messages postés
301
Date d'inscription
jeudi 18 décembre 2003
Statut
Membre
Dernière intervention
9 février 2010

merci pour la réponse Cantador,
en fait, le champ 'code' est de type : char(10)
et chaine est de type string.
lorsque j'ai essayé :
ADOQuery.Locate('Code', quotedstr(Chaine), []);
ça m'affiche : "une opération en plusieurs étapes a généré des erreurs. Vérifiez chaque valeur d'état"
que dois je faire dans ce cas??
Merci pour votre aide les amis!
Messages postés
4715
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
12
curieux ce message, visiblement il doit y avoir des erreurs ailleurs..
Peut-être la structure..
il vaut mieux mettre la clé primaire en integer..


j'ai retrouvé une ancienne écriture :


ADOAccident.Locate('id_accident',65092,[]);

qui fonctionne


id-accident est un integer..

cantador
Messages postés
7
Date d'inscription
jeudi 22 mars 2007
Statut
Membre
Dernière intervention
17 décembre 2008

bonjour,

moi je rencontre un souci avec locate !

je m'explique...........

je passe par un adoconnection + adodataset + datasource et le code suivant

try

locate ( ' date,id_races', date;id_races , [] );
edit;
fieldsbyname('date').value:= date;
fieldsbyname('id_race').value:= id_races;

except;

insert;
fieldsbyname('date').value:= date;
fieldsbyname('id_race').value:= id_races;
post;

end;

.......afin de vérifier si l'enregistrement existe ou pas et ou l'insérer ou le modifier

mon problème est que l'enregistrement existe ou pas c'est toujours en "édit" et ça réecrit toujours sur le 1er enregistrement de ma table
malgrès locate j'ai un prb de detection d'enregistrement car ça n'insère jamais si nouveau enreg

si quelqu'un a la solution ??

encore merci
Messages postés
7
Date d'inscription
jeudi 22 mars 2007
Statut
Membre
Dernière intervention
17 décembre 2008

avec une base access !!
Messages postés
139
Date d'inscription
mardi 27 novembre 2007
Statut
Membre
Dernière intervention
10 mai 2010
2
Salut,

Softer47: essaie cette syntaxe: Locate('date;id_races', VarArrayOf([date, id_races]), []). Le 1° paramètre doit être séparé par des ';' et pas des ','. Et dans le cas d'une recherche sur plusieurs champs, le 2° paramètre est un tableau de Variant.
ptite suggestion: tu pourrais faire un truc du style:
if Locate('date;id_races', VarArrayOf([date, id_races]), []) then
  begin   //on a trouvé: Locate renvoie True et nous positionne sur l'enr. recherché
     edit;
     ...
  end
else     //on n'a pas trouvé: Locate renvoie False et le curseur du DataSet reste au même endroit
  begin
     insert;
     ...
  end;
ça te permettra de voir tout de suite (en debug) si tu as trouvé ton enregistrement.
Dans ton code tu cherches l'enregistrement, mais si tu ne le trouves pas (Locate renvoie False), tu te mets quand même en Edit pour modifier l'enregistrement courant (celui sur lequel tu étais positionné avant d'appeler Locate, par exemple le premier!).
Je pense que ça règlera ton pb.

Othland: j'arrive certainement un peu (beaucoup) tard, mais bon... je ne travaille jamais avec des types char, mais à tout zazard, tu pourrais essayer de caster ta variable "chaine" en Variant, ou peut-être en char(10).
Voilou!
@+.
Messages postés
7
Date d'inscription
jeudi 22 mars 2007
Statut
Membre
Dernière intervention
17 décembre 2008

jeremy,

merci de ta réponse mais ma syntaxe est bien celle que tu préconises :

locate('date;id_races',vararrayof([date,id_races]),[]);

donc là c'est bon...............mais même avec if ...then..else......... ça marche pas ( j'avais déja testé )

je comprends pas :(
Messages postés
139
Date d'inscription
mardi 27 novembre 2007
Statut
Membre
Dernière intervention
10 mai 2010
2
Quand tu dis "ça marche pas", est-ce que ça veut dire que tu ne trouves pas un enregistrement qui devrait y être et que tu passes systématiquement dans la clause else? est-ce que tu as essayé sur plusieurs enregistrements ou c'est toujours le même qui déconne? As-tu essayé avec les options (loCaseInsensitive,...)? Désolé, mais j'ai du mal à cibler ton pb.. et en ce qui concerne la syntaxe, ce n'est pas celle que tu as marquée dans ton post, d'où ma précédente suggestion..
Messages postés
7
Date d'inscription
jeudi 22 mars 2007
Statut
Membre
Dernière intervention
17 décembre 2008

re,

bon effectivement ça marche mais j'ai rajouté du formatage de variable dans vararrayof.........

vararrayof([strtodate(date),strtoint(id_races)])

bizarre car date et id_races sont bien Tdate et integer ?????

enfin c'est ok maintenant !!

merci pour tout !
Messages postés
139
Date d'inscription
mardi 27 novembre 2007
Statut
Membre
Dernière intervention
10 mai 2010
2
Abinvoui... tu n'as pas précisé d'où viennent tes variables, mais effectivement si c'est par exemple des valeurs saisies dans des TEdit, c'est forcément un String que tu récupères... Enfin bon, maintenant ça roule!!

Tchô!