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:
| @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)") |
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
| 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 |
| |
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
Newfield(j) = "" 'setting the new field's element to blank(k not incremented. J & K are now out of sync by one)
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.