Si vous souhaitez accéder à la base de donnée AS/400, le plus simple est d'utiliser le driver ODBC (celui de Client Access) :
Dans le cas de l'AS/400, le driver livré avec Client/Access, va établir
une session client Access.
(QZDASOINIT dans QSYSWRK)
ATTENTION, pour utiliser ODBC vous devez avoir attribué à votre AS/400 un nom de base de données DRDA
par ADDRDBDIRE (wrkrdbdire permet de voir la liste des bases connues):
L'enchaînement d'ODBC est le suivant
Votre application en VB
(ou autre)
|
ODBC.DLL (routine Microsoft)
|
CWBODBC.DLL
|
Dialogue IP avec l'AS/400
|
Réseau (lien Ethernet/ Token
ring, ...)
|
QZDASOINIT (IP)
jobs à démarrage anticipé |
DB2/400 (requête
SQL)
[génération du résultat] |
Dernier point (Important) toutes les requêtes transmises au driver sont à la syntaxe SQL, et les requêtes sont exécutées sur le serveur. (Ici l'AS)
PARAMETRAGE
Pour le paramétrer :
1/ définir une nouvelle source de données
dans le dossier client access choisir l'icône
l'image suivante vous est affichée :
choisissez "ajouter" pour une nouvelle configuration
les applications PC ne connaissent que ce nom logique.
Sur l'AS/400, limitez cette notion à une bibliothèque ou à
une application
(ce qui est souvent la même chose en ce qui concerne les fichiers)
Indiquez ici le nom logique de ce paramétrage (aucune incidence sur
l'AS/400)
et le nom de votre AS/400.
et sur cet onglet, indiquez la (ou les) bibliothèques. [séparées par ";"].
les autres onglets sont d'utilisation moins fréquente et représentent
:
Modules | Paramétrages des SQL Packages
(depuis la V3R1M3 ils peuvent être enregistrés sur le disque dur) |
Performances | paramètres de groupage (taille d'une E/S) |
langue | critères de tri (tenir compte ou pas des caractéristiques de la langue) |
Autre | connexion en lecture seule ou en lecture/écriture (facilement modifiable hélas!) |
Conversion | faut-il convertir (en ANSI) les fichiers avec CCSID 65535 |
format | format des dates/heures, marque décimale et caractère de qualification ("." ou "/") |
Les objets sans interface graphique sont principalement
:
Une fonction est une suite d'instructions qui peut être appelée depuis le code d'une feuille ou d'un module, et qui retourne une valeur. La fonction peut comporter des paramètres dont les valeurs devront être indiquées lors de l'appel. La fonction se déclare dans une feuille ou dans un module.
Lorsque vous arrivez dans l'environnement de développement, Visual Basic ouvre automatiquement un nouveau projet intitulé 'Projet1' et vous affiche les 5 fenêtres suivantes :
- la fenêtre de création de menu qui permet de mettre à jour la barre de menu de la feuille active. Cette fenêtre peut être ouverte en cliquant dans la barre de menu sur Outils, Créateur de menus.
- la fenêtre de débogage qui permet d'afficher des données (variables, texte, ...) lors de l'exécution du programme, et facilite ainsi la mise au point de votre application. Cette fenêtre peut être ouverte en cliquant dans la barre de menu sur Affichage, Fenêtre Débogage.
ODBC et Visual Basic:
En VB4, il faut :
Passer un ordre OPENDATABASE pour établir la connexion
puis : passer une requête :
Manipulation d'une base de données en SQL
Global SQLreq As String
Global SQLcde As String
Global Societe As String * 4
Global Mode As Integer
Global Index As Integer
Global Message As String
Global Cr, Lf As String
Procédure Form_Load
Dim i As Integer Dim Sn As Snapshot Dim rsSociete As Recordset
Cr = Chr$(13) Lf = Chr$(10) On Error Resume Next
Set Db = OpenDatabase(Nom_Base, False, False, Option_Driver)
If Err.Number <> 0 Then GoTo Erreur_Base End If
SQLreq = "select * from " & T_Societe
'Exemple de déclaration d'un Snapshot ' Set Sn = Db.CreateSnapshot(SQLreq, Option_Record)
Set rsSociete = Db.OpenRecordset(SQLreq, dbOpenSnapshot, Option_Record) rsSociete.MoveFirst While Not rsSociete.EOF LB_Table.AddItem rsSociete.Fields("societe") & " " & rsSociete.Fields("soc_desi") rsSociete.MoveNext Wend
rsSociete.Close Exit Sub
Erreur_Base: Beep Message = "Erreur n°" & Str$(Err.Number) & Cr & Err.Description MsgBox Message, vbOKOnly, "Erreur Base de Données" Unload Me Exit Sub End Sub
Procédure C_Modif_Click
Index = LB_Table.ListIndex
Societe = Left$(LB_Table.Text, 4) If Societe = " " Or Index < 0 Then MsgBox ("Vous devez sélectionner une société") Exit Sub End If Mode = 0 F_Maj_Soc.Show Refresh End Sub
Procédure C_Nouveau_Click Mode = 1 F_Maj_Soc.Show
End Sub
Prcédure LB_Table_DblClick C_Modif_Click End Sub
Procédure C_Quitter_Click Unload Me End Sub
Description des procédures de la feuille F_Maj_Soc
Procédure Form_Load Dim i As Integer
' Modification ou suppression If Mode = 0 Then N_Societe.Enabled = False SQLreq = "select * from " & T_Societe & " where societe = '" & Societe & "'" 'Exemple de déclaration d'un Dynaset ' Set Ds = Db.CreateDynaset(SQLreq, Option_Record) Set Rs = Db.OpenRecordset(SQLreq, dbOpenDynaset, Option_Record_Set)
Rs.MoveFirst Affiche_Societe Else C_Suppress.Visible = False End If End Sub
Procédure Form_Unload (Cancel As Integer) On Error Resume Next Rs.Close End Sub
Procédure C_Annuler_Click Unload Me End Sub
Procédure C_OK_Click Dim i As Integer ' Cas de la modification ' ======================
If Mode = 0 Then SQLcde = "update " & T_Societe SQLcde = SQLcde & " set soc_desi='" & LTrim(Design.Text) & "', " SQLcde = SQLcde & "soc_desab='" & LTrim(Desab.Text) & "', " SQLcde = SQLcde & "soc_adresse_1='" & Adresse_1.Text & "', " SQLcde = SQLcde & "soc_comment_1='" & Comment_1.Text & "', " SQLcde = SQLcde & "soc_comment_2='" & Comment_2.Text & "' " SQLcde = SQLcde & " where " & T_Societe & ".societe='" & Societe & "'" ' Suppression puis ajout de la Société dans la ListBox ' pour prendre en compte le changement éventuel de désignation ' ------------------------------------------------------------ F_Societes.LB_Table.RemoveItem Index F_Societes.LB_Table.AddItem Societe & " " & LTrim(Design.Text)
' Cas de la création ' ================== Else ' Contrôle du numéro de société ' ----------------------------- N_Societe.Text = UCase(N_Societe.Text) If Len(N_Societe.Text) <> 4 Then Beep MsgBox "Le numéro de société doit comporter 4 chiffres", vbExclamation, "Erreur" N_Societe.SetFocus Exit Sub End If
For i = 1 To 4 If Mid$(N_Societe.Text, i, 1) < "0" Or Mid$(N_Societe.Text, i, 1) > "9" Then Beep MsgBox "Le numéro de société ne doit comporter que des chiffres", vbExclamation, "Erreur" N_Societe.SetFocus Exit Sub End If Next i
' Contrôle que la société n'existe pas ' ------------------------------------ SQLreq = "select * from " & T_Societe & " where societe = '" & N_Societe.Text & "'" 'Set Ds = Db.CreateDynaset(SQLreq, Option_Record) Set Rs = Db.OpenRecordset(SQLreq, dbOpenDynaset, Option_Record_Set) On Error Resume Next Rs.MoveFirst If Err.Number = 0 Then Beep Message = "La société " & N_Societe.Text & " existe déjà" MsgBox Message, vbExclamation, "Erreur" Rs.Close N_Societe.SetFocus Exit Sub End If
' Création de la société ' ---------------------- SQLcde = "insert into " & T_Societe SQLcde = SQLcde & "(societe,soc_desi,soc_desab,soc_adresse_1,soc_adresse_2," SQLcde = SQLcde & "soc_adresse_3,soc_code_postal,soc_ville,soc_pays," SQLcde = SQLcde & "soc_telephone,soc_fax,soc_civil,soc_nom,soc_prenom," SQLcde = SQLcde & "soc_tel_cont,soc_qualite,soc_activites_1,soc_activites_2," SQLcde = SQLcde & "soc_groupe,soc_comment_1,soc_comment_2)" SQLcde = SQLcde & " values (" SQLcde = SQLcde & "'" & N_Societe.Text & "'," SQLcde = SQLcde & "'" & LTrim(Design.Text) & "'," SQLcde = SQLcde & "'" & LTrim(Desab.Text) & "'," SQLcde = SQLcde & "'" & Adresse_1.Text & "'," SQLcde = SQLcde & "'" & Adresse_2.Text & "'," SQLcde = SQLcde & "'" & Adresse_3.Text & "'," SQLcde = SQLcde & "'" & LTrim(Code_Postal.Text) & "'," SQLcde = SQLcde & "'" & LTrim(Ville.Text) & "'," SQLcde = SQLcde & "'" & LTrim(Pays.Text) & "'," SQLcde = SQLcde & "'" & LTrim(Telephone.Text) & "'," SQLcde = SQLcde & "'" & LTrim(Fax.Text) & "'," SQLcde = SQLcde & "'" & LTrim(Civilite.Text) & "'," SQLcde = SQLcde & "'" & LTrim(Nom.Text) & "'," SQLcde = SQLcde & "'" & LTrim(Prenom.Text) & "'," SQLcde = SQLcde & "'" & LTrim(Tel_Contact.Text) & "'," SQLcde = SQLcde & "'" & LTrim(qualite.Text) & "'," SQLcde = SQLcde & "'" & LTrim(Activite_1.Text) & "'," SQLcde = SQLcde & "'" & LTrim(Activite_2.Text) & "'," SQLcde = SQLcde & "'" & LTrim(groupe.Text) & "'," SQLcde = SQLcde & "'" & Comment_1.Text & "'," SQLcde = SQLcde & "'" & Comment_2.Text & "')"
' Ajout de la Société dans la ListBox ' ----------------------------------- F_Societes.LB_Table.AddItem N_Societe.Text & " " & LTrim(Design.Text) End If ' Exécution de la commande Sql ' ============================ Db.Execute SQLcde, Option_Execute ' Arrêt de la transaction ' ======================= Unload Me End Sub
Procédure C_Suppress_Click Dim Reponse As Integer Beep Message = "Confirmez la suppression de la société " & Societe Reponse = MsgBox(Message, vbOKCancel, "Suppression société") If Reponse = vbCancel Then Exit Sub End If ' Suppression de l'enregistrement ' =============================== SQLcde = "delete from " & T_Societe & " where societe='" & Societe & "'" Db.Execute SQLcde, Option_Execute ' Suppression de la Société dans la ListBox ' ========================================= F_Societes.LB_Table.RemoveItem Index Unload Me End Sub
Procédure Affiche_Societe ' Exemple avec Dynaset : ' N_Societe.text = Ds.Fields("societe") N_Societe.Text = Rs.Fields("societe") Design.Text = Rs.Fields("soc_desi") Desab.Text = Rs.Fields("soc_desab") Adresse_1.Text = Rs(3) Adresse_2.Text = Rs(4) Adresse_3.Text = Rs(5) Code_Postal.Text = Rs(6) Ville.Text = Rs(7) Pays.Text = Rs(8) Telephone.Text = Rs(12) Fax.Text = Rs(13) Civilite.Text = Rs(14) Nom.Text = Rs(15) Prenom.Text = Rs(16) Tel_Contact.Text = Rs(17) qualite.Text = Rs(18) Activite_1.Text = Rs(9) Activite_2.Text = Rs(10) groupe.Text = Rs(11) Comment_1.Text = Rs(19) Comment_2.Text = Rs(20) End Sub
Avec VB6 vous pouvez utiliser DAO qui est plus rapide et évite l'utilisation de JET (le moteur d'ACCESS) ou bien ADO
cette nouvelle technique (DAO) permet de manipuler des objets WORKSPACE offrant un espace pour vos transactions
voici la séquence : (attention à vérifier le chargement de DAO 3.5 ou supérieur, dans projet/références)
Dim w as Wworkspace
Dim c as Connection
Dim d as Database
Dim r as RecordSet
Set w = CreatWorkSpace('ODBCWorkspace" , "" , "" , dbUseOdbc) WorkSpace.append w Set c = w.OpenConnection("nom-odbc" , DBDRIVENOPROMT , False , "ODBC;") Set d = c.Database
' puis traitement du recordset (select SQL ou CALL à une procédure cataloguée) set r = d.OpenRecodrSet("select libart from artciles", dbOpenForwardOnly) while nor r.Eof 'traitement r.movenext wend
vous pourrez gérer le commit/rollback lors des mises à jour par :
w.BeginTrans
d.execute("delete from fichier where..." , 0)
w.CommitTrans
' ou w.Rollback
Vous pouvez (devez ?) utiliser pleinement les possibilités
récentes de DB2/400
DB2_TEST.FRM
Soit le formulaire de saisie de commande suivant :
==================================================
contenant ce code :
===================
Dim db As database
Sub Exit_Click () End End Sub
Sub Form_Load () screen.MousePointer = 11 Set db = OpenDatabase("Formation", False, False, "ODBC;LOGINTIMEOUT=240;") (nom, (mode exclusif),(lecture seule),type de base,parametre (s).) screen.MousePointer = 0 End Sub
Sub Ajouter_Click () Dim insert As String Dim retour As Long screen.MousePointer = 11 insert = "INSERT INTO CDEENTP1 VALUES(" & NOCLI.Text insert = insert & ", " & NOCDE.Text & ", '" insert = insert & DATCDE.Text & "' , '" insert = insert & datliv.Text & "')" retour = db.ExecuteSQL(insert) screen.MousePointer = 0 MsgBox Str$(retour) & "insere(s) dans le fichier commandes" End Sub
Si vous avez mis en place l'intégrité référentielle, vous recevez le message suivant
Lors de l'ajout de la commande (bouton ajouter) :
=================================================
Un ensemble d'actions base de données devant être réalisées sur une base distante peut être demandé par l'appel à une procédure (un programme) stockée sur le serveur distant.
Cela normalise un ordre CALL (en tant qu'ordre SQL), avec passage de paramètres et ce en étant affranchi de l'OS du serveur.
Sur l'AS/400 les procédures cataloguées peuvent être écrites dans n'importe quel langage et leur déclaration est optionnelle, alors qu'avec ORACLE il ne peut s'agir que du PL/SQL et la procédure doit avoir été enregistrée.
Divers
Une procédure cataloguée invoquée par ODBC peut renvoyer explicitement un groupe d'enregistrement par :
SET RESULT SETS CURSOR xxx (le curseur xxx, résultat dune requête)
SET RESULT SETS ARRAY yyy (la table[tableau] yyy, chargée comme bon vous semble)
Exemple avec Le data Control DBGRID
Il faut d'abord définir un objet data control qui fait le lien avec la base de données en indiquant les propriétés suivantes :
1/ Table
- vous travaillez en direct sur le fichier et en mode mise à jour.(pas de sélection)
2/ Dynaset
- Index local pointant sur un fichier en mode mise à jour, vous pouvez faire des sélections et de la recherche
3/ Snapshot
- copie locale (ou extrait) du fichier sur le micro, vous êtes
en consultation.
1/ Un nom de fichier (PF ou LF ou Vue)
2/ Un SELECT SQL
3/ Un appel à une procédure cataloguée
Puis l'objet DBGrid doit faire référence à data1 par la propriété DATASOURCE
(Data1 peut ne pas apparaître à l'exécution, comme tous les objets VB en indiquant Visible = False)
Examinons ensemble les trois méthodes pour la propriété
Record source
A/ un nom de fichier
le contenu du fichier est chargé dans la grille.
B/ Un select SQL
Dim requete requete = "select * from AF400.af4mbrp1 where af4txt like '%" & Trim(Text1.Text) & "%'" Data1.Options = dbSQLPassThrough ' mode transparent pour un serveur Data1.RecordSource = requete Data1.Refresh End Sub
C/ un appel à un programme RPG ou COBOL contenant du SQL
sous la forme «CALL BIB.PGM (param1, param2, ...)»
structure générale du pgm
DECLARE c1 CURSOR FOR SELECT ......
puis OPEN c1
et enfin SET RESULT SETS CURSOR c1
le curseur Ouvert constitue alors le jeu d'enregistrement renvoyé à l'application
ATTENTION :
la procédure DOIT avoir été déclarée par l'ordre SQL suivant
create procedure VBCALL (:sujet CHAR(10))
RESULT SETS 1
(EXTERNAL NAME AF4SRCT/VBCALL
LANGUAGE RPGLE SIMPLE CALL)
Sources :
Visual Basic
Private Sub Command2_Click() Dim requete ' il faut passer le paramètre en lg fixe Dim sujet As String * 10 sujet = Trim(Text1.Text) Form1.MousePointer = 11 requete = "call AF4SRCT.VBCALL ('" & sujet & " ')" Data1.Options = dbSQLPassThrough Data1.RecordSource = requete Data1.Refresh Form1.MousePointer = 0 End Sub
SQLRPGLE
C
*entry plist
C
parm
sujet
C/EXEC SQL
C+ DECLARE C1 CURSOR FOR SELECT * FROM
C+ AF4MBRP1 WHERE SUJET = :sujet ORDER BY AF4MBR
C/END-EXEC
*
C/EXEC SQL
C+ OPEN C1
c/END-EXEC
*
C/EXEC SQL
C+ SET RESULT SETS CURSOR C1
C/END-EXEC
C
return
IBM a développédes objets à la norme OLE (des OCX) utilisables en VB pour manipuler :
Il faut charger l'objet OCX par Outils/Controles personnalisés et choisir parcourir
le fichier est dans « program Files\IBM\Client Access\Shared » et il s'appelle CWBCTRL.OCX
et le fichier d'aide est CWBCTRL.HLP dans « program Files\IBM\Client Access\mri2928 »
Vous devez voir apparaitre trois nouvelles icones dans la boite à
outils
CWBSystemListBox
Charge automatiquement la liste des système
Propriétés remarquables
Passe une commande sur l'AS/400
Propriétés remarquables
Gestion des DTAQ
Propriétés remarquables