Problème: Recherche d'une valeur exacte avec un TClientDataSet

Résolu
cs_djynn62 Messages postés 19 Date d'inscription lundi 14 juillet 2008 Statut Membre Dernière intervention 10 septembre 2008 - 9 sept. 2008 à 22:04
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 - 10 sept. 2008 à 15:58
Bonsoir à tous:
Je développe un programme utilisant 2 bases de données.
L'une des base contient la liste avec le premier numéro du premier feuillet du carnet (cdsFeuil) et l'autre contient tout les numéros de tout les feuillet, avec un libellé et une date de transmission (cdsTransmit)

Il sera possible dans le programme d'archiver les feuillets sans pour autant que le carnet ne soit terminé.
En conséquence, si l'on veut, pour x ou x raison supprimer l'un de ces carnet, on ne doit pouvoir le faire que si et seulement si les feuillet n'ont pas été transmis et encore moins archiver.
Si le feuillet est archiver, il est supprimer de cdsTransmit.

J'ai donc développer une routine qui semble vouloir me poser des problèmes... Je cherches depuis 3 jours et je n'ai pas trouvé de solution a l'heure actuelle.

Voici la procédure:
ShowMesge est une feuille contenant uniquement un "memo" et un bouton "Ok".
Erreur sert pour déclencher l'affichage de ShowMesge après avoir récupérer tout les feuillets incriminés...
ReturnNbFeuil renvois un integer selon le nombre de feuillet dans un carnet (Trois type de carnet...)
Pour alléger l' executable, toutes les bases de données sont définies dans la "Form1".

procedure TForm5.SupprimerClick(Sender: TObject);
Var
   Erreur: Boolean;
   Number, T: Integer;
label fin;
begin
     {Il faut vérifier dans un premier temps, si l'un des feuillets a été transmis.
      Ensuite, si il y a des erreurs, elles seront affichées dans une boite de dialogue
      contenant le numéro des feuillets concernés}

     //On définit le message d'erreur éventuel:
     ShowMesge.Memo1.Clear;  //On efface du mémo le dernier message affiché...
     ShowMesge.Memo1.Lines.Add('Impossible de supprimer pour la/les raison(s) suivante(s):');
     Erreur := False; //Par défaut, il n'y a pas d'erreur...

     With Form1 do//On use et abuse de Form1...
     begin
          Number : = cdsFeuil.FieldValues['Numero'];
          cdsTransmit.IndexFieldNames := 'Numero'; //On se positionne dans cdsTransmit...

          //On crée une boucle pour vérifier l'intégralité des feuillets...
          For T : = Number to Number + ReturnNbFeuil(cdsTa.FieldValues['Couleur']) do
          begin
               //Si le numéro du feuillet est introuvable, c'est qu'il est archivé.
               If cdsTransmit.FindKey([T]) = False then       //CA BLOQUE ICI!!  
               begin
                    Erreur : = True; //L'erreur est donc évidente...
                    //On ajoute une ligne d'erreur au message.
                    ShowMesge.Memo1.Lines.Add('Le feuillet numéro ' + IntToStr(T) + ' est archivé.');
                    goto fin;//Pour passer les instructions non encore implémentées. Sera simplifié en temps et en
                                  heures
               end;
          //On affiche le message d'erreur...          If Erreur True then   ShowMesge.ShowModal;
Le résultat de cette boucle est que tout les feuillets qui sont présent dans la liste sont "archivés" alors qu'il n'en est rien!
J'ai bien tenté "d'inverser" le résultat, mais sans succès
J'ai tenté d'utiliser "Locate(IntToStr(T), T, [loCaseInsensitive])", mais là delphi me renvoie une erreur en me disant qu'il n'a pas trouvé le champ. Or, en affichant la liste de cdsTransmit, la feuille existe bel et bien (ainsi que les suivante).
J'ai tenté d'autres choses, mais toujours sans succès...
Quelqu'un aurait il une idée?

3 réponses

cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
10 sept. 2008 à 13:59
J'ai tenté d'utiliser "Locate(IntToStr(T), T, [loCaseInsensitive])", mais là delphi me renvoie une erreur en me disant qu'il n'a pas trouvé le champ.


Déjà, l'écriture n'est pas correcte :

cdsTransmit.Locate('NomDuChamp', ValeurCherchée,[]);

[] mis par défaut pour les SearchOptions.

Voir si ça marche dans ces conditions.

cantador
3
cs_djynn62 Messages postés 19 Date d'inscription lundi 14 juillet 2008 Statut Membre Dernière intervention 10 septembre 2008
10 sept. 2008 à 14:57
Quel idiot je fait....
Ca a l'air de fonctionner comme ça... Merci beaucoup
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
10 sept. 2008 à 15:58
reste un clic sur réponse acceptée..

cantador
0
Rejoignez-nous