Das Notes Forum
Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: MisterDa am 01.04.03 - 11:43:54
-
Hallo Leute,
ich habe ein Problem mit ODBC.
Und zwar: Ich will aus einer Access DB eine Spalte auslesen und die Werte in einer Dialogliste zur Auswahl stellen. Jetzt habe ich die Access DB im ODBC Manager unter System-DSN registriert und will mit dem @dbColumn(ODBC) Befehl darauf zugreifen. Es kommt aber ständig der Fehler "Der benötigte externe Datenbanktreiber kann nicht gefunden werden"
Formel: @DbColumn("OBDC";"RekDB2";"";"";"Gerät";"SNr")
Was mache ich falsch?
Thx
MisterDa
-
... die Fehlermeldung weist darauf hin, daß dir der ODBC-Treiber für deine externe Datenbank fehlt / nicht instaliert ist...
ata
-
ja schon, aber wenn ich doch meinen Treiber beim ODBC Manager auswählen kann für die DB und es keine Fehlermeldung gibt, dann geh ich davon aus, dass er auch installiert ist...
...oder seh ich das falsch? ???
und wenn ich nachschaue im Manager, zeigt er mir auch den Namen des Treibers an, der (angeblich) installiert sein soll...
("Microsoft Access Driver (*.mdb)")
(Sorry falls das Thema weng von Notes abweicht..)
MisterDa
-
lt. Help:
Wenn die Datei NOTES.INI des Benutzers die Anweisung
NoExternalApps=1
enthält, wird die Formel @DbColumn Formel deaktiviert. Der Benutzer sieht keine Fehlermeldung; die Formel wird ignoriert. Dies gilt nur dann für @DbColumn, wenn Sie diese Formel in Verbindung mit ODBC verwenden.
Dürfte aber an sich kein fehler kommen dann.
Dann die Syntax:
@DbColumn("ODBC" : "NoCache" ; Datenquelle ; Benutzer-ID1 : Benutzer-ID2 ; Kennwort1 : Kennwort2 ; Tabelle ; Spalte : Nullwertebehandlung ; "Distinct" : Sortieren )
check nochmals punkt für punkt.
-
Thx. hab ich alles gemacht..
Die Zeile steht nich in der Notes.ini und den Befehl hab ich auch noch mehrmals überprüft...(allerdings immer ohne user bzw pw):
@DbColumn("OBDC":"No Cache";"RekDB2";"";"";"Gerät";"SNr":"Discard";"Distinct":"Ascending" )
kommt immernoch der gleiche Fehler in der Dialogliste..
wenn ich allerdings ein Lotus Skript aus der Hilfe ausführe, dann sagt er, "Connected to RekDB2"...es kann also nich am ODBC Treiber liegen oder? ???
Hier das Skript..:
Uselsx "*LSXODBC"
Sub Initialize
Dim con As New ODBCConnection
con.ConnectTo(Inputbox("ODBC data source name", "DSN"))
While Not con.IsConnected
dsn = Inputbox("ODBC data source name", _
"Connection not made ...")
If dsn = "" Then Exit Sub
con.ConnectTo(dsn)
Wend
Messagebox "Connected to " & con.DataSourceName,, _
"Connection made ..."
con.Disconnect
End Sub
MisterDa
-
... für die unterschiedlichen ACCESS-Versionen gibt es unterschiedliche Treiber - überprüfe die Version - wäre noch ein möglicher Ansatz...
ata
-
hab ich schon gemacht, hab auch die neuesten runtergeladen und installiert..hat aber leider nix gebracht... :-\
-
... da fällt mir so aus der Distanz nichts mehr dazu ein...
ata
-
schade...
aber das was mich eben verwirrt ist, dass ich über das unten dargestellte Skript ohne Probleme eine Verbindung herstellen kann..nur wenn ich die Formel in die Dialogliste eingebe, will er nicht...wenns an ODBC läge, würde es beim Skript ja auch nicht gehen, oder seh ich das falsch?
MisterDa
-
... wenn Script den Treiber verwenden kann, dann sollte die Formel ebenso damit umgehen können....
... was spricht den gegen Script?
ata
-
1. das soll ja zu einer Auswahl an vorgegebenen Werten führen, die ich in einer Dialogliste vorgeben möchte..kann man da überhaupt mit skript arbeiten..ich seh da nur das Formelfenster..(bin wie gesagt neu in Notes ::) )
2. hab ich bisher mit Script keine Erfahrung...
MisterDa
-
... du kannst das auch mit LotusScript machen. Die Werte werden dann in ein Mehrfachwertefeld geschrieben. Dein Auswahlfeld zieht sich die Liste dann von diesem Feld...
... in LS lässt es sich besser kontrollieren, was für Werte kommen...
... Formel ist performanter..
ata
-
nur leider hab ich von LS noch überhaupt keine Ahnung.. :(
MisterDa
-
... ich habe auf meiner Homepage das Grundgerüst für LotusScript beschrieben...
... hast du den Grunderfahrung in LotusScript / Basic?
ata
-
hab im Zusammenhang mit Access ein wenig mit Visual Basic gearbeitet...da gibts ja Ähnlichkeiten..
MisterDa
-
... LotusScript ist ein Deriwat von VisualBasic - zwar nicht von der neuesten Version - aber brauchbar...
... schau dir das Grundgerüst dort mal an, du findest es unter
http://www.anton-tauscher.de/LotusScript (http://www.anton-tauscher.de/LotusScript)
... im Menü unter Datenbanken | Datenbanken | ODBC-Grundgerüst
ata
-
jo danke. bin grad dabei. an der stelle mal ein Lob an deine Homepage. Sowas bräuchte man öfters..
MisterDa
-
gut. die Verbindung steht und er liest auch die richtigen Werte aus...
"Die Werte werden dann in ein Mehrfachwertefeld geschrieben. Dein Auswahlfeld zieht sich die Liste dann von diesem Feld..."
Wie funktioniert das dann?
MisterDa
-
... danke für das Kompliment - leider immer noch ne Baustelle...
ata
-
Die Werte werden dann in ein Mehrfachwertefeld geschrieben. Dein Auswahlfeld zieht sich die Liste dann von diesem Feld...
kann mir das noch bitte einer erklären wie sowas funktioniert?
Danke
MisterDa
-
... wenn du die Werte in einem Array hast, dann kannst du die Werte zum Beispiel wie folgt einem Feld zuweisen
NotesDocument.Feldname = DeinArray
... damit sind die Werte in deinem MultipleValue-Feld
Auf dieses Feld bezieht sich deine Auswahliste. Als Formel verwendest du den Feldnamen...
... eventuell benötigst du noch einen Refresh, damit die Liste aktuell verwendet werden kann...
ata
-
also, ich bin jetzt soweit, dass ich alle Daten in meinem Feld hab, jetzt versteh ich nicht das weitere Vorgehen, bzw. weis nicht was oder wie ich das anstellen soll..
Sub Entering(Source As Field)
Dim Con As New ODBCConnection
Dim Qry As New ODBCQuery
Dim Res As New ODBCResultSet
Dim IsConnected As Integer
Dim sValue As String
Dim typ As String
Dim ausdruck As String
Dim feld() As String
Dim counter As Integer
counter = 0
typ = "D0084"
ausdruck = "SELECT * FROM Gerät WHERE GeräteTyp = '"& typ & "'"
IsConnected = Con.ConnectTo("RekDB2")
Set Qry.Connection = Con
Qry.SQL = ausdruck
Set Res.Query = Qry
Res.Execute
IsConnected = Res.FirstRow
Do While IsConnected = True
Redim Preserve feld(counter) As String
feld(counter) = Res.GetValue("SNr")
IsConnected = Res.NextRow
counter = counter+1
Loop
' # ... die ODBC-DB schließen...
IsConnected = Res.Close( DB_CLOSE )
' # ... die ODBC-Verbindung schließen.
IsConnected = Con.Disconnect
End Sub
MisterDa
-
... die werte hast du ja nun in deinem Array "Feld"
Jetzt muß dieses Array einem Feld in deinem Dokument zugewiesen werden. Du hast den Code im Initialze eines Feldes. Hier ist der Code nicht optimal, nimm den Code ins PostOpen, da ist der Code besser positioniert. Im Initialze dieses Feldes wird niemand nach dem Code suchen - und das macht für späteree Entwickler die Suche schwerer und unübersichtlicher...
... ich nenne das Feld zur Aufnahme der Liste mal "ListODBC"
... der Code ist im Postopen plaziert...
Dim ws As New NotesUIWorkspace
Dim docThis As NotesDocument
' # hier der Code, den du schon hast
Set docThis = Source.Document
' # die Zuweisung der Liste
docThis.ListODBC = feld
Call Source.refresh
... deine Auswahlliste bezieht die Werte nun per Formel. Als Formel gibst du den Namen des Listenfeldes ein, also ...
ListODBC
... ein hinweis sei noch erlaubt, Listenfelder haben eine Begrenzung in der Datenmenge...
ata
-
Danke!
ich hab jetzt noch ein Problem..er zeigt mir die Werte in der Dialogliste und im ListODBC-Feld nacheinander mit Komma an (nr1, nr2, nr3, ...) ..ich hätte sie aber gerne wie in ner normalen Dialogliste untereinander einzeln anwählbar...geht das?
die max Size beträgt diese ominösen 64k oder?
MisterDa
-
... ich denke in diesem Fall 32KByte
... daß du die Werte mit Kommas angezeigt bekommst, hängt mit dem Listenfeld - ich hatte es ListODBC genannt - zusammen. Du mußt diesem Feld die Eigenschaft geben Mehrfachwerte zulassen und im dritten Register werte trennen bei "Neue Zeile" , Werte anzeigen "mit neuer Zeile" administrieren, dann müßten die Kommas weg sein...
... da fällt mir noch was ein, in deinen werten sollten auf keinen Fall Kommas oder Semikolons sein, das kann Notes bei Auswahlfeldern ins Schleudern bringen...
ata
-
Juhu, es klappt endlich..
Danke ata
-
... gratuliere, dein erster Import per ODBC mit Script...
... gar nicht so wild, oder...
ata ;)
-
Danke. ;D
Jetz ist mir aber aufgefallen, dass ich den Code doch erst im Entering
des Feldes ausführen kann, weil ich vorher in einerm anderen Feld erst was auswählen muss und nach dieser Auswahl, richtet sich das Auswahlkriterium "typ" im Code...
kann es sein, dass 'Set docThis = Source.Document' nur im Postopen funktioniert?
MisterDa
-
... ja, in der Art dort schon, denn im Postopen kommt das Object "Source" über das Event als NotesUIDocument...
... wenn du es im Entering benötigst, dann mußt du im Entering das Source deklarieren und initialisieren...
... doch Vorsicht, du mußt das bestehende Source ersetzen durch "uidoc" - denn "Source" ist dort als Vraiable bereits belegt...
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = ws.CurrentDocument
... einfügen, und alle Variablen (bis auf die im Heder der Funktion) umbenennen (Find & Replace)...
ata
-
danke. jetzt kappts so wies soll :)
(musste allerdings noch ein NotesDocument einfügen und uidoc dem doc zuweisen, damit er die Zuweisung "doc.ListODBC=feld" annimmt...)
MisterDa
-
... ich hab mir den Code nicht mehr angeschaut, aber wie du es erwähnst, fällt es mir wieder ein, es war über Source initialisiert...
... auf jeden Fall funktioniert es jetzt - freut mich ;D
ata