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

Signaler
Messages postés
187
Date d'inscription
mercredi 24 mai 2006
Statut
Membre
Dernière intervention
28 août 2015
-
Messages postés
187
Date d'inscription
mercredi 24 mai 2006
Statut
Membre
Dernière intervention
28 août 2015
-
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
A voir également:

16 réponses

Messages postés
4719
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
1 février 2021
14
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
Messages postés
187
Date d'inscription
mercredi 24 mai 2006
Statut
Membre
Dernière intervention
28 août 2015

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
Messages postés
4719
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
1 février 2021
14
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
Messages postés
187
Date d'inscription
mercredi 24 mai 2006
Statut
Membre
Dernière intervention
28 août 2015

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
Messages postés
187
Date d'inscription
mercredi 24 mai 2006
Statut
Membre
Dernière intervention
28 août 2015

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
Messages postés
4719
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
1 février 2021
14
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
Messages postés
187
Date d'inscription
mercredi 24 mai 2006
Statut
Membre
Dernière intervention
28 août 2015

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
Messages postés
4719
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
1 février 2021
14
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
Messages postés
187
Date d'inscription
mercredi 24 mai 2006
Statut
Membre
Dernière intervention
28 août 2015

Developper est une dimension pour moi.
Leader2000
Messages postés
187
Date d'inscription
mercredi 24 mai 2006
Statut
Membre
Dernière intervention
28 août 2015

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
Messages postés
4719
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
1 février 2021
14
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
Messages postés
187
Date d'inscription
mercredi 24 mai 2006
Statut
Membre
Dernière intervention
28 août 2015

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
Messages postés
4719
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
1 février 2021
14
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
Messages postés
187
Date d'inscription
mercredi 24 mai 2006
Statut
Membre
Dernière intervention
28 août 2015

Developper est une dimension pour moi.
Leader2000
Messages postés
187
Date d'inscription
mercredi 24 mai 2006
Statut
Membre
Dernière intervention
28 août 2015

Developper est une dimension pour moi.
Leader2000
Messages postés
187
Date d'inscription
mercredi 24 mai 2006
Statut
Membre
Dernière intervention
28 août 2015

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