Simple filtrage: "Têtutesse oblige!" [Résolu]

Leader2000 190 Messages postés mercredi 24 mai 2006Date d'inscription 28 août 2015 Dernière intervention - 15 mai 2008 à 16:16 - Dernière réponse : Leader2000 190 Messages postés mercredi 24 mai 2006Date d'inscription 28 août 2015 Dernière intervention
- 23 mai 2008 à 14:46
Salut!


Je me demande si c'est un oubli ou c'est juste une question d'ignorance.


J'ai une table contenant deux champs: CodeBar et Prix. Et sur mon Tform j'ai les composants suivants: Tedit1 et Tedit2.
Dans le OnChange de mon Tedit1, j'ai les codes suivants pour permettre le filtrage:

Adotable1.filter:='CodeBar=' +quotedstr(edit1.Text);
Adotable1.filtered:= True;
Edit2.Text:= Adotable1.FieldValues['prix']; // bloquage ICI

Ben, quand j'écris par exemple le nom d'un code bar dans mon Tedit1. Il fait parfaitement du filtrage en affichant dans le Tedit2, le prix juste à l'aide de la ligne de code colorée en rouge.

Mais quand j'utilise mon le lecteur Code bar... il tente de bien faire la lecture... soudainement le programme se bloque au niveau de la ligne colorée de rouge.

Tandis que lorsque je saisi manuellement au truchement du clavier le code bar dans le Tedit1, la donnée du prix s'affiche normalement dans le Tedit2. Mais alors, la même operation faite avec le dit lecteur. Il y a bloquage sur la dite ligne en rouge. Que faire?

Merci d'avance,
Developper est une dimension pour moi.
Leader2000
Afficher la suite 

Votre réponse

17 réponses

Meilleure réponse
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 17 mai 2008 à 18:05
3
Merci
Mais alors, si j'écris manuellement le même code à partir de l'edit1. Oh lala lala, c'est là où s'pose le problème. Le programme s'plante TOTALEMENT

C'est normal leader2000 puisque ton évènement OnChange est actif et donc dès que tu tapes le premier caractère paf ton OnChange se déclenche et crée un filtre avec ce premier caractère..
on imagine le résultat..

Si tu veux pouvoir taper ton code manuellement, il faut nécessairement déclencher quelque chose lorsque ta saisie est terminée..

Mais qui peut le savoir quand c'est fini ?
sauf bien sûr si tous tes codes ont la même longueur

auquel cas il suffit de tester la longueur de ta chaîne sur le OnKeyPress ou le OnkeyDown et dès qu'elle est atteinte tu exécutes ta procédure de filtre.
sinon tu poses un bouton et tu cliques lorsque la saisie est terminée.

Dans les deux cas, il faut encapsuler tes écritures par un traitement des erreurs

try
...
...
except
showmessage('code erroné');
exit;

end;

ce qui évitera les plantages du programme.

si ça te convient merci de cliquer sur réponse acceptée

cantador

Merci cs_cantador 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 99 internautes ce mois-ci

Commenter la réponse de cs_cantador
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 16 mai 2008 à 08:21
0
Merci
bonjour leader2000,
avec le lecteur, quelle est la valeur dans :

quotedstr(edit1.Text);
?

ajouter ceci en attendant :

Adotable1.filtered:= false;

Adotable1.filter:='CodeBar=' +quotedstr(edit1.Text);
Adotable1.filtered:= True;
Edit2.Text:= Adotable1.FieldValues['prix']; // bloquage ICI
Commenter la réponse de cs_cantador
Leader2000 190 Messages postés mercredi 24 mai 2006Date d'inscription 28 août 2015 Dernière intervention - 16 mai 2008 à 12:46
0
Merci
Salut!


J'ai essayé les codes donnés. Ça n'a malheuresement pas marché! Ça affiche le prix dans Edit2. Au fait, je ne devais pas mettre du "next" sinon il passerait chaque fois à la deuxième ligne. Le code en rouge m'a permis d'actualiser toujours ma table.
Ma préoccupation est de faire juste une boucle qui me permettra l'affichage du prix d'un produit à un autre, chaque fois qu'il sera scanner.




Adotable1.filter:='CodeBar=' +quotedstr(edit1.Text);
Adotable1.filtered:= True;
Adotable1.filtered:= False;
Adotable1.Next;
Edit2.Text:= Adotable1.FieldValues['prix'];
Adotable1.Refresh;


 


Developper est une dimension pour moi.
Leader2000
Commenter la réponse de Leader2000
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 16 mai 2008 à 20:53
0
Merci
je ne pige pas grand chose à tes explications car 
Au fait, je ne devais pas mettre du "next"
dans le code fourni il n'y avait pas de next et par ailleurs tu ne réponds pas la question posée..
valeur dans :
quotedstr(edit1.Text);
et je ne vois vraiment pas ce que next vient faire ici..(car cette instruction sert à se déplacer sur l'enregistrement suivant..)
et enfin un filtre ne déplace pas le pointeur..
il faut faire un locate si tu tiens à te positionner sur l'enregistrement précis
sinon tu peux faire un lookup à condition de récupérer la clé du prix avec le lecteur.

cantador
Commenter la réponse de cs_cantador
Leader2000 190 Messages postés mercredi 24 mai 2006Date d'inscription 28 août 2015 Dernière intervention - 17 mai 2008 à 15:25
0
Merci
Ok. J'ai été trop brut dans mon expression. Je crois que je veux resumer tout ça pour être plus explicite.
Pour repondre à ta question du Edit1, il reçoit la valeur du code Bar. C'est dire que, les codes lus par le lecteur seront affichés dans l'Edit1.


Au fait, j'ai compris qu'il s'agit d'une sorte de refus d'écrire manuellement le code. Je prends un exemple très concret:
ma Table contient deux champs: "CodeBar" et "Prix". C'est dire que Edit1 pour affichage "Code Bar" et edit2 pour affichage "Prix".
En runtime; si je vais dans mon Dbgrid pour copier un code à partir du champ "codeBar" et le coller dans l'Edit1. L'affiche dudit produit apparaît sans problème dans l'Edit2.
Mais alors, si j'écris manuellement le même code à partir de l'edit1. Oh lala lala, c'est là où s'pose le problème. Le programme s'plante TOTALEMENT et s'arrête sur la ligne que j'ai colorée en rouge.
Pour finir, je suis convaincu que c'est ce que le lecteur fait. Faisant la lecture du code bar avec le lecteur...le programme s'plante avant même d'entamer le deuxième chiffre du code bar. Voilá tout!
Comment pourrai-je resoudre ce problème.

Merci,

...OnChange...

Adotable1.filter:='CodeBar=' +quotedstr(edit1.Text);
Adotable1.filtered:= True;
Edit2.Text:= Adotable1.FieldValues['prix']; // bloquage ICI

Developper est une dimension pour moi.
Leader2000
Commenter la réponse de Leader2000
Leader2000 190 Messages postés mercredi 24 mai 2006Date d'inscription 28 août 2015 Dernière intervention - 17 mai 2008 à 19:48
0
Merci
Oui Cantador,
les dits codes marchent parfaitement bien que toujours maintenu dans le même évenement (OnChange). Plus de blocage et le filtrage se fait bien! Quand je dis qu'il se fait bien, c'est parce que je le vois à travers mon Dbgrid.
Seulement, l'affichage du contenu du champ "prix" ne s'affiche pas dans l'Edit2, après écrit le code dans l'Edit1.
Peux-tu jeter un coup d'oeil là où j'ai mis la fameuse ligne de code (colorée en vert).
Si tu peux bien apporter ton aide...Cela faciliterai le clique sur "reponse acceptée". Je suis convaincu que cette solution aiderai quelques uns.

...OnChange...
try
Adotable1.filter:='CodeBar=' +quotedstr(edit1.Text);
Adotable1.filtered:= True;
except
showmessage('code erroné');
Edit2.Text:= Adotable1.FieldValues['prix']; //  plus de bloquage, juste une question d'affichage!
exit;
end;

Merci d'avance,

Developper est une dimension pour moi.
Leader2000
Commenter la réponse de Leader2000
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 17 mai 2008 à 21:55
0
Merci
try

Adotable1.filtered:= false;
Adotable1.filter:='CodeBar=' +quotedstr(edit1.Text);
Adotable1.filtered:= True;
Edit2.Text:= Adotable1.FieldValues['prix'];

except                                       // ici on ne traite que l'erreur
showmessage('code erroné');
exit;
end;

nb :
il te manque le traitement de la chaîne saisie manuellement..
je ne peux pas faire plus car tu ne réponds aux questions posées..

cantador
Commenter la réponse de cs_cantador
Leader2000 190 Messages postés mercredi 24 mai 2006Date d'inscription 28 août 2015 Dernière intervention - 18 mai 2008 à 18:31
0
Merci
Cantador!


Avant toute chose, laisses-moi repondre très rapidement à ta question avant que tu ne te fâches . Le traitement de la dite chaîne est numérique.
J'ai omis tout ce temps de t'informer qu'à chaque plantage vient ce message:

Project Project1.exe raixed exeception class EvariantTypeCastError with message'Could not convert variant' of type (Null) into type (String)'. Process stopped. Use Step or Run to continue.


Tes codes de traitement d'erreur marchent très bien. Je rappel que le filtrage  s'passe bien. Parce que j'arrive d'ailleurs à voir les données filtrées dans mon Dbgrid. C'est juste la donnée "prix" qui ne s'affichage pas dans le fameux Edit2.

Cool,


Developper est une dimension pour moi.
Leader2000
Commenter la réponse de Leader2000
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 19 mai 2008 à 10:45
0
Merci
Je ne me fache presque jamais !  (mdr)

C'est un plaisir de répondre aux questions..

J'aime bien aussi appeler un chat un chat.


'Could not convert variant' of type (Null) into type (String)'


Ce message est la traduction en anglais de mes explications fournies..


Il apparaît dans l'EDI mais en lançant l'exécutable c'est l'autre('code erroné') qui doit sortir.


une solution consiste à supprimer le OnChange et mettre :
Ex:

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
LongeurDeMaChaine : integer;
begin
  if Key < ' ' then exit;
  if Length(Edit1.Text) = LongueurDeMaChaine then
  MaProcedureDeFiltre;
end;

Ainsi la procédure MaProcedureDeFiltre ne se déclenchera que lorsque la chaîne sera complète et le cas Null ne se produira pas, ne restera que les codes erronés..

Mais il y a encore beaucoup d'autres possiblités.

Mais chaque jour suffit à sa peine !

cantador
Commenter la réponse de cs_cantador
Leader2000 190 Messages postés mercredi 24 mai 2006Date d'inscription 28 août 2015 Dernière intervention - 19 mai 2008 à 14:42
0
Merci
Developper est une dimension pour moi.
Leader2000
Commenter la réponse de Leader2000
Leader2000 190 Messages postés mercredi 24 mai 2006Date d'inscription 28 août 2015 Dernière intervention - 19 mai 2008 à 14:58
0
Merci
Bonjour!


Tes codes sont vraiment sans reporches. Le non affichage dudit message d'erreur est reglé. Voilà comment je fais et ça marche!


procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var Double : integer;
begin
  if Key < ' ' then exit;
  if Length(Edit1.Text) = double then
  Adotable1.filter:='CodeBar=' +quotedstr(edit1.Text);
  Adotable1.filtered:= True;
  Edit2.Text:= Adotable1.FieldValues['prix'];
  end; 
end;


Presentement, c'est juste le premier enregistrement du champ "prix"qui s'affiche dans l'Edit2. Et alors, quand j'introduis par exemple un autre code dans l'Edit1 l'affichage du prix d'un autre produit ne s'affichage dans l'edit2. SEULEMENT, celui du premier enregistrement.


Je crois que c'est juste une question de boucle.
Developper est une dimension pour moi.
Leader2000
Commenter la réponse de Leader2000
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 19 mai 2008 à 18:32
0
Merci
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
varDouble : integer;         // Attention Double est un mot réservé (integer, single, double etc.) il faut changer le nom de cette variable
begin
  if Key < ' ' then exit;
  if Length(Edit1.Text) = double then
      begin
      Adotable1.filtered:= False;
      Adotable1.filter:= 'CodeBar=' +quotedstr(edit1.Text);
      Adotable1.filtered:= True;
      Edit2.Text:= Adotable1.FieldValues['prix']; 
     end; 
end;

cantador
Commenter la réponse de cs_cantador
Leader2000 190 Messages postés mercredi 24 mai 2006Date d'inscription 28 août 2015 Dernière intervention - 20 mai 2008 à 14:35
0
Merci
Je crains que ça devienne ennuyant pour toi de revenir sur les mêmes codes.
Du moins, j'ai essayé fidelement ces codes. Rien ne marche (plus de filtrage comme avant et pas d'affichage dans l'Edit2 comme toujours). Je sais qu'il n'y a pas filtrage à cause de cette ligne: Adotable1.filtered:= False;

Ces codes marchent mieux et fais du filtrage.Sauf, le non affichage de la donnée "prix" dans le fameux Edit2 après filtrage n'a toujours pas marché.
Cantador, ça te derangerait de les tester seul. C'est juste une base de donnée de deux champs (CodeBar et prix).

if Key < ' ' then exit;
  if Length(Edit1.Text) = double then
  Adotable1.filter:='CodeBar=' +quotedstr(edit1.Text);
  Adotable1.filtered:= True;
  Edit2.Text:= Adotable1.FieldValues['prix'];
  end; 
end;

Merci,
Developper est une dimension pour moi.
Leader2000
Commenter la réponse de Leader2000
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 20 mai 2008 à 17:30
0
Merci
C'est pas évident pour moi du fait que je n'ai pas de lecteur codebarre mais en tout cas je suis sûr du code.
N'oublie pas la remarque sur double qui peut provoquer des ennuis..
(tu n'as pas corrigé..)
si le code ne fonctionne pas avec Adotable1.filtered:= False;
c'est qu'il doit y avoir autre chose..
ah oui, il faudrait pour bien faire :

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var 
MonCode : integer;         
begin
  if Key < ' ' then exit;
  if Length(Edit1.Text) = MonCode then
      begin
       AdoTable.Close;
      Adotable1.filtered:= False;
      Adotable1.filter:= 'CodeBar=' +quotedstr(edit1.Text);
      Adotable1.filtered:= True;
      AdoTable.Open;
      Edit2.Text:= Adotable1.FieldValues['prix']; 
     end; 
end;






cantador
Commenter la réponse de cs_cantador
Leader2000 190 Messages postés mercredi 24 mai 2006Date d'inscription 28 août 2015 Dernière intervention - 23 mai 2008 à 14:10
0
Merci
Developper est une dimension pour moi.
Leader2000
Commenter la réponse de Leader2000
Leader2000 190 Messages postés mercredi 24 mai 2006Date d'inscription 28 août 2015 Dernière intervention - 23 mai 2008 à 14:32
0
Merci
Developper est une dimension pour moi.
Leader2000
Commenter la réponse de Leader2000
Leader2000 190 Messages postés mercredi 24 mai 2006Date d'inscription 28 août 2015 Dernière intervention - 23 mai 2008 à 14:46
0
Merci
Cantador!

N.B. Les messages vides apparaissant dans ce forum ne sont  mis de mon propre gré. C'est le même message envoyé...mais qui a râté!


J'ai choisi l'option acceptée pour les codes qui permettent d'éviter l'erreur. J'ai tenté avec le fameux code d'affichage ça ne marche toujours (avec lecteur ou sans lecteur).
Du moins un grand merci de toute cette patience que t'as manifesté à mon humble personne.


Je rappel qu'il y a aussi des gens patients comme toi dans ce forum. C'est déjà un très bon signe!!!. Voilà comment Delphifr prendra toujours un merveilleux élan


Merci,


Developper est une dimension pour moi.
Leader2000
Commenter la réponse de Leader2000

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.