Leader2000
Messages postés184Date d'inscriptionmercredi 24 mai 2006StatutMembreDernière intervention28 août 2015
-
15 mai 2008 à 16:16
Leader2000
Messages postés184Date d'inscriptionmercredi 24 mai 2006StatutMembreDernière intervention28 août 2015
-
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:
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
Leader2000
Messages postés184Date d'inscriptionmercredi 24 mai 2006StatutMembreDernière intervention28 août 2015 16 mai 2008 à 12:46
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.
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202113 16 mai 2008 à 20:53
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.
Leader2000
Messages postés184Date d'inscriptionmercredi 24 mai 2006StatutMembreDernière intervention28 août 2015 17 mai 2008 à 15:25
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.
Leader2000
Messages postés184Date d'inscriptionmercredi 24 mai 2006StatutMembreDernière intervention28 août 2015 17 mai 2008 à 19:48
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;
Leader2000
Messages postés184Date d'inscriptionmercredi 24 mai 2006StatutMembreDernière intervention28 août 2015 18 mai 2008 à 18:31
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.
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202113 19 mai 2008 à 10:45
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..
Leader2000
Messages postés184Date d'inscriptionmercredi 24 mai 2006StatutMembreDernière intervention28 août 2015 19 mai 2008 à 14:58
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
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202113 19 mai 2008 à 18:32
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;
Leader2000
Messages postés184Date d'inscriptionmercredi 24 mai 2006StatutMembreDernière intervention28 août 2015 20 mai 2008 à 14:35
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
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202113 20 mai 2008 à 17:30
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;
Leader2000
Messages postés184Date d'inscriptionmercredi 24 mai 2006StatutMembreDernière intervention28 août 2015 23 mai 2008 à 14:46
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