Das Notes Forum
Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: lndsbrgr am 16.09.09 - 10:42:46
-
Hallo!
Ich möchte unsere Kundenstammdaten aus der AS400 zwecks E-Mail-Marketing in ein Adressbuch importieren. Prinzipiell funktioniert es auch, allerdings werden nie mehr als 1542 Datensätze ausgelesen und da liegt das Problem: Unsere Kundendatenbank hat mehrere tausend Einträge.
Der ODBC-Treiber stammt aus dem ClientAccess von IBM. Meines Wissen gibt es hier keine Begrenzung (wurde schon mehrfach in anderen Applikationen genutzt, um derartige Datenmengen aus unserer AS400 zu bekommen...).
Hat jemand hier schon einmal eine ähnliche Erfahrung gemacht??
Das Skript:
Option Public
Uselsx "*LSXODBC"
Sub Initialize
Dim Session As New NotesSession
Dim db As NotesDatabase
Set db = Session.currentdatabase
Dim Con As New ODBCConnection
Dim Qry As New ODBCQuery
Dim res As New ODBCResultSet
RetCode% = Con.ConnectTo("AS400", "","")
Set Qry.Connection = Con
Qry.SQL = "SELECT * FROM kd.yku"
Set Res.Query = Qry
Res.Execute
Res.CacheLastRowNum = 5000
Res.LastRow
Rows% = Res.NumRows
columns = res.NumColumns
rows% = res.NumRows
RetCode% = Res.FirstRow
Do While RetCode% =True
Dim kunde As String
Dim ansprechp As String
Dim straße As String
Dim plz As String
Dim ort As String
Dim telefon As String
Dim bemerkung As String
kunde = Cstr(Res.GetValue("kdnr") )
'ansprechp = Cstr(Res.GetValue("ansprechp") )
'straße = Cstr(Res.GetValue("straße") )
'plz = Cstr(Res.GetValue("plz") )
'ort = Cstr(Res.GetValue("ort") )
'telefon = Cstr(Res.GetValue("telefon") )
'bemerkung = Cstr(Res.GetValue("ort") )
Dim Doc As New NotesDocument(db)
doc.form = "Person"
doc.type = "Person"
doc.view = "People"
'doc.fullname = kunde
doc.companyname = kunde
'doc.lastname = ansprechp
'doc.businessaddress = straße
'doc.officezip = plz
'doc.location = ort
'doc.officephonenumber = telefon
'doc.comment = bemerkung
'Call doc.ComposeWithForms (True, False)
Call doc.save (True, True)
Print "datensatz",res.currentrow , "von", rows%
RetCode% = Res.NextRow
Loop
RetCode% = Res.Close(DB_CLOSE)
RetCode% = Con.Disconnect
End Sub
-
Servus,
evtl. Workaround:
Versuch mal mittels dem Client-Access ODBC Treiber die Daten nach Exel oder Access auszugeben,
kommen dann alle bzw. mehr Datensätze als 1542?
Wenn ja, evtl. kannst Dir ein Skript schrieben, das ne XLS- oder TXT-Datei ausliest.
Grüße Tim
-
Das wäre denkbar. Ist aber von hinten durch die Brust ins Auge, oder?! ; )
Ich würde es lieber wie geplant abbilden, als zusätzlich einen Umweg über eine weitere Datei zu gehen.
Ja, es kommen in anderen Anwendung mehr als die besagten 1542 Datensätze...
Gruß, Thies
-
Ist für diese Schnittstelle eine eigene Datenquelle eingerichtet worden ? Wenn ja, vergleich mal die Einstellungen in der Datenquelle mit den anderen, bei denen es funktioniert.
-
@Thies:
Wenn es nur ne einmalige Sache wäre, würde ich den Workaround versuchen, sollte die
Aktion periodisch öfter ausgeführt werden, dann richtig, ist es nur die "zweitbeste" Lösung ;)
Kommt ne Fehlermeldung? Oder wie äußert sich das Problem?
Grüße Tim
-
@Driri
Ich nutze meinen lokalen PC und eine mehrfach erfolgreich getestete System DSN.
@Tim
Leider kommt keine Fehlermeldung.
Ich habe nun testweise die Daten komplett in Access importiert (...mit der gleichen System DSN). Die neue Access mdb-Datei habe ich dann ebenfalls per ODBC angezapft und erneut lediglich 1542 Sätze herausbekommen...
Auf einer anderen Seite wurde die "CacheLimit"-Eigenschaft verantwortlich gemacht, damit habe ich aber auch keinen Erfolg. Vielleicht ist irgendwo anders der Cache limitiert.
-
Wir hatten mal ähnliche Probleme und konnten das dadurch ändern, dass eine Cachevariable auf irgendeinen krummen Wert gesetzt wurde.
Hast Du mal mit deinem Wert 5000 experimentiert?
Das ist doch die Abbruchbedingung oder? Setz den Wert mal auf 10042 oder sowas oder ändere die Abbruchbedingung.
Matthias
-
Hi,
also ich programmiere selten mal was, und auch ganz wenig im LN.
Aber wenn ich mir das so ansehe, ist da nicht die Abbruchbedingung falsch... also wenn ich z.B eine Datei einlese geh ich Zeile für Zeile bis EOF.
Würde man das hier nicht so ähnlich machen?
Mit Access 2007 und V6R1 ging das öffnen der Daten, wobei wir auf unserer Maschine nicht so viele Datensätze hat und auch nur Testdaten. Bei einem Kunden hatte ich vor kurzem mit 2003 und V5R4 (glaub ich) den Zugriff per ODBC eingerichtet.
Das waren über 2000 Datensätze und scheint zu funtkionieren, sonst hätte sich der Kunde ja nochmal gemeldet ;).
MFG Michael
-
Hallo, ich habe einmal ein paar ganz blöde Fragen. Der Code oben scheint ziemlich Fehlerhaft zu sein.
Frage:
1 - Warum deklarierst du deine Variablen in jedem Loop Durchlauf neu?! (Funktioniert das überhaupt? Ich dachte das giebt ne dicke Fehlermeldung dass diese Variable bereits Deklariert ist).
2 - Warum nutzt du überhaupt Variablen? Sowas wär doch gescheiter: doc.fullname = Cstr(Res.GetValue("kdnr"))
3 - Was würde folgender Code machen: Call doc.ComposeWithForms (True, False) ? Ich wüsste nicht dasses eine solche Methode für das NotesDocument giebt. Ich kenne nur notesDocument.ComputeWithForm( doDataTypes, raiseError )...
Ich hoffe irgendjemand beantwortet mir diese Fragen. Ich will ja schließlich dazulernen :)
mfg Samuel
-
Nochmal allgemein vorweg: Das Skript ist aus dem Forum. Speziell mit LotusScript habe ich bisher noch keine Prgrammiererfahrung.
@Matthias
Der Wert mit der 5000 (Res.CacheLastRowNum = 5000) ist anscheinend nur eine interne Variable (leider hab ich keine Doku dazu gefunden). Hatte ich zum Testen verändern wollen, weil diese laut Debugger auf 1542 gesetzt wird nach dem "res.lastrow". Irrelevant. Ansich sollte hierfür die CacheLimit-Eigenschaft verantwortlich sein. Veränderungen bringen hier aber nichts (außer auf Werte unter 1542...).
@Michael
Mit dem EOF hast Du wohl recht. Die Abbruchbedingung wird in diesem Skript durch den Returncode von "Res.NextRow" vor dem Ende des Loops definiert. Wenn keine weitere Zeile gelifert wird, ist kommt false... allerdings könnte es natürlich sein, dass es hier mit einem EOF auch ginge. Dazu fehlt mir die Erfahrung. Also...
Frage: Gibt es in LotusScript auch eine EOF-Eigenschaft, die für die Schleife genutzt werden könnten??? Vielleicht wäre das die Lösung...
@Samuel
1 - Du hast Recht: eigentlich ergibt das gar keinen Sinn! Bin ich bisher gar nicht drüber gestolpert...wie gesagt: das Skript stammt aus dem Forum.
2 - s. 1. - Es wäre wohl überischtlicher, falls die Variablen mehrfach verwendet würden... zur Performance kann ich leider ncihts sagen
3 - Stimmt: Diese Methode gibt's nicht. War ebenfalls schon im beispielskript auskommentiert...
Vielen Dank schon mal für eure Mithilfe!
Gruß, Thies
-
@Samuel
1- Variablen werden zur Compile-Zeit angelegt und nicht zur Laufzeit. Es ist daher vollkommen egal, wo die in Code stehen, haupsache sie sind im Quelltext vor der erstmaligen Benutzung deklariert. Es gibt sogar Programmier-Philosphien, die sagen, dass Variablen nicht im Kopf des Quellcodes Deklariert werden sollen, siondern in unmittelbarer Nähe ihrer Verwendung.
2 - das erleichtert das Debugging ungemein.
Thomas
-
@ Thomas
2 - Zum Debuggen geb ich dir recht, sonst isses einfach nur überflüssig
1 - Mir geht es nicht darum dass er die Deklaration in nähe der Variablen getätigt hat, das mache ich genauso. Mir geht es um den ständigen redeclair den er da durchführt. So wie ich das sehe stehen die Deklarationen in ner Schleife.
Und das war ja auch meine Frage. Ich dachte immer Notes mag sowas garnicht.
Mfg Samuel
-
@ Thomas
1 - Mir geht es nicht darum dass er die Deklaration in nähe der Variablen getätigt hat, das mache ich genauso. Mir geht es um den ständigen redeclair den er da durchführt. So wie ich das sehe stehen die Deklarationen in ner Schleife.
Mfg Samuel
???
Es gibt kein "Redeclare"!
Deklarationen finden zur Compile-Zeit statt, Schleifen werden zur Laufzeit ausgeführt. Da überschneidet sich nichts.
(Was anderes ist es allerdings, wenn Du mit ReDim arbeitest... das wird zur Laufzeit ausgeführt).
Thomas
-
@ Thomas
Danke dir! Wieder was neues gelernt ;) Ich liebe dieses Forum...
mfg Samuel
-
???
Es gibt kein "Redeclare"!
Deklarationen finden zur Compile-Zeit statt, Schleifen werden zur Laufzeit ausgeführt. Da überschneidet sich nichts.
Thomas
AFAIK hat Samuel aber recht, dass dir der Code in früheren Notes-Versionen "um die Ohren geflogen" wäre ;)
Gruß
Roland
-
AFAIK hat Samuel aber recht, dass dir der Code in früheren Notes-Versionen "um die Ohren geflogen" wäre ;)
Gruß
Roland
also ich hab gerade nochmal die 5.0.8 angeworfen: kein Problem
auf meiner "normalen" 6.5-Umgebung: auch kein Problem.
Da müsste man schon in die Urzeiten von LotusScript zurückgehen (Script-Version 2.0?).
Thomas
-
Etwas Offtopic
@TRO
Da müsste man schon in die Urzeiten von LotusScript zurückgehen (Script-Version 2.0?).
???
Welche Version 2.0?
Lotus Script gibt es doch erst seit Version 4 von Lotus.
Andreas
-
Etwas Offtopic
@TRO
Da müsste man schon in die Urzeiten von LotusScript zurückgehen (Script-Version 2.0?).
???
Welche Version 2.0?
Lotus Script gibt es doch erst seit Version 4 von Lotus.
Andreas
Auch die in Notes und den anderen Lotus-Produkten (1-2-3, WordPro, Freelance,...) eingebauten Core-Script-Maschinen haben Versionsnummern. Seit Notes 5.x ist meines Wissens die Version 4 die aktuelle.
Natürlich wurde LotusScript erstmalig in Notes4 eingeführt. Die dort verwendete Script-Maschine hatte die Versionsnummer 3.
Thomas