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 :

Optimisation Requête multitable


Sujet :

Requêtes et SQL.

  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Points : 249
    Points
    249
    Par défaut Optimisation Requête multitable
    Bonjour à tous,

    Je fais appel à votre aide car je fais face à un problème assez particulier.

    Il y aurait-il un moyen en ACCESS me permettant d'optimiser cette requête.

    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
     
     
    SELECT OPERA_ACCTNG_POST_KF.TTY_NO, OPERA_ACCTNG_POST_KF.TTY_NAM, OPERA_ACCTNG_POST_KF.START_PD, OPERA_PD.END_PD, OPERA_ACCTNG_POST_KF.ACCTNG_YR_END_DAY, OPERA_ACCTNG_POST_KF.SECT_POS, OPERA_ACCTNG_POST_KF.CMP_ID, OPERA_ACCTNG_POST_KF.FINAN_YR_ID, IIf([OPERA_ACCTNG_POST_KF].[FINAN_MNTH]<=3,1,IIf([OPERA_ACCTNG_POST_KF].[FINAN_MNTH]<=6,2,IIf([OPERA_ACCTNG_POST_KF].[FINAN_MNTH]<=9,3,4))) AS FINAN_QRT_ID, OPERA_ACCTNG_POST_KF.GLBL_AU_ID, OPERA_ACCTNG_POST_KF.GLBL_AU_CODE, GCODE_BUSI_CLAS_LAST.LNAM AS BUSI_CLAS_LNAM, OPERA_ACCTNG_POST_KF.ACCTNG_NO, OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_CODE, OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_ID, OPERA_ACCTNG_POST_KF.RELEA_DAT, OPERA_ACCTNG_POST_KF.ORIGN_ID, OPERA_ACCTNG_POST_KF.ORIG_CCY_ID, OPERA_ACCTNG_POST_KF.RATE_MNTH, OPERA_ACCTNG_POST_KF.BUSI_TYP_ID, GCODE_BUSI_TYP_LAST.LNAM AS BUSI_TYP_LNAM, OPERA_ACCTNG_POST_KF.FI_POST_DAT, OPERA_ACCTNG_POST_KF.ACCTNG_YR_ID, OPERA_ACCTNG_POST_KF.ACCTNG_PD_ID, GCODE_ACCTNG_PD_LAST.REPORT_ACCTNG_PD_ID, OPERA_ACCTNG_POST_KF.BOK_ID, GCODE_BOK_LAST.CODE AS BOK_CODE, GCODE_BOK_LAST.LNAM AS BOK_LNAM, OPERA_ACCTNG_POST_KF.ORIG_AMNT, OPERA_ACCTNG_POST_KF.KYFIG_ID, OPERA_ACCTNG_POST_KF.KYFIG_CODE, GCODE_KYFIG_LAST.AGRG_LEVL AS KYFIG_AGRG_LEVL, GCODE_KYFIG_LAST.SYS_ID AS KYFIG_SYS_ID, GCODE_KYFIG_LAST.SYS_CODE AS KYFIG_SYS_CODE, GCODE_AREA_LAST.LNAM AS AREA_LNAM, OPERA_ACCTNG_POST_KF.ESTM_CODE, GCODE_FAS_TYP_LAST.CODE AS FAS_TYP_CODE, OPERA_ACCTNG_POST_KF.SAP_ACCTNG_CEDT_UIN AS SAP_CNTRCT_PARTN_UIN, OPERA_SECT.CCY_ID AS CCY_UPL_ID, GCODE_TTY_STATUS_LAST.CODE AS TTY_STATUS_CODE, OPERA_ACCTNG_POST_KF.TAD_RSPN AS TAD_ORG_POS_CODE, OPERA_ACCTNG_POST_KF.UW_RSPN AS UW_ORG_POS_CODE, OPERA_ACCTNG_POST_KF.ORG_UNIT_CODE_RSPN AS REPORT_LINE_CODE, OPERA_ACCTNG_POST_KF.TTY_DIREC_CODE, GCODE_ACCTNG_PD_LAST.ACTIV_VF, GCODE_CMP_LAST.LOCL_CCY_ID, GCODE_FE_TMPLT_LAST.LNAM AS ESTM_TMPLT_CODE
    FROM GCODE_FE_TMPLT_LAST INNER JOIN
     
    (OPERA_SECT_HD INNER JOIN (GCODE_CMP_LAST INNER JOIN
     
    (GCODE_FAS_TYP_LAST INNER JOIN (OPERA_SECT INNER JOIN ((GCODE_TTY_STATUS_LAST INNER JOIN 
     
    (GCODE_AREA_LAST INNER JOIN 
     
    (GCODE_BOK_LAST INNER JOIN (GCODE_ACCTNG_PD_LAST INNER JOIN
     
    (GCODE_BUSI_CLAS_LAST INNER JOIN (OPERA_PD INNER JOIN 
     
    (GCODE_KYFIG_LAST INNER JOIN 
     
    OPERA_ACCTNG_POST_KF ON GCODE_KYFIG_LAST.ID = OPERA_ACCTNG_POST_KF.KYFIG_ID) ON (OPERA_PD.CLNT_ID = OPERA_ACCTNG_POST_KF.CLNT_ID) AND (OPERA_PD.TTY_NO = OPERA_ACCTNG_POST_KF.TTY_NO) AND (OPERA_PD.START_PD = OPERA_ACCTNG_POST_KF.START_PD)) ON GCODE_BUSI_CLAS_LAST.ID = OPERA_ACCTNG_POST_KF.BUSI_CLAS_ID) ON GCODE_ACCTNG_PD_LAST.ID = OPERA_ACCTNG_POST_KF.ACCTNG_PD_ID) ON GCODE_BOK_LAST.ID = OPERA_ACCTNG_POST_KF.BOK_ID) ON GCODE_AREA_LAST.ID = OPERA_ACCTNG_POST_KF.AREA_ID) ON GCODE_TTY_STATUS_LAST.ID = OPERA_PD.TTY_STATUS_ID)
     
     INNER JOIN GCODE_BUSI_TYP_LAST ON OPERA_ACCTNG_POST_KF.BUSI_TYP_ID = GCODE_BUSI_TYP_LAST.ID) ON (OPERA_SECT.TTY_NO = OPERA_ACCTNG_POST_KF.TTY_NO) AND (OPERA_SECT.START_PD = OPERA_ACCTNG_POST_KF.START_PD)) ON GCODE_FAS_TYP_LAST.ID = OPERA_SECT.FAS_TYP_ID) ON GCODE_CMP_LAST.ID = OPERA_ACCTNG_POST_KF.CMP_ID) ON OPERA_SECT_HD.TTY_NO = OPERA_SECT.TTY_NO) ON GCODE_FE_TMPLT_LAST.ID = OPERA_SECT_HD.FE_TMPLT_ID
     
    WHERE (((OPERA_ACCTNG_POST_KF.CMP_ID)=cmp_code()) AND ((OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_CODE)='R' Or (OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_CODE)='P' Or (OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_CODE)='B_R') AND ((OPERA_ACCTNG_POST_KF.KYFIG_ID)=1066) AND ((GCODE_KYFIG_LAST.SYS_ID)=2) AND ((GCODE_ACCTNG_PD_LAST.ACTIV_VF)<>#1/1/1950#)) OR (((OPERA_ACCTNG_POST_KF.CMP_ID)=cmp_code()) AND ((OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_CODE)='R' Or (OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_CODE)='P' Or (OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_CODE)='B_R') AND ((OPERA_ACCTNG_POST_KF.BOK_ID)<>'510') AND ((GCODE_KYFIG_LAST.AGRG_LEVL)=9) AND ((GCODE_KYFIG_LAST.SYS_ID)=11) AND ((GCODE_ACCTNG_PD_LAST.ACTIV_VF)<>#1/1/1950#)) OR (((OPERA_ACCTNG_POST_KF.CMP_ID)=cmp_code()) AND ((OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_CODE)='R' Or (OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_CODE)='P' Or (OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_CODE)='B_R') AND ((OPERA_ACCTNG_POST_KF.KYFIG_ID)=10081) AND ((GCODE_KYFIG_LAST.SYS_ID)=4) AND ((GCODE_ACCTNG_PD_LAST.ACTIV_VF)<>#1/1/1950#)) OR (((OPERA_ACCTNG_POST_KF.CMP_ID)=cmp_code()) AND ((OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_CODE)='R' Or (OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_CODE)='P' Or (OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_CODE)='B_R') AND ((OPERA_ACCTNG_POST_KF.KYFIG_ID)=10087) AND ((GCODE_KYFIG_LAST.SYS_ID)=5) AND ((GCODE_ACCTNG_PD_LAST.ACTIV_VF)<>#1/1/1950#));
    Merci par avance pour votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Tu veux optimisé la vitesse d'exécution ou la longueur du scripte de ta requête?

    Genre
    (OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_CODE='R' Or OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_CODE='P' Or OPERA_ACCTNG_POST_KF.ACCTNG_STATUS_CODE)='B_R') And(OPERA_ACCTNG_POST_KF.CMP_ID)=cmp_code() Or/And etc)

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 359
    Points : 23 829
    Points
    23 829
    Par défaut
    Bonjour.

    Si c'est pour le temps d'execution, tu peux demander son avis a Access.
    Menu : Outils de base de donnees/Analiseur de performance.
    Il a parfois de bonne idee.

    Une autre solution est de proceder par requetes successives en stockant les resultats dans des tables intermedaires.
    FAIRE bien ATTENTION de vider les tables intermediaires avant de commencer le traitement.
    Et eventuellement apres pour eviter d'exploser les 2 Go.

    A+

  4. #4
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Points : 249
    Points
    249
    Par défaut
    Citation Envoyé par dysorthographie Voir le message
    Bonsoir,

    Tu veux optimisé la vitesse d'exécution ou la longueur du scripte de ta requête?
    Bonjour,

    Merci pour votre réponse, je veux optimiser la vitesse d'exécution.

    Pour être plus précis, à la requête mise dans le poste précédent, je dois rajouter ces champs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    SELECT OPERA_TTY.TTY_NO, reqACTUD.ACTUD_COLLCTN_TYP_LNAM, reqPREMD.PREMD_COLLCTN_TYP_LNAM, reqLOSSD.LOSSD_COLLCTN_TYP_LNAM
    FROM ((OPERA_TTY LEFT JOIN reqACTUD ON OPERA_TTY.TTY_NO = reqACTUD.TTY_NO) LEFT JOIN reqLOSSD ON OPERA_TTY.TTY_NO = reqLOSSD.TTY_NO) LEFT JOIN reqPREMD ON OPERA_TTY.TTY_NO = reqPREMD.TTY_NO
    WHERE (((OPERA_TTY.CMP_ID)=cmp_code()) AND ((OPERA_TTY.TTY_CLAS_ID)=1));
    Et (ce n'est pas encore fini)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    SELECT OPERA_GRP_TTY_LNK.TTY_NO, EASY_BUSI_PARTNER.NAM AS CNTRCT_PARTN_NAM, OPERA_GRP_HD.TXT AS LIFE_PROJ_CLU_GRP_TXT
    FROM OPERA_GRP_HD INNER JOIN (EASY_BUSI_PARTNER INNER JOIN OPERA_GRP_TTY_LNK ON (OPERA_GRP_TTY_LNK.CLNT_ID = EASY_BUSI_PARTNER.CLNT_ID) AND (EASY_BUSI_PARTNER.UIN = OPERA_GRP_TTY_LNK.CEDT_UIN)) ON OPERA_GRP_HD.GRP_NO = OPERA_GRP_TTY_LNK.GRP_NO
    WHERE (((OPERA_GRP_TTY_LNK.TTY_NO)=3032085) AND ((OPERA_GRP_HD.GRP_TYP_ID)=17) AND ((OPERA_GRP_HD.CMP_ID)="2000"));
    J'arrive à un plutôt bon résultat mais quand il faut joindre ces 3 requêtes ensemble. Le résultat devient .

    J'ai essayé de passer par VBA en exécutant mes requêtes dans des recordset pour ensuite les mettre dans des tables mais cela n'améliore pas du tout la vitesse d'exécution.

    Merci pour votre aide.

  5. #5
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Points : 249
    Points
    249
    Par défaut
    Citation Envoyé par marot_r Voir le message
    Bonjour.

    Si c'est pour le temps d'execution, tu peux demander son avis a Access.
    Menu : Outils de base de donnees/Analiseur de performance.
    Il a parfois de bonne idee.
    Merci, je ne connaissais pas cette fonctionnalité de Access, je le regarde tout de suite.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    Une autre solution est de proceder par requetes successives en stockant les resultats dans des tables intermedaires.
    FAIRE bien ATTENTION de vider les tables intermediaires avant de commencer le traitement.
    Et eventuellement apres pour eviter d'exploser les 2 Go.
    J'ai essayé cette solution mais elle ne m'a pas apporté le résultat voulu, ou peut-être que je ne crée pas les bonnes tables intermédiaires.

    Je vais rééssayer. Pour vous donner une vue d'ensemble de ma requête (et j'ai plusieurs critères sur cette requête, elle fonctionne vraiment bien avant que je rajoute les deux autres requêtes),

    Nom : Untitled.png
Affichages : 99
Taille : 70,9 Ko

    Merci encore pour votre aide et votre disponibilité.

  6. #6
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Points : 249
    Points
    249
    Par défaut
    Citation Envoyé par marot_r Voir le message
    Bonjour.

    Si c'est pour le temps d'execution, tu peux demander son avis a Access.
    Menu : Outils de base de donnees/Analiseur de performance.
    Il a parfois de bonne idee.

    A+
    A ma grande surprise, nous n'avons pas accès à l'Analyseur de performances sur Access au boulot.

    Le Warning me dit que soit il n'est pas installé, soit il est en mauvais état.

  7. #7
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 359
    Points : 23 829
    Points
    23 829
    Par défaut
    Bonjour.

    Pour l'analyse, voir avec ton service technique, autant que je sache c'est la par defaut mais il est prudent avec Access de demander l'installation complete (il faut en faire le choix au moment de l'installation).

    Pour ton autre probleme.

    Pour les tables intermediaires, j'essairai de "decouper" les grosses "branches", celles de OPERA_PD et OPERA_SECT.
    Je mettrai leur resultat dans une table puis je joindrai ces tables.

    C'est un peu au "filling" car Access ne fourni pas vraiment d'outil pour savoir ou les performances accrochent.

    Aussi, avant le tronconnage, assure toi que tous les champs ID des diverses tables sont bien indexes.
    Tu voudras peut-etre aussi ajouter un index compose avec les champs utilises dans ta jointure de OPERA_SECT.
    Et fait un essai puis apres : decoupe.

    Sinon, je ferai une table intermediaire par "jointure" (pas une perspective engageante du tout :-( ).
    1. Donc une table pour le resultat de la 1ere jointure.
    2. Puis une table pour le resultat et la 2ieme jointure.
    3. Etc.


    Mais vraiment cela devrait etre l'ultime solution.

    Enfin tu a beaucoup de source nommee _LAST.
    Trouver le dernier energistrement (ex : tarif a date dans un historique de tarif ou tu as juste la date de changement de tarif) peut etre tres demandant pour le systeme.
    Une methode plus efficace consiste a avoir une date de debut et une date de fin et de trouver l'enregistrement qui "encadre" la date cherchee.
    C'est plus simple a ecrire (TaDate between DateDebut and DateFin) et surtout beaucoup plus rapide (une seule recherche dans la table au lieu d'une comparaison enregistrement par enregistrement).
    Il faut juste faire attention de ne pas avoir de recouvrement de periode. C'est a valider au moment de la saisie, soit par code, soit par l'utilisateur.

    A+

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 359
    Points : 23 829
    Points
    23 829
    Par défaut
    Un dernier point.

    Les jointures sont "couuteuses" donc si tu as vraiment des gros problemes de performance, tu peux envisager une denormalisation de ta base de donnees en recopiant une partie des donnnees.

    La aussi cela doit etre vu comme un dernier recours, apres les tables temporaires, car cela complexifie la gestion et met tes donnees a risque d'incoherence si la copie n'est pas faite pour une raison ou une autre.

    Si tu t'aligne vers cela, ca doit etre super bien signale et documente pour les developpeurs futurs.

    A+

  9. #9
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Points : 249
    Points
    249
    Par défaut
    Citation Envoyé par marot_r Voir le message
    Bonjour.

    Pour les tables intermediaires, j'essairai de "decouper" les grosses "branches", celles de OPERA_PD et OPERA_SECT.
    Je mettrai leur resultat dans une table puis je joindrai ces tables.

    C'est un peu au "filling" car Access ne fourni pas vraiment d'outil pour savoir ou les performances accrochent.
    Merci beaucoup, j'essaie cela de ce pas.


    Aussi, avant le tronconnage, assure toi que tous les champs ID des diverses tables sont bien indexes.
    Tu voudras peut-etre aussi ajouter un index compose avec les champs utilises dans ta jointure de OPERA_SECT.
    Et fait un essai puis apres : decoupe.
    J'ai un peu de mal à comprendre ce paragraphe. Que voulez-vous dire par "les champs ID des tables sont bien indexés" ?
    Et aussi par ajouter un index composé ?


    Enfin tu a beaucoup de source nommee _LAST.
    En fait, toutes les tables se terminant par LAST (dernière version de la table) me permettent de trouver les informations à part entière.
    Les tables OPERA ne contiennent que des ID pour la plupart et les tables nommées LAST les informations liées à ces ID.

    Pour le champ BOK_ID par exemple, la table BOK_LAST me permet d'avoir le code, le nom du BOK etc ... cf. image ci-dessous

    Nom : Untitled.png
Affichages : 122
Taille : 7,6 Ko

    Et c'est le même cas pour toutes les tables finissant par LAST et j'en ai tellement

    Je vous remercie pour votre aide. Je teste tout de suite la solution proposée.

  10. #10
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 359
    Points : 23 829
    Points
    23 829
    Par défaut
    Bonjour.

    J'ai un peu de mal à comprendre ce paragraphe. Que voulez-vous dire par "les champs ID des tables sont bien indexés" ?
    Et aussi par ajouter un index composé ?
    Tes tables _LAST, ont un champ ID.
    Ces champs ID sont utilises dans des jointures.
    Ce champ ID devrait etre indexe pour faciliter la recuperation des donnees par Access.

    Tu vas dans la table concernee (ex : GCODE_BOK_LAST) en mode conception.
    Tu cliques sur l'icone Index (celle avec l'eclair)
    Dans la premiere colonne tu donnes un nom significatif a ton index (ex : UniciteID ou ID ou IndexID).
    Dans la seconde colonne tu choisis le champ concerne (ex : ID).
    En bas sous les colonnes, tu choisis si l'index est la clef primaire (pas 2 fois la meme valeur et ne peut pas etre nul), unique (pas 2 fois la meme valeur mais peut etre nul) ou non.
    Tu sauvegardes.

    Un index compose est un index qui comprend plusieurs champs.
    Pour ta table OPERA_SECT tu utilises 2 champs dans la jointure donc tu pourrais definr un index sur ces 2 champs.
    Comme precement tu vas dans les indexes.
    Tu definis le nom, le premier champ et le type (la c'est Non pour Primaire et Non pour Unique).
    Sur une ligne juste sous le nom, dans la 2ieme colonne, tu ajoutes le second champ.
    Tu sauvegardes.

    Il n'est pas sur que cela ait un impact measurable mais cela devrait aider en fournissant a Access un possibilite de lire moins d'enregistrements donc de gagner du temps.

    Note qu'on a aucun controle sur ce que Access decide de faire ou pas quand il execute une requete. On peut juste lui suggerer des pistes.

    A+

  11. #11
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Points : 249
    Points
    249
    Par défaut
    Haaa ok, je vois merci pour ces implications mais je n'y arrive pas.

    Je suppose que cela est du au fait que toutes mes tables sont liées à ma base de données par des liens UDBP ?

    Le warning me dit que microsoft access ne peut pas me permette de sauvegarder des modifications sur ces tables.

    Bon bon, toutes ces contraintes ne me facilitent vraiment pas la tâche.

    Merci encore pour votre disponibilité.

  12. #12
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 359
    Points : 23 829
    Points
    23 829
    Par défaut
    liens UDBP ? Qu'est-ce ?

    Mais oui, si les tables ne t'appartiennent pas, tu ne peux pas les modifier.

    si ce sont des tables Access, tu peux aller dans la base attachee et faire les modif la, si tu en as l'autorisation.

    Sinon, tu peux peut-etre utilser une requete Pass-thru qui te permet d'ecrire du SQL non Access et de le faire executer par la BD dorsale (ex : Oracle ou MS SQL Server).
    Ca peut considerablement reduire le temps d'execution (genre 1h a 5mn, fait vecu).
    La encore, cela te prend la permission de le faire, ce qui n'est psas garanti.

    A+

  13. #13
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Points : 249
    Points
    249
    Par défaut
    Citation Envoyé par marot_r Voir le message
    liens UDBP ? Qu'est-ce ?
    Liens ODBC, je voulais dire.

    J'opte finalement pour le Pass-thru qui passe et semble plutôt bien fonctionner même si cela me prend beaucoup beaucoup plus de temps. Je suppose que ça m'aidera à connaître un peu le SQL.

    Je peine à faire fonction cette requête, je me suis pourtant inspiré des différents sujets semblables du forum. Ci-dessous le warning que j'ai.

    Nom : Untitled.png
Affichages : 88
Taille : 3,3 Ko

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    SELECT OPERA.TTY.TTY_NO, reqACTUD2.ACTUD_COLLCTN_TYP_LNAM, reqPREMD2.PREMD_COLLCTN_TYP_LNAM, reqLOSSD2.LOSSD_COLLCTN_TYP_LNAM
    FROM ((OPERA.TTY 
    LEFT JOIN reqACTUD2 ON OPERA.TTY.TTY_NO = reqACTUD2.TTY_NO) 
    LEFT JOIN reqLOSSD2 ON OPERA.TTY.TTY_NO = reqLOSSD2.TTY_NO)
    LEFT JOIN reqPREMD2 ON OPERA.TTY.TTY_NO = reqPREMD2.TTY_NO
    GROUP BY OPERA.TTY.TTY_NO, reqACTUD2.ACTUD_COLLCTN_TYP_LNAM, reqPREMD2.PREMD_COLLCTN_TYP_LNAM, reqLOSSD2.LOSSD_COLLCTN_TYP_LNAM
    ;

  14. #14
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 359
    Points : 23 829
    Points
    23 829
    Par défaut
    Bonjour.

    cela me prend beaucoup beaucoup plus de temps.
    Oui je ne suis pas surpris. L'editeur de SQL de Access est TRES limite, rien a voir avec les outils disponibles sur les "grosses" BD.
    C'est un peu comme une 2CV vs une Rolls.

    Utiliser une requete pass-thru necessite de connaitre :
    1. le SQL de la BD distante (Oracle, MS SQL Server, DB2, ...)
    2. la structure interne de la BD distante.
      Par exemple tu peux avoir des notions de schema qui sont "invisibles" a Access mais sont necessaires dans la BD distante.


    ou avoir in DBA sympa a portee de main qui va te reecrire ta requette et que tu n'auras plus qu'a recopier.
    Un conseil : fournir la requete "graphique", le SQL de Access est assez exotique et deroute les DBA des autres BD.

    A+

  15. #15
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Points : 249
    Points
    249
    Par défaut
    Citation Envoyé par marot_r Voir le message

    ou avoir in DBA sympa a portee de main qui va te reecrire ta requette et que tu n'auras plus qu'a recopier.
    Un conseil : fournir la requete "graphique", le SQL de Access est assez exotique et deroute les DBA des autres BD.

    A+
    Merci encore une fois pour votre réponse.

    L'IT a décidé d'installer TOAD sur mon appareil, d'autres entités du groupe fonctionnent déjà avec apparemment mais tant qu'on ne demande rien, on perd son temps avec ACCESS ...

    J'essaie de convertir la requête ACCESS ci-dessous en requête Pass-Thru.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    SELECT DISTINCTROW OPERA_TTY.TTY_NO, reqACTUD.ACTUD_COLLCTN_TYP_LNAM, reqPREMD.PREMD_COLLCTN_TYP_LNAM, reqLOSSD.LOSSD_COLLCTN_TYP_LNAM
    FROM ((OPERA_TTY LEFT JOIN reqACTUD ON OPERA_TTY.TTY_NO = reqACTUD.TTY_NO) LEFT JOIN reqLOSSD ON OPERA_TTY.TTY_NO = reqLOSSD.TTY_NO) LEFT JOIN reqPREMD ON OPERA_TTY.TTY_NO = reqPREMD.TTY_NO
    GROUP BY OPERA_TTY.TTY_NO, reqACTUD.ACTUD_COLLCTN_TYP_LNAM, reqPREMD.PREMD_COLLCTN_TYP_LNAM, reqLOSSD.LOSSD_COLLCTN_TYP_LNAM, OPERA_TTY.CMP_ID, OPERA_TTY.TTY_CLAS_ID
    HAVING (((OPERA_TTY.CMP_ID)=cmp_code()) AND ((OPERA_TTY.TTY_CLAS_ID)=1))
    ORDER BY OPERA_TTY.TTY_NO;
    La requête Pass-thru que j'ai écrite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    SELECT OPERA.TTY.TTY_NO, reqACTUD2.ACTUD_COLLCTN_TYP_LNAM, reqPREMD2.PREMD_COLLCTN_TYP_LNAM, reqLOSSD2.LOSSD_COLLCTN_TYP_LNAM
    FROM ((OPERA.TTY 
    LEFT JOIN reqACTUD2 ON OPERA.TTY.TTY_NO = reqACTUD2.TTY_NO) 
    LEFT JOIN reqLOSSD2 ON OPERA.TTY.TTY_NO = reqLOSSD2.TTY_NO) 
    LEFT JOIN reqPREMD2 ON OPERA.TTY.TTY_NO = reqPREMD2.TTY_NO
    GROUP BY OPERA.TTY.TTY_NO, reqACTUD2.ACTUD_COLLCTN_TYP_LNAM, reqPREMD2.PREMD_COLLCTN_TYP_LNAM, reqLOSSD2.LOSSD_COLLCTN_TYP_LNAM
    HAVING (((OPERA.TTY.CMP_ID)='1930') AND (OPERA.TTY.TTY_CLAS_ID)=1))
    ORDER BY OPERA.TTY.TTY_NO;
    mais ça ne fonctionne pas, j'ai l'erreur que je vous ai montré dans mon message précédent.

    Merci encore.

  16. #16
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 359
    Points : 23 829
    Points
    23 829
    Par défaut
    Bonjour.

    1. Tu crees ta requette avec TOAD et tu la valides dans TOAD.
      Je parle de creation pas de traduction diu SQL Access en SQL Oracle.
      Ca va generalement beaucoup plus vite de proceder comme cela.
    2. Une fois au point, tu crees une nouvelle requette dans Access et tu dis que c'est une Pass-Thru.
    3. Tu selectionnes le code SQL dans TOAD.
    4. Tu le copie dans Acess.
    5. Tu etablis une connection ODBC sur ta BD Oracle.


    Et en principe cela marche direct.

    Access envoie ta requette a Orcale qui l'execute et te retourne le resultat.

    A+

Discussions similaires

  1. optimisation requête-regroupement info
    Par mariobedard dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/09/2005, 15h10
  2. Besoin d'aide pour optimiser requête SQL
    Par Keuf95 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 06/09/2005, 16h02
  3. Optimiser requête utilisant NOT IN
    Par Neilos dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/08/2005, 14h24
  4. optimisation requête
    Par alex2205 dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 09/02/2005, 14h15
  5. optimisation requête SQL!!! help!!
    Par anathem62 dans le forum Requêtes
    Réponses: 2
    Dernier message: 24/05/2004, 16h26

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