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

DB2 Discussion :

Requetes Directes Access sur l'AS400


Sujet :

DB2

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    923
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 923
    Points : 760
    Points
    760
    Par défaut Requetes Directes Access sur l'AS400
    Bonjour, voilà un truc que je trouve un peu bizarre dans mon application:

    Jusqu'à aujourd'hui, pour remplir ma base Access, j'avais des fichiers Excel que faisaient des requetes sur une base DB2-AS400. Ces fichiers etant liées dans Access, je créais des vrais tables Access pour utiliser ces donnés (par biais des requetes de Création de table).

    Ces fichiers Excel étaient actualisés toutes les matins, pendant environ 10mn.

    Depuis quelques jours, j'ai découvert les requetes SQL directes, et je trouve un peu plus sympa, car c'est tout fait "dans" Access, pas avoir besoin des fichiers Excel

    Le seulle soucis c'est que maintenant la durrée de l'actualsation est passé à 50mn!

    Est-ce que ça c'est normal?
    Merci de vos réponses...

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Points : 1 084
    Points
    1 084
    Par défaut
    Citation Envoyé par Marc_27 Voir le message
    ...je créais des vrais tables Access
    Lol, je savais pas qu'accès avait de "vraies" tables.

    Citation Envoyé par Marc_27 Voir le message
    Le seulle soucis c'est que maintenant la durrée de l'actualsation est passé à 50mn!
    Est-ce que ça c'est normal?
    Non, DB2 te répond à la milliseconde sur des tables de plusieurs Go.
    Poste ton code pour mieux y voir.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    923
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 923
    Points : 760
    Points
    760
    Par défaut
    Merci de ta reponse K2R400.


    Une petite correction: Mes "vraies" tables Access sont des tables liées SQL Server...

    J'ai deux types d'actions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DoCmd.OpenTable "T_cb_complete", acViewNormal, acEdit
    DoCmd.RunCommand acCmdSelectAllRecords
    DoCmd.RunCommand acCmdDelete
    DoCmd.RunCommand acCmdCloseWindow
    DoCmd.OpenQuery "R_cr_T_cb_complete", acViewNormal, acEdit
    Qui est faite plusieurs fois, et dont la requete "R_cr_T_cb_complete", que fait une table Access est base sur quelques requetes SQL directes, c'est-à-dire, je prends les donnés de plusieurs tables AS400 et les fusione dans 1 table Access.

    J'ai aussi 3 bloques où j'utilise l'ADO:
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    Set rs = New ADODB.Recordset
    rs.ActiveConnection = CurrentProject.Connection
    rs.Source = "SELECT * FROM T_comptes_complet WHERE NBJ_DEC>20 AND GSTR_C<>'GPA'"
    rs.CursorType = adOpenDynamic
    rs.LockType = adLockOptimistic
    rs.Open
    If Not rs.EOF Then
        rs.MoveFirst
        While Not rs.EOF
                Set rs2 = New ADODB.Recordset
                rs2.ActiveConnection = CurrentProject.Connection
                rs2.Source = "SELECT * FROM T_20J_dem WHERE COMPTE='" & rs![COMPTE] & "'"
                rs2.CursorType = adOpenDynamic
                rs2.LockType = adLockOptimistic
                rs2.Open
                If rs2.EOF Then
                    rs2.AddNew
                    rs2![AG] = rs![AG]
                    rs2![COMPTE] = rs![COMPTE]
                    rs2![DOSS_VU] = False
                    rs2.Update
                End If
                rs2.Close
            rs.MoveNext
        Wend
    End If
    rs.Close
     
    Set rs = New ADODB.Recordset
    rs.ActiveConnection = CurrentProject.Connection
    rs.Source = "SELECT * FROM T_20J_dem"
    rs.CursorType = adOpenDynamic
    rs.LockType = adLockOptimistic
    rs.Open
    If Not rs.EOF Then
        rs.MoveFirst
        While Not rs.EOF
                Set rs2 = New ADODB.Recordset
                rs2.ActiveConnection = CurrentProject.Connection
                rs2.Source = "SELECT * FROM T_comptes_complet WHERE COMPTE='" & rs![COMPTE] & "'"
                rs2.CursorType = adOpenDynamic
                rs2.LockType = adLockOptimistic
                rs2.Open
                If rs2.EOF Then
                    rs.Delete
                Else
                    If (rs2![GSTR_C] = "GPA") Then rs.Delete
                End If
                rs2.Close
            rs.MoveNext
        Wend
    End If
    rs.Close
    Où je mets des enregistrements manquants dans la table "T_20J_dem" et ensuite j'efface ces qui n'ont plus d'importance...
    Et c'est la que je pense avoir une prise du temps importante...

    EDIT: "T_comptes_complet" est une requete SQL directe.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Points : 1 084
    Points
    1 084
    Par défaut
    Sais-tu à quelle étape celà prends tu temps ?
    Tu dis que celà prend 50 min mais ou ?
    Mets des timestamp dans ton code avant et à la fin d'un pavé, pour savoir ou ça rame. En fonction de celà on va pouvoir se focaliser sur la requête qui traine, le tout c'est de savoir laquelle. As-tu cette info ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    923
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 923
    Points : 760
    Points
    760
    Par défaut
    Voilà.

    Après avoir fait des essayes, la parte la plus longue du code est
    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
    23
    24
    25
    Set rs = New ADODB.Recordset
    rs.ActiveConnection = CurrentProject.Connection
    rs.Source = "SELECT * FROM T_ch_de4a5"
    rs.CursorType = adOpenDynamic
    rs.LockType = adLockOptimistic
    rs.Open
    If Not rs.EOF Then
        rs.MoveFirst
        While Not rs.EOF
                Set rs2 = New ADODB.Recordset
                rs2.ActiveConnection = CurrentProject.Connection
                rs2.Source = "SELECT * FROM chequiers WHERE COMPTE='" & rs![COMPTE] & "'"
                rs2.CursorType = adOpenDynamic
                rs2.LockType = adLockOptimistic
                rs2.Open
                If rs2.EOF Then
                    rs.Delete
                Else
                    If ((rs![PRECHQ] <> rs2![PRECHQ]) And (rs![DERCHQ] <> rs2![DERCHQ])) Then rs.Delete
                End If
                rs2.Close
            rs.MoveNext
        Wend
    End If
    rs.Close
    qui prends 44mn!

    où "chequiers" est la requete SQL direct et "T_ch_de4a5" est une table liée SQL Server, laquelle où je dois mettre des nouveaux enregistrements (1ère partie) et effacer ces qui sont obsoletes (deuxième partie).

    Et bien sure,
    Merci encore une fois...


    EDIT: Je vais mettre la requete:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT cast(ageges as smallint) as mag, nocmpt as compte, cast(substr(dtdem, 1, 4)||'-'||substr(dtdem, 5, 2)||'-'||substr(dtdem, 7, 2) as date) as dtdem, cast(substr(dtrefa, 1, 4)||'-'||substr(dtrefa, 5, 2)||'-'||substr(dtrefa, 7, 2) as date) as dtrefa, cast(substr(dtdeli, 1, 4)||'-'||substr(dtdeli, 5, 2)||'-'||substr(dtdeli, 7, 2) as date) as dtdeli, cast(substr(dtannu, 1, 4)||'-'||substr(dtannu, 5, 2)||'-'||substr(dtannu, 7, 2) as date) as dtannu, etchqr
     
    FROM pack10pdta.chqchqp000
     
    WHERE dtdeli=' ' and dtrefa<>' ' and dtannu =' '
     
    ORDER by ageges, nocmpt

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Points : 1 084
    Points
    1 084
    Par défaut
    Déjà dans ton code je ne comprends pas quelque chose.
    Tu déclares deux curseurs.
    Tu lis le premier pour lire un second.
    Quid d'une jointure entre les deux tables ???
    T_ch_de4a5 et chequiers sont bien sur l'AS/400 ?
    En quelle version OS/400 est-tu ?

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    923
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 923
    Points : 760
    Points
    760
    Par défaut
    La table "T_ch_de4a5" est une table liée SQL Server (je la traite comme une table Access),

    La table "chequiers" est dans l'AS400.

    La version je ne suis pas sure...

    Le truc c'est de parcourir toutes les enregistrements de "T_ch_de4a5" et voir quels sont dans la table "chequiers".

    S'ils ne sont pas la (<if rs2.EOF then rs2.delete>), je les efface.

    Je vais reflechir un peu pour essayer de faire une requete avec une jointure.


    Merci pour l'idée

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Points : 1 084
    Points
    1 084
    Par défaut
    Assure toi qu'il existe un index sur la zone COMPTE de chequier, sinon lance un CREATE INDEX sur le fichier chequier.
    Mais si un index est créé et les temps sont encore longs, regarde plutôt côté SQL SERVER, car entre DB2 et SQL SERVER ca ne boxe pas dans la même catégorie, si ca rame, c'est forcément SQL SERVER

  9. #9
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    A chaque fois, la deuxième requête (rs2) qui est fonction du résultat de la première (rs) est ouverte puis fermée et ceci à chaque itération, et çà, c'est très couteux ! Il doit bien y avoir moyen de joindre les tables entre elles, non ?

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    923
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 923
    Points : 760
    Points
    760
    Par défaut
    Bonjour K2R400, Mercure,

    Désolé d'avoir pris autant de temps pour repondre, j'ai eu besoin de faire un autre chose pour quelques journés...


    J'ai essayé la requete suivant, mais elle bloque au
    Elle dit que "la Base ou l'objet est en Lecture Seule"
    Je crois que c'est à cause de la requete SQL directe, car je ne peut pas changer les donnés de l'AS400...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Set rs = New ADODB.Recordset
    rs.ActiveConnection = CurrentProject.Connection
    rs.Source = "SELECT T_ch_de4a5.* FROM T_ch_de4a5 LEFT JOIN chequiers ON T_ch_de4a5.COMPTE=chequiers.COMPTE WHERE (chequiers.COMPTE IS NULL) OR ((T_ch_de4a5.PRECHQ <> chequiers.PRECHQ) And (T_ch_de4a5.DERCHQ <> chequiers.DERCHQ))"
    rs.CursorType = adOpenDynamic
    rs.LockType = adLockOptimistic
    rs.Open
    If Not rs.EOF Then
        rs.MoveFirst
        While Not rs.EOF
            rs.Delete
            rs.MoveNext
        Wend
    End If
    rs.Close

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Points : 1 084
    Points
    1 084
    Par défaut
    Salut,

    Tu ne peux pas supprimer une table jointe, c'est normal !
    Mais c'est moi qui t'es induit en erreur avec une jointure, je n'avais pas vu le delete.
    M'enfin pas besoin de déclarer deux curseurs pour faire ce que tu veux faire, une simple requête sans curseur suffit avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    delete from chequier where (compte, PRECHQ, DERCHQ) not in
    (select  compte, PRECHQ, DERCHQ from T_ch_de4a5)
    Tu vas passer de 45 minutes à 45 millisecondes.

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    923
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 923
    Points : 760
    Points
    760
    Par défaut
    Bonjour K2R400.

    Enfait, je voudrais le contraire:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DELETE FROM T_ch_de4a5 WHERE (compte, PRECHQ, DERCHQ) NOT IN
    (SELECT  compte, PRECHQ, DERCHQ FROM chequier)

    Je vais essayer et quelque chose de poste un peu après!


    Merci beaucoup!!

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Points : 1 084
    Points
    1 084
    Par défaut
    En SQL on peut faire énormément de choses, presque en no limit .
    Dès fois pas la peine de déclarer des curseurs surtout pour faire des mise à jour / insertions / suppressions en masse comme dans ton cas.
    Pour l'avenir, si tu as des soucis, tu postes le contenu de quelques lignes d'un fichier et tu donnes aussi le résultat attendu.
    Ainsi on pourra te donner la solution (si tu n'y arrives pas de toi même) d'une façon plus rapide.

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    923
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 923
    Points : 760
    Points
    760
    Par défaut
    J'ai essayé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.RunSQL ("delete T_ch_de4a5.*  from T_ch_de4a5 where T_ch_de4a5.compte not in (select chequiers.compte from chequiers)")
    Mais ça n'a pas marché...
    "Impossible de supprimer dans les tables spécifiées"



    Je suis sure que je peux supprimer dans la table T_ch_de4a5...
    Quelque idée?

    Pour essayer, j'ai testé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.RunSQL ("delete T_ch_de4a5.*  from T_ch_de4a5 where T_ch_de4a5.compte='xxx'")
    Et cette fois la requete a bien marché...

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Points : 1 084
    Points
    1 084
    Par défaut
    Peux-tu te renseigner sur la version le l'OS/400 ?
    Et pourquoi mets-tu des * ???? ce n'est pas supporté dans un DELETE.
    Et cette fois la requete a bien marché...
    Humm, je doute avec un DELETE * FROM..

    Fais tout simplement (copier/coller):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.RunSQL ("delete from T_ch_de4a5 where compte not in (select compte from chequiers)")

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    923
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 923
    Points : 760
    Points
    760
    Par défaut
    Je vais me renseigner, mais je crois que le problème viens d'Access...

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    923
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 923
    Points : 760
    Points
    760
    Par défaut
    J'ai trouvé la bonne requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.RunSQL ("DELETE DISTINCTROW T_ch_de4a5.*, chequiers.COMPTE FROM T_ch_de4a5 LEFT JOIN chequiers ON T_ch_de4a5.COMPTE = chequiers.COMPTE WHERE (((chequiers.COMPTE) Is Null))")


    Merci beaucoup K2R400 pour ta patience...

  18. #18
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Points : 1 084
    Points
    1 084
    Par défaut
    Wow, super, sauf que t'es pas sur un AS/400.
    Tu supprimes ailleurs mais pas directement sur le serveur, cette syntaxe n'est pas supporté sur Db2 / UDB

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    923
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 923
    Points : 760
    Points
    760
    Par défaut
    Voilà:
    Cet un application Access:

    J'ai une table liée SQL Server (T_ch_de4a5) et une requete SQL directe (chequiers).

    La requete chequiers se porte plus ou moins comme une table liée, et je voudrais supprimer des enregistrements de T_ch_de4a5, qu'est dans SQL Server


    Pour la version c'est la V5R3M5, et on va passer vers la V5R4M5 prochainement...

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

Discussions similaires

  1. [ODBC] Utilisation d'une base Access sur AS400 avec php
    Par zoneaide dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 06/06/2007, 12h08
  2. [Access] requete d'ajout sur 2 table a la fois?
    Par benoit_iund dans le forum Langage SQL
    Réponses: 2
    Dernier message: 25/05/2007, 19h59
  3. [Access] Requête (avec AND) sur 1 meme champ d'une table
    Par jeje22 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 11/09/2006, 22h59
  4. [VBA-E] Requetes depuis Excel sur une Base Access sécurisée
    Par DhiSan dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 31/05/2006, 18h44
  5. requetes BUSINESS OBJECT sur une base ACCESS
    Par greatmaster1971 dans le forum Deski
    Réponses: 1
    Dernier message: 06/10/2004, 14h10

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