pierre_claval
Messages postés10Date d'inscriptionjeudi 19 juillet 2007StatutMembreDernière intervention20 mars 2014
-
18 mars 2014 à 03:19
pierre_claval
Messages postés10Date d'inscriptionjeudi 19 juillet 2007StatutMembreDernière intervention20 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 !
solilog
Messages postés273Date d'inscriptionsamedi 13 juin 2009StatutMembreDernière intervention18 avril 201510 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.
pierre_claval
Messages postés10Date d'inscriptionjeudi 19 juillet 2007StatutMembreDernière intervention20 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));