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 :

requête trop complexe


Sujet :

Access

  1. #1
    Membre du Club
    Femme Profil pro
    Gestionnaire de paie
    Inscrit en
    Janvier 2016
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Gestionnaire de paie
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2016
    Messages : 61
    Points : 42
    Points
    42
    Par défaut requête trop complexe
    Bonjour,

    Au lancement d'une requête dans ACCESS, en rajoutant une condition sur un champ <-1 ou >1, j'ai le message "requête trop complexe". Il est vrai qu'elle est assez copieuse mais il y a peut_être des choses à corriger.

    Voici le code sql :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT RUB_0.R_IJSS, RUB_0.R_1902, RUB_0.R_1900, RUB_0.R_1979, RUB_0.R_5979, RUB_0.R_5107_prec, RUB_0.R_5107_act, RUB_0.R_5031_act, [001F_EFF_PAIE_EN_COURS].Mois_paie, [001F_EFF_PAIE_EN_COURS].Gest_Adm, [001F_EFF_PAIE_EN_COURS].direction, [001F_EFF_PAIE_EN_COURS].libelle, [001F_EFF_PAIE_EN_COURS].Matricule_paie, [001F_EFF_PAIE_EN_COURS].Nom_prenom, [001F_EFF_PAIE_EN_COURS].[Nature_ contrat], [001F_EFF_PAIE_EN_COURS].statut_Paie, [001F_EFF_PAIE_EN_COURS].Prive_Public, [001F_EFF_PAIE_EN_COURS].Date_fin, [001F_EFF_PAIE_EN_COURS].motif_sortie_lib, [001F_EFF_PAIE_EN_COURS].date_anc_paie, [001F_EFF_PAIE_EN_COURS].[12_medaille_trav_total], [001F_EFF_PAIE_EN_COURS].[13_Mobilite_total], [001F_EFF_PAIE_EN_COURS].[0513_cal], [001F_EFF_PAIE_EN_COURS].[1372_cal], [001F_EFF_PAIE_EN_COURS].CAL3, [14d_total_mutex].SommeDe14d_mt_presta_paye, [001F_EFF_PAIE_EN_COURS].[0225_cal], [001F_EFF_PAIE_EN_COURS].[1447_cal], [001F_EFF_PAIE_EN_COURS].[18_Ind_depart], Nz([0378_cal],0)+Nz([0379_cal],0)+Nz([5048_cal],0)+Nz([0380_cal],0)+Nz([0381_cal],0)+Nz([0382_cal],0)+Nz([0383_cal],0)+Nz([0359_cal],0) AS HS_total, [16_total2_prime_conferencier].SommeDe0510, [6b_total2_abs_non_paye].[6b_cal_montant], [5_total4_regul].SommeDe5cal_total, [R_5107_prec]-[R_5031_act] AS [5107_prec-5031_act], [R_5107_act]-[R_5107_prec] AS diff_5107, Nz([R_5031_act],0)-Nz([R_1902],0)+Nz([R_IJSS],0)-Nz([Total_Ind_csg],0)-Nz([R_5979],0)-Nz([1372_cal],0)-Nz([18_ind_depart],0)-Nz([0378_cal],0)-Nz([0379_cal],0)-Nz([5048_cal],0)-Nz([0380_cal],0)-Nz([0381_cal],0)-Nz([0382_cal],0)-Nz([0383_cal],0)-Nz([0359_cal],0)-Nz([SommeDe14d_mt_presta_paye],0)-Nz([0225_cal],0)+Nz([1447_cal],0)-Nz([SommeDe0510],0)+Nz([6b_cal_montant],0)-Nz([SommeDe5cal_total],0)-Nz([13_mobilite_total],0)-Nz([12_medaille_trav_total],0)-Nz([diff_anc],0)-Nz([IDCA_cal2],0)-Nz([1968],0)-Nz([0520],0)-Nz([diff_SM_promo],0)-Nz([CAL3],0)-Nz([1900],0) AS 5107_retabli, Nz([R_5031_act],0)-Nz([R_5107_prec],0)+(Nz([R_IJSS],0)-Nz([CAL3],0)-Nz([R_1900],0)-Nz([Total_Ind_csg],0)-Nz([R_5979],0)-Nz([0825],0)-Nz([1372_cal],0)-Nz([18_ind_depart],0)-Nz([0378_cal],0)-Nz([0379_cal],0)-Nz([5048_cal],0)-Nz([0380_cal],0)-Nz([0381_cal],0)-Nz([0382_cal],0)-Nz([0383_cal],0)-Nz([0359_cal],0)-Nz([1902],0)-Nz([SommeDe14d_mt_presta_paye],0)-Nz([0225_cal],0)+Nz([1447_cal],0)-Nz([SommeDe0510],0)+Nz([6b_cal_montant],0)-Nz([SommeDe5cal_total],0)-Nz([13_mobilite_total],0)-Nz([12_medaille_trav_total],0)-[0240_cal]+[prec_0240_cal]-Nz([IDCA_cal2],0)-Nz([1968],0)-Nz([0520],0)-(IIf(([sal_mens_prive]-[prec_SM_prive])<>0,([sal_mens_prive]-[prec_SM_prive]-([0240_cal]-[prec_0240_cal])),([sal_mens_prive]-[prec_SM_prive])))) AS diff, Nz([R_5031_act],0)-Nz([R_5107_prec],0)+(Nz([R_IJSS],0)-Nz([CAL3],0)-Nz([R_1900],0)-Nz([Total_Ind_csg],0)-Nz([R_5979],0)-Nz([1372_cal],0)-Nz([18_ind_depart],0)-Nz([0378_cal],0)-Nz([0379_cal],0)-Nz([5048_cal],0)-Nz([0380_cal],0)-Nz([0381_cal],0)-Nz([0382_cal],0)-Nz([0383_cal],0)-Nz([0359_cal],0)-Nz([1902],0)-Nz([SommeDe14d_mt_presta_paye],0)-Nz([0225_cal],0)+Nz([1447_cal],0)-Nz([SommeDe0510],0)+Nz([6b_cal_montant],0)-Nz([SommeDe5cal_total],0)-Nz([13_mobilite_total],0)-Nz([12_medaille_trav_total],0)-[0240_cal]+[prec_0240_cal]-Nz([IDCA_cal2],0)-Nz([1968],0)-Nz([0520],0)-(IIf(([sal_mens_prive]-[prec_SM_prive])<>0,([sal_mens_prive]-[prec_SM_prive]-([0240_cal]-[prec_0240_cal])),([sal_mens_prive]-[prec_SM_prive]))))-Nz([diff_salaire_justif],0) AS new_diff, [01B2_EFF_ANC_MOIS_PREC_SM].prec_SM_prive, [001F_EFF_PAIE_EN_COURS].diff_salaire_justif, [001F_EFF_PAIE_EN_COURS].commentaire_eff_paie, [001F_EFF_PAIE_EN_COURS].mois_anc_paie, [001F_EFF_PAIE_EN_COURS].mois_mois_paie, [0240_cal]-[prec_0240_cal] AS diff_anc, [001F_EFF_PAIE_EN_COURS].[0240_cal], [001F_EFF_PAIE_EN_COURS].anc, [001F_EFF_PAIE_EN_COURS].IDCA_cal2, [sal_mens_prive]-[prec_SM_prive] AS diff_SM_promo, RUB_0.Total_Ind_csg
    FROM ((((((RUB_0 INNER JOIN 001F_EFF_PAIE_EN_COURS ON (RUB_0.RUB_mois_paie = [001F_EFF_PAIE_EN_COURS].Mois_paie) AND (RUB_0.RUB_mat = [001F_EFF_PAIE_EN_COURS].Matricule_paie)) LEFT JOIN 16_total2_prime_conferencier ON ([001F_EFF_PAIE_EN_COURS].Matricule_GA = [16_total2_prime_conferencier].[16_mat_GA]) AND ([001F_EFF_PAIE_EN_COURS].Mois_paie = [16_total2_prime_conferencier].[16_mois_paie])) LEFT JOIN 11_liste_heures_sup ON ([001F_EFF_PAIE_EN_COURS].Mois_paie = [11_liste_heures_sup].Mois_paie) AND ([001F_EFF_PAIE_EN_COURS].Matricule_GA = [11_liste_heures_sup].Matricule_GA)) LEFT JOIN 14d_total_mutex ON ([001F_EFF_PAIE_EN_COURS].Matricule_GA = [14d_total_mutex].Matricule_GA) AND ([001F_EFF_PAIE_EN_COURS].Mois_paie = [14d_total_mutex].[14d_mois_paie])) LEFT JOIN 6b_total2_abs_non_paye ON ([001F_EFF_PAIE_EN_COURS].Matricule_GA = [6b_total2_abs_non_paye].[6b_matGA]) AND ([001F_EFF_PAIE_EN_COURS].Mois_paie = [6b_total2_abs_non_paye].[6b_mois_paie])) LEFT JOIN 5_total4_regul ON ([001F_EFF_PAIE_EN_COURS].Matricule_GA = [5_total4_regul].[5_matGA]) AND ([001F_EFF_PAIE_EN_COURS].Mois_paie = [5_total4_regul].[5_mois_regul])) LEFT JOIN 01B2_EFF_ANC_MOIS_PREC_SM ON [001F_EFF_PAIE_EN_COURS].Matricule_paie = [01B2_EFF_ANC_MOIS_PREC_SM].Prec_Mat_paie
    WHERE ((([001F_EFF_PAIE_EN_COURS].Gest_Adm) Like "*" & [Saisir le nom du gestionnaire] & "*" Or ([001F_EFF_PAIE_EN_COURS].Gest_Adm) Is Null) AND (([001F_EFF_PAIE_EN_COURS].Prive_Public)="privé") AND ((Nz([R_5031_act],0)-Nz([R_5107_prec],0)+(Nz([R_IJSS],0)-Nz([CAL3],0)-Nz([R_1900],0)-Nz([Total_Ind_csg],0)-Nz([R_5979],0)-Nz([1372_cal],0)-Nz([18_ind_depart],0)-Nz([0378_cal],0)-Nz([0379_cal],0)-Nz([5048_cal],0)-Nz([0380_cal],0)-Nz([0381_cal],0)-Nz([0382_cal],0)-Nz([0383_cal],0)-Nz([0359_cal],0)-Nz([1902],0)-Nz([SommeDe14d_mt_presta_paye],0)-Nz([0225_cal],0)+Nz([1447_cal],0)-Nz([SommeDe0510],0)+Nz([6b_cal_montant],0)-Nz([SommeDe5cal_total],0)-Nz([13_mobilite_total],0)-Nz([12_medaille_trav_total],0)-[0240_cal]+[prec_0240_cal]-Nz([IDCA_cal2],0)-Nz([1968],0)-Nz([0520],0)-(IIf(([sal_mens_prive]-[prec_SM_prive])<>0,([sal_mens_prive]-[prec_SM_prive]-([0240_cal]-[prec_0240_cal])),([sal_mens_prive]-[prec_SM_prive]))))-Nz([diff_salaire_justif],0))>-1 Or (Nz([R_5031_act],0)-Nz([R_5107_prec],0)+(Nz([R_IJSS],0)-Nz([CAL3],0)-Nz([R_1900],0)-Nz([Total_Ind_csg],0)-Nz([R_5979],0)-Nz([1372_cal],0)-Nz([18_ind_depart],0)-Nz([0378_cal],0)-Nz([0379_cal],0)-Nz([5048_cal],0)-Nz([0380_cal],0)-Nz([0381_cal],0)-Nz([0382_cal],0)-Nz([0383_cal],0)-Nz([0359_cal],0)-Nz([1902],0)-Nz([SommeDe14d_mt_presta_paye],0)-Nz([0225_cal],0)+Nz([1447_cal],0)-Nz([SommeDe0510],0)+Nz([6b_cal_montant],0)-Nz([SommeDe5cal_total],0)-Nz([13_mobilite_total],0)-Nz([12_medaille_trav_total],0)-[0240_cal]+[prec_0240_cal]-Nz([IDCA_cal2],0)-Nz([1968],0)-Nz([0520],0)-(IIf(([sal_mens_prive]-[prec_SM_prive])<>0,([sal_mens_prive]-[prec_SM_prive]-([0240_cal]-[prec_0240_cal])),([sal_mens_prive]-[prec_SM_prive]))))-Nz([diff_salaire_justif],0))>1))
    ORDER BY RUB_0.RUB_nom, [001F_EFF_PAIE_EN_COURS].Nom_prenom;



    Merci par avance pour votre aide

    Cdlt

  2. #2
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    bonsoir,

    Citation Envoyé par CALOU3117
    Il est vrai qu'elle est assez copieuse
    merci de le reconnaitre
    Citation Envoyé par CALOU3117
    mais il y a peut_être des choses à corriger
    je défie quiconque d'apporter une amélioration rien qu'en regardant cette requête: 6851 caractères quand même ! un record, je pense.
    Certes, il n'y a que 4 IIF mais on compte 158 NZ, 7 jointures et des noms de requêtes à rallonge cela fait beaucoup !

    Cela doit venir de la profession, ce code semble également effectuer un calcul de paie: voir cet ancien post.
    Il y a aussi cette discussion, même si elle date un peu et que la requête ne contient "que" 6547 caractères, on y trouve également d'autres explications et conseils.

    Sérieusement, si une requête est trop complexe, je te conseille de passer par des tables temporaires plutôt que d'essayer de faire cela en une fois. Le but est de transformer les requêtes adjacentes (celles qui sont jointes) par des requêtes d'ajout dans une ou plusieurs tables mettre à jour les champs nuls pour éviter d'utiliser 158 fois la fonction NZ, etc...
    Et l'avantage des tables temporaires, c'est qu'on peut pister (auditer) le processus de calcul au fur et à mesure de son avancement surtout pour un sujet aussi sensible qu'un calcul de paie.
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  3. #3
    Membre du Club
    Femme Profil pro
    Gestionnaire de paie
    Inscrit en
    Janvier 2016
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Gestionnaire de paie
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2016
    Messages : 61
    Points : 42
    Points
    42
    Par défaut
    Bonjour,

    Désolé pour la réponse tardive.

    Je viens de reprendre le sujet.

    J'ai créé une table temporaire dans laquelle j'enregistre les résultats. jA partir de cette table temporaire, j'ai créé une requête qui exécute le résultat final donc je n'ai plus le problème de résultat complexe.

    Par contre j'éxécute cette requête finale par l'intermédiaire d'une macro ou d'abord j'éxécute une action "suppression des données de la table temporaire" puis j'éxécute une requête ajout pour avoir les derniers résultats les plus à jour puisque les utilisateurs peuvent être amenés à modifier des données pour corriger les écarts et ensuite j'ouvre la requête avec le résultat final où figure les écarts restant à contrôler.

    J'utilise une table fractionnée. les 25 gestionnaires ont copié la table de données frontale sur leur disque et la base de données principale est enregistrée sur un réseau. La table temporaire a été créée dans la base de données principale et est une table liée.

    Ma question est que 25 personnes sont susceptibles de lancer la requête avec le résultat final en même temps et à plusieurs reprises ou sont entrain de consulter les écarts qu'elles ont sur leur portefeuille. Vu que la table temporaire est remise à zéro puis recréeé à chaque fois que la requête est lancée par une gestionnaire, est ce que cela a une incidence sur le traitement pour les autres utilisateurs qui y sont dessus ?

    Merci par avance pour votre réponse

    Bien cordialement

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Points : 1 876
    Points
    1 876
    Par défaut
    Je ne sais pas comment vous vous y retrouvez.
    Si je disais que la modélisation de la DB laisse à désirer j'enfoncerais des portes ouvertes.
    Mais la première question est de comprendre à quoi ça sert, comment c'est utilisé et à partir de là on peut réfléchir à des améliorations.

    Dans ce cas-ci, je proposerais éventuellement de construire des vues et même de les imbriquer, l'idée est vraiment d'ajouter plusieurs couches pour simplifier le statement fial.
    Par exemple, on peut ajouter une vue pour incorporer les NZ et IIf, et même aliaser certaines colonnes à moins que cette convention de nommage aie beaucoup de sens dans votre métier...

    Ce qui me choque c'est la longueur de la partie WHERE.
    En supposant que les critères sont constants, alors on pourrait incorporer cette clause WHERE dans une autre vue. Ainsi, il vous restera la partie SELECT, que l'on peut simplifier un tout petit peu, comme je l'ai décrit ci-dessus.

    Mais il n'y a pas de miracle.

    Évidemment, j'abonde dans le même sens que tee_grandbois, utiliser des tables temporaires (ou agrégées) serait préférable je pense, saucissonner le calcul apporterait plus de traçabilité. Car il me semble difficile de garantir l'exactitude d'un truc aussi abscons, et la paie est quand même un domaine sensible ou l'approximation est difficilement tolérable.

    Ceci dit, il semble que vous avez déplacé le problème puisque maintenant se pose la question de la concurrence.
    Est-ce qu'il n'y a pas la notion de TEMPORARY TABLE en Access ? Il me semble que le scope de chaque table de ce type est alors limité à la "session", je comprends par là: connexion utilisateur.

  5. #5
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 648
    Points : 14 626
    Points
    14 626
    Par défaut
    bonsoir,
    La table temporaire a été créée dans la base de données principale et est une table liée.

    Ma question est que 25 personnes sont susceptibles de lancer la requête avec le résultat final en même temps et à plusieurs reprises ou sont entrain de consulter les écarts qu'elles ont sur leur portefeuille. Vu que la table temporaire est remise à zéro puis recréeé à chaque fois que la requête est lancée par une gestionnaire, est ce que cela a une incidence sur le traitement pour les autres utilisateurs qui y sont dessus ?
    et bien non, la table temporaire doit être locale, d'autant que la requête demande la saisie d'un code gestionnaire en paramètre ; il serait préférable de commencer par sélectionner tous ce qui concerne le gestionnaire demandeur et ensuite construire la table, sauf si ce n'est pas l'objectif final et qu'à terme il peut y avoir une demande de consolidation (tous les gestionnaires).
    Dans ce cas, il va falloir revoir ce traitement qui n'est pas viable (fiable ?) en l'état.

    A ce stade, n'ayant ni le modèle de données, ni le cahier des charges du traitement ou de l'application sous les yeux, il reste difficile de donner des réponses plus pertinentes que celles données par binarygirl et moi-même.
    Maintenant, cela concerne plutôt les concepteurs et les demandeurs du projet.
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  6. #6
    Membre du Club
    Femme Profil pro
    Gestionnaire de paie
    Inscrit en
    Janvier 2016
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Gestionnaire de paie
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2016
    Messages : 61
    Points : 42
    Points
    42
    Par défaut
    Merci à vous 2 de vous être penché sur mon problème

    Du coup, j'ai créé la table temporaire sur la partie frontale sans la lier.

    Cela solutionne mon problème

    C'est sûrement pas la meilleure solution mais elle fonctionne.


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

Discussions similaires

  1. requête trop complexe ?
    Par soulfactory dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 25/02/2011, 12h53
  2. Requête trop complexe pour moi
    Par snips67 dans le forum Requêtes
    Réponses: 6
    Dernier message: 27/01/2010, 09h24
  3. Requête trop complexe
    Par Domi2 dans le forum Requêtes et SQL.
    Réponses: 16
    Dernier message: 11/04/2009, 09h06
  4. Une requête trop complexe pour moi
    Par prgasp77 dans le forum Langage SQL
    Réponses: 13
    Dernier message: 14/01/2009, 17h12
  5. Simplication d'une requête "trop complexe"
    Par Manopower dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 27/06/2006, 14h22

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