Delphi - Oracle, comment rechercher une valeur dans un champ ?

Résolu
pierre_claval Messages postés 10 Date d'inscription jeudi 19 juillet 2007 Statut Membre Dernière intervention 20 mars 2014 - 18 mars 2014 à 03:19
pierre_claval Messages postés 10 Date d'inscription jeudi 19 juillet 2007 Statut Membre Dernière intervention 20 mars 2014 - 20 mars 2014 à 20:32
Bonjour,

Toujours sur mon développement avec Delphi 5 (Delphi 2009 disponible également et si nécessaire) sur une base de données Oracle.

Satisfait dans un premier temps du résultat obtenu avec la fonction "classique" "Locate" que j'utilisais jusqu'à présent pour aller vérifier si une valeur donnée était présente ou non dans un champ spécifique.

Soit sur la table Oracle "CLIENT" :

// Rechercher dans la table "CLIENT" si le code abonné "CI_Abo" existe
if CLIENT.Locate('CODE_ABO', CI_Abo, []) Then
Begin
//ShowMessage('Code abonné trouvé');
// Récupération des données dans la table CLIENT
Li_ID_LDD := CLIENT.FieldByName('ID_LDD').AsInteger;
Li_ID_PERSONNE := CLIENT.FieldByName('ID_PERSONNE').AsInteger;
...

Comme j'obtenais un résultat cohérent auprès plusieurs tests, j'ai cru que la fonction "Locate" aller me permettre de traiter toutes mes recherches.

Et bien non, une recherche sur une autre table et un autre champ me fit prendre conscience du problème ! En fait, le champ sur lequel la fonction "Locate" donne un résultat est un champ de type "VARCHAR". Dès lors où je fais une recherche sur un champ de type "NUMBER"..., cela ne fonctionne pas. De plus, sans erreur, ce qui m'a laissé croire un instant que cela fonctionnait !

J'ai bien essayé d'utiliser le SQL sous la forme :
...
sql.Add('SELECT DOSSIER. * FROM DOSSIER WHERE ID_LDD LIKE ');
sql.add('''%'+Edit3.Text+'%''');
...

Je n'ai pas d'erreur mais la requête ne semble pas balayer l'ensemble de la table... et comment puis-je m'assurer du résultat ?

Pouvez-vous m'aider SVP ?

Un exemple serait le bienvenu car je reste un amateur dans le domaine et tout particulièrement sur des bases Oracle !

En vous remerciant par avance.

Cordialement.

Pierre

4 réponses

solilog Messages postés 273 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 18 avril 2015 10
18 mars 2014 à 20:20
Salut,
Le LIKE dans le SQL est dangereux, car il te retourne bien TOUS les records, mais bien plus : LIKE "%10%" te retournera les 10, 100, 210, 10xx, tous les codes qui contiennent 10, évident ...
Par contre que ton champ soit NUM ou CHAR, le
' SELECT * from DOSSIER WHERE ID_LDD = "+edit1.text+" '
si alpha
et
' SELECT * from DOSSIER WHERE ID_LDD = ' + edit1.text
si num (sans ")
tout çà fonctionne et te retournera TOUS les records.

Maintenant si tu veux utiliser une tTable, mets filtered=true,
utilises l'évenement OnFilterRecord. Là tu peux faire tout les tests et accepter/refuser le record (Accept:=true/false). Ensuite, les first, next, last sur le dataset seront restreints à ta condition.
C'est tout facile.

solilog
0
pierre_claval Messages postés 10 Date d'inscription jeudi 19 juillet 2007 Statut Membre Dernière intervention 20 mars 2014
19 mars 2014 à 15:34
Bonjour et merci Solilog,

Cela fonctionne parfaitement.

A toutes fins utiles pour d'autres personnes en recherche, ci-dessous le code en question dans un "bouton".

procedure TMaster.Button2Click(Sender: TObject);
Var
valcode : integer;
valcode2 : integer;

begin

Query5.active:=false;
Query5.Sql.Clear;
Query5.Sql.Add('select * from DOSSIER Where ID_LDD = '+Edit4.Text);
Query5.active:=true;
valcode:=Query5.fieldbyname('ID_LDD').AsInteger; // et non AsString
valcode2:=Query5.fieldbyname('IDENTIFIANT').AsInteger; // et non AsString

if valcode <> StrtoInt(edit4.text) then showmessage('Code '+Edit4.Text+' introuvable.') Else showmessage('ID_LDD : '+Inttostr(valcode)+' trouvé avec le numéro de dossier : '+IntToStr(valcode2));

end;

Bonne journée.

Pierre
0
solilog Messages postés 273 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 18 avril 2015 10
19 mars 2014 à 15:44
Re ...
si cà fonctionne, merci de fermer ton post.
solilog
0
pierre_claval Messages postés 10 Date d'inscription jeudi 19 juillet 2007 Statut Membre Dernière intervention 20 mars 2014
20 mars 2014 à 20:32
Bonjour,

J'ai cliqué sur "résolu" dans la foulée !

Ce n'est pas suffisant, dois-je faire autre chose ?

Cordialement

Pierre
0
Rejoignez-nous