PDA

View Full Version : AS400 Kennwort mit VBA prüfen



Pauli
09-07-12, 09:20
Ich habe in einem VBA verschiedene SQL's und will nicht bei jeder Verbindung mit der AS400 meinen Benutzer und das Kennwort eingeben. Wie kann ich in VB das ganze prüfen und nur einmal eingeben. Ich habe eine Routine erstellt wenn aber das Kennwort falsch erfaßt wurde, muß dieses immer wieder neu bei jeder SQL-Verbindung eingegeben werden. Ich möchte Benutzer und Kennwort auf der AS400 prüfen und wenn diese falsch sind nur einen Fehlercode von der AS400 erhalten. Es soll dort nicht korrigiert werden dürfen.
Hier die Source
Private Sub cmdOK_Click()
Dim system As New cwbx.AS400System
system.Define "xxxxxxxx"
system.UserId = tbBenutzer
system.Password = tbKennwort
system.IPAddress = "nn.nn.nn.nn"
On Error GoTo weiter
system.Connect (cwbcoServiceODBC)
weiter:
If (system.IsConnected(cwbcoServiceODBC)) Then

Else
MsgBox "Fehler: Benutzername oder Kennwort falsch. Programmende"
Application.Quit
End If

Const CN_STR = "ODBC;Driver=iSeries Access ODBC Driver;SYSTEM=system.IPAddress ;DefaultLibrari;UID="
Dim sSQL1, sEOF1 As String
Dim cnADO1 As DAO.Connection
Dim rsDaten1 As DAO.Recordset
Dim wrkODBC1 As DAO.Workspace
Dim iPos2, iPos3 As Integer
Dim Firmen(99) As String
Dim Firmentext(99) As String

sSQL1 = "select fifirm, fiktad, fiortn" & _
" from cmdlib.ufirmp " & _
" order by fifirm, fiortn asc "

Set wrkODBC1 = DAO.CreateWorkspace("IBM/AS400", "", "", dbUseODBC)
Set cnADO1 = wrkODBC1.OpenConnection("", dbDriverCompleteRequired, False, CN_STR & system.UserId & "; Pwd =" & tbKennwort)
Set rsDaten1 = cnADO1.Database.OpenRecordset(sSQL1, dbOpenDynamic)

rsDaten1.MoveFirst
iPos3 = 0
sEOF1 = ""

While Not rsDaten1.EOF
FrmAuswahl.lbFirma.AddItem (rsDaten1.Fields("fifirm") & " " & rsDaten1.Fields("fiktad").Value)
Firmen(iPos3) = rsDaten1.Fields("fifirm").Value
Firmentext(iPos3) = (rsDaten1.Fields("fifirm") & " " & rsDaten1.Fields("fiktad").Value)
iPos3 = iPos3 + 1
rsDaten1.MoveNext
Wend
rsDaten1.Close

FrmAuswahl.Show
End Sub

Fuerchau
09-07-12, 09:27
Ersetze
dbDriverCompleteRequired
durch
dbDriverPromptNever (oder ähnlich)

dann kommt kein Anmeldefenster und User/PWD muss in der Verbindungsfolge mitgegeben werden.

Sind Benutzer/Kennwort falsch, schlägt der Open der Verbindung fehl.

Pauli
09-07-12, 09:41
Vielen Dank für die schnelle Antwort, leider habe ich auch hier die Anmeldemaske von der AS400 wenn ein falscher Benutzer oder das Kennwort nicht korrekt ist.
Besteht die Möglichkeit, zu prüfen, ist die Anmeldung nicht OK, dann erhalte ich einen Fehlercode in einer Variablen

Vielen Dank nochmals

KM
09-07-12, 09:53
Hallo,

für solche Zwecke hab ich für die Methode "Workbook.Open" eine kleine UserForm als Anmeldefenster erstellt, in die der Benutzer seinen Loginnamen und Kennwort eingeben muß.
Damit erstelle ich dann folgendermaßen eine ADO-Connection:

Set as400 = New ADODB.Connection
as400.Open "Driver=iSeries Access ODBC Driver;CONNTYPE=2;TRANSLATE=1;SYSTEM=ISERIES;UID=" & user & ";PWD=" & password...

Das Objekt "as400" verwende ich als globale Variable, so dass ich es je nach Bedarf benutzen kann.

Gruß,
KM

Pauli
09-07-12, 10:18
Vielen Dank KM,
aber auch hier erhalte ich jedesmal eine Anmedlung, wenn diese beim ersten mal fehlerhaft war.

KM
09-07-12, 10:28
Hallo Pauli,

ich hab jetzt noch nicht so recht verstanden was Du vorhast. In meinem Beispiel erscheint beim Öffnen der Excel-Tabelle als erstes ein Anmelde-Window. Wenn die Anmeldung korrekt ist, wird ein ADO.Connection-Objekt erstellt, das ich im weiteren Verlauf immer wieder ohne weitere Anmeldung verwenden kann. Wenn die Anmeldung nicht korrekt ist, bleibt das Anmelde-Window weiterhin bestehen mit dem Hinweis, dass eben ein Fehler bei der Anmeldung aufgetreten ist und der Benutzer aufgefordert wird die Logindaten zu korrigieren.

Gruß,
KM

Pauli
09-07-12, 10:38
Hallo KM,
Bei uns sind alle Benutzer über den Operations Navigator so eingestellt, dass diese sich jedesmal, wenn Sie einen Zugriff auf die AS400 starten anmelden müssen, das kann ich in VBA umgehen in dem ich ein eigenes Form "Anmeldefenster" erstellt habe. Im Connection-String gebe ich dann den Benutzer und das Kennwort aus meiner Form mit. Das funktioniert auch so ganz gut, wenn der Benutzer und das Kennwort beim ersten mal korrekt eingegeben wurden. Bei einer Falscheingabe übernimmt die AS400 die Anmeldeprozedur, was ich nicht möchte, weil mir die AS400 kein Flag mit gibt, dass die Anmeldung korrigiert wurde.

Es ist nicht einfach, aber ich hoffe das ich mich verständlich ausgedrückt habe

Fuerchau
09-07-12, 11:10
Das leigt eben an der Einstellung:

dbDriverCompleteRequired

was dazu führt, dass bei Fehlern eben das Anmeldefenster kommt.
Diesen Wert musst du mit einer Einstellung "dbDriverPromptNone" verhindern!
Wobei ich den genauen Namen der Konstanten jetzt nicht kenne, den bekommst du aber per IntelliSence angezeigt.

Pauli
09-07-12, 12:19
Hallo,

ich habe jetzt den richtigen Befehl gefunden.

Die Zeile sieht jetzt so aus
Set cnADO1 = wrkODBC1.OpenConnection("", dbDriverNoPrompt, False, CN_STR & tbBenutzer & "; Pwd =" & tbKennwort)

und damit kann ich jetzt eine "ON Err" Abfrage starten und das ganze von vorne beginnen lassen

Übrigens Error 13 = falsches Kennwort

Vielen Dank an alle