IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

Calcul lié à la valeur de l'enregistrement précédent [AC-2007]


Sujet :

Requêtes et SQL.

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Infirmier à dom
    Inscrit en
    Avril 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Infirmier à dom
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2009
    Messages : 24
    Points : 30
    Points
    30
    Par défaut Calcul lié à la valeur de l'enregistrement précédent
    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

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    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+

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Infirmier à dom
    Inscrit en
    Avril 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Infirmier à dom
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2009
    Messages : 24
    Points : 30
    Points
    30
    Par défaut
    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

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Bonjour,
    si tu as déjà un classement via une requête; il faut précéder comme suit

    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
    tout dépend de la requête de classement.

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 219
    Points : 1 707
    Points
    1 707
    Par défaut
    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.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Infirmier à dom
    Inscrit en
    Avril 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Infirmier à dom
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2009
    Messages : 24
    Points : 30
    Points
    30
    Par défaut
    Citation Envoyé par LE VIEUX Voir le message
    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

  7. #7
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    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;

  8. #8
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 219
    Points : 1 707
    Points
    1 707
    Par défaut
    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 -

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Infirmier à dom
    Inscrit en
    Avril 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Infirmier à dom
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2009
    Messages : 24
    Points : 30
    Points
    30
    Par défaut
    Citation Envoyé par ilank Voir le message
    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;
    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.

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Infirmier à dom
    Inscrit en
    Avril 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Infirmier à dom
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2009
    Messages : 24
    Points : 30
    Points
    30
    Par défaut
    Citation Envoyé par LE VIEUX Voir le message
    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 -
    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

  11. #11
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 219
    Points : 1 707
    Points
    1 707
    Par défaut
    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.
    à +

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Infirmier à dom
    Inscrit en
    Avril 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Infirmier à dom
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2009
    Messages : 24
    Points : 30
    Points
    30
    Par défaut ReRe
    Ci joint un fichier exel en exemple
    Fichiers attachés Fichiers attachés

  13. #13
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 219
    Points : 1 707
    Points
    1 707
    Par défaut
    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.
    à+

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Infirmier à dom
    Inscrit en
    Avril 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Infirmier à dom
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2009
    Messages : 24
    Points : 30
    Points
    30
    Par défaut Merci
    Merci,

    je vais éplucher ton code et chercher qq tutos sur VBA pour comprendre.

  15. #15
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 219
    Points : 1 707
    Points
    1 707
    Par défaut
    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

  16. #16
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    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 champ
    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))
    et
    Ecart_P est le champ
    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))
    Maintenant la requête donne :
    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;

  17. #17
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 219
    Points : 1 707
    Points
    1 707
    Par défaut
    bonsoir,
    ci-joint test basé sur le fichier excel transmis

  18. #18
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    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;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2010] Récupération d'une valeur de l'enregistrement précédent
    Par stsym dans le forum VBA Access
    Réponses: 4
    Dernier message: 09/04/2015, 17h21
  2. Réponses: 1
    Dernier message: 24/04/2010, 18h36
  3. Répéter valeur enregistrement précédent
    Par igour dans le forum Access
    Réponses: 2
    Dernier message: 14/02/2007, 19h37
  4. Petit Calcul à l'aide des enregistrements précédents
    Par laurentcr dans le forum Access
    Réponses: 5
    Dernier message: 11/09/2006, 13h41
  5. Valeur par défault = Enregistrement précédent
    Par Aost dans le forum Access
    Réponses: 8
    Dernier message: 04/07/2006, 22h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo