C
CtiMcs
Bonjour,
Je suis surtout utilisateur du C++ (dans Visual C++) et du
Pascal (dans Delphi), ceci explique peut-être pourquoi
VBA me donne quelques soucis!
Il est écrit dans diverses docs sur VBA (dans Excel par exemple)
que l'opérateur And est l'opérateur logique entre des expressions
booléennes ET l'opérateur 'bitwise' entre des expressions numériques.
Il est écrit par ailleurs, que DAO 3.6 (MS Jet 4.0) utilise VBA
pour évaluer tout ce qu'il peut évaluer avant d'envoyer la requête.
Sous ces hypothèses, pourquoi le code suivant, appliqué à une table
où Attributs = 17, 18, ou 33 ne retourne rien, (rs=le recordset)
-----------------------------------------------------------------
rs.FindFirst(' (CLng(Attributs) And CLng(16)) = 16 ');
while not rs.NoMatch do
begin
attr:=rs.Fields.Item[2].Value; s:=Format('%3.3d: ',[attr]);
LstPersonnes.Items.Add(s+rs.Fields.Item[0].Value);
rs.FindNext(' (CLng(Attributs) And CLng(16)) = 16 ');
end;
-----------------------------------------------------------------
alors que le code suivant, retourne tout (Attributs n'est jamais 0):
(remarquer le -1 à la place du 16).
-----------------------------------------------------------------
rs.FindFirst(' (CLng(Attributs) And CLng(16)) = -1 ');
while not rs.NoMatch do
begin
attr:=rs.Fields.Item[2].Value; s:=Format('%3.3d: ',[attr]);
LstPersonnes.Items.Add(s+rs.Fields.Item[0].Value);
rs.FindNext(' (CLng(Attributs) And CLng(16)) = -1 ');
end;
-----------------------------------------------------------------
Manifestement, les précautions CLng() sont inopérantes, et le 'And'
travaille toujours sur des booléens, auquel cas l'expression est
toujours vrai (-1) du fait que Attributs n'est jamais = 0.
Merci par avance d'excuser exceptionnellement le multi-post sur
Delphi(pour le contexte et surtout les programmeurs interessés),
DAO (pour le coeur du sujet) et VBA (pour les expressions).
Cordialement,
Je suis surtout utilisateur du C++ (dans Visual C++) et du
Pascal (dans Delphi), ceci explique peut-être pourquoi
VBA me donne quelques soucis!
Il est écrit dans diverses docs sur VBA (dans Excel par exemple)
que l'opérateur And est l'opérateur logique entre des expressions
booléennes ET l'opérateur 'bitwise' entre des expressions numériques.
Il est écrit par ailleurs, que DAO 3.6 (MS Jet 4.0) utilise VBA
pour évaluer tout ce qu'il peut évaluer avant d'envoyer la requête.
Sous ces hypothèses, pourquoi le code suivant, appliqué à une table
où Attributs = 17, 18, ou 33 ne retourne rien, (rs=le recordset)
-----------------------------------------------------------------
rs.FindFirst(' (CLng(Attributs) And CLng(16)) = 16 ');
while not rs.NoMatch do
begin
attr:=rs.Fields.Item[2].Value; s:=Format('%3.3d: ',[attr]);
LstPersonnes.Items.Add(s+rs.Fields.Item[0].Value);
rs.FindNext(' (CLng(Attributs) And CLng(16)) = 16 ');
end;
-----------------------------------------------------------------
alors que le code suivant, retourne tout (Attributs n'est jamais 0):
(remarquer le -1 à la place du 16).
-----------------------------------------------------------------
rs.FindFirst(' (CLng(Attributs) And CLng(16)) = -1 ');
while not rs.NoMatch do
begin
attr:=rs.Fields.Item[2].Value; s:=Format('%3.3d: ',[attr]);
LstPersonnes.Items.Add(s+rs.Fields.Item[0].Value);
rs.FindNext(' (CLng(Attributs) And CLng(16)) = -1 ');
end;
-----------------------------------------------------------------
Manifestement, les précautions CLng() sont inopérantes, et le 'And'
travaille toujours sur des booléens, auquel cas l'expression est
toujours vrai (-1) du fait que Attributs n'est jamais = 0.
Merci par avance d'excuser exceptionnellement le multi-post sur
Delphi(pour le contexte et surtout les programmeurs interessés),
DAO (pour le coeur du sujet) et VBA (pour les expressions).
Cordialement,