Das Notes Forum
Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: Alperen15 am 08.12.11 - 11:26:30
-
Hallo Spezialisten,
ich habe eine xls Datei die erste Zeile sind die Überschriften Kundennummer, Kundenname usw.... ab Zeile zwei kommen die Inhalte.
Ich möchte in der xls Datei die Kundennumer nehmen als key definieren in der Ansicht suchen, wenn die Kundennummer nicht exisitert möchte ich ein neues Dokument anlegen mit deren Feldinhalt
Wird der Kunde gefunden soll er nichts tun und die nächste Zeile analysieren. hier mein Quellcode
Die Stelle wo der Debugger eine Fehlermeldung bringt habe ich markiert.
Sub Initialize
Dim session As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim doc As NotesDocument
Dim rtitem As NotesRichTextItem, SendRtitem As NotesRichTextItem
Dim itemReaders As NotesItem, itemReaders2 As NotesItem
Dim object As NotesEmbeddedObject
Dim row As Integer, written As Integer ,iWCount As Integer
Dim colsum As Currency, colsum2 As Currency, colval As Currency, colname As Currency
Dim Excel As Variant, xlWorkbook As Variant, xlSheet As Variant, vIntLeser(3) As Variant
Dim One As String, xlFilename As String
Dim cRechname As String, cPathname As String
Dim tmpKundennr As String
Dim vdoc As NotesDocument
Dim i As String
Dim filenum As Integer
Dim pathName As String
Dim cFilename As String
Dim PathFileName As String
pathName$ = "E:\TestKUR\LCU\*"
cFilename$ = Dir$(pathName$ & "*.xls", 0)
PathFileName = "E:\TestKUR\LCU\" & cFilename$
iWCount = 1
Set db = session.CurrentDatabase
Set Excel = CreateObject( "Excel.Application" )
' *** ---------------------- öffnet Excel File ---------------------------
Excel.Visible = False
Excel.Workbooks.Open PathFileName
Set xlWorkbook = Excel.ActiveWorkbook
'Set xlSheet = xlWorkbook.Worksheets(1)
Set xlSheet = xlWorkbook.ActiveSheet ' *** Nur ein Sheet - wird hier definiert
row = 2
With xlSheet
tmpKundennr = .Cells( row, 1 ).Value
Set view = db.GetView ("vwLogistik")
While tmpKundennr <> ""
'tmpKundennr = .Cells( row, 1 ).Value
Set vdoc = view.GetDocumentByKey(tmpKundennr)
If vdoc Is Nothing Then --> Fehlermeldung: Object Variable not set
vdoc.Form = "maLCU"
vdoc.txCustNo = .Cells( row, 2 ).Value
vdoc.txCustName = .Cells( row, 3 ).Value
vdoc.fdMandant = .Cells( row, 4 ).Value
vdoc.fdAnzahlMA = .Cells( row, 5 ).Value
vdoc.fdBranche = .Cells( row, 6 ).Value
vdoc.fdAPKunde = .Cells( row, 7 ).Value
vdoc.fdUmsatzAktiv = .Cells( row, 8 ).Value
vdoc.fdUmsatzPassive = .Cells( row, 9 ).Value
vdoc.fdUmsatzEMechanik = .Cells( row, 10 ).Value
vdoc.fdUmsatzTotal = .Cells( row, 11 ).Value
vdoc.fdMargeAktiv = .Cells( row, 12 ).Value
vdoc.fdMargePassive = .Cells( row, 13 ).Value
vdoc.fdMargeEMechanik = .Cells( row, 14 ).Value
vdoc.fdUmsatzAktiv_1 = .Cells( row, 15).Value
vdoc.fdUmsatzPassive_1 = .Cells( row, 16 ).Value
vdoc.fdUmsatzEMechanik_1 = .Cells( row, 17 ).Value
vdoc.fdUmsatzTotal_1 = .Cells( row, 18 ).Value
vdoc.fdMargeAktiv_1 = .Cells( row, 19 ).Value
vdoc.fdMargePassive_1 = .Cells( row, 20 ).Value
vdoc.fdMargeEMechanik_1 = .Cells( row, 21 ).Value
vdoc.fdUmsatzAktiv_2 = .Cells( row, 22 ).Value
vdoc.fdUmsatzPassive_2 = .Cells( row, 23 ).Value
vdoc.fdUmsatzEMechanik_2 = .Cells( row, 24 ).Value
vdoc.fdUmsatzTotal_2 = .Cells( row, 25 ).Value
vdoc.fdMargeAktiv_2 = .Cells( row, 26 ).Value
vdoc.fdMargePassive_2 = .Cells( row, 27 ).Value
vdoc.fdMargeEMechanik_2 = .Cells( row, 28 ).Value
Call vdoc.save(False,True)
row = row + 1
tmpKundennr = .Cells( row, 1 ).Value
Else
row = row + 1
tmpKundennr = .Cells( row, 1 ).Value
End If
Wend
End With
NextDoc:
' *** Disconnecting from Excel...
xlWorkbook.Close False
Excel.Quit
Set Excel = Nothing
End Sub
-
Ist die Spalte der Ansicht, in der nach der Kundennummer gesucht wird, kategoriert?
Ist im Debugger erkennbar, dass "tmpKundennr" beim GetDocumentByKey überhaupt die entsprechende Kundennummer enthält?
Gruß
Thorsten
-
In der angegebenen Zeile kann es eigentlich gar nicht knallen. Passiert das nicht eher in der Zeile davor?
-
Hallo Thorsten
stimmt du hast völlig Recht, Ich habe die Ansicht nach Kundennummer kategorisiert, Denn Debugger laufen lassen
In der xls file habe ich zwei Zeilen befüllt, in der ersten Zeile habe ich eine Kundennummer eingetragen die in der Datenbank exisiert --> Da trägt der Agent nichts ein, stimmt so
in der zweiten Zeile habe ich eine Nummer eingetrage die in der DB nicht existiert.... und aus den ganzen Feldinhalte soll der Agent ein neues Dokument erstellen
Fehlermeldung Object variable not set stelle habe ich markiert
With xlSheet
tmpKundennr = .Cells( row, 1 ).Value
Set view = db.GetView ("vwUpload")
While tmpKundennr <> ""
'tmpKundennr = .Cells( row, 1 ).Value
Set vdoc = view.GetDocumentByKey(tmpKundennr)
'If Not vdoc Is Nothing Then
If vdoc Is Nothing Then
vdoc.Form = "maLCU" --> Object variable not set
vdoc.txCustNo = .Cells( row, 2 ).Value
vdoc.txCustName = .Cells( row, 3 ).Value
vdoc.fdMandant = .Cells( row, 4 ).Value
vdoc.fdAnzahlMA = .Cells( row, 5 ).Value
-
Hallo,
vdoc exisitiert nicht und Du möchtest diesem Nichts etwas zuweisen. Ein New muß wohl erstmal her
-
stimmt du hast recht hat geklappt dankeschön =)
-
Hallo alle zusammen.
ich war mal am testen, da haben sich folgende Fehler sich herausgestellt.
1. wie schon eben erwähnt habe ich zwei kunden in der File die eine Kundennummer (Kunde A) existiert in der Ansicht und die andere Kundennummer (Kunde B))habe ich frei erfunden,
2. Den Kunden (Kunde A) der in der DB existiert, wird kein neues Dokument erstellt
3. Bei Kunde B wird ein neues Dokument erstellt so wie ich es mir vorgestellt
Wenn ich den Agenten erneut starte sollte er mir keine neuen Dokumente erstellen. Da Kunde A Kunde B bereits existiert.
Der Kunde B wird aber erneut angelegt somit habe ich das selbe Dokument mehrmals ??? ??? ??? ???
Excel.Workbooks.Open PathFileName
Set xlWorkbook = Excel.ActiveWorkbook
'Set xlSheet = xlWorkbook.Worksheets(1)
Set xlSheet = xlWorkbook.ActiveSheet ' *** Nur ein Sheet - wird hier definiert
row = 2
With xlSheet
tmpKundennr = .Cells( row, 1 ).Value
Set view = db.GetView ("vwUpload")
While tmpKundennr <> ""
'tmpKundennr = .Cells( row, 1 ).Value
Set vdoc = view.GetDocumentByKey(tmpKundennr)
If vdoc Is Nothing Then
Set vdoc = New NotesDocument(db)
vdoc.Form = "maLCU"
vdoc.txCustNo = .Cells( row, 1 ).Value
vdoc.txCustName = .Cells( row, 2 ).Value
vdoc.fdMandant = .Cells( row, 3 ).Value
vdoc.fdAnzahlMA = .Cells( row, 4 ).Value
Call vdoc.save(False,True)
row = row + 1
tmpKundennr = .Cells( row, 1 ).Value
Else
row = row + 1
tmpKundennr = .Cells( row, 1 ).Value
End If
Wend
End With
NextDoc:
' *** Disconnecting from Excel...
xlWorkbook.Close False
Excel.Quit
Set Excel = Nothing
End Sub
-
Dann kläre, warum das Dokument in der Ansicht nicht gefunden wird. Eine Möglichkeit wäre, dass die Ansicht gar nicht schnell genug aktualisiert wird.
Bernhard
-
also vom Script her sieht ihr auch keine Fehler oder?
-
Ich tippe auch eher darauf, dass die Ansicht nicht aktualisiert wurde. Daher würde ich beim Initialisieren der Ansicht diese refreshen
Set view = ...
Call view.Refresh
Wenn das dann auch nicht funktioniert, schau Dir die erste Spalte der Ansicht an, vielleicht werden da führende Nullen vorangesetzt.
Kunde A ist 11111 der funktioniert, Kunde B ist 2222, wird aber als 02222 in der Ansicht dargestellt.
Noch ein Hinweis: Verwende unbedingt Set vdoc = view.GetDocumentByKey(tmpKundennr, True), sonst findet Kundennummer 1234 den Kunden 12345
-
also vom Script her sieht ihr auch keine Fehler oder?
Das Script schaue ich mir erst gar nicht an, solange wichtige Informationen fehlen.
Vorhin war ja auch die Fehlerzeile falsch angegeben ...
Bernhard
-
Hallo,
wäre es nicht sinnvoll, statt auf die sich verändernde view zuzugreifen. die Kunden in eine collection einzulesen und dann nur auf diesen fixen Datenbestand zuzugreifen?
viele Grüße
-
In der Collection hast Du aber kein GetDocumentByKey. Ich mache das i.d.R. so, dass ich die vorhandenen Kundennummern in eine Liste (Dim kundennummern List As Integer) einlese, und dagegen vergleiche.
Man muss natürlich die Rahmenbedingungen beachten. In einer Datenbank mit vielen Dokumenten, in die nur ein paar nachimportiert werden sollen, ist es performanter, in der Ansicht nachzuschauen.
-
Danke Peter für Deinen Gedanken dazu