Importation dans excel de données d'une source as400 (i5, iseries) sans définition de data source odbc. version 2 (avec ou s

Soyez le premier à donner votre avis sur cette source.

Snippet vu 9 369 fois - Téléchargée 18 fois

Contenu du snippet

Bonjour,
le code suivant, à placer dans un module vba (vb), permet de récupérer dans excel le contenu de tout fichier AS400 (pour autant qu'on dispose des droits requis sur l'AS400) dans une feuille excel de votre choix à partir de la cellule de votre choix.

Pour ce faire, il faut simplement disposer d'une connection AS400, du software standard Iseries Access for Windows installé avec le driver ODBC standard, et d'un Userid avec les droits pour ce genre d'opération. (Contrainte AS400)

Il faut cocher la référence à "Microsoft ActiveX data Objects 2.6 Library" pour que ce code fonctionne.

A adapter a l'environnement de l'utilisateur :
Data Source = xxx.xxx.xxx.xxx : Mettre ici l'IP de l'AS400 ou son nom DNS
USER ID = user : mettre ici le Userprofile AS400 à utiliser
PASSWORD = Password : mettre ici le password AS400 du UserProfile choisi.

1 Seule procédure, avec ou sans sélection de Record (clause Where):

ReadFileI5Full

ReadFileI5Full : Importe le contenu avec ou sans filtrage (clause Where), d'un membre d'un fichier AS400
Usage : ReadFileI5Full (Input_File as string, Target_Worksheet as string, Target_Range as string)
Input_File : Fichier As400 à importer (avec ou sans Clause (Where)
peut être Si pas de Clause Where (Importante complète)
soit - Nom_Librairie.Fichier
soit - Nom_librairie.fichier(Membre) (Membre peut valoir *LAST ou *FIRST avec cette syntaxe)
soit - Nom_librairie.fichier Membre (Membre *LAST ou *FIRST non supporté avec cette syntaxe)

Si Clause Where (Importation Sélective)
Soit - Nom_Librarie.Fichier Where (conditions)
Soit - Nom_librairie.Ficher Membre Where (conditions)
Attention : 1) La/les condition(s) doivent être entourées de parenthèses
2) les valeurs de comparaisons doivent être entourées de simples quotes, numériques ou pas (Non testé avec champs spéciaux !!)
3) Les noms de membres *FIRST & *LAST ne sont pas supportés avec une clause Where

Exemples Valides avec Clause Where pour Input file
Mylib.Myfile Where ((Fieldx>'0005' AND Fieldy='FR') OR (Fieldx='0005' AND Fieldy<>'FR')
Mylib.Myfile MyMember Where (Fieldw<>"BONJOUR")
Exemples Erronés avec Clause Where pour input file
Mylib.Myfile(MyMember) Where(condition) ---> Clause Where ignorée -> Import Complet !!!!
Mylib.Myfile *FIRST Where(condition) ---> erreur SQL : *FIRST (ni *LAST) n'est pas reconnu

Target_Worksheet : Feuille excel de destination
Doit être un nom valide d'une feuille excel. (onglet). Si la feuille existe elle est vidée avant l'import, sinon elle est créée.
Target_Range : Cellule de départ (haut, gauche) pour l'import des données. Doit être un nom de cellule valide. (Ex : "A1")

L'import retourne en première ligne les noms de champs, puis les données.

TRUC : Pour récupérer uniquement les noms des champs, spécifier simplement une clause 'Where' avec une condition impossible comme (Field1<>Field1)

Source / Exemple :

Option Explicit

Public Sub ReadFileI5Full(ByVal Input_File As String, ByVal Target_worksheet As String, ByVal Target_range As String)
'ReadFileI5Full : get I5 data from Lib.file(member) and insert that in Worksheet at désired range cell
'usage : ReadFileI5Full (File, Worksheet, Range)
' Input_File : I5 File to be imported (With ou Without Where Clause) : Input_File = SqlString
'  can be
'   WHEN NO 'Where' CLAUSE (Full Member Import)
'            either  Library_Name.File
'                or  Library_Name.File(Member) (With This Syntax Member may also be *FIRST or *LAST)
'                or  Library_Name.File Member  (Member *FIRST or *LAST unsupported with this syntax)
'
'   WHEN 'Where' Clause (Selective Import)
'            Either - Library_Name.File Where (conditions)
'                or - Library_Name.File Member Where (conditions)
'
'     WARNING          1) Condition(s) must be surrounded by brackets ( )
'                      2) Comparison values must be surrounded by single quotes, numeric or not (Not tested with specials fields !!)
'                      3) Special Member Names *FIRST & *LAST non supported with Where Clause
'
'             Valid Examples With Where Caluse for Input_file parameter
'                      Mylib.Myfile Where ((Fieldx>'0005' AND Fieldy='FR') OR (Fieldx='0005' AND Fieldy<>'FR')
'                       Mylib.Myfile MyMember Where (Fieldw<>"HELLO")
'             Erroneous Examples with Where Close for Input_file parameter
'                      Mylib.Myfile(MyMember) Where(condition)  ---> Clause Where ignored -> Full Import  !!!!
'                      Mylib.Myfile *FIRST    Where(condition)  ---> SQL Error : *FIRST (nor *LAST) is not understood

' Target_Worksheet : Must be a valid Worksheet Name : if exists : cleared before fullfillment
'                                              if not exists : will be created
' Target_Range     : Must be a valid cell name : Example "A1"
'
'
' TIP : To get Only Fields names, just specify a 'Where' clause with a non possible condition as (Field1<>Field1)



    On Error GoTo ErrorHandler
 
    Dim cn          As New ADODB.Connection
    Dim rs          As New ADODB.Recordset
    Dim sConn       As String
    Dim SqlString   As String
    Dim FileName    As String
    Dim DSN_Name As String
    Dim ws          As String 'Results Storing Worksheet name
    Dim Rg          As String 'results Cells top left
    Dim cellule     As Range
    Dim CompA       As Integer
    Dim idx         As Long
    Dim sheet_found As Boolean
    Dim ActShName   As String
    Dim Rec_nbr     As Long   'Record Set record Count
    

        
        
 
    sConn = "provider=IBMDA400;Data source=xxx.xxx.xxx.xxx;USER ID=user;PASSWORD=Password"
    FileName = Trim(Input_File)
    ws = Trim(Target_worksheet)
    Rg = Trim(Target_range)
        
    'check target Worsksheet exists and if not build
    sheet_found = False
    For idx = 1 To Sheets.Count
        If Sheets(idx).Name = ws Then
            Application.DisplayAlerts = False
            Sheets(idx).Cells.Clear
            Application.DisplayAlerts = True
            sheet_found = True
            Exit For
        End If
    Next idx
    'Build Ws
    If Not sheet_found Then
        ActShName = ActiveSheet.Name
        Sheets.Add
        ActiveSheet.Name = ws
        Sheets(ActShName).Activate
    End If
 
    'Open Connection
    cn.ConnectionString = sConn
    cn.Open
    SqlString = "SELECT * FROM " & FileName & ""
    
    'open record Set
    rs.Open SqlString, cn
    Rec_nbr = rs.RecordCount
    
    
    
    'Paste Fields names in line 1
    Set cellule = Worksheets(ws).Range(Rg)
    For CompA = 0 To rs.Fields.Count - 1
        cellule.Offset(0, CompA).Value = rs.Fields(CompA).Name
    Next CompA
    'Paste results line above names
    Worksheets(ws).Range(Rg).Offset(1, 0).CopyFromRecordset rs

    rs.Close
    cn.Close
    Set cn = Nothing
    Set rs = Nothing
    'MsgBox Rec_nbr & " records imported from I5"
 
    Exit Sub
ErrorHandler:
    ' clean up
    If Not cn Is Nothing Then
        If cn.State = adstateopen Then cn.Close
    End If
    Set cn = Nothing
    If Not rs Is Nothing Then
        If rs.State = adstateopen Then rs.Close
    End If
    If Err <> 0 Then
      MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
 
End Sub

Conclusion :

Conclusion d'origine
---------------------
J'espère que ce code pourra aider quelqu'un. Il m'a considérablement aidé dans mes import dans Excel de mes DB As400.
Sa mise en oeuvre est très simple et ne nécessite quasi rien.

Je le stocke dans un .XLA et y fais référence via mes applications de manière indépendante.

Godzestla.

A voir également

Ajouter un commentaire

Commentaires

Messages postés
9
Date d'inscription
lundi 6 décembre 2010
Statut
Membre
Dernière intervention
19 mai 2011

Salut Lapix,

chez moi le rs.recordcount fonctionne sans faille.

Etrange.
Messages postés
33
Date d'inscription
dimanche 11 septembre 2005
Statut
Membre
Dernière intervention
5 juillet 2012
1
Salut

GODZESTLA,

Techniquement, je suis d'accord avec toi. rs.recordcount
Sauf qu'il me renvoie 0 tout le temps (delai de connexion ???, temps de reaction???)

Ce que je sais c'est movelast ou movefirst me renvoie une erreur
Par contre si je fais apres rs.open....:

do while not rs.eof
rs.movenext
loop

je peux alors comptabiliser les enregistrement dans un compteur. mais ca peut etre long...

Il me reste a essayer :

rs.movenext
rs.recordcount

pour voir si le movenext qui semble fonctionner permet ensuite d'avoir le recordcount sans erreur...

A suivre donc
Messages postés
9
Date d'inscription
lundi 6 décembre 2010
Statut
Membre
Dernière intervention
19 mai 2011

Bonjour BelouBelou,

via mon code je ne tape jamais le login pour l'as400 car le user et le password sont dans le code.
Ce n'est donc pas un problème pour moi.

Sinon,
dans mon code ou cn = le string de connection et rs le string de recordset, (contrairement à toi), tu reprends à
# SqlString = "SELECT * FROM " & FileName & ""
#
# 'open record Set
# rs.Open SqlString, cn

Après avoir pris soin de mettre auparavant
set rs = nothing
Messages postés
2
Date d'inscription
vendredi 23 janvier 2009
Statut
Membre
Dernière intervention
16 septembre 2011

Bonjour !

Comment pourrait on outrepasser

# cn.ConnectionString = sConn
# cn.Open

C'est à dire, dans le cas où une connexion iseries est déjà en cours, passer directement à la suite
SqlString = "SELECT * FROM " & FileName & ""

sans taper de nouveau le login pour accèder à as 400.

Merci pour aide
Messages postés
9
Date d'inscription
lundi 6 décembre 2010
Statut
Membre
Dernière intervention
19 mai 2011

Salut Lapix, merci pour ta réaction.

je vais tester ta façon de gérer la clause Where dès que possible.

Pour le nb de records, c'est très simple:

rs.RecordCount
Afficher les 9 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.