Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
681 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  tests de condition IF et WHERE

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

tests de condition IF et WHERE

n°419483
Trancy
Posté le 06-06-2003 à 14:55:54  profilanswer
 

en vb y a pas moyen de faire exectuer les tests separement car remplacer ca :

Code :
  1. test = CurrentDb.OpenRecordset(reqSQL, dbOpenDynaset)
  2. while( (test.Fields("Code" ) = Me![code]) and not test.EOF )
  3.             PrepRelance.Edit
  4.             PrepRelance.Fields("toto" ) = Me![toto]
  5.             PrepRelance.Update
  6.             PrepRelance.MoveNext
  7. wend


(il provoque une erreur parce qu'il est a la fin du fichier et que me! n'existe pas qd c a la fin du fichier)
 
par ca ca marche pas:

Code :
  1. test = CurrentDb.OpenRecordset(reqSQL, dbOpenDynaset)
  2. while( not test.EOF  and (test.Fields("Code" ) = Me![code]))
  3.             PrepRelance.Edit
  4.             PrepRelance.Fields("toto" ) = Me![toto]
  5.             PrepRelance.Update
  6.             PrepRelance.MoveNext
  7. wend


si je n'mabuse en C/C++ ca aurais marché car il test pas le 2eme membre du WHILE lorsque la condiion du 1er membre est fausse.
 
comprendo les monsieurs ? le C c bien  :sol:


Message édité par Trancy le 06-06-2003 à 14:59:45
mood
Publicité
Posté le 06-06-2003 à 14:55:54  profilanswer
 

n°419637
MagicBuzz
Posté le 06-06-2003 à 15:58:05  profilanswer
 

C'est une énormité qu'en c/c++ ça passe (je doute que tous les compilos laissent passer...)
 
En algèbre, sorti de la priorité des opérateurs, il n'y a pas d'ordre pour faire les calculs.
 
L'algèbre de bool, comme son nom l'indique, n'est ni plus ni moins que de l'algèbre, donc les mêmes pricinpes s'appliquent.
 
Il est donc impossible de savoir dans quel ordre le compilo va décider de faire les tests... Ce type de bidouilles est donc à bannir. (perso, je casse les dents de tous mes collègues qui pondent ces horreurs)
 
Tu testes si eof dans le while, et dans un if à l'intérieur, tu fait un exit while en fonction de ton code, voilà tout.
 
C'est non seulement plus lisible, mais en plus c'est aussi rapide et tu ne peux en aucun cas planter.

n°419643
mario51
Posté le 06-06-2003 à 15:59:41  profilanswer
 

Et tu as quoi comme erreur ?


---------------
Il ne faut pas vendre la peau de l'ours.....NON, il ne faut pas!!!!
n°419648
MagicBuzz
Posté le 06-06-2003 à 16:00:56  profilanswer
 

mario51 a écrit :

Et tu as quoi comme erreur ?


EOF or BOF is true je suppose

n°419649
antp
Super Administrateur
Champion des excuses bidons
Posté le 06-06-2003 à 16:01:19  profilanswer
 

MagicBuzz a écrit :

C'est une énormité qu'en c/c++ ça passe (je doute que tous les compilos laissent passer...)
[...]
Il est donc impossible de savoir dans quel ordre le compilo va décider de faire les tests... Ce type de bidouilles est donc à bannir. (perso, je casse les dents de tous mes collègues qui pondent ces horreurs)


 
:heink: en C, C++ et Delphi (et probablement d'autres) il est prévu dans la norme qu'on n'évalue que ce qui est nécessaire, de gauche à droite.
Je fais souvent des trucs du genre :
if (Item <> nil) and (Item.Selected) then ...
je vois pas où est le problème :??:


Message édité par antp le 06-06-2003 à 16:02:42

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°419658
MagicBuzz
Posté le 06-06-2003 à 16:03:49  profilanswer
 

antp a écrit :

:heink: en C, C++ et Delphi (et probablement d'autres) il est prévu dans la norme qu'on n'évalue que ce qui est nécessaire, de gauche à droite.
Je fais souvent des trucs du genre :
if (Item <> nil) and (Item.Selected) then ...
je vois pas où est le problème :??:


Bah c'est dégueux, à moins que ce que tu entendes par "norme" soit le cahier des charges du C. Dans ce cas, à la limite je dis pas... M'enfin ça n'en reste pas moins illisible, et niveau "propreté" ça passe par la norme ISO par exemple, car on mélange les poules et les cochons au niveau des tests, un EOF est bien plus grave (et surtout bloquant) qu'une égalité entre deux variables, donc nécessitement doit être traîté à part, surtout si le fait que ce dernier soit à vrai met en préile les autres instructions de la même ligne.
 
 
PS: Et pour la petite histoire, en ASP ça marche justement, de gauche à droite. Seulement, voilà le meilleur exemple prouvant qu'un code à la con n'est pas portable. Mes pages ASP ou mes programmes VB, j'ai pas une ligne à changer si je les passe de l'un à l'autre. Donc les bidouilles de "ouais, je déclare ma classe, mon objet et mes réservations mémoire dans une ligne et je plante je sais pas pourquoi"


Message édité par MagicBuzz le 06-06-2003 à 16:08:36
n°419672
antp
Super Administrateur
Champion des excuses bidons
Posté le 06-06-2003 à 16:07:18  profilanswer
 

Je vois pas ce que ça a de dégueux [:spamafote]
ça évite de faire plein de if en cascade


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°419682
skeye
Posté le 06-06-2003 à 16:09:03  profilanswer
 

antp a écrit :

Je vois pas ce que ça a de dégueux [:spamafote]
ça évite de faire plein de if en cascade


[:benou_+1]

n°419685
MagicBuzz
Posté le 06-06-2003 à 16:09:35  profilanswer
 

antp a écrit :

Je vois pas ce que ça a de dégueux [:spamafote]
ça évite de faire plein de if en cascade


Parceque au bout de 10 minutes, tu fais ça :
 
"ouais, je déclare ma classe, mon objet et mes réservations mémoire dans une ligne et je plante je sais pas pourquoi"
 
J'en vois pas trop l'intérêt ;)

n°419689
antp
Super Administrateur
Champion des excuses bidons
Posté le 06-06-2003 à 16:10:17  profilanswer
 

:heink: Je vois pas trop le rapport


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
mood
Publicité
Posté le 06-06-2003 à 16:10:17  profilanswer
 

n°419713
MagicBuzz
Posté le 06-06-2003 à 16:15:44  profilanswer
 

Deplus, il me semble bien que c'est ISO, c'est pour ça que je l'ai cité, distingue vraiment ce genre de tests.
 
Un EOF, ça indique une ERREUR (qui c'est déjà produite, mais trappée par la fonction appelée, dans notre cas un movenext).
Deplus, une fois un objet à EOF, on ne peux plus lire dedans sous peine d'erreur bloquante (plantage)
 
Ca mérite donc un traîtement immédiat.
 
Un test d'égalité pour voir si le chien à bien bouffé sa pâté, ça ne résulte pas d'une erreur, les données vont pas se sauver toutes seules, donc c'est un traîtement qui doit être fait APRES les tests précédents.
 
Et APRES ça veut pas dire "un opérateur plus loin", mais bel et bien séparré par un saut de ligne (';' dans le cas du C)
 
Un programme qui ne respecte pas ces notions ne passe pas une certification ISO je sais pas combien.
 
Votre truc, c'est un peu comme regarder sa montre pour voir si c'est l'heure du thé alors qu'on est en chutte libre du haut d'une falaise. Le premier truc à faire, c'est ouvrir un parachute si on en a un, ou alors crier comme un tarré même si ça sert à rien ;) Si vous vous en sortez pas, vous vous en foutez que ce soit l'heure de bouffer un croissant.

n°419855
Trancy
Posté le 06-06-2003 à 16:46:33  profilanswer
 

je peux pas affirmer que tous les compilos vont laisser passer ce genre de truc mais dans le bouquin de C que j'avais (me rappelle plus du titre et l'auteur je croit que c le createur mais chu pas sur) il y avais ces priorité de defini
C vraiment tres pratique pour pas faire de debordement, qd tu connais ces regles. Et normalement c pas du au piff.
Par contre c sur que nivo esthetique c pas top koi que...
Coté algebre de bool et comparaison de carotte et de patate je partage ton avis magicbuzz
*Pour l'erreur qu'il me sortais : il me disais qu'il connaissais pas me![toto]; pas de valeur ou non definie me![toto] un truc du genre. Ca faisais juste un message d'erreur pas de plantage mais par exemple en C mal ecrit seg fault koi :cry:  
Sinon j'ai ecrit ca :

Code :
  1. fin = False
  2.     While ((Not PrepRelance.EOF) And fin = False)
  3.         If (PrepRelance.Fields("code" ) = Me![code]) Then
  4.             PrepRelance.Edit
  5.             PrepRelance.Fields("toto" ) = Me![toto]
  6.             PrepRelance.Update
  7.             PrepRelance.MoveNext
  8.         Else
  9.             fin = True
  10.         End If
  11.     Wend


voyez vous une autre solution plus rapide ?
 

n°419861
skylight
Made in France.
Posté le 06-06-2003 à 16:48:36  profilanswer
 

un exemple, en ada.
 
 
if (truc = 1 and toto = null) {
 
}
 
ceci evalue les 2.
 
 
if ( truc = 1 and then toto = null ) {
 
}
ceci evalue toto = null uniquement si truc = 1 est vérifiée.

n°419891
MagicBuzz
Posté le 06-06-2003 à 16:55:11  profilanswer
 

Trancy a écrit :

Code :
  1. fin = False
  2.     While ((Not PrepRelance.EOF) And fin = False)
  3.         If (PrepRelance.Fields("code" ) = Me![code]) Then
  4.             PrepRelance.Edit
  5.             PrepRelance.Fields("toto" ) = Me![toto]
  6.             PrepRelance.Update
  7.             PrepRelance.MoveNext
  8.         Else
  9.             fin = True
  10.         End If
  11.     Wend




Je comprends pas trop ce que c'est censé faire :D
 
Je verrais plutôt :
 

do while not rs.EOF
   if Me![code] <> rs("code" ) then
      exit loop
   else
   ' traîtements sur le rs
   rs.movenext
   end if
loop


 
Sinon, ton erreur est chelou si c'est à propos du Me![code]
T sûr de ta syntaxe ? je ne connais pas cette syntaxe donc je peux pas dire ;)

n°419902
MagicBuzz
Posté le 06-06-2003 à 16:57:31  profilanswer
 

Sinon, solution bourrin (c'est ce que je fais en C, et qui, alors que ça semble crade, est très propre, c'est notamment untilisé par IBM dans leurs devs (le "if" est interdit chez eux, les seuls tests qui existent dans leur code, c'est pour l'analyse des exceptions :))) bien plus rapide :
 

on error goto fin_boucle
do while rs("code" ) = Me![code]
  ' traîtements
  rs.movenext
loop
fin_boucle:
on error resume next


 
La ça booste à fond, mais c'est pas compréhensible du tout :D


Message édité par MagicBuzz le 06-06-2003 à 16:58:27
n°419905
Trancy
Posté le 06-06-2003 à 17:01:03  profilanswer
 

euh ok skylight ca marche dans les while cette histoire la ?ca c cool c en gros ce que je voulais
magicbuzz> je suis sur de ma syntaxe et c sur que c parce qu'il evalue le 2eme membre que ca chiais ;)
Par contre pour ton truc je suis ok mais exit loop
 :ouch: ARF C HORRIBLE enfin si mes profs avais vu ca http://smileyonline.free.fr/images/gif/forum/valoranim01.gif
 
http://smileyonline.free.fr/images/gif/forum/flemmeanimnoel01.gif d'expliquer ce que c censé faire ^^

n°419909
skylight
Made in France.
Posté le 06-06-2003 à 17:02:19  profilanswer
 

Trancy a écrit :

euh ok skylight ca marche dans les while cette histoire la ?ca c cool c en gros ce que je voulais
magicbuzz> je suis sur de ma syntaxe et c sur que c parce qu'il evalue le 2eme membre que ca chiais ;)
Par contre pour ton truc je suis ok mais exit loop
 :ouch: ARF C HORRIBLE enfin si mes profs avais vu ca http://smileyonline.free.fr/images [...] anim01.gif
 
http://smileyonline.free.fr/images [...] noel01.gif d'expliquer ce que c censé faire ^^

oui ce que j'ai écrit marche dans n'importe quel test, en langage ADA.

n°419911
antp
Super Administrateur
Champion des excuses bidons
Posté le 06-06-2003 à 17:02:39  profilanswer
 

MagicBuzz a écrit :


 
Votre truc, c'est un peu comme regarder sa montre pour voir si c'est l'heure du thé alors qu'on est en chutte libre du haut d'une falaise. Le premier truc à faire, c'est ouvrir un parachute si on en a un, ou alors crier comme un tarré même si ça sert à rien ;) Si vous vous en sortez pas, vous vous en foutez que ce soit l'heure de bouffer un croissant.


 
J'aime bien les exemples bidons :D


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°419915
Trancy
Posté le 06-06-2003 à 17:03:42  profilanswer
 

MagicBuzz a écrit :

Sinon, solution bourrin (c'est ce que je fais en C, et qui, alors que ça semble crade, est très propre, c'est notamment untilisé par IBM dans leurs devs (le "if" est interdit chez eux, les seuls tests qui existent dans leur code, c'est pour l'analyse des exceptions :))) bien plus rapide :
 

on error goto fin_boucle
do while rs("code" ) = Me![code]
  ' traîtements
  rs.movenext
loop
fin_boucle:
on error resume next


 
La ça booste à fond, mais c'est pas compréhensible du tout :D


benh perso j'ai compris mais pour moi ca semble archi crade.
Enfin bon c les profs aussi qui veulent pas de goto

n°419917
skylight
Made in France.
Posté le 06-06-2003 à 17:04:53  profilanswer
 

Trancy a écrit :


benh perso j'ai compris mais pour moi ca semble archi crade.
Enfin bon c les profs aussi qui veulent pas de goto  

j'ai jamais compris pourquoi les profs veulent pas de goto.
 
ok au niveau de l'assembleur ca rajoute des BRA ...
 
 
mais il suffit de ne pas en abuser, moi je trouve que c'est plus propre que d'imbriquer des tests / boucles

n°419919
Trancy
Posté le 06-06-2003 à 17:06:13  profilanswer
 

Skylight a écrit :

oui ce que j'ai écrit marche dans n'importe quel test, en langage ADA.


c comment alors ?

Code :
  1. while( truc=1 then and toto = 3 )
  2. blabla
  3. wend

n°419921
skylight
Made in France.
Posté le 06-06-2003 à 17:07:05  profilanswer
 

Trancy a écrit :


c comment alors ?

Code :
  1. while( truc=1 then and toto = 3 )
  2. blabla
  3. wend



ca c'est pas de l'ada ...
 
les boucles en ada :  
 
while (truc = true and then toto = null ) loop
 
 blabla;
 
end loop;

n°419925
Trancy
Posté le 06-06-2003 à 17:08:19  profilanswer
 

Skylight a écrit :

j'ai jamais compris pourquoi les profs veulent pas de goto.
 
ok au niveau de l'assembleur ca rajoute des BRA ...
 
 
mais il suffit de ne pas en abuser, moi je trouve que c'est plus propre que d'imbriquer des tests / boucles


benh ca ressemble a un paquet de noeud qd t'as des goto de goto de goto
Pour une trace c de la merde plus courrament appeller trace de merde :lol:

n°419926
skylight
Made in France.
Posté le 06-06-2003 à 17:09:00  profilanswer
 

c'est ce que je dis ...
2 ou 3 max dans un programme ok, mais en abuser, clairement non

n°419927
Trancy
Posté le 06-06-2003 à 17:09:23  profilanswer
 

Skylight a écrit :

ca c'est pas de l'ada ...
 
les boucles en ada :  
 
while (truc = true and then toto = null ) loop
 
 blabla;
 
end loop;


coné pas l'ada c koi ? les initial ?
ca veux dire koi plz ?

n°419930
skylight
Made in France.
Posté le 06-06-2003 à 17:10:14  profilanswer
 

c'est un langa de programmation différent de visual basic
 
 
ADA, c'est simplement le prénom de la femme qui a créé ce langage

n°419959
Trancy
Posté le 06-06-2003 à 17:23:33  profilanswer
 

Skylight a écrit :

c'est un langa de programmation différent de visual basic
 
 
ADA, c'est simplement le prénom de la femme qui a créé ce langage


ok :jap:

n°419961
MagicBuzz
Posté le 06-06-2003 à 17:23:52  profilanswer
 

Skylight a écrit :

c'est un langa de programmation différent de visual basic
 
 
ADA, c'est simplement le prénom de la femme qui a créé ce langage


La contesse vient de faire 25 tours dans sa tombe !
 
Elle est morte bien avant que le premier ordinateur existe !
 
Non, par contre, elle assistait son mari qui travaillait sur un des tous premiers automates (à l'époque, en bois, et 100% mécanique) et a travaillé sur les tous premiers algos. En effet, la machine de son mari était le premier automate capable de changer de changer de fonctionnement en fonction de leviers un peu partout. Donc elle est s'est collée à faire des "programmes" pour cet automate. Mais ça n'a rien à voir avec le langage lui-même.

n°423394
Thorondor
Posté le 11-06-2003 à 08:05:56  profilanswer
 

Trancy a écrit :

en vb y a pas moyen de faire exectuer les tests separement car remplacer ca :
comprendo les monsieurs ? le C c bien  :sol:


T'a déjà essayé la prog windows en C???

n°423401
drasche
Posté le 11-06-2003 à 08:26:16  profilanswer
 

bon ça a bien tourné en couille je trouve ce topic :o
 
Trancy> si tu passais le nécessaire à une fonction qui ferait le travail et renverrait un booléen en conséquence?
 
MagicBuzz> le EOF n'est pas une erreur.  JAMAIS.  De notre point de vue de développeur, c'est un flag qui indique si on est à la fin du fichier, point final.  Ce sont les fields qui sont en état d'erreur, mais jamais un flag EOF ou BOF.
 
Trancy> pour relier avec les posts précédents, sache que ton même code en C++ aurait planté également: tu ne testes pas EOF en premier.  Si ça plante, c'est simplement parce que quand EOF est à True, ton expression test.Fields("Code" ) est en état d'erreur, c'est aussi simple que ça.  Il faut malheureusement éviter ce genre de gymnastique en VB.  Donc je suggère que tu passes Me et test à une fonction qui fera le test proprement et te renverra un booléen pour indiquer la réussite ou l'échec de la comparaison (sachant que si test.EOF est à True, il n'est nul besoin d'aller plus loin).


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  tests de condition IF et WHERE

 

Sujets relatifs
condition multipleSelect *from $table where ...
[tests navigateurs] une page web à tester svp[C]condition string qui marche pas !
Impossible WHERE noticed .....post et pres condition
condition dans boucles for"DELETE FROM `guest` WHERE `id` ='$id' LIMIT 1"; ca ne marche pa :cry:
mysql: select * from matable where monchamp like '%\\%'[php] faire une condition ds une autre avec session
Plus de sujets relatifs à : tests de condition IF et WHERE


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR