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 :

Manipuler les chaînes de caractères & des dates


Sujet :

Requêtes et SQL.

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 36
    Points : 25
    Points
    25
    Par défaut Manipuler les chaînes de caractères & des dates
    Bonjour,

    Je suis assez novice en access, et j'essaie tant bien que mal de monter quelque chose.

    J'ai une table avec une colonne "Période" qui se remplie de la manière suivante :
    M012017 --> cela correspond au mois de janvier 2017.
    Ainsi qu'une colonne : "Référence" et une colonne "Etat"

    J'ai crée une requête paramétrée afin que l'utilisateur saisisse la période d'étude (Donc M012017 s'il veut étudier le mois de janvier 2017).

    Je voudrais que ma requête compare pour une même référence avec les mois d'avant si l'enregistrement a déjà été dans un état critique.

    Exemple :
    Id Période Référence Etat
    1 M012017 00 Critique
    2 M012017 01 OK
    3 M012017 02 OK
    ...
    59 M022017 00 Critique
    60 M022017 47 OK


    Donc si l'utilisateur saisi le paramètre "M022017" j'aimerais bien qu'il me ressorte l'enregistrement 59. (avec un menu déroulant dans lequel on a l'enregistrement 1, mais je sais pas comment faire)

    Ce que j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT T0.Id, T0.Période, T0.Référence, T0.Etat
    FROM MaTable As T0 INNER JOIN MaTable As T1 ON T1.Référence = T0.Référence
    WHERE ((T0.Etat = "Critique" AND T1.Etat = "Critique") AND ((T1.Période)=Replace([Paramètre],Mid([Paramètre],2,1),(CInt(Mid([Paramètre],2,2))-1))) AND (T0.Référence = T1.Référence);
    Mais malheureusement ça ne marche pas, je n'arrive pas à chercher le mois d'avant la saisie...

    D'autant plus que si l'utilisateur saisi : "M012017", si on applique ma petite formule, on aura "M002017", ce qui ne correspond pas au mois de décembre 2016...
    Sur ce côté là je ne sais pas trop comment faire du coup..

    Si vous pouviez m'aider.. Peut-être en utilisant un paramètre au format date ?

    Merci de votre aide

    EDIT : 14h28
    Avec une succession de VraiFaux et ExtracChaîne, j'ai réussi à aboutir.
    En revanche, j'aimerais bien qu'à un enregistrement, on me montre via un déroulant les différents enregistrements des mois précédents ayant aussi eu l'état Critique.

    Je sais qu'on peut faire ça sur Access, mais je ne sais même pas quoi tapper sur google... quand je tape déroulant, j'ai que des choses sur des requêtes paramétrées avec menu déroulant...

  2. #2
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Points : 281 920
    Points
    281 920
    Par défaut
    Bonjour,

    Mais malheureusement ça ne marche pas, je n'arrive pas à chercher le mois d'avant la saisie..
    La fonction DateSerial( ) ferait bien ça pour toi !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Option Compare Database
    Option Explicit
     
     
    Public Function PeriodePrec(Periode As String) as String
     Dim dateTampon As Date
     dateTampon = DateSerial(Right(Periode, 4), Mid(Periode, 2, 2) - 1, "01")
     PeriodePrec = "M" & Format(Month(dateTampon), "00") & Year(dateTampon)
    End Function


    Que veux-tu, au fait ?

    Un formulaire qui te permettrait de choisir une période dans une liste déroulante et qui afficherait :
    - les données de cette période) ;
    - celles du mois qui précède (uniquement si critique ?).

    Si oui, dis-moi comment s'appelle la table, je te ferai une proposition de code.

    Vérifie aussi ton exemple : Reference intervient-il dans les critères pour retrouver l'enregistrement ?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 36
    Points : 25
    Points
    25
    Par défaut
    Bonjour Claude

    Oui référence intervient, je viens de le corriger dans mon premier message.

    Voici comment j'ai procédé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT T0.Id, T0.Période, T0.Référence, T0.Etat, T1.Id
    FROM MaTable As T0 INNER JOIN MaTable As T1 ON T1.Référence = T0.Référence
    WHERE (((T0.Période)=[Paramètre]) AND ((T1.Période)=IIf(CInt(Mid([Paramètre],2,2))=1,"M12" & CStr(CInt(Mid([Paramètre],4,4)-1)),"M0" & CStr(CInt(Mid([Paramètre],2,2)-1)) & CStr(CInt(Mid([Paramètre],4,4))))) AND ((T0.[Référence])=[T1].[Référence]) AND (([T1].[Etat]="Critique")) AND (([T0].[Etat]="Critique" ))));
    J'ai donc via des fonctions déjà pré-enregistrée "extrait" le 02 de M022017 pour le descendre de 1. Puis crée une condition pour afficher M122016 quand l'utilisateur tape M012017.

    En revanche votre solution m'intéresse, car je ne sais pas comment l'exploiter, et ça m'ouvrirait des portes pour l'avenir !
    Je vois que c'est du VBA : vous avez crée un module, puis rentré ce code ?
    Comment l'avez vous intégré à la requête ?

    Et ce que je veux :
    C'est comparer les enregistrements critiques de la période rentrée par l'utilisateur, avec ceux de la période précédente. (mois - 1 en gros)

    Merci beaucoup de prendre le temps de me répondre !

  4. #4
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Points : 281 920
    Points
    281 920
    Par défaut
    Résumons
    Pour les références dont l’état est « critique » pour une période, tu voudrais voir l’état de cette même référence le mois qui précède.
    Correct ?

  5. #5
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Points : 281 920
    Points
    281 920
    Par défaut
    Exemple avec une requête :






    SQL de la requête
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT LaTable.Periode, LaTable.Reference, LaTable.Etat, nz(DLookUp("Etat","LaTable","Periode=""" & PeriodePrec([periode]) & """ AND Reference=""" & [Reference] & """"),"Pas de données") AS EtatPrecedent
    FROM LaTable
    WHERE (((LaTable.Periode)=[Quelle période ?]) AND ((LaTable.Etat)="critique"));
    Fichiers attachés Fichiers attachés

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 36
    Points : 25
    Points
    25
    Par défaut
    Honnêtement

    Merci beaucoup

    J'ai compris beaucoup de choses grâce à toi, notamment l'utilisation des modules dans les requêtes. Je te remercie encore.

    Une autre question (pour ne pas refaire de sujet) :

    J'ai deux tables, sur lesquels j'ai fait plusieurs requêtes : 6 au total.
    J'aimerais bien faire un "état bilan" sur lequel je voudrais compter le nombre de résultat de chacune de mes requêtes par service.

    En parcourant la toile, j'ai vu qu'ils recommandaient de faire une requête Union pour que tous les résultats s'affichent dans la même requête que l'on liera à l'état.
    Ce que j'ai donc fait.

    Mais maintenant, je ne sais pas comment compter les éléments de la première requête, puis de la deuxième, puis de la troisième... qui sont désormais l'une en dessous de l'autre dans la même requête désormais "unifié"!

    Lorsque je rentre Compte([monChamp]) il me compte le nombre d'enregistrement total, et pas par requête !

    Merci encore ClaudeLELOUP de prendre le temps de me répondre !

  7. #7
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Points : 281 920
    Points
    281 920
    Par défaut
    Bonjour,

    Intéresse-toi plutôt aux fonctions de domaine (ici : CpteDom())

    Exemple :

    Fichiers attachés Fichiers attachés

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 36
    Points : 25
    Points
    25
    Par défaut
    Bonjour,

    Encore merci Claude ! C'est vrai que cela fonctionne pour des requêtes ne contenant pas de paramètres. Mais moi, malheureusement j'ai besoin d'utiliser un paramètre..
    D'après la doc la fonction s'écrit : CpteDom("Champ à compter", "Table/Requête", "critère")

    J'ai fait plusieurs tentatives pour mettre mon paramètre dans le "critère", mais impossible j'ai systématiquement des Erreurs pour les requêtes qui nécessitent un paramètre pour tourner..

    EDIT 1 : j'ai peut être une idée enfait

    EDIT 2 : Finalement je n'y arrive pas...

    J'ai donc une table PA
    Dans laquelle j'ai :
    Echelon - Date de début - Date de Fin - Etat


    Une table Organisation dans laquelle à chaque Echelon est attribué un Groupe
    Echelon - Groupe

    J'ai crée mes 6 requêtes avec le même nombre de champ
    Je lie Echelon avec Echelon
    Dans chacune de mes requêtes je fais taper à l'utilisateur le fameux "m012017", et grace à une fonction que j'ai écrite dans un module il va chercher la date associée. Je mets en plus de ça un critère supplémentaire qui les spécifie les unes des autres.

    Désormais j'aimerai créer un état, dans lequel j'écrit le nombre de résultat de chacune des requêtes (qui sont donc pour la pluspart paramétrée) avec CpteDom.
    D'autant plus que j'aimerais trier mes résultats par Echelon..

    Je n'y arrive pas ça me rend complètement fou..

  9. #9
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Points : 281 920
    Points
    281 920
    Par défaut
    Désolé, je n'ai pas de solution à te proposer.

    J'ai ouvert une discussion ici : https://www.developpez.net/forums/d1...e/#post9793387

    Espérons...

  10. #10
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Points : 281 920
    Points
    281 920
    Par défaut
    Va voir, tee_grandbois a proposé une solution, bravo à lui !

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 36
    Points : 25
    Points
    25
    Par défaut
    Merci à vous deux !

    J'ai de mon côté trouvé une solution pour contourner le problème :

    J'ai modifié mes requêtes en rajoutant une colonne "Bilan : 'bilan x'".
    J'ai unifié mes 6 requêtes via une requête d'union paramétrée.
    J'ai donc mes résultats qui s'écrivent les uns en dessous des autres, sauf que :
    - les résultats issu de la requête 1 ont dans le champ Bilan la valeur "bilan 1"
    - les résultats issu de la requête 2 ont dans le champ Bilan la valeur "bilan 2"
    etc..

    J'ai crée un état qui prenait source dans cette requête unifiée.
    Et j'ai réalisé des
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =Somme(VraiFaux([Bilan]='bilan 1';1;0))
    En lançant mon état, je rentre le paramètre : et j'obtiens tous les résultats que je désire !

    Voilà une autre approche !

Discussions similaires

  1. [PHP 5.6] Manipuler les chaînes de caractère.
    Par shadhes dans le forum Langage
    Réponses: 9
    Dernier message: 28/05/2016, 01h31
  2. Réponses: 1
    Dernier message: 14/10/2015, 11h38
  3. MFC + Manipuler les chaînes de caractères
    Par mqsi dans le forum MFC
    Réponses: 2
    Dernier message: 15/11/2006, 16h24

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