Autor Thema: Mal wieder dynamische Tabellen  (Gelesen 3931 mal)

Offline Sommersprosse

  • Senior Mitglied
  • ****
  • Beiträge: 296
  • Geschlecht: Weiblich
Mal wieder dynamische Tabellen
« am: 22.05.14 - 15:27:13 »
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)")

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

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)

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.
« Letzte Änderung: 27.05.14 - 09:54:11 von sommersprosse »
Gruß Ulli

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Mal wieder dynamische Tabellen
« Antwort #1 am: 23.05.14 - 10:58:52 »
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.

Offline Sommersprosse

  • Senior Mitglied
  • ****
  • Beiträge: 296
  • Geschlecht: Weiblich
Re: Mal wieder dynamische Tabellen
« Antwort #2 am: 23.05.14 - 13:44:00 »
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?



Gruß Ulli

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Mal wieder dynamische Tabellen
« Antwort #3 am: 23.05.14 - 14:13:10 »
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.

Offline Sommersprosse

  • Senior Mitglied
  • ****
  • Beiträge: 296
  • Geschlecht: Weiblich
Re: Mal wieder dynamische Tabellen
« Antwort #4 am: 23.05.14 - 15:03:29 »

 
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.
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
So wie das aussieht kann er J und K nicht höher wie 1 setzen.

Ist das Feld nicht Typ Name funktioniert es.
Gruß Ulli

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Mal wieder dynamische Tabellen
« Antwort #5 am: 23.05.14 - 15:07:50 »
Einen Zusammenhang mit dem Feldtyp "Names" kannst Du zu 100% ausschliessen.

Ist es vielleicht sowas schlichtes wie ein vergessener Haken bei "Mehrfachwerte zulassen"? Ein kurzer Blick zeigt ja, daß ein Ubound auch eine Rolle im Code spielt.

Bernhard

Offline Sommersprosse

  • Senior Mitglied
  • ****
  • Beiträge: 296
  • Geschlecht: Weiblich
Re: Mal wieder dynamische Tabellen
« Antwort #6 am: 23.05.14 - 15:24:47 »
Hallo Bernhard,

ich wundere mich nur das er mit leeren Feldern umgehen kann, wenn sie nicht die Eigenschaft "Namen" haben. Ändere ich den Typ von namen auf Text kratzt ihn das gar nicht und er erweitert mir mein Protokoll um eine Zeile.

Zitat
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

Lasse ich aber in eine Zeile mal den Namen weg und möchte eine neue Zeile erstellen passiert eben dieser Fehler.
Mehrfachwerte hab ich gecheckt. Sind alle gesetzt.
Hab noch einen Screenshot angehängt..... vielleicht hilft der was.

Ist das Feld responsible immer mit einem Namen gefüllt, geht's.
« Letzte Änderung: 23.05.14 - 15:33:16 von sommersprosse »
Gruß Ulli

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Mal wieder dynamische Tabellen
« Antwort #7 am: 23.05.14 - 15:56:41 »
In dem Screenshot vom Debugger wäre jetzt interessant, wie viele Werte Field und Newfield haben.

EDIT: Quatsch, kann man ja sehen ...

Newfield hat zwei Werte, j ist 1, also wird der zweite Wert gefüllt. Die Fehlermeldung an der Stelle ist m.E. sinnfrei.

Was passiert, wenn Du das etwas umschreibst?

Anstelle von

ResField = ExpandField(Doc.Responsible)

probier mal

Resfield = Doc.Responsible
Resfield = ExpandField (Resfield)

Dann kann auf keinen Fall irgendetwas aus der Maske dazwischengehen. (Obwohl ich mir es selbst kaum vorstellen kann, dass die Eingabevalidierung da zuschlagen sollte)
« Letzte Änderung: 23.05.14 - 16:03:23 von Peter Klett »

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Mal wieder dynamische Tabellen
« Antwort #8 am: 23.05.14 - 16:18:59 »
Noch was ganz anderes. Neulich wollte ich ein Feld mit Mehrfachwerten so füllen, dass Elemente davon leer sind. Beim F9 oder Speichern werden die leeren von Notes immer gelöscht, zumindest habe ich nichts gefunden, womit ich das verhindern konnte (Habe es dann mit einem einfachen Textfeld gelöst und schreibe über Script ein Item in das Dokument, das nicht als Feld in der Maske vorkommt).

Vielleicht ist das hier auch so etwas. Du hast definitiv 3 Zeilen, k ist 3, weil eine neue Zeile (die vierte (incl. der 0)) eingefügt werden soll. Alle anderen Arrays haben auch 4 Elemente (das letzte ist leer), nur Dein Newfield hat nur zwei. Das passt später sowieso nicht zu den anderen Werten.

Ich vermute, dass der Fehler nicht an der Stelle auftritt, die Du vermutest (denn die Routine sieht an der Stelle sauber aus), sondern direkt danach, wenn durch alle Arrays durchgegangen wird, und dann das ResField nicht genügend Elemente hat.

Poste mal die Routine ClearFields, der Fehler könnte darin stecken.

Offline Sommersprosse

  • Senior Mitglied
  • ****
  • Beiträge: 296
  • Geschlecht: Weiblich
Re: Mal wieder dynamische Tabellen
« Antwort #9 am: 23.05.14 - 16:46:08 »
oh man.... es lag doch an der Formatierung der Felder!

Die Tücke steckt im Detail....
Die Mehrfachwerte wurden nicht korrekt getrennt, in den Optionen war eingestellt Werte trennen bei EIngabe von Komma, Semikolon und Neue Zeile und anzeigen mit Komma.

letzteres geändert auf nur Semikolon und neue Zeile weggelassen, jetzt kann er alle Einträge auslesen und darstellen.
Die Darstellung wie in Bild3 hat mich stuzig gemacht,

Hey vielen Dank für's mitdenken.
Bernhard ich hätte deinem Tipp gleich genauer nachgehen sollen, aber manchmal ist man da einfach blind.
Peter deine Vermutung war in diesem Fall auch richtig
nur Dein Newfield hat nur zwei. Das passt später sowieso nicht zu den anderen Werten.


Sieht jetzt mal gut aus.
Schönes WE

« Letzte Änderung: 23.05.14 - 16:49:23 von sommersprosse »
Gruß Ulli

Offline Sommersprosse

  • Senior Mitglied
  • ****
  • Beiträge: 296
  • Geschlecht: Weiblich
Re: Mal wieder dynamische Tabellen
« Antwort #10 am: 27.05.14 - 10:04:21 »
Guten Morgen,

muss meinen Thread noch einmal aufgreifen...
hab noch eine Sache festgestellt, die mir noch nicht ganz so gefällt.

Um das zu verdeutlichen habe ich noch einmal einen Screenshot beigefügt.
Das feld Description ist eigentlich das Hauptfeld und dazu gedacht Protokollergebnisse festzuhalten. Hier kann natürlich wenig oder auch viel text eingegeben werden.
Wird viel Text eingegeben, verschwindet der Zeilenzusammenhang, da ja in den anderen Feldern kein neues Feld nur wegen viel Text hinzugefügt wird.
Kann ich das ganze lösen in dem ich nach jeder "Zeile" einen Zeilenumbruch einfüge? Geht das mit dieser Art überhaupt, oder muss ich meine Programmierung komplett umstellen, was ich ungern machen würde.

Hoffe mein Problem ist klar, wenn nicht fragen.
Gruß Ulli

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Mal wieder dynamische Tabellen
« Antwort #11 am: 27.05.14 - 10:29:49 »
Das ist das Problem dieser Art von "Tabellen", und Du hast m.W. auch keine Chance, dieses Verfahren so zu ändern, dass es befriedigender wird. Du könntest theoretisch die Anzahl Buchstaben in der Description validieren, aber es macht einen riesigen Unterschied, ob jemand 100 i's oder m's schreibt. Eine Eigenschaft für die Länge eines Strings (in Zentimetern oder Pixel) gibt es nicht.

Außerdem weißt Du nicht, wie breit jeweils der Bildschirm eines Benutzers ist. Und auch, wenn der Text passt, kann ein anderer das Fenster kleiner schieben, dann passt es nicht mehr.

Einen Zeilenumbruch einzufügen, würde nur bedeuten, dass die einzelnen Zeilen deutlicher getrennt sind, Verschiebungen wird es trotzdem geben.

Die anderen Alternativen haben auch alle ihre eigenen Nachteile, einige davon wären:

Hart definierte Tabelle mit einer festen Anzahl Zeilen, die verborgen werden, falls sie leer sind

Tabelle als Richtext erzeugen

Unterpunkte als eigene Dokumente gestalten und in einer eingebetteten Ansicht anzeigen

Offline Sommersprosse

  • Senior Mitglied
  • ****
  • Beiträge: 296
  • Geschlecht: Weiblich
Re: Mal wieder dynamische Tabellen
« Antwort #12 am: 27.05.14 - 10:40:08 »
Hallo Peter,

ich habs fast befürchtet...

Hart definierte Tabelle mit einer festen Anzahl Zeilen, die verborgen werden, falls sie leer sind

war meine erste Idee, aber dann sind die Zeilen zu wenig, dem anderen wieder zuviel...vielleicht leite ich das aber mal weiter an das Kremium die die Idee mit dieser Protokoll DB hatte.
Hab ich zwar auch noch nicht gemacht, muss ich mich reinlesen...

Wäre schade die jetztige Arbeit wegzuschmeißen und alles noch mal neu zu machen und komplett umzustellen.
Nach welchen Klassen muss ich da schauen?
Wäre für nen kurzen Tipp dankbar.

Gruß Ulli

Driri

  • Gast
Re: Mal wieder dynamische Tabellen
« Antwort #13 am: 27.05.14 - 10:54:08 »
Ich habe so etwas ähnliches mal als berechnete Tabelle im Richtext umgesetzt. Das funktioniert vermutlich am saubersten, denn die anderen beiden von Peter genannten Alternativen haben auch ihre Einschränkungen (z.B. hast Du in einer eingebetteten Ansicht auch die Beschränkungen, da max. 9 Zeilen je Dokument verwendet werden können).

Eine Tabelle im Richtext kannst Du via NotesRichTextNavigator und NotesRichTextTable erzeugen. Je Wert in dem Multivalue-Field mußt Du dann einfach eine Tabellenzeile erzeugen und die Werte in die Zellen schreiben (Sprünge zwischen den Zellen dann über den Navigator).

Offline Sommersprosse

  • Senior Mitglied
  • ****
  • Beiträge: 296
  • Geschlecht: Weiblich
Re: Mal wieder dynamische Tabellen
« Antwort #14 am: 27.05.14 - 10:59:57 »
Na hurra....

aber so kann ich es in der Tat nicht lassen, da hauen mir die Leute das um die Ohren...

Kann ich die Protokolleinträge auch über die Dialogboxen erfassen, oder funktioniert das nach einem ganz anderen Prinzip (nein ich hab die Hilfe noch nicht im detail gelesen)?

Gruß Ulli

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Mal wieder dynamische Tabellen
« Antwort #15 am: 27.05.14 - 11:07:17 »
Du hast zwei Baustellen, zum einen, wie Du zu den Daten kommst, und zum anderen, wie Du sie darstellst.

Dein Problem ist die zweite Baustelle, die Darstellung, also brauchst Du an der ersten (-> Dialog) nichts zu ändern. Die über den Dialog erhaltenen Daten musst du halt anders verarbeiten.

Offline Sommersprosse

  • Senior Mitglied
  • ****
  • Beiträge: 296
  • Geschlecht: Weiblich
Re: Mal wieder dynamische Tabellen
« Antwort #16 am: 27.05.14 - 11:37:22 »
alles klar,

dann werd ich mal wieder ein neues Programmierthema angehen.

Wenn ich nicht weiterkomme melde ich mich wieder, gibt ja einige Beispiele im Netz.

Danke Euch
Gruß Ulli

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz