Rechercher un mot clé dans les tables d'une base access

codial Messages postés 265 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 5 mai 2015 - 8 nov. 2006 à 18:22
codial Messages postés 265 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 5 mai 2015 - 9 nov. 2006 à 10:23
Bonsoir,

c'est probablement une question bête, mais bon je bute dessus!!

Je cherche à faire une recherche à partir d'un mot clé dans les tables d'une base access.

Je balaie donc tous les champs des tables mais je bute sur un truc:
Est ce qu'il existe une fonction pour dire: Le champ X contient MonOccurence? Ou bien une autre technique?

D'avance merçi

Cordialement
Codial

<!-- / message -->

3 réponses

Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
8 nov. 2006 à 21:06
tu peux essayer un
req := 'SELECT * FROM matable WHERE monchamp LIKE '''%' + monOccurence + '%'''';

remarque : c'est que des simples quotes, ce qui donne (monOccurence = 'occ') :

SELECT * FROM matable WHERE monchamp LIKE '%occ%'

remarque2 : le % est peut etre a remplacer par * sous access
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
9 nov. 2006 à 09:17
Heuh...Guillemouze, avec ta requête SQL tu ne recherches que dans le champ MonChamp !

Voici une autre solution testée avec la bdd DbDemos livrée avec Delphi et effectuant une recher sur le contenu de trois champs de type chaîne : 
SELECT * FROM Biolife WHERELOWER(category||common_name||"species name") LIKE "%fish%"

Explications :
1/- Pour faciliter la recherche sans tenir compte de la casse des caractères, on force le contenu des champs concaténés en minuscules.
2/- On utilise l'opérateur de concaténation "||" (2 fois le caractères pipe, [ALT gr][6]) et on utilise l'opérateur LIKE du SQL.

Comme l'a fait remarquer Guillemouze, il faut peut-être remplacer le caractère % par un astérisque avec une base Access.

May Delphi be with you !
<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
codial Messages postés 265 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 5 mai 2015 1
9 nov. 2006 à 10:23
Bonjour,

merci pour vos réponses. En fait je dois chercher un mot clé dans tous les champs de toutes les tables, aussi je ne pense pas que le select convienne c'est pour ça que je ne l'ai pas utilisé, mais je me trompe peut être, je vais réécrire le code pour voir:

Hier soir en recherchant dans l'aide de Delphi la fonction copy j'ai écrit ce code qui semble fonctionner
A partir d'un bouton j'appelle chaque table avec:

//=====================================
../..
if R5.Checked then begin
    AfficheRecherche(DM.tblClients);
    AfficheRecherche(DM.tblPRO);
    AfficheRecherche(DM.tblChantiers);
    AfficheRecherche(DM.tblDetailChantier);
    end;
  If  ListView1.Items.Count = 0 Then
        Application.MessageBox('Chaîne recherchée non trouvée', 'Information',mb_Ok);
.../...
//=============================================================


procedure TfrmRecherche.AfficheRecherche(MaTable:TADOTable);
var
   i: Integer;
   y:integer;
   pos:integer;
   Info: String;
   Critere:variant;
   PrevValue:variant;
   ListAjout : TListItem;
begin
    critere:=Edit1.Text; // Le mot clé
    MaTable.Open;
    MaTable.First;
    While Not MaTable.EOF do
      begin
      for i := 1 to MaTable.FieldCount - 1 do begin
        pos:=0;
        Info := MaTable.Fields[i].FieldName ;
        if not VarIsNull(MaTable.Fields[i].Value) then
        PrevValue:= MaTable.Fields[i].Value;
        for y := 1 to length(PrevValue) do begin
          pos:=pos+1; //On incrémente la position dans la chaîne
          if UpperCase(Copy(PrevValue,pos,Length(Critere))) = Uppercase(Critere) then
          begin
            //On ajoute les champs dans la listbox
            ListAjout := ListView1.Items.Add;
            ListAjout.Caption := MaTable.Name; // La table où a été trouvée le mot clé
            ListAjout.SubItems.Add(Info); // Le nom du champ
            ListAjout.SubItems.Add(PrevValue); // La valeur du champ
            listajout.SubItemImages[0] := 1;
          Break;          end;
        end;
      end;
      PrevValue:=null;
      MaTable.Next;
      end;
end;

Il y a peut être plus simple !!!!

Cordialement
Codial
0
Rejoignez-nous