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

Access Discussion :

[Règles de l'art ?] Déterminer la date d'une étape en cours - Imbrication de IIF


Sujet :

Access

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 163
    Points : 166
    Points
    166
    Par défaut [Règles de l'art ?] Déterminer la date d'une étape en cours - Imbrication de IIF
    Bonjour à toutes et tous !

    Je récupère des données d'un autre système et je dois les traiter.
    Le problème est ici le traitement d'un dossier en 6 étapes maximum.
    Pour chaque étape, il y a une date de traitement prévue (Px) et une date de traitement fini (Fx).

    Les dates prévues sont saisies à la création du dossier et les dates de fin au fur et à mesure de la vie du dossier.

    Un dossier peut être terminé en 4 ou 6 étapes.

    Je dois identifier à quelle étape se trouve le dossier et retourner la date prévue pour l'étape en cours.

    Exemple :
    ---P1--------F1--------P2--------F2--------P3--------F3--------P4--------F4--------P5--------F5...
    01/02/06--01/02/06--07/02/06--06/02/06--12/02/06--13/02/06--20/02/06--20/02/06--Est Null--Est Null...

    Ici, les étapes de 1 à 4 sont remplies et les dates de 5 à 6 sont vides, donc, le dossier est terminé.

    ---P1--------F1--------P2--------F2--------P3--------F3--------P4--------F4--------P5--------F5...
    01/02/06--01/02/06--07/02/06--06/02/06--12/02/06--Est Null--20/02/06--Est Null--25/02/06--Est Null...

    Ici l'étape 2 est terminée, l'étape 3 est en cours, je dois donc récupérer la date P3 du 12/02/06.
    J'ai donc collé dans ma requête une imbrication de IIf, cela fonctionne, mais je doute que ce soit fait dans les rêgles de l'art... qu'en pensez-vous ?
    IIf([P6] Is Not Null And [F6] Is Not Null,"Terminé",IIf([P5] Is Not Null And [F5] Is Not Null And [P6] Is Not Null And [F6] Is Null,[P6],IIf([P4] Is Not Null And [F4] Is Not Null And [P5] Is Null And [F5] Is Null,"Terminé",IIf([P4] Is Not Null And [F4] Is Not Null And [P5] Is Not Null And [F5] Is Null,[P5],IIf([P3] Is Not Null And [F3] Is Not Null And [P4] Is Not Null And [F4] Is Null,[P4],IIf([P2] Is Not Null And [F2] Is Not Null And [P3] Is Not Null And [F3] Is Null,[P3],IIf([P1] Is Not Null And [F1] Is Not Null And [P2] Is Not Null And [F2] Is Null,[P2],IIf([P1] Is Not Null And [F1] Is Null And [P2] Is Not Null And [F2] Is Null,[P1],"Pb WF")))))))) AS [DatePrevueEtapeEnCours]
    Merci d'avance pour vos avis toujours utiles et précieux !!

    JMarc

  2. #2
    Membre confirmé Avatar de milia
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juillet 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juillet 2006
    Messages : 481
    Points : 532
    Points
    532
    Par défaut
    Bonjour,

    Déjà c'est bizare que cela marche car vous avez mis des virgules à la place des points virgules. Et puis je ne vois pas trop de simplifications.

    Bon courage

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 163
    Points : 166
    Points
    166
    Par défaut
    Bonjour Milia et merci pour la réponse,

    En fait, j'ai mis des point-virgules dans mes vraix-faux dans QBE, mais en faisant afficher le code SQL, cela ressort avec des virgules simpes.

    Sinon, pas de simplification... cela veut dire que c'est fait comme il faut ?

    J'étais limite sur la longueur de l'expression dans QBE, donc si j'avais eu 25 étapes... j'aurais surement dépassé les capacités d'Access et j'aurais dù faire autrement. Et cette autre méthode serait peut-être plus simple et rapide... mais je ne la connais pas ! si elle existe !

    JMArc

  4. #4
    Membre confirmé Avatar de milia
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juillet 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Juillet 2006
    Messages : 481
    Points : 532
    Points
    532
    Par défaut
    Euh non ça veut pas dire ça forcément ça veut juste dire que moi j'en vois pas, j'aurais surement fait comme vous, mais je ne suis pas une référence.

    Bon courage.

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    Il ne faut pas se laisser enfermer par la forme des données importées

    Après import on a
    Dossier d1 f1 d2 f2….
    X 1 2 3 null
    Il faut transformer cela comme suit
    Dossier étape debut fin
    X 1 1 2
    X 2 3 null
    Le sql deviendra alors plus naturel
    De plus si un jour il apparaît une étape 7 ou 6 bis on ne devra pas tout réécrire

  6. #6
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonjour,

    Je partage l'avis de Random.
    Sinon, dans ta structure actuelle, tu peux alléger le SQL en utilisant une fonction publique. Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ..., fctDatePrévueEtapeEnCours(P1,F1,P2,F2,P3,F3,P4,F4) as DatePrévueEtapeEnCours
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public Function fctDatePrévueEtapeEnCours(P1 As Variant, F1 As Variant, P2 As Variant, F2 As Variant, P3 As Variant, F3 As Variant, _
                                                P4 As Variant, F4 As Variant, P5 As Variant, F5 As Variant) As Variant
     
    fctDatePrévueEtapeEnCours = Nz(IIf(Not IsNull(P1) And IsNull(F1), P1, Null) & _
            IIf(Not IsNull(F1) And Not IsNull(P2) And IsNull(F2), P2, Null) & _
            IIf(Not IsNull(F2) And Not IsNull(P3) And IsNull(F3), P3, Null) & _
            IIf(Not IsNull(F3) And Not IsNull(P4) And IsNull(F4), P4, Null) & _
            IIf(Not IsNull(F4) And Not IsNull(P5) And IsNull(F5), P5, Null), "Terminé")
     
    End Function
    Ce qui améliore un peu la lisibilité, et illustre une autre façon de faire. Et il y en a encore plusieurs autres... Choisis en une qui te paraît plus simple à maintenir.

    MAis le mieux reste certainement de faire une table des étapes.

    Bon courage,

    PGZ

    Bon courage

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 163
    Points : 166
    Points
    166
    Par défaut
    Merci Random et Pgz pour vos réponses.
    Effectivement, je n'avais pas penser à faire une table étape pour la simple raison que la base que je développe actuellement ne sera pas péreine au delà de quelques mois et sera remplacé par un outil décisionnel, et donc d'ici là, la structure des données ne devrait pas changer.

    Sinon... n'étant pas très caler en VBA et en SQL, la solution que Pgz m'apporte soulève une question, je ne comprends pas où se fait la distinction pour les dossiers qui seront terminés en 4 étapes ?

    Merci encore pour votre aide.
    JMarc

  8. #8
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    bjr,

    pour éviter l'imbriquation de IIF, utilisez Switch

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    IIf(a contient "b", "a contient b", _
    IIf(a = "c", "a contient c", _
    IIf(a = "d", "a contient d", "a contient autre")))
    devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Switch(a = "b", "a contient b", _
           a = "c", "a contient c", _
           a = "d", "a contient d", _
           True, "a contient autre")
    beaucoup plus lisible comme ça...

  9. #9
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Re,

    je ne comprends pas où se fait la distinction pour les dossiers qui seront terminés en 4 étapes ?
    Pour ces dossiers, on a P1 à 4 renseignés et P5 null.
    DOnc le cinquième Iif renvoie Null. Le résultat ne dépent donc que de F1 à F4.

    la fonction = Nz(Expression, "Terminée")

    et expression = concaténation de 5 iif ( 1 pour chaque étape) qui renvoient une date ou null.
    Pour qu'un iif renvoie une date, il faut:
    - que l'étape précédente soit terminée et
    - que cette étape soit à faire et
    - que cette étape ne soit pas terminée. Si les 3 conditions sont réunies, ce iif donne la date Pi correspondante.
    L'expression ne peut renvoyer qu'un Pi
    L'expression peut renvoyer Null. Dans ce cas le Nz donne "Terminé".

    Apparemment, ce n'est pas aussi lisible que je le pensais.

    Bon courage,

    PGZ

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 163
    Points : 166
    Points
    166
    Par défaut
    Merci PGZ,

    Non, c'était surement très lisible, mais pour quelqu'un de plus calé que moi en VBA...

    Merci à tous pour toutes vos suggestions, je vais me regarder tout cela à tête reposé et en faire bon usage !!!

    JMarc

  11. #11
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    Il y assez fun pour résoudre ton problème
    C’est d’utiliser un checksum

    Exemple de checksum la fonction vartype

    Ici nous allons écrire notre fonction de checksum nous même
    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
     
    Function pcontrat(ParamArray x()) As Long
    Dim p As Long
    Dim total As Long
    Dim boucle As Variant
    total = 0
    p = 1
    For Each boucle In x
        If Not IsNull(boucle) Then
        total = total + p
        End If
    p = p * 2
    Next boucle
    pcontrat = total
    End Function

    Il suffit de renvoyer les champs concernés à la fonction par un
    Select pcontrat(p1,f1…p6,f6)
    À remarquer qu’en cas d’apparition d’un p7 f7 il suffit de modifier la requête la fonction
    Reste valide

    Bien entendu on complétera pat une table de décision

    Poids état
    0 rien n’est rempli
    1 seul p1 est rempli
    2 p1 rempli p2 à null
    3 p1 +p2
    etc

    on tombe alors sur un truc évolutif et disons le hilarant

  12. #12
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonjour Random.

    Sauf erreur de ma part ton "checksum" te permet de savoir combien il y a d'étapes pour une affaire, mais pas quelle est celle en cours.

    PGZ

  13. #13
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    bien sur que si d'ailleurs on peut écrire la fonction inverse

    si pcontrat= x
    je peux te dire pour les champs(n) à (n+x) lesquels sont nuls

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 163
    Points : 166
    Points
    166
    Par défaut
    Heu... là, on tombe dans la discussion de spécialiste... c'est trop fort pour moi...

    Merci à tous pour vos conseils, un jour je serai aussi fort que vous !

    JMarc

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/11/2007, 22h05
  2. Utiliser la STL dans les règles de l'art
    Par FabaCoeur dans le forum SL & STL
    Réponses: 10
    Dernier message: 10/06/2007, 21h58
  3. [Règles de l'art ?] Select Case.. sur 85 case..
    Par jeanchcom dans le forum Access
    Réponses: 6
    Dernier message: 18/09/2006, 15h21
  4. Réponses: 1
    Dernier message: 14/02/2006, 20h22

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