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

Macros et VBA Excel Discussion :

[E03] Lister les tables d'un AS400 (ADODB)


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier Avatar de e040098k
    Inscrit en
    Avril 2007
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 197
    Points : 94
    Points
    94
    Par défaut [E03] Lister les tables d'un AS400 (ADODB)
    Bonjour,

    Je souhaite faire une petite interface dans excel me permettant de créer des requètes SQL afin d'extraire des données de l'AS400

    J'ai trouver ce code permettant d'extraire les données :

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    Private Sub CmdGO_Click()
    Dim wrqt As String
    Dim was400 As String
    wrqt = UCase(Trim(Range("SQL").Value)) 'UCase(Trim(TextSql.text))
    Debug.Print wrqt
    was400 = UCase(Trim(TextAS.text))
    If Len(wrqt) < 10 Then
        MsgBox "Requête incorrecte !"
        Exit Sub
    End If
    If Left(wrqt, 6) <> "SELECT" Then
        MsgBox "la requête doit commencer par 'SELECT' !"
        Exit Sub
    End If
    If Len(was400) < 3 Then
        MsgBox "AS400 incorrect"
        Exit Sub
    End If
    Conect wrqt, was400
    End Sub
     
    'Routine principale :
    Public Sub Conect(wrqt As String, was400 As String)
    Dim Con As New ADODB.Connection
    Dim Cmd As New ADODB.Command
    Dim Rs As ADODB.Recordset
    Dim txtc As String
     
    Dim rowCount As Integer
    Dim colCount As Integer
    Dim text As String
    Dim Number As Long
    Dim val As Variant
    On Error GoTo FINI
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    oldStatusBar = Application.DisplayStatusBar
    Application.StatusBar = True
    Application.StatusBar = "Pierre BERTAUD travaille pour vous..."
    '** Indiquer le data source, le user et le MdP qui vous conviennent
    txtc = "provider=IBMDA400;data source=" & was400 & "; ;;"
    Con.Open txtc
     
    Set Cmd.ActiveConnection = Con
    Cmd.CommandText = wrqt
    Set Rs = Nothing
    Set Rs = Cmd.Execute()
    rowCount = 4
    'Sheets.Item(2).Range(Cells(rowCount + 1, 20), Cells(4000, 20)).ClearContents
        Sheets("Résultat").Select
        Range("A4:J4000").Select
        Selection.ClearContents
     
    For colCount = 0 To Rs.Fields.Count - 1
        Sheets.Item(2).Cells(rowCount, colCount + 1).Value = Rs.Fields(colCount).Name
        Sheets.Item(2).Cells(rowCount, colCount + 1).Font.Bold = True
    Next colCount
    While Not Rs.EOF
        rowCount = rowCount + 1
        For colCount = 0 To Rs.Fields.Count - 1
            If Rs.Fields(colCount).ActualSize = -1 Then
                text = ""
            Else
                val = Rs.Fields(colCount).Value
                If VarType(val) = vbNull Then
                    text = ""
                Else
                    text = val
                End If
            End If
        Sheets.Item(2).Cells(rowCount, colCount + 1).Value = text
        Next colCount
        Rs.MoveNext
    Wend
     
    Set Rs = Nothing
    Con.Close
    Sheets.Item(2).Cells.Columns.AutoFit
    Sheets.Item(2).Activate
    Sheets.Item(2).Cells(1, 1).Activate
    FINI:
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.StatusBar = False
    Application.DisplayStatusBar = oldStatusBar
    'MsgBox Cmd.Parameters.Count
    If Len(Err.Description) > 0 Then
        MsgBox Err.Description
    End If
     
    End Sub
    Donc je sais déja comment me connecter, seulement afin de pouvoir construire dynamique mon SQL je dois pouvoir lister les tables des bibliothèques qui m'intéresse ainsi que les champs de ces tables!

    Est-ce que cela vous semble possible ?

  2. #2
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Bonsoir,

    c'est possible mais cela dépend de la manière dont la sécurité est installé sur ton I5. (As400).

    Ce que tu demande ne devrais normallement pas être possible, si la sécurité est à un niveau suffisant sur ton i5.

    Pense qu'avec ce genre de système, tu as très facilement accès à toutes les librairies et lecture et en écriture d'où danger.

    Le système que tu as trouvé, quoique fort intéressant me parait personnelement limitatif car il sous entend que tu connais la description du fichier I5 que tu veux downloader, ce qui est rarement le cas sauf mémoire et connaissance plutôt prodigieuse.

    Voic la méthode que j'utilise et qui me satisfait pleinement.

    Cette méthode-sous_entend qu'un driver ODBC a été configuré pour faire le lien entre ton I5 et la(les) librairies que tu souhaites rendre disponible.

    Si nécessaire, je pourrai t'expliquer comment faire.

    Version simple
    ____________
    0) démarrer l'enregistreur de macro.
    1) Via le menu Data -> Get external data, créer une requète sql, et la sauver
    sur library/file(member) recherché sur l'I5 et importer ces données dans une feuille spécifique qui ne sert qu'à cela.
    2) arrêter l'enregistreur de macro et remanier un peu le code pour qu'il supprime le SQL de la feuille e ses données avant tout import.

    C'est tout.

    Cette version est basique. Son inconvénient est lié au fait que généralement sur l'I5, les données prévues pour être exploitées en PC sont préparées par un batch. Or tu ne sais pas sur ton pc quand le batch à tourné et de quand datent les données.
    Et si tu tente l'import pendant l'update, , c'est la plante assurée.

    D'ou version élaborée
    __________________
    Sur ton i5, tu modifiee ton CLP ou RPGLE ou autre qui constitue le fichier a importer pour qu'il mette d'abord à jour un fichier trigger qui contient à la fois la date d'update (timestamp) et le status.
    Quand ton proc I5, démarre, tu flag le record d'update à "encours".
    Quand ton rpco I5 s'arrète, tu flag le record d'update à libre.

    Ta procédure import excel change de la manière suivante.

    0) Il te faut un sql sur le fichier trigger.

    Tu fais un bouton d'update dans qexcel qui fait :
    2) Tu importe le fichier trigger.
    3) si le status est 'encours', tu informe le user de réessayer plus tard.
    4) si c'est libre, tu passes à l'import proprement dit.
    5) Tu récupère le timstamp du trigger et tu sais toujours de quand datent tes données importées.

    Ca marche très bien.

    Dis moi si tu veux un exemple.

    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

  3. #3
    Membre régulier Avatar de e040098k
    Inscrit en
    Avril 2007
    Messages
    197
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 197
    Points : 94
    Points
    94
    Par défaut


    wouaw!

    Bon alors tout d'abord merci pour toutes ces explications détaillées!

    Sur ton i5, tu modifiee ton CLP ou RPGLE ou autre qui constitue le fichier a importer pour qu'il mette d'abord à jour un fichier trigger qui contient à la fois la date d'update (timestamp) et le status.
    Quand ton proc I5, démarre, tu flag le record d'update à "encours".
    Quand ton rpco I5 s'arrète, tu flag le record d'update à libre.
    Je ne peut modifer quoi que ce soit sur mon ISeries (je ne fait pas partie du service info mais suis simplement contrôleur de gestion). Cela dit si je n'ai pas les autorisations je peux toujours les demander!

    Ca marche très bien.

    Dis moi si tu veux un exemple.
    Je veux bien oui ! Parce que là honnêtement je suis largué!

  4. #4
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    ,

    mauvais calcul de ma part car si tu ne fais pas partie du service informatique (moi bien) tu ne saurais pas utiliser la méthode avancée que je propose.

    On va donc s'en tenir à la méthode de base.

    je suis un peu débordé pour l'instant mais j'essaie de te trouver un exemple le plus simple possible pour la méthode de base et je le publie.

    J'ignore si ce sera aujourd'hui mais j'essaierai.

    A+
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

Discussions similaires

  1. Lister les tables
    Par chahi dans le forum PostgreSQL
    Réponses: 11
    Dernier message: 13/01/2009, 12h58
  2. [Debutant] Lister les tables d'une base de données
    Par Konrad Florczak dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/07/2005, 16h24
  3. Lister les tables d'une base
    Par pg_user dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 13/05/2005, 10h41
  4. [ODBC] Intranet en PHP : Lister les tables d'une base Access
    Par fblouet dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 28/10/2003, 14h46
  5. Lister les tables d'une Base
    Par YanK dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 08/10/2003, 10h40

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