Das Notes Forum
Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: chriss76 am 23.05.05 - 11:39:22
-
Hallo,
ich lese den Inhalt einiger tausend Excelzellen in ein Rich Text Feld ein!
Dabei ist mir aufgefallen, dass bei ca. 1000 Zeilen, das Feld "voll" ist,
dann wird immer die letzte Zeile durch den nächsten Datensatz überschrieben!
Ich bekomme keinerlei Fehlermeldung, dass das Feld voll ist, denn auch das Einfügen per Hand ist noch problemlos möglich.
1. Welche Größenbegrenzung liegt auf einem Rich Text Feld (64 KB) ??
2. Gibt es ein anderes Feld, das ich benutzen kann?
3. Gibt es andere Möglichkeiten die Datensätze in ein Feld einzulesen, die Datensätze
sind niemals gleich?
Danke im voraus
Chris
-
Die maximale Größe eines Absatzes in einem Rich Text Feld ist 64 KB.
Wenn Du hinter jeder Deiner Zeile einen Absatzumbruch / Zeilenumbruch einfügst, kannst Du also beliebig viel importieren.
Andreas
-
Hallo Andreas,
ich mache immer einen Zeilenumbruch, trotzdem wird ab einem bestimmten Datensatz
nichts mehr hinzugefügt, sondern nur noch der vorherige Datensatz überschrieben.
(Ich weiss den Datensatz natürlich nicht vorher, aber ich schätze ab ca. 800 vorhandenen Einträgen gibt es Probleme)
Ich lese das Excelfile von meinem PC direkt online auf dem Server mit LS ein.
Die Datensätze sehen z.B. so aus:
Zb01 Test für alle Rollen
zb02 Zweiter Test
......
Mit den Daten möchte ich nichts weiter machen, sondern
sie sollen nur zur Information dargestellt werden.
Hast Du oder jemand anderes noch eine Idee, warum es nicht funktioniert?
Oder welche Routine könnte ich schreiben?
Ich hatte vielleicht gedacht, nach ca. 800 Zeilen, immer ein neues Feld zu generieren und wieder 800 Sätze einzulesen? Geht das überhaupt, wenn Ja, wie??
Chris
-
Zeilenumbruch oder neuer Abschnitt? Das ist nicht dasselbe ... mit welchem LS-Befehl erzeugst Du denn die neue Zeile?
-
Liest Du die Daten ins Frontend oder ins Backend ein?
Ich denke, im Backend gibt es das Problem, da nützt dann auch ein Zeilenumbruch nichts.
Notes legt mehrere Items gleichen Namens an, wenn die 64 K Grenze überschritten wird.
Das könntest Du auch versuchen, nach 800 Einträgen dann ein
Set notesItem = notesDocument.AppendItemValue( itemName$, value )
Damit wird ein neues Item (Feld) angelegt, auch wenn es dieses bereits gibt.
Ob es dann allersdings mit der Anzeige im Frontend klappt, weiß ich nicht.
Andreas
-
Hallo,
Zeilenumbruch mache ich mit Chr$(10)!
Ich lese die Daten ins Frontend ein, habe also kein Dokument offen!
Ideen???
Chris
-
Das ergibt nur einen Zeilenumbruch, keinen Abschnitt. Schau Dir die NotesRichtTextItem Klasse in der Hilfe mal an und dort die AddNewLine Methode, der zweite Parameter erzwingt einen neuen Paragraphen
-
Hallo,
bekomme bei AddNewLine folgende Fehlermeldung:
"Instance member ADDNEWLINE does not exist"
Dann habe ich die Prüfung auf RichTEXT-Item eingebaut und das
Feld (rlTransaction_description), das ich brauche ist gar nicht vom Typ Richtext, sondern 1280.
In der Maske hat das Feld "Rich Text" als Feldtyp und ist bearbeitbar!
Dim rtitem As Variant
Set rtitem = nd.GetFirstItem( "rlTransaction_description" )
If ( rtitem.Type = RICHTEXT ) Then
Call rtitem.AddNewLine(1)
Call rtitem.AppendText(strTransactionDesc)
End If
Call nd.Save(True,True)
Was ist jetzt falsch??
Chris
-
Jetzt also nun doch Backend !?
Andreas
-
Hallo Andreas,
Du hast selbstverständlich Recht, Backend ist richtig, habe vorhin zu schnell geantwortet und nicht nachgedacht.
Sorry nochmals, hast Du jetzt noch einen Gedanken mehr?!
Chris
-
Kannst Du uns mal etwas mehr Code spendieren?
Wie wird "rlTransaction_description" gesetzt?
Andreas
-
Hallo Andreas,
rlTransaction_description ist der Name eines Feldes in der Maske!
Anbei die ganze Routine!
Sub ExcelUpload_roleinformation()
On Error Goto ErrorHandler
Dim strWert As String
strWert=Msgbox("Would you like to upload an Excel sheet ==> role information, -details?", 1, "Attention! Data will be changed!")
If strWert = 2 Then
Exit Sub
End If
Dim strPath As String
strPath=Inputbox$("Path of Excel file","Excel Upload","C:\P13_rollen_information_test.xls")
If strPath<>"" Then
'Initiate Excel
Dim xlApp As Variant
Dim xlWorkbook As Variant
Set xlApp=CreateObject("excel.application")
xlApp.Visible=True
Set xlWorkbook=xlApp.Workbooks.Open(strPath)
'Initialize
Dim ns As New NotesSession
Dim ndb As notesDatabase
Set ndb=ns.CurrentDatabase
Dim counter As Long
Dim strRole As String
Dim strDesc As String
Dim strDatestart As String
Dim strDateend As String
Dim strTransaction As String
Dim strTransactionDesc As String
Dim strOwner As String
Dim strStandin As String
Dim nd As NotesDocument
Dim ni As NotesItem
'neue Zeile
Dim rtitem As Variant
counter=1
Dim help_role As String
help_role = ""
With xlWorkbook.Worksheets(1)
Do While .Range("A" + Cstr(counter)).Value <>""
strRole = ""
strDesc=""
strTransaction=""
strTransactionDesc=""
'Daten werden zeilenweise aus dem Excelfile ausgelesen
strRole=.Range("A" + Cstr(counter)).Value
strDesc=.Range("B" + Cstr(counter)).Value
strTransaction=.Range("C" + Cstr(counter)).Value
strTransactionDesc=.Range("D" + Cstr)(counter)).Value
'Wenn es das erste Dokument ist, dann wird auch der Vergleichswert
'help_role gefüllt. Dieser wird benötigt, um zu vergleichen, ob 2
'aufeinander folgende Rolle gleich sind.
'das kann ja beim ersten Dokument nicht der Fall sein
If counter = 1 Then
help_role = strRole
Set nd=ndb.CreateDocument()
Call nd.ReplaceItemValue("Form","fa_Role_info")
Set ni=nd.ReplaceItemValue("AccessAdmin","[Admin]")
ni.IsAuthors=True
strTransactionDesc = strTransaction + " " + strTransactionDesc
Call nd.ReplaceItemValue("rlTitle",strRole)
Call nd.ReplaceItemValue("rlComment",strDesc)
'Call nd.ReplaceItemValue("rlDatestart",strDatestart)
'Call nd.ReplaceItemValue("rlDateend",strDateend)
Call nd.ReplaceItemValue("rlTransaction_description",strTransactionDesc)
'Call nd.ReplaceItemValue("rlOwner",strOwner)
'Call nd.ReplaceItemValue("rlStandin",strStandin)
Call nd.Save(True,True)
Else
'ab hier wenn läuft die Schleife, wenn es nicht das erste Dokument ist
If strRole <> help_role Then
' wenn die akuelle Rolle nicht mit der davorgehenden Rolle übereinstimmt,
' dann wird einfach ein neues Dokument angelegt und der Wert von help_role
' wird durch den gerade aktuellen Wert überschrieben
Set nd=ndb.CreateDocument()
Call nd.ReplaceItemValue("Form","fa_Role_info")
Set ni=nd.ReplaceItemValue("AccessAdmin","[Admin]")
ni.IsAuthors=True
strTransactionDesc = strTransaction + " " + strTransactionDesc
Call nd.ReplaceItemValue("rlTitle",strRole)
Call nd.ReplaceItemValue("rlComment",strDesc)
'Call nd.ReplaceItemValue("rlDatestart",strDatestart)
'Call nd.ReplaceItemValue("rlDateend",strDateend)
Call nd.ReplaceItemValue("rlTransaction_description",strTransactionDesc)
'Call nd.ReplaceItemValue("rlOwner",strOwner)
'Call nd.ReplaceItemValue("rlStandin",strStandin)
Call nd.Save(True,True)
help_role = strRole
Elseif strRole = help_role Then
'wenn die aktuelle Rolle mit der davorgehenden Rolle übereinstimmt
Dim help_strTransactionDesc As String
help_strTransactionDesc = ""
Set rtitem = nd.GetFirstItem( "rlTransaction_description" )
'Get description from the existing document
'alle Dokumente müssen sortiert vorliegen
'help_strTransactionDesc = nd.rlTransaction_description(0)
'im gerade aktuellen Dokument werden die Transaktion und
'die Transaktionsbeschreibung zusammen gefügt
strTransactionDesc = strTransaction + " " + strTransactionDesc
'die Transaktion und die Beschreibung werden mit einem Return an
'die bereits bestehenden Daten angehängt
'strTransactionDesc = help_strTransactionDesc + Chr$(10) + strTransactionDesc
If ( rtitem.Type = RICHTEXT ) Then
'...use NotesRichTextItem methods...
Call rtitem.AddNewLine(1)
Call rtitem.AppendText(strTransactionDesc)
End If
Call rtitem.AddNewLine(1)
Call rtitem.AppendText(strTransactionDesc)
'Anhängen des Strings
'Call nd.ReplaceItemValue("rlTransaction_description",strTransactionDesc)
Call nd.Save(True,True)
End If
End If
'Counter für Excelzeile wird um 1 erhöht
counter=counter+1
Loop
End With
'Schliessen von Excel
Call xlApp.Quit
End If
ExitSub:
Exit Sub
ErrorHandler:
Msgbox Cstr(Err) + " -" + "BaseFunctionsLib\ExcelUpload_roleinformation: " + Error$ + ", Excel Line: "+ Cstr(counter), 16, "Error"
Goto ExitSub
End Sub
-
Das ganze müsste so aussehen:
Sub ExcelUpload_roleinformation()
On Error Goto ErrorHandler
Dim strWert As String
strWert=Msgbox("Would you like to upload an Excel sheet ==> role information, -details?", 1, "Attention! Data will be changed!")
If strWert = 2 Then
Exit Sub
End If
Dim strPath As String
strPath=Inputbox$("Path of Excel file","Excel Upload","C:\P13_rollen_information_test.xls")
If strPath<>"" Then
'Initiate Excel
Dim xlApp As Variant
Dim xlWorkbook As Variant
Set xlApp=CreateObject("excel.application")
xlApp.Visible=True
Set xlWorkbook=xlApp.Workbooks.Open(strPath)
'Initialize
Dim ns As New NotesSession
Dim ndb As notesDatabase
Set ndb=ns.CurrentDatabase
Dim counter As Long
Dim strRole As String
Dim strDesc As String
Dim strDatestart As String
Dim strDateend As String
Dim strTransaction As String
Dim strTransactionDesc As String
Dim strOwner As String
Dim strStandin As String
Dim nd As NotesDocument
Dim ni As NotesItem
Dim rtitem As NotesRichTextItem
counter=1
Dim help_role As String
help_role = ""
With xlWorkbook.Worksheets(1)
Do While .Range("A" + Cstr(counter)).Value <>""
strRole = ""
strDesc=""
strTransaction=""
strTransactionDesc=""
'Daten werden zeilenweise aus dem Excelfile ausgelesen
strRole=.Range("A" + Cstr(counter)).Value
strDesc=.Range("B" + Cstr(counter)).Value
strTransaction=.Range("C" + Cstr(counter)).Value
strTransactionDesc=.Range("D" + Cstr)(counter)).Value
'Wenn es das erste Dokument ist, dann wird auch der Vergleichswert
'help_role gefüllt. Dieser wird benötigt, um zu vergleichen, ob 2
'aufeinander folgende Rolle gleich sind.
'das kann ja beim ersten Dokument nicht der Fall sein
If counter = 1 Then
help_role = strRole
Set nd=ndb.CreateDocument()
Call nd.ReplaceItemValue("Form","fa_Role_info")
Set ni=nd.ReplaceItemValue("AccessAdmin","[Admin]")
ni.IsAuthors=True
strTransactionDesc = strTransaction + " " + strTransactionDesc
Call nd.ReplaceItemValue("rlTitle",strRole)
Call nd.ReplaceItemValue("rlComment",strDesc)
'Call nd.ReplaceItemValue("rlDatestart",strDatestart)
'Call nd.ReplaceItemValue("rlDateend",strDateend)
Set rtitem = New NotesRichTextItem( nd, "rlTransaction_description")
Call rtitem.AppendText(strTransactionDesc)
'Call nd.ReplaceItemValue("rlOwner",strOwner)
'Call nd.ReplaceItemValue("rlStandin",strStandin)
Call nd.Save(True,True)
Else
'ab hier wenn läuft die Schleife, wenn es nicht das erste Dokument ist
If strRole <> help_role Then
' wenn die akuelle Rolle nicht mit der davorgehenden Rolle übereinstimmt,
' dann wird einfach ein neues Dokument angelegt und der Wert von help_role
' wird durch den gerade aktuellen Wert überschrieben
Set nd=ndb.CreateDocument()
Call nd.ReplaceItemValue("Form","fa_Role_info")
Set ni=nd.ReplaceItemValue("AccessAdmin","[Admin]")
ni.IsAuthors=True
strTransactionDesc = strTransaction + " " + strTransactionDesc
Call nd.ReplaceItemValue("rlTitle",strRole)
Call nd.ReplaceItemValue("rlComment",strDesc)
'Call nd.ReplaceItemValue("rlDatestart",strDatestart)
'Call nd.ReplaceItemValue("rlDateend",strDateend)
Call rtitem.AddNewLine(1)
Call rtitem.AppendText(strTransactionDesc)
'Call nd.ReplaceItemValue("rlOwner",strOwner)
'Call nd.ReplaceItemValue("rlStandin",strStandin)
Call nd.Save(True,True)
help_role = strRole
Elseif strRole = help_role Then
'wenn die aktuelle Rolle mit der davorgehenden Rolle übereinstimmt
Dim help_strTransactionDesc As String
help_strTransactionDesc = ""
'Get description from the existing document
'alle Dokumente müssen sortiert vorliegen
'help_strTransactionDesc = nd.rlTransaction_description(0)
'im gerade aktuellen Dokument werden die Transaktion und
'die Transaktionsbeschreibung zusammen gefügt
strTransactionDesc = strTransaction + " " + strTransactionDesc
'die Transaktion und die Beschreibung werden mit einem Return an
'die bereits bestehenden Daten angehängt
'strTransactionDesc = help_strTransactionDesc + Chr$(10) + strTransactionDesc
'Anhängen des Strings
'Call nd.ReplaceItemValue("rlTransaction_description",strTransactionDesc)
Call nd.Save(True,True)
End If
End If
'Counter für Excelzeile wird um 1 erhöht
counter=counter+1
Loop
End With
'Schliessen von Excel
Call xlApp.Quit
End If
ExitSub:
Exit Sub
ErrorHandler:
Msgbox Cstr(Err) + " -" + "BaseFunctionsLib\ExcelUpload_roleinformation: " + Error$ + ", Excel Line: "+ Cstr(counter), 16, "Error"
Goto ExitSub
End Sub
-
Moin,
ich habe das letzte Coding eingebaut, aber leider wird der Upload dadurch so langsam, dass ich ihn nicht gebrauchen kann.
Ich habe den Rechner die ganze Nacht laufen lassen und er hat gerade mal 6000 von 30000 Sätzen eingelesen und ich weiss nicht warum es so lange gedauert hat.
Am Anfang startet er flott, wird dann aber zusehendest langsamer!
Hat jemand noch eine Idee?
Chris