Bonjour,
je voudrais, dans une requête, appliquer une formule liée à la valeur d'un champ de l'enregistrement précédent:
Si valeur du champ de l'enregistrement précédent = 0, formule1, si non, Formule2
Est-ce possible, et si oui, comment?
Merci
Bonjour,
je voudrais, dans une requête, appliquer une formule liée à la valeur d'un champ de l'enregistrement précédent:
Si valeur du champ de l'enregistrement précédent = 0, formule1, si non, Formule2
Est-ce possible, et si oui, comment?
Merci
Access n'étant pas Excel ce genre de truc est assez difficile à réaliser. Dans une BD il n'y a pas de lien entre les enregistrements. Ils sont tous en vrac dans un grand sac :-).
Peux-tu nous en dire un peux plus sur ta condition, peut-être pourrait-on trouver une solution alternative.
On peut toujours faire une fonction VBA mais c'est garantir que l'enr trouvé sera bien celui que tu cherches qui peut être problématique.
A+
Vous voulez une réponse rapide et efficace à vos questions téchniques ?
Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.
Merci pour ta réponse, qui ne me surprend d'autant moins que les enregistrements ne seront pas forcément rentrés dans l'ordre, ce qui,je pense, exclu l'utilisation de la clé primaire. Pour ce qui est de vba je n'y touche pas un calot :-)) mais je vais quand même préciser:
2 champs minimum: champ1, champ2 (en fait, 7 ou8)
n enregistrements classé par le biais d'une requête
ce que je veux en utilisant la syntaxe de la fonction if (exel):
Si (valeur champ1 de n-1=0; (valeur champ2 de n-1)+1;0)
je ne sais pas si une boucle du genre tant que champ1 = 0, champ2 est incrémenté de 1. Mais là, le pb deviens, pour moi, purement intellectuel.. ;-)
Il me reste la solution d'exporter les données ds exel puis d'importer les résultats
Bonjour,
si tu as déjà un classement via une requête; il faut précéder comme suit
tout dépend de la requête de classement.
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SELECT A.Champ1, Iif(Isnull(B.champ1) Or B.champ2<>0, A.champ2,B.champ2+1) FROM Requete AS A LEFT JOIN Requete AS B ON B.Classement=A.Classement-1
bonsoir,
ton problème se règle normalement par un parcours de ta table par VBA via ADO et un recordset, mais ta présentation me pose encore un problème d'explication merci de donner un exemple de ce que tu veux obtenir.
J'ai 1 table date_Prono et 1 table Prono liées à date_Prono par le champ Date
1 requête dont le code est le suivant
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT Date_Pronos.Date_Prono, Pronos.N°Course, Pronos.Nom_prono, Pronos.N°Cheval, Pronos.Gagnant, Pronos.Placé FROM Date_Pronos INNER JOIN Pronos ON Date_Pronos.I_date = Pronos.I_date WHERE (((Pronos.Nom_prono)=2)) ORDER BY Date_Pronos.Date_Prono, Pronos.N°Course;
Je voudrais créer un champ "écart" me donnant l'écart d'un prono:
ex: si le 23/01/09, Pronos.Gagnant>0, le 24/01/09 "écart" devrait afficher "0", mais si le 23/01/09, Pronos.Gagnant=0, le 24/01/09 "écart" devrait afficher "écart+1"
Est-il possible d'adapter la réponse de Ilank (en m'expliquant un peu la syntaxe ;-) ) afin d'éviter de passer "par un parcours de ta table par VBA via ADO et un recordset" ce qui, pour moi, est à peine différent d'une version en chinois :-)
Dans tout les cas, merci de vos réponses
Bonjour,
le problème est que hormis la date quel lien y a-t-il entre deux pronostics fait à un jour j et au jour j-1 ?
Le n° de cheval identifie-t-il un seul cheval, le n° de course un seul n° de course, ?
Exemple : Pour l'exemple j'appelle ta requête Rqt_Prono
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SELECT A.Date_Prono, A.N°Course, A.Nom_prono, A.N°Cheval, A.Gagnant, A.Placé, Iif(B.Gagnant>0, 0, 1) As [écart] FROM Rqt_Prono As A INNER JOIN Rqt_Prono As B ON B.Date_Prono=A.Date-1;
salut,
a part le titre du post, "calcul lié a l'enregistrement précédent", ce que je règle personnellement par un parcour de table ou requête en VBA, mais on peut faire aussi, mais c'est pour moi plus compliqué en SQL, je ne comprend rien à ton problème, probablement l'âge, en plus je ne connait rien aux courses, pour moi il me faudrait des exemples concrets - situation de départ, scénarios possibles, ce que l'on veut à l'arrivée......et peut-être le pourquoi qui expliquera peut-être le comment -
J'ai essayé, mais celà ne fontionne pas: peux-tu m'expliquer la démarche de cette requête?
Ma requête doit afficher :
date............N°course....N°CV.....Gagnant..écart
01/01/2009..........1.........101.........3€........2 avec le dernier gagnant
02/01/2009..........1.........107.........0€........0
03/01/2009..........1.........104.........0€........1
04/01/2009..........1.........102.........0€........2
05/01/2009..........1.........103.........4€........3
date+1................1.........102.........0........ 0
etc
Les champs importants sont le champ date et le champ Gagnant, le N°course et le N°CV étant juste là pour identifier le prono et pourraient être remplacés par le nom du cheval ou autre.
Bon, je réquépépète depuis le bédut, ;-))
Un ami m'a demandé de lui faire une BD lui permettant de saisir différents pronos (par exemple le CV du jour donné par un journal quelconque. Ce CV arrive gagnant, placé ou.... pas du tout :-)
ce qu'il cherche, c'est de savoir quel est l'écart (Nb de jour depuis le dernier prono arrivé gagnant ou placé) de son prono pour le comparer à l'écart maximum sur l'ensemble de ses données.
Ceci est trés facile à faire sous exel avec la fonction =SI(gagnant>0;0;valeur de la cellule du dessus incrémentée de 1)
Voilà le pb (je peux t'envoyer un fichier .xls si tu veux.
Pour l'âge, je ne connais pas le tien, mais si à 57 ans je peux rentrer au club... Je suis autodidacte et... nul en VBA
re,
bien reçu et avec le post précédent je vois un peu mieux ton objectif,
pour l'âge le mien est affiché 64 et depuis peu 23/4, bien sur que tu es le bien venu mais pour quelques années encore je ne peux pas dire comme dans un de mes posts précédent "bienvenu au club du 3eme âge qui "se" développe encore" autodidacte je le suis depuis bien longtemps comme certainement beaucoup des participants à ce forum, quant au VBA il faut s'y mettre c'est un outil important d'access comme d'office et donc d'excel, tu peux mettre ton fichier excel en post, ce qui m'évitera de créer la table pour t'aider à résoudre ton problème par VBA.
à +
Ci joint un fichier exel en exemple
salut,
regardes la base jointe si ça correspond, à adapter bien sur, j'ai mis un bouton pour déclencher le calcul mais bien sûr tu peux le faire de bien d'autres manières.
à+
Merci,
je vais éplucher ton code et chercher qq tutos sur VBA pour comprendre.
re, re,
excuses j'ai zappé les commentaires - "pas sérieux le vieux"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 Function CalcEcart() Dim cnc As ADODB.Connection Dim rst As New ADODB.Recordset Set cnc = CurrentProject.Connection rst.Open "Courses_R", cnc, adOpenForwardOnly, adLockOptimistic rst.MoveNext ' on va au deuxieme enregistrement Do While Not rst.EOF ' on parcours la requête rst.MovePrevious ' on se positionne sur l'enregistrement précédent G = rst("Gagnant") 'on récupère la valeur des champs dans une variable E = rst("écart") rst.MoveNext ' on passe à l'enregistrement suivant ' on teste toutes les possibilités et on enregistre en fonction If rst("Gagnant") = 0 And G <> 0 Then rst("écart") = 0 End If If rst("Gagnant") = 0 And G = 0 Then rst("écart") = E + 1 End If If rst("Gagnant") <> 0 And G = 0 Then rst("écart") = E + 1 End If If rst("Gagnant") <> 0 And G <> 0 Then rst("écart") = 0 End If rst.MoveNext ' on passe à l'enregistrement suivant Loop ' fin de la boucle cnc.Close ' on clos la connection à la requête End Function
Oui, tu peux le faire en une seule requête.
L'idée étant que l'Ecart_G est en fait le nombre d'enregistrements compris entre l'enregistrement courant et le dernier enregistrement précédent où Gagnant<>0, Ecart_P est la même chose.
j'appelle encore pour l'exemple ta requête Rqt_Prono
Ecart_G est le champet
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 (SELECT Count(*) FROM Rqt_Prono WHERE Date_Prono<A.Date_Prono AND Date_Prono>(SELECT Max(Date_Prono) FROM Rqt_Prono WHERE Gagnant>0 AND Date_Prono<A.Date_Prono))
Ecart_P est le champMaintenant la requête donne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 (SELECT Count(*) FROM Rqt _Prono WHERE Date_Prono<A.Date_Prono AND Date_Prono>(SELECT Max(Date_Prono) FROM Rqt_Prono WHERE Placé>0 AND Date_Prono<A.Date_Prono))
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 SELECT A.Date_Prono, A.Nom_Prono, A.N°Course, A.N°Cheval, A.Gagnant, A.Placé, (SELECT Count(*) FROM Rqt_Prono WHERE Date_Prono<A.Date_Prono AND Date_Prono>(SELECT Max(Date_Prono) FROM Rqt_Prono WHERE Gagnant>0 AND Date_Prono<A.Date_Prono) ) As [Ecart_G], (SELECT Count(*) FROM Rqt _Prono WHERE Date_Prono<A.Date_Prono AND Date_Prono>(SELECT Max(Date_Prono) FROM Rqt_Prono WHERE Placé>0 AND Date_Prono<A.Date_Prono) ) As [Ecart_P] FROM Rqt_Prono As A;
bonsoir,
ci-joint test basé sur le fichier excel transmis
Bonjour,
j'ai fait un calcul bien compliqué, alor que la soluton est nettement plus simple.
En fait les champs Ecart_P et Ecart_G représentent le nombre de jours depuis le dernier Gagnant et le dernier Placé.
La requête est en fait celle_ci:
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT A.Date_Prono, A.Nom_Prono,A.N°Course, A.N°Cheval, A.Gagnant,A.Placé, DateDiff("d",(SELECT Max(Date_Prono) FROM Rqt_Prono WHERE Date_Prono<A.Date_Prono AND Gagnant>0),A.Date_Prono-1) As [Ecart_G], DateDiff("d",(SELECT Max(Date_Prono) FROM Rqt_Prono WHERE Date_Prono<A.Date_Prono AND Placé>0),A.Date_Prono-1) As [Ecart_P] FROM Rqt_Prono;
Partager