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 :

[A-03] une question sur requête analyse croisée


Sujet :

Requêtes et SQL.

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 745
    Points : 202
    Points
    202
    Par défaut [A-03] une question sur requête analyse croisée
    bonjour

    j'ai une table avec plusieurs clés primaires dont une où je souhaite avoir des renseignement.

    La clé sur NUM_OPERATION comme son nom l'indique me permet pour chaque enregistrement de l'affecte a une opération.

    Mon problème est que pour réaliser une requête d'analyse croisé je souhaite faire une sélection sur NUM_OPERATION mais je n'arrive pas a le faire et je suis obligé de faire une sélection grâce a une requête "copier le résultat" de cette requête dans une table vide et là je peux réaliser mon analyse croisé avec juste les résultats souhaité.

    Il y a t-il une solution plus simple???


    Suite a ta demande de précisé ma demande, je te joins une base d'exemple.
    Tu ouvre le formulaire "Gestion des réserves" et à droite tu as une liste déroulante pour imprimer et la si tu regarde le code je suis obliger de faire une requête "ajout" dans la table "stat_reserve" pour ensuite réalise ma requête d'analyse croisé. Je suis actuellement obliger de passe par une requête d'ajout car je fais un filtre sur OPERATION.


    Je souhaite savoir si je peux trouve une solution pour évite de copier les données dans une table


    Ps : je suis sous access 2003

  2. #2
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    Bonjour,

    La difficulté réside dans le fait d'ouvrir un recordset sur une requête paramétrée.

    Pour tes deux impressions (5 et 10) j'ai créé deux requêtes srqDOC5 et srqDOC10 qui reprennent l'instruction SELECT de tes deux INSERT vba.
    Code sql srqDOC5 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT LOGEMENT.BATIMENT_LOGE, LOGEMENT_TS_RESERVE.NUM_ENTREPRISE, Count(LOGEMENT_TS_RESERVE.NUM_TS_RESERVE) AS nombre, LOGEMENT.NUM_LOGE
    FROM LOGEMENT INNER JOIN LOGEMENT_TS_RESERVE ON (LOGEMENT.NUM_OPERATION = LOGEMENT_TS_RESERVE.NUM_OPERATION) AND (LOGEMENT.NUM_LOGEAUTO = LOGEMENT_TS_RESERVE.NUM_LOGEAUTO)
    WHERE (((LOGEMENT.NUM_LOGE)<>'pc') AND ((LOGEMENT_TS_RESERVE.NUM_OPERATION)=[Forms]![Gestion des réserves]![NUM_OPERATION]) AND ((LOGEMENT_TS_RESERVE.TYPE_TS_RESERVE)='reserve'))
    GROUP BY LOGEMENT.BATIMENT_LOGE, LOGEMENT_TS_RESERVE.NUM_ENTREPRISE, LOGEMENT.NUM_LOGE;
    Code sql srqDOC10 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT LOGEMENT.BATIMENT_LOGE, LOGEMENT_TS_RESERVE.NUM_ENTREPRISE, Count(LOGEMENT_TS_RESERVE.NUM_TS_RESERVE) AS nombre
    FROM LOGEMENT INNER JOIN LOGEMENT_TS_RESERVE ON (LOGEMENT.NUM_OPERATION = LOGEMENT_TS_RESERVE.NUM_OPERATION) AND (LOGEMENT.NUM_LOGEAUTO = LOGEMENT_TS_RESERVE.NUM_LOGEAUTO)
    WHERE (((LOGEMENT_TS_RESERVE.NUM_OPERATION)=[Forms]![Gestion des réserves]![NUM_OPERATION]) AND ((LOGEMENT_TS_RESERVE.TYPE_TS_RESERVE)="reserve") AND ((LOGEMENT.NUM_LOGE)="pc"))
    GROUP BY LOGEMENT.BATIMENT_LOGE, LOGEMENT_TS_RESERVE.NUM_ENTREPRISE;
    Dans les deux requêtes sources des états j'ai remplacé la table "stat_reserve" par une des deux requêtes.

    Impression : 5
    Etat : "analyse croise bat appart entreprise"
    Requête : "analyse croise appart entreprise"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    PARAMETERS [Forms]![Gestion des réserves]![NUM_OPERATION] Long;
    TRANSFORM Sum(srqDOC5.nombre) AS SommeDenombre
    SELECT srqDOC5.BATIMENT_LOGE, srqDOC5.NUM_LOGE
    FROM ENTREPRISE INNER JOIN srqDOC5 ON ENTREPRISE.NUM_ENTREPRISE = srqDOC5.NUM_ENTREPRISE
    GROUP BY srqDOC5.BATIMENT_LOGE, srqDOC5.NUM_LOGE
    ORDER BY srqDOC5.BATIMENT_LOGE, srqDOC5.NUM_LOGE, ENTREPRISE.NOM_ENTREPRISE
    PIVOT ENTREPRISE.NOM_ENTREPRISE;
    Impression : 10
    Etat : "analyse croise bat com entreprise"
    Requête : "analyse croise bat com entreprise"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    PARAMETERS [Forms]![Gestion des réserves]![NUM_OPERATION] Long;
    TRANSFORM Sum(srqDOC10.nombre) AS SommeDenombre
    SELECT srqDOC10.BATIMENT_LOGE
    FROM ENTREPRISE INNER JOIN srqDOC10 ON ENTREPRISE.NUM_ENTREPRISE = srqDOC10.NUM_ENTREPRISE
    GROUP BY srqDOC10.BATIMENT_LOGE
    ORDER BY srqDOC10.BATIMENT_LOGE, ENTREPRISE.NOM_ENTREPRISE
    PIVOT ENTREPRISE.NOM_ENTREPRISE;
    Dans le code événementiel qui ouvre les états j'ai mis en commentaire les instructions sql
    Code vb : 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
    Private Sub listeimpression_AfterUpdate()
    DoCmd.RunCommand acCmdRefresh
    On Error GoTo Err_listeimpression_Click
    If listeimpression = 5 Then
    DoCmd.SetWarnings False
    'DoCmd.RunSQL "DELETE stat_reserve.* FROM stat_reserve;"
    'DoCmd.RunSQL "INSERT INTO stat_reserve ( BATIMENT_LOGE, NUM_ENTREPRISE, nombre, NUM_LOGE ) SELECT LOGEMENT.BATIMENT_LOGE, LOGEMENT_TS_RESERVE.NUM_ENTREPRISE, Count(LOGEMENT_TS_RESERVE.NUM_TS_RESERVE) AS nombre, LOGEMENT.NUM_LOGE FROM LOGEMENT INNER JOIN LOGEMENT_TS_RESERVE ON (LOGEMENT.NUM_OPERATION = LOGEMENT_TS_RESERVE.NUM_OPERATION) AND (LOGEMENT.NUM_LOGEAUTO = LOGEMENT_TS_RESERVE.NUM_LOGEAUTO) GROUP BY LOGEMENT.BATIMENT_LOGE, LOGEMENT_TS_RESERVE.NUM_ENTREPRISE, LOGEMENT_TS_RESERVE.NUM_OPERATION, LOGEMENT_TS_RESERVE.TYPE_TS_RESERVE, LOGEMENT.NUM_LOGE HAVING (((LOGEMENT_TS_RESERVE.NUM_OPERATION)=[Forms]![Gestion des réserves]![NUM_OPERATION]) AND ((LOGEMENT_TS_RESERVE.TYPE_TS_RESERVE)='reserve') AND ((LOGEMENT.NUM_LOGE)<>'pc'));"
    DoCmd.SetWarnings True
        Dim stDocName5 As String
        stDocName5 = "analyse croise bat appart entreprise"
        DoCmd.OpenReport stDocName5, acPreview
    Else
    If listeimpression = 10 Then
    DoCmd.SetWarnings False
    'DoCmd.RunSQL "DELETE stat_reserve.* FROM stat_reserve;"
    'DoCmd.RunSQL "INSERT INTO stat_reserve ( BATIMENT_LOGE, NUM_ENTREPRISE, nombre ) SELECT [regroupe com bat entreprise].BATIMENT_LOGE, [regroupe com bat entreprise].NUM_ENTREPRISE, [regroupe com bat entreprise].nombre FROM [regroupe com bat entreprise];"
    DoCmd.SetWarnings True
        Dim stDocName10 As String
        stDocName10 = "analyse croise bat com entreprise"
        DoCmd.OpenReport stDocName10, acPreview
    End If
    End If
    Exit_listeimpression_Click:
        Exit Sub
    Err_listeimpression_Click:
        Resume Exit_listeimpression_Click
    End Sub
    Enfin dans chacun des deux états j'ai modifié le code "sur ouverture"
    - Je renseigne le paramètre ([Forms]![Gestion des réserves]![NUM_OPERATION]) avant d'ouvrir le recordset.
    - Je prends le nombre de colonnes depuis rstEnregistrement au lieu de rstRequete.
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Report_Open(Cancel As Integer)
        Dim rstRequete As DAO.QueryDef
     
        Set dbbase = CurrentDb
        Set rstRequete = dbbase.QueryDefs("analyse croise bat com entreprise")
        rstRequete.Parameters(0) = Eval(rstRequete.Parameters(0).Name)
        Set rstEnregistrement = rstRequete.OpenRecordset()
     
        'Définit le nombre de colonnes de la requête
        NbColonnes = rstEnregistrement.Fields.Count
     
    End Sub

    Voila, je pense que je n'ai rien oublié.

    A+

  3. #3
    Débutant  
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 745
    Points : 202
    Points
    202
    Par défaut
    merci pour ta solution

    mais pour le code que j'e doit rentre dans l'etat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Dim rstRequete As DAO.QueryDef
     
        Set dbbase = CurrentDb
        Set rstRequete = dbbase.QueryDefs("analyse croise bat com entreprise")
        rstRequete.Parameters(0) = Eval(rstRequete.Parameters(0).Name)
        Set rstEnregistrement = rstRequete.OpenRecordset()
     
        'Définit le nombre de colonnes de la requête
        NbColonnes = rstEnregistrement.Fields.Count
    je l'ai rentre mais il me dit :
    erreur d'exécution 3265
    element non trouve dans cette collection

    et il me souligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        rstRequete.Parameters(0) = Eval(rstRequete.Parameters(0).Name)
    pk?

  4. #4
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    il doit manquer le paramètre dans la requête.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PARAMETERS [Forms]![Gestion des réserves]![NUM_OPERATION] Long;
    Ouvre la requête analyse croisée en mode création et vérifie en faisant
    menu principal > requête > paramètres...

    A+

  5. #5
    Débutant  
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 745
    Points : 202
    Points
    202
    Par défaut
    non je l'ai bien fait regarde j'ai fait ce que tu ma dis de faire

  6. #6
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    Ben non.

    le code que tu montres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rstRequete = dbbase.QueryDefs("analyse croise bat com entreprise")
    -> requête "analyse croise bat com entreprise"
    Je regarde et ne voie aucun paramètre.

    Par contre tu l'as bien mis dans la requête "analyse croise appart entreprise".

    Dans cette partie de ce que j'écris ....
    - Je renseigne le paramètre ([Forms]![Gestion des réserves]![NUM_OPERATION]) avant d'ouvrir le recordset.
    - Je prends le nombre de colonnes depuis rstEnregistrement au lieu de rstRequete.
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Report_Open(Cancel As Integer)
        Dim rstRequete As DAO.QueryDef
        
        Set dbbase = CurrentDb
        Set rstRequete = dbbase.QueryDefs("analyse croise bat com entreprise")
        rstRequete.Parameters(0) = Eval(rstRequete.Parameters(0).Name)
        Set rstEnregistrement = rstRequete.OpenRecordset()
        
        'Définit le nombre de colonnes de la requête
        NbColonnes = rstEnregistrement.Fields.Count
     
    End Sub
    ... les modifs concernaient le lignes en rouges
    Il faut conserver le nom de la requête dans ton état:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Set rstRequete = dbbase.QueryDefs("nom de la requête")
    état "analyse croise bat appart entreprise"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Report_Open(Cancel As Integer)
        Dim rstRequete As DAO.QueryDef
     
        Set dbbase = CurrentDb
        Set rstRequete = dbbase.QueryDefs("analyse croise appart entreprise")
        rstRequete.Parameters(0) = Eval(rstRequete.Parameters(0).Name)
        Set rstEnregistrement = rstRequete.OpenRecordset()
     
     
        'Définit le nombre de colonnes de la requête
        NbColonnes = rstEnregistrement.Fields.Count
    End Sub
    état "analyse croise bat com entreprise"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Report_Open(Cancel As Integer)
        Dim rstRequete As DAO.QueryDef
     
        Set dbbase = CurrentDb
        Set rstRequete = dbbase.QueryDefs("analyse croise bat com entreprise")
        rstRequete.Parameters(0) = Eval(rstRequete.Parameters(0).Name)
        Set rstEnregistrement = rstRequete.OpenRecordset()
     
        'Définit le nombre de colonnes de la requête
        NbColonnes = rstEnregistrement.Fields.Count
    End Sub
    Va moins rapidement, prends le temps de lire posément et ça devrait le faire

    A+

  7. #7
    Débutant  
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 745
    Points : 202
    Points
    202
    Par défaut
    merci bcp j'au vu mon erreur.

    J'ai etait un peu long a repondre car je l'ai réalise sous un autre exemple et j'ai tout repris a zero pour être sur que j'ai bien compris.

    Merci encore

  8. #8
    Débutant  
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 745
    Points : 202
    Points
    202
    Par défaut
    j'ai reusi a réalise ton systeme que tu ma donne sur 2 autre cas que j'avais et sa marche super bien.

    Mais la j'ai un cas ou j'ai une erreur, les données sont d'abord traité sur un formulaire de recherche multi critaire "Gestion Impression Réserve" qui me copier le résultat dans une requete "Impression_reserve" de cette requete je réalise une nouvelle requete "impres_gestion_reserve_analyse_croise" ensuite je réalise ma requete d'analyse croisé avec comme parametre les formulaires source "[Forms]![Gestion Impression Réserve]![escopefini]" type oui non; "[Forms]![Gestion Impression Réserve]![txtdatereserve]" type texte; "[Forms]![Gestion Impression Réserve]![chkdatereserve]" type oui non.

    Mon probléme est quand j'excécute la requete il me dit "Incohérence de type dans une expression".

    Tu peux me dire qu'elle est le probléme.?

  9. #9
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    Bonjour,

    J'ai mis du temps à trouver.
    Je n'ai voulu me fier à première impression qui était une incompatibilité de type dans une jointure.
    J'ai cherché du côté des expressions comme l'indique le message d'erreur.

    Dans la requête d'analyse croisée "analyse croise recherche appart entreprise" la jointure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FROM .... ON impres_gestion_reserve_analyse_croise.Entreprise = ENTREPRISE.NUM_ENTREPRISE
    n'est pas possible.
    impres_gestion_reserve_analyse_croise.Entreprise est du texte
    ENTREPRISE.NUM_ENTREPRISE est numérique

    Tu n'as pas besoin de la table ENTREPRISE.
    Essaie comme ça pour "analyse croise recherche appart entreprise"
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    PARAMETERS [Forms]![Gestion Impression Réserve]![escopefini] Bit, [Forms]![Gestion Impression Réserve]![txtdatereserve] Text ( 255 ), [Forms]![Gestion Impression Réserve]![chkdatereserve] Bit;
    TRANSFORM Sum(impres_gestion_reserve_analyse_croise.nombre) AS SommeDenombre
    SELECT impres_gestion_reserve_analyse_croise.Bâtiment, impres_gestion_reserve_analyse_croise.[N° Loge]
    FROM impres_gestion_reserve_analyse_croise
    GROUP BY impres_gestion_reserve_analyse_croise.Bâtiment, impres_gestion_reserve_analyse_croise.[N° Loge]
    ORDER BY impres_gestion_reserve_analyse_croise.Bâtiment, impres_gestion_reserve_analyse_croise.[N° Loge], impres_gestion_reserve_analyse_croise.Entreprise
    PIVOT impres_gestion_reserve_analyse_croise.Entreprise;
    A+

  10. #10
    Débutant  
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 745
    Points : 202
    Points
    202
    Par défaut
    merci pour ta reponse,
    j'avai pas fait attention que j'avai deja récupera le nom de l'operation donc sa marche bien pour la requete.

    je souhaite l'intégre dans mon etat (Impression Réserve entreprise) mais il me dis :
    Le moteur de la base de données Microsoft office Access ne reconnait pas " " en tant que nom de champ ou expression correcte.


    regarde le code de mon de mon etat mais je ne voi rien qui ne marche pas.

    Tu pourrai me dis pk il me donne cette erreur? stp merci

  11. #11
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    Bonsoir,

    Dans ton état tu as un regroupement sur "BATIMENT_LOGE".
    Mais ce champ n'existe pas dans la source de données du formulaire.

    Il faut juste changer le nom du champ sur lequel faire le regroupement, en le sélectionnant dans la liste déroulante.

    A+

  12. #12
    Débutant  
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 745
    Points : 202
    Points
    202
    Par défaut
    Merci bcp sa marche super

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

Discussions similaires

  1. [AC-2003] Somme sur requête analyse croisée
    Par willytito dans le forum Access
    Réponses: 2
    Dernier message: 06/03/2015, 18h43
  2. Réponses: 2
    Dernier message: 23/09/2012, 12h02
  3. [AC-2000] Formulaire et état basés sur une requête analyse croisée
    Par ClaudeLELOUP dans le forum IHM
    Réponses: 4
    Dernier message: 23/02/2011, 13h58
  4. Arrondis faux sur requêtes analyse croisée et création de table
    Par Banban52 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 28/07/2007, 10h07

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