Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

PROCÉDURE CONNEXION ET IMPORTATIONS DONNÉES AS400 DANS ACCESS


Information sur le tutorial

Catégorie :Base de Donnees Date de création : 24/11/2006 08:15:33 Vu : 12 010 fois

Note :
8,8 / 10 - par 5 personnes
8,80 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (12)
Ajouter un commentaire et/ou une note

Description

Procédure complète pour créer des requêtes et importer les résultats directement d'un AS400 dans access, afin d'en exploiter les résultats.

Tutorial

  Access et AS400

 

L'entreprise dans laquelle je travaille a 90% de ses données sur As400. Système au combien rigide mais au combien fiable. Mais il arrive régulièrement qu'il y ait ponctuellement des analyses complémentaires à faire ne nécessitant pas forcément l'intervention de développeurs sur l'As.

Certes on peut toujours faire des Query mais ce n'est pas d'une convivialité folle.

Après avoir beaucoup ramé, beaucoup surfé et passé beaucoup de nuits blanches, j'ai réussi petit à petit à me faire un processus qui s'avère fiable et qui me permets d'avoir sur mon bureau, en arrivant à l'entreprise, tous mes états sortis en automatique pendant la nuit .

La difficulté pour un profane c'est qu'en fait le langage à appliquer est un mélange du langage Access et de langage Ibm.

Je vais donc essayer de vous faire bénéficier de ma petite expérience en sachant pertinemment que cela peut encore être amélioré et que n'étant pas du tout expert, il doit y avoir des moyens d'améliorer le code. Je compte sur tout le monde pour m'aider en cela.

Merci à tous les participants de CodeSourceS et Developpez.com qui ont permis à un non-informaticien d'apprendre quelques bases et de prélever ainsi les informations nécessaires.

Un petit rappel sur L'As400

L'architecture est basée sur des Bibliothèques (que l'on peut assimiler à des répertoires), dans lesquelles sont stockés des Fichiers (tables) avec différentes Zones (champs).

Il est défini par un nom du type 'S443A08G' ou par son adress IP (192.170.83.25) par exemple.

Un des autres problèmes auquel j'ai eu à faire face est que sur beaucoup de programmes les dates sont stockées dans plusieurs zones (une de 2 caractères pour le siècle, une de deux caractères pour l'année, une de 2 caractères pour le mois et une de 2 caractères pour le jour.

Prérecquis

Le prérecquis est simplement d'avoir sur le Pc , le driver Ibm de ClientAccess et le Mdac de Microsoft.
A ce propos si quelqu'un connait un driver libre, je suis preneur.

Définition de notre application

Pour étayer notre propos, nous allons simuler l'importation dans Access du chiffre d'affaire de la veille fait par un vendeur donné (dont le code est « V12 »).
Sur l'AS400 les données sont stockées dans une bibliothèque et deux fichiers.
La bibliothèque s'appelle « GESTCOM »

Le premier fichier appelé « AVENTP1 » et comprend entre autres les Zones suivantes

- NOBON (N° de bon) Char 8
- COVEN (Code vendeur) Char 4
- BONDA (Année du bon) Char 2
- BONDM (Mois du bon) Char 2
- BONDJ (Jour du bon) Char 2
- COCLI (Code du client) Char 10
- MOBON (Montant du Bon) Packed 11

Le deuxième fichier appelé « BVENDP1 » comprend entre autres les zones suivantes:
- COVEN (Code vendeur) Char 4
- NOVEN (Nom vendeur) Char 20


Voilà donc où sont stockées les informations dont nous avons besoin.
Nous allons maintenant créer une base access vide que nous appellerons Ca_vendeurs

1ère Etape

En tout premier lieu et afin d'éviter des problèmes de maintenance en cas de changement d'AS400 ou de changement d'utilisateur nous allons créer une table « Paramètres »

codes1.jpg


Nous allons créer un formulaire « Paramètres » basé sue cette table:

codes2.jpg


Mettre le masque de saisie du mot de passe sur password
La propriété Ajout autorisé du formulaire doit être à Non.
Pour finalement le remplir.

codes3.jpg

Nous avons donc nos paramètres de connexion à jour et en cas de modif, il n'y aura pas besoin de retourner dans les pages de code.

2ème Etape

Nous allons maintenant créer la table « Import_Ventes » qui va nous servir à stocker les informations de l'As400, avec des noms plus parlants. On peut le faire directement sous Vba pour garantir la sécurité de la base ou sous la forme classique Création de table:

codes4.jpg

Deux constatations:

  • Les champs Texte doivent avoir la même taille que sur le fichier As400

  • La création de deux champs date. L'un (Date1) est destiné à rapatrier les données Année, Mois,Jour sous forme texte

par concaténation, l'autre à convertir ce dernier en vrai format de date (Date_Bon). L'importation directe dans un champ Date entraînant
une « incompatibilité de type.. »
Nous verrons plus tard comment faire la conversion.

3ème Etape

La constitution du formulaire d'accueil avec les paramètres de date.
Nous créons donc un contrôle indépendant appelé « DatBon » avec la propriété de format jj/mm/aa.

codes5.jpg


Comme nous voulons a priori avoir les résultats de la veille il faut créér une fonction de remplissage par défaut du champ sur l'évènement "Ouverture "du formulaire:

Private Sub Form_Open(Cancel As Integer)
' Si la date du jour = Lundi la date dans le contrôle doit être un samedi et non un Dimanche
If Weekday(Now) = 2 Then
Me.DatBon.Value = DateAdd("d", -2, Now)
Else
' Sinon la veille
Me.DatBon.Value = DateAdd("d", -1, Now)
' On pourrait également inclure les jours fériés
End If
End Sub

Ce qui fait que par exemple ce fichier ouvert le Jeudi 25 Octobre 2006 affichera automatiquement la date du Mercredi 24/10/06 et ce même fichier ouvert le Lundi 23 Octobre 2006 affichera la date du Samedi 21 Octobre.

4ème Etape

Nous pouvons maintenant procéder à l'importation des données.
Tout d'abord il faut s'assurer que la référence ADO est cochée
Pour cela :Outils - Références ADO Ext.
S'il n'est pas dans la liste chargez le Mdac téléchargeable chez Microsoft.

codes6.jpg

Nous allons créer un module qui sera lancé sur l'évènement Onclick du bouton OK ou sur l'ouverture du formulaire d'accueil suivant que l'on souhaite pouvoir modifier la date ou non.

Option Compare Database
Option Explicit

Public Function Imp_CA()

' variables de connexion ADO
Dim CnnAs400 As ADODB.Connection
Dim RsAs400 As ADODB.Recordset
Dim Cnndb As New ADODB.Connection
Dim Rsdb As New ADODB.Recordset
Dim strTabSupprimer As String

' variables paramètres
Dim Dat As String 'variable Date de bon
Dim Nas AsString 'variable nom de l'As400
Dim Nus As String 'Variable nom utilisateur
Dim Cus As String 'Variable Code Utilisateur

' Valeur des variables
' Transforme le controle date du formulaire d'accueil par exemple 24/10/06 en texte de 6 caractères 061024
Dat = Right(Form_Form_accueil.[DatBon], 2) & Mid(Form_Form_accueil.[DatBon], 4, 2) & Left(Form_Form_accueil.[DatBon], 2)

' Les trois variables suivantes vont chercher leurs valeurs dans la table « Paramètres »
Nas = Dlookup("Nom_AS400", "Paramètres")
Nus = Dlookup("Identifiant", "Paramètres")
Cus = Dlookup("Mot_Passe", "Paramètres")

' Nous supprimons les données de la table "Import_Ca"
DoCmd.SetWarnings False
strTabSupprimer = "DELETE * FROM [Import_Ca];"
DoCmd.RunSQL strTabSupprimer
DoCmd.SetWarnings True

' Nous lançons la connexion.
Set CnnAs400 = CreateObject("ADODB.connection")
CnnAs400.Open "provider=IBMDA400;data source=" & Nas & "", Nus, Cus ' Attention à l'orthographe, sinon galère
Set Cnndb = CurrentProject.Connection
Set RsAs400 = CreateObject("ADODB.recordset")
RsAs400.ActiveConnection = CnnAs400

' Nous créons la Requête.
strsql = " " & _
       " select T01.NOBON ,T01.COVEN ,T01.BONDA||T01.BONDM||T01.BONDJ ,T01.COCLI ,T01.MOBON ,T02.NOVEN" & _
       " from GESTCOM.AVENTP1 T01 " & _
       " join GESTCOM.BVENDP1 T02 " & _
       " On T01.COVEN = T02.COVEN " & _
       " where (T01.BONDA||T01.BONDM||T01.BONDJ = '061025' AND T01.COVEN = ' V12' "

' Pour avoir notre champ Date1 nous faisons une concaténation et nous mettons dans la condition where une
 date quelconque car l'As400 n'accepte pas directement la variable.
Nous remplaçons la valeur bidon de la date par le contenu de la variable

strsql = Replace(strsql, "'061025'", Chr(39) & Dat & Chr(39))

RsAs400.Open strsql
    Do Until RsAs400.EOF
              i = 1
For Each Fld In RsAs400.Fields
    Select Case i
        Case 1
            Champ1 = Fld.Value
        Case 2
            Champ2 = Fld.Value
        Case 3
           Champ3 = Fld.Value
        Case 4
           Champ4 = Fld.Value
        Case 5
          Champ5 = Fld.Value
       Case 6
          Champ6 = Fld.Value

Case Else
End Select
i = i + 1
Next Fld

If Rsdb.State = 0 Then

' ouverture de la table et remplissage
Rsdb.Open "[Import_Ca]", Cnndb, adOpenKeyset, adLockOptimistic

        End If
With Rsdb

' attribution des valeurs aux champs correspondants

.AddNew Array("N°_Bon", "Code_Ven", "Date1", "Code_client", "CA_Bon", "Nom_Ven"), _
                 Array(Champ1, Champ2, Champ3, Champ4, Champ5, Champ6)
.Update

End With

RsAs400.MoveNext
Loop

' ferme la connexion

RsAs400.Close
Set RsAs400 = Nothing
Set Rsdb = Nothing
Set CnnAs400 = Nothing
Set Cnndb = Nothing

' La Table est remplie et il faut maintenant s'occuper du dernier champ qui nous intéresse
c'est à dire le champ "Date_Bon". Nous allons nous servir de la fonction Update.

DoCmd.SetWarnings False 'Stoppe les messages d'alerte
DoCmd.RunSQL "Update Import_Ca Set Date_Bon = Right([Date1],2) & '/' & Mid([Date1],3,2) & '/' & Left([Date1],2)"
DoCmd.SetWarnings True
End Function

Attention

Il arrive que les Zones As400 Années, Mois , Jour ne soient pas de Type « Char » mais de type « ZoneD ».
Dans ce cas la requête ne marche pas: il faut en changer le mode de concaténation.

' Nous créons la Requête

strsql = " " & _
        " select T01.NOBON ,T01.COVEN ,Digits(T01.BONDA)Concat Digits(T01.BONDM)Concat Digits(T01.BONDJ) ,T01.COCLI ,T01.MOBON ,T02.NOVEN" & _
        " from GESTCOM.AVENTP1 T01 " & _
        " join GESTCOM.BVENDP1 T02 " & _
        " On T01.COVEN = T02.COVEN " & _
        " where (Digits(T01.BONDA)Concat Digits(T01.BONDM)Concat Digits(T01.BONDJ) = '061025' AND T01.COVEN = ' V12' "

Voilà notre table Access est alimentée et nous pouvons maintenant créer les Requêtes, Formulaires et Etats souhaités avec toutes les possibilités offertes par Access. Je conseille de vider les tables à la fermeture de la base pour allèger l'ensemble.
Dans le cas de réseau, les bases sont stockées sur le serveur pour toutes les taches automatiques de la nuit. Par contre si ce sont des taches susceptibles d'être utilisées par plusieurs personnes, il vaut mieux mettre une application runtime par poste.


Variations
Ceci est un exemple très simple qui peut bien sûr être complété. On peut travailler sur une période avec une date de départ et d'arrivée. On peut alimenter une table vendeurs et ensuite en sélectionner un dans une zone de liste en y joignant une variable. Tout est imaginable et j'ai de nombreuses applications qui tournent sur cette base.

Conclusion
Je suis très conscient que ce problème de liaison avec un As400 ne touche pas une majorité de gens, mais pour cette minorité, il y a beaucoup de mal à trouver quelque chose sur Internet. Alors si je peux mettre une petite pierre à l'édifice...



24 novembre 2006 08:20:32 :
Meilleure lisibilité du code
signaler à un administrateur
Commentaire de Gil_ le 26/11/2006 17:33:05

Génial !!! super merci beaucoup je pense que ça va grandement m'aider

signaler à un administrateur
Commentaire de tolulu le 13/12/2006 15:16:33

Bonjour,
Il aurait plus simple de travailler directement en ODBC pour ce cas précis.
En effet, avec les drivers Client Access, il est trés facile de faire une source ODBC.
Ensuite dans le fichier access, il faut faire une importation de table, ainsi on travaille directement avec les données sur l'as/400.

signaler à un administrateur
Commentaire de j_d_g le 15/12/2006 07:39:02

Réponse j_d_g à TOLUFU.
Certes j'aurais pu travailler en Odbc. Mais comme je peux installer les programmes sur plusieurs Pc. avec ADO, je n'ai pas besoin de refaire les connexions.
D'autre part, je peux avoir des tables avec plus d'une centaine de champs, et si j'en ai besoin de deux ou trois ce n'est pas la peine de tout importer et d'alourdir la table access? C'est pour celà que j'ai adopté cette technique qui me permet de ne me ramener que ce dont j'ai besoin et d'accélérer les requêtes ultérieures. Mais tout dépend bien sûr de ce que l'on cherche. Si l'on veut modifier des données en direct sur l'As400 il faut faire autrement.

signaler à un administrateur
Commentaire de Kafilongo le 20/12/2006 08:19:38

Merci beaucoup de ce sujet très intéressant.

signaler à un administrateur
Commentaire de josoft le 22/12/2006 10:51:19

Merci beaucoup,

clair propre et d'un grand secour

signaler à un administrateur
Commentaire de JCBOUCARD le 11/10/2007 18:40:20

Clair et net, Merci
Savez-vous comment écrire le sql pour atteindre un 'Membre' dans un fichier multi-membres d'une bibliothèque.
Cordialement

signaler à un administrateur
Commentaire de dragonnoir57 le 02/02/2008 23:46:26

Remarque pour JCBOUCARD. Avec le driver IBM Access il ne semble pas possible d'accéder a un 'membre' précis. Il existe des logiciels tiers payant pour combler ce manque.
Petite Remarque à J_D_G: C'est un exemple explicite et clair de transfert de tables as400 vers d'autres systèmes. S'il s'agit de limiter les accès sur une grosse table As400 ton application Access ou VB je suggère de travailler/creer une vue sur le 400 plutôt que d'attaquer directement cette table.
Bonne continuation.

signaler à un administrateur
Commentaire de j_d_g le 28/02/2008 15:29:10

Merci à DRAGONNOIR57 pour son commentaire.
Ta suggestion est tout à fait pertinente, et c'est une marche supplémentaire.

La seule réserve que j'émets est que dans ce cas, cela fait intervenir sur l'AS400. Or quand on n'y connait rien, ou peu l'AS400, fait figure de monstre auquel il ne faut surtout pas toucher. Ce n'est d'ailleurs pas forcement une mauvaise chose.  Dans le cadre de ma démarche de profane, on ne fait que de l'extraction et on n'intervient en rien sur l'AS. Cela a un coté rassurant, et c'est un des buts de ce tutoriel.
Après , bien évidemment en fonction de son niveau et des besoins on peut pousser plus loin et passer par des phases plus subtiles.

signaler à un administrateur
Commentaire de nyavo2000 le 30/06/2008 08:54:12

Bonjour

Je trouve que ce sujet sur AS/400 et Vb est très intéressant.
Nous aussi, nous utilisons des bases AS-400 pour faire des stats ou des présentations plus conviviales pour les utilisateurs.

Toutefois, nous avons de difficulté pour l'automatisation de certaine extraction  sur des fichiers As-400 multi-membres ( nous ne savons le code vb correspondant).

Je m'explique: un fichier As-400 est composé de 12 membres ( membre 1: JANV, membre N°2: FEVR,...., 12: DEC) et on veut accéder automatiquement à ce membre à chaque fin du mois correspondant mais on ne sait pas comment ?. Avec l'extraction interactive de client access, on arrive à avoir les données mais en code, aucune idée ?

Si quelqu'un a la réponse à cette question .

Merci d'avance


signaler à un administrateur
Commentaire de jenji le 18/11/2008 16:57:36

oui c est bien de mettre en place ce code
mais dans le client access de l AS400  il y a le menu transfert vers un pc

signaler à un administrateur
Commentaire de nemo2 le 21/11/2008 19:13:02

pour niavo2000:
sur l'as400 tu peux créer un alias vers le membre
exemple : CREATE ALIAS bib1/ficjanv FOR bib2/fictotal (mbrjanv)
en accedant au fichier FICJANV tu acèdes en fait au membre MBRJANV
du fichier FICTOTAL mais ça oblige à faire autant d'Alias que de membres

signaler à un administrateur
Commentaire de j_d_g le 26/11/2008 10:01:02

Pour Jenji
Effectivement on peut passer par le transfert de Client access, mais il engendre des fichiers intermédiaires Txt ou Csv. La synchro avec Access était donc plus compliquée. Avec ma méthode il n'y a aucun fichier intermédiaire et une grande sécurité puisque les connexions à l'As400 se ferment dès que le contenu de la table Access est chargé.
D'autre part je ne mets sur les postes que des fichiers Mde dont le code est bloqué et je n'ai aucune reconfiguration à faire, même sur des sites éloignés.

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,031 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.