Delphi - Oracle, comment rechercher une valeur dans un champ ? [Résolu]

pierre_claval 10 Messages postés jeudi 19 juillet 2007Date d'inscription 20 mars 2014 Dernière intervention - 18 mars 2014 à 03:19 - Dernière réponse : pierre_claval 10 Messages postés jeudi 19 juillet 2007Date d'inscription 20 mars 2014 Dernière intervention
- 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
Afficher la suite 

4 réponses

Répondre au sujet
solilog 273 Messages postés samedi 13 juin 2009Date d'inscription 18 avril 2015 Dernière intervention - 18 mars 2014 à 20:20
0
Utile
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
Commenter la réponse de solilog
pierre_claval 10 Messages postés jeudi 19 juillet 2007Date d'inscription 20 mars 2014 Dernière intervention - 19 mars 2014 à 15:34
0
Utile
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
Commenter la réponse de pierre_claval
solilog 273 Messages postés samedi 13 juin 2009Date d'inscription 18 avril 2015 Dernière intervention - 19 mars 2014 à 15:44
0
Utile
Re ...
si cà fonctionne, merci de fermer ton post.
solilog
Commenter la réponse de solilog
pierre_claval 10 Messages postés jeudi 19 juillet 2007Date d'inscription 20 mars 2014 Dernière intervention - 20 mars 2014 à 20:32
0
Utile
Bonjour,

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

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

Cordialement

Pierre
Commenter la réponse de pierre_claval

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.