Domino 9 und frühere Versionen > ND8: Entwicklung
Mal wieder dynamische Tabellen
Sommersprosse:
Hallo Forumsgemeinde,
ich kämpfe mit einer dynamischen Tabelle die ich aufgrund dieser Vorlage erstellt habe.
https://www.eview.com/eview/volr6.nsf/0/832B3F91849B005F852565FB00574907/$File/Dynamic%20Tables%20MJ%20978.pdf
In meinem Fall wird ein Protokoll erstellt, welches per Link dann an die Kalender einträge kopiert werden kann, aber in einer eigenen Datenbank abgelget werden.
Da ich im Vorfeld nicht sagen kann wieviel Einträge ein Meetingprotkoll hat habe ich mich für eine dynamische Tabelle entschieden, bei der die Felder nach Bedarf erstellt werden.
Zum Füllen der Felder wird eine Dialogbox aufgerufen:
--- Code: ---@If(TopNumber="";@Return(@Command([ToolsRunMacro];"(AddFirstRow)"));@Success);
numbers := "0" : "1" : "2" : "3" : "4" : "5" : "6" : "7" : "8" : "9";
list := @Text(@TextToNumber(@Subset(numbers *+ numbers;-99)));
listofElements := @Subset(list;@Elements(TopNumber));
selections := "0. First Row" :(listofelements + ". " + TopNumber);
InsertionPoint := @Prompt([OkCancelList] :[NoSort];"Selection Box"; "Select the row number you wish your new item to appear below.";@Subset(Selections;-1);Selections);
@If(InsertionPoint = 1;@Return(@Prompt([Ok]; "Error Message"; "No value selected. Process canceled."));@Success);
ENVIRONMENT EnvIP := @Word(InsertionPoint;". ";1);
@Command([ToolsRunMacro]; "(AddRow)")
--- Ende Code ---
In meiner Dialogbox sind folgende Felder enthalten:
htopnumber - typ Text, hDescription - typ Text, hstatus - typ Kombinationsfeld, hresponsible - typ Name und hEnddate - typ Date
Die Werte der Dialobox werden dann in die eigentliche Tabelle geschrieben und zwar mit diesem Code
--- Code: ---Option Public
Option Declare
Use "SharedVariables"
Dim InsertionPoint As Integer
Dim NumField As Variant
Dim DesField As Variant
Dim StatField As Variant
Dim ResField As Variant
Dim EnddField As Variant
Sub Initialize
'********************************************************************************************************
'* Created: January 5, 1998
'* Author: Betsy Thiede (Richmond Information Group) with much help from Gary Shifflett
'* Purpose: Adds information from the hidden fields to the place where user indicated.
'* Parameters: None
'* Called by:
'* Calls: GetCurrentField, ClearFields, SetTableFields
'*`Title: AddRow
'********************************************************************************************************
InsertionPoint = Cint(Trim(Session.GetEnvironmentString("EnvIP")))
Call GetCurrentFields() 'Get values of existing fields
Call ClearFields() 'Initialize hidden fields
If Workspace.DialogBox( "db_Detail", True,True, False, True, False,False, "Enter New Characteristic") Then
Call SetTableFields
End If
Call UiDoc.Reload
Call UiDoc.Refresh
End Sub
Function ExpandField(Field As Variant) As Variant
Dim NewField() As String 'Array to temporarily store the new "expanded" field.
Dim J As Integer 'Index counter for new field
Dim K As Integer 'Index counter for existing field.
Redim NewField(Ubound(field)+1)
k = 0
For j=0 To Ubound(field) + 1
If J <> InsertionPoint Then
NewField(j) = Field(k) 'transfer value from existing field to new field.
k = k + 1
Else
Newfield(j) = "" 'setting the new field's element to blank(k not incremented. J & K are now out of sync by one)
End If
Next
Expandfield = newfield
End Function
Sub SetTableFields
NumField(InsertionPoint) = Doc.hTopNumber(0)
DesField(InsertionPoint) = Doc.hDescription(0)
StatField(InsertionPoint) = Doc.hStatus (0)
ResField(InsertionPoint) = Doc.hResponsible (0)
EnddField(InsertionPoint) = Doc.hEndDate(0)
Doc.TopNumber = NumField
Doc.Description = DesField
Doc.Status = StatField
Doc.Responsible = ResField
Doc.EndDate = EnddField
End Sub
Sub GetCurrentFields
NumField = ExpandField(Doc.TopNumber)
DesField = ExpandField(Doc.Description)
StatField = ExpandField(Doc.Status)
ResField = ExpandField(Doc.Responsible)
EnddField = ExpandField(Doc.EndDate)
End Sub
--- Ende Code ---
In der Hauptmaske sind die Felder entsprechend vorhanden und auch identisch typisiert wie in der Dialogbox.
Soweit so gut.
Folgendes Problem: Ich erstelle mein Protokoll und lege als Bsp. zwei Zeilen an, lasse in diesem Fall aber das Feld responsible leer. Bei der dritten Zeile fällt er auf die Nase mit Suscript out of range und zwar lt. Debugger an dieser Stelle
--- Code: ---Newfield(j) = "" 'setting the new field's element to blank(k not incremented. J & K are now out of sync by one)
--- Ende Code ---
Bei allen anderen Feldern kann er mit leeren Feldern umgehen, nur beim Typ Name nicht?
Stimmt was an der Declaration nicht? Steh' grad auf'm Schlauch.
Ich hoffe das ich mein Problem genau genug beschrieben habe und Euch nicht nur Code erschlagen habe, bei Fragen melden.
Peter Klett:
Schau mal im Debugger an dieser Stelle:
Welchen Wert hat j?
Wieviele Elemente hat Newfield?
Vielleicht kommst Du dann weiter. Das Script sieht m.E. korrekt aus.
Sommersprosse:
Hallo Peter,
danke für's anschauen des Scriptes. So wie das aussieht kann er J und K nicht höher wie 1 setzen.
Er stellt noch fest das J <> INSERTIONPOINT ist, soll dann ein neues Feld erstellen und macht das nicht, weil er kein Namen Feld erstellen kann..?!?
Ich habe gerade mal die Eigenschaft des Feldes auf Text anstatt Namen geändert, hier hat er keine Probleme.
Macht eventuell das @UpperCase(@Name([CN];Responsible)) Probleme?
Peter Klett:
Hm, Du machst es einem nicht leicht ...
Ich kann Dir nicht sagen, ob das @UpperCase(@Name([CN];Responsible)) Probleme macht, denn nirgendwo in Deinem dargestellten Script oder der Formel steht das. Damit ist das von einem Leser aus der Distanz nicht bewertbar.
Es wird auch kein neues Feld erstellt, sondern es wird ein Array aufgebaut, das um einen Eintrag verlängert und entsprechend gefüllt wird.
Das ganze passiert hier (verkürzt dargestellt)
Redim NewField(Ubound(field)+1)
For j=0 To Ubound(field) + 1
If J <> InsertionPoint Then
Else
Newfield(j) = ""
End If
Next
Gemäß Script hat Newfield ein Element mehr als field. J läuft von 0 bis Anzahl Elemente field + 1. Normalerweise kann Dein Fehler nicht auftreten, denn j ist immer in der Range von Newfield.
Da er aber doch auftritt, musst Du im Debugger schauen, was für Werte vorhanden sind. Dazu musst Du im Debugger unten auf "Variablen" gehen, und Dir, wie vorhin beschrieben, die Variablen ansehen. Eventuell ist dann etwas zu erkennen, was nicht passt.
Sommersprosse:
--- Zitat von: Peter Klett am 23.05.14 - 14:13:10 ---Ich kann Dir nicht sagen, ob das @UpperCase(@Name([CN];Responsible)) Probleme macht, denn nirgendwo in Deinem dargestellten Script oder der Formel steht das. Damit ist das von einem Leser aus der Distanz nicht bewertbar.
--- Ende Zitat ---
Sorry hab ich vergessen zu schreiben. Steht in der Eingabevalidierung des Feldes responsible.
Im debugger hab ich bei den Variablen geschaut, die Felder J und K bekommen nie den Wert höher als 1.
Genau das habe ich damit gemeint
--- Zitat von: sommersprosse am 23.05.14 - 13:44:00 ---So wie das aussieht kann er J und K nicht höher wie 1 setzen.
--- Ende Zitat ---
Ist das Feld nicht Typ Name funktioniert es.
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln