Parameter-Übergabe bei Form-Aufruf mit Filtergroups

18. Dezember 2006 14:01

Hallo Allerseits,

beginnen wir mit der Vorstellung:

Ich bin neu hier (klar, sieht man schon am Beitrags-Zähler).

Ich hab von C/AL so viel Ahnung wie eine kuh vom Fliegen (d.h. ich bin sogar unfähg, effizient die Suchfunktion zu benutzen, weil ich die Terminologe nicht beherrsche; also sorry im Voraus, wenns meine Fragen schon gab)

Das Positive: Wenn Ihr mal Fragen zu gefährlichen Chemikalien habt, dann habt Ihr jetzt jemanden im Forum, der die beantworten kann. ;)

Nun zu meinem Problem:

Ich will zu Stammdatensätzen Bemerkungen erfassen können, ähnlich wie es mit diesem Bleistift-Button von der Item-Karte aus möglich ist. Hierzu hab ich mir eine eigene Bemerkungs-Tabelle angelegt, mit dem Bemerkungstyp (Option-Feld mit 3 verschiedenen Options), einem Feld für meine Stammdaten-ID, einem Lfd-Nr-Feld, einem Datums-Feld und dem Textfeld für die Bemerkungen.

Hierzu das passende Listen-Formular gebaut und die Aufrufe auf der Stammdaten-Karte implementiert: Über die Push-Action rufe ich das Listen-Formular auf, und über die RunFormLink-Eigenschaft gebe ich die Parameter mit für den Filter. In der Listen-Form hab ich auch die Eigenschaft für den Auto-Split aktiviert.

Funktioniert alles ganz wunderbar, ich bekomme die Datensätze angezeigt, die mich interessieren, und ich kann problemlos neue Bemerkungen anlegen.

Nun ist es ja so, daß ich die Filter-Paramter über Ctrl+F7 aufrufen und löschen kann. Dann sehe ich in meiner List-Form alle Einträge.

Um dies zu unterbinden, nutze ich die Filtergroups und hab da jetzt folgenden Code im OpenForm-Trigger der List-Form:

Code:

IF (GETFILTER("Comment Type") <> '') AND (GETFILTER("No.") <> '') THEN BEGIN
   lFilterStr := GETFILTER("Comment Type");
   lNo := GETFILTER("No.");

   SETRANGE("Comment Type");
   SETRANGE("No.");

   FILTERGROUP(2);
   SETFILTER("Comment Type",lFilterStr);
   SETFILTER("No.",lNo);
   FILTERGROUP(0);
END;


Nun läßt sich der Filter vom Benutzer nicht mehr lösen - so weit, so gut.

Allerdings verschluckt sich das Progrämmle, wenn ich neue Datensätze anlegen will. Offenbar bekommt er es nicht gebacken, die Parameter Comment Type und No. richtig zu übernehmen: Der Auto-Split funktioniert einwandfrei, aber die Option ist immer die erste (Default?) und das No.-Feld bleibt leer.

Was mach ich falsch?

Viele Grüße,

SF

18. Dezember 2006 14:09

Allerdings verschluckt sich das Progrämmle, wenn ich neue Datensätze anlegen will. --> was meinst du genau damit?

18. Dezember 2006 14:31

Ohgott - wie sag ich's meinem Kinde?

sagen wir mal, ein Stammdaten-Typ sei der "PKW".
ein anderer Stammdatentyp sei der "LKW".

Meine Bemerkungstabelle hat:

Comment Type, No., Line No., Date, Comment.

Ich stehe auf der PKW-Karte mit der No. PKW-3. Dort drücke ich auf den Button.

Über die Push-Action wird meine List-Form aufgerufen. Über die RunFormLink-Eigenschaft gebe ich mit:

Comment Type=CONST(1),No.=FIELD(No.)

Der Filter in der List-Form wird ordentlich auf

Comment type = 1
No. = PKW-3

gesetzt.

analog würde es von der LKW-Form aus laufen, nur wäre da der Comment-Type = 2.

Funktioniert wunderbar.
Wenn ich ein leeres Filterergebnis bekomme (also noch keine Bemerkung eingetragen ist), und ich fange an zu schreiben, dann bekomme ich den Datensatz ordentlich angelegt (ich sollte vielleicht noch erwähnen, daß ich in der list-Form nur die Felder "Datum" und "Comment" angezeigt habe; "No.", "Line No." und "Comment Type" sollen automatisch generiert werden):

Comment Type --> 1
No. --> PKW-3
Line No. --> 10000
Date --> 31. 02. 2010
Comment --> Blablabla

Funktioniert also alles, wie gedacht.

Jetzt baue ich die unsägliche Routine ein mit der Filter-Group.
Die List-Form filter korrekt, aber wenn ich jetzt einen neuen Datensatz schreibe, dann schreibt die Form nicht mehr automatisch rein:

Comment Type --> 1
No. --> PKW-3

Das No.-Feld bleibt leer, und der Comment-Type ist wohl nur zufällig 1, weil dies die erste Option ist. Versuche ich es von der LKW-Karte aus, dann schriebt er jedenfalls auch eine 1 dort hinein, obwohl es eigentlich die 2 sein müsste.

Ist es so verständlicher?

Ohne den Filtergroup-Code werden die "unsichtbaren" Verwaltungs-Felder in der Tabelle bei Neuanlage automatisch gefüllt, Mit Filter-Group nicht mehr. Aufgrund des Keys knallt es dann.

Viele Grüße,

SF

18. Dezember 2006 15:05

Schau dir mal den RunFormLink und den RunFormLinkType bei deinem CommandButton an - oder zum Vergleich auf der Artikelkarte. Eventuell stimmen die Filter nicht.

18. Dezember 2006 15:11

Nein, das ist es nicht.

a) Die Filter entsprechen sich.
b) RunFormLinkType = OnUpdate in beiden Fällen
c) Alles funktioniert prächtig, wenn ich die Filtergroup nicht verwende.

Ich habe eher den Eindruck, durch Verwendung der Filtergroup 2 kann die List-Form beim Anlegen neuer DS diese Parameter nicht mehr finden (No. und Type). Kann das sein?

Gegen diese Theorie spricht aber, daß diese Parameter durchaus noch vorhanden sind, wenn man von der Listen-Form aus den Filter manuell öffnet.

Viele Grüße,

SF

18. Dezember 2006 21:56

Hey SF,

ich habe gerade dein Tabellen und Forms in Navsion nachgebildet und konnte das Problem nicht reproduzieren.

Was habe ich gemacht?
Code:
1. Eine Tabelle mit den Feldern erstellt:

   1. "Comment Type" vom Typ "Option"
   2. "No." vom Typ "Code (10)"
   3. "Line No." vom Typ "Integer"
   4. "Date" vom Typ "Date"
   5. "Comment" vom Typ "Text (50)"

   Key: Comment Type,No.,Line No.

2. Eine weitere Tabelle mit den folgenden Feldern erstellt:

   1. "Type" vom Typ "Option" (identischer OptionString mit Tabelle oben)
   2. "No." vom Typ "Code (10)"
   3. "Name" vom Typ "Text (30)"

   Key: Type,No.

3. Eine neue Form mit einer TableBox zur Darstellung der 1. Tabelle.

4. Eine neue Form mit einer Kartenansicht zur Darstellung der 2. Tabelle. Zusätzliche habe ich auf der Form einen Button hinzugefügt mit den folgenden Eigenschaften:

   1. "PushAction" auf "RunObject"
   2. "RunObject" auf "Form Comments" (1. Form)
   3. "RunFormLink" auf "Comment Type=FIELD(Type),No.=FIELD(No.)"

5. Den von dir genannten Code habe ich - wie bei dir auch - in den OnOpenForm-Trigger gepackt.

Alles funktioniert wunderbar.

Gruß, Marc

19. Dezember 2006 09:34

Hallo Marc,

vielen Dank erstmal, daß Du Dir solche Mühe gemacht hast. Großartig!

Tabelle 2 wäre also die Stammdaten-Tabelle. Bei mir hat die jetzt nicht das Feld Type, sondern aus der Tatsache, daß der Comment-Aufruf von der zugehörigen Karte aus kommt, wird der Type abgeleitet.

Entsprechend habe ich im RunformLink:
Comment Type=CONST(1),No.=FIELD(No.)

Der Comment Type in der Kommentar-Tabelle hat die Optionen 1,2,3 und die Benennungen:
OptionCaption: Substance,Formulation,DG

Bei mir wird also der Type in Form einer Konstante übergeben.

Die Form, die auf der Kommentar-Tabelle aufsetzt (--> Comment List), habe ich mit dem Assistenten als Listen-Form erstellt. Dieses Listen-Control hat die Spalten Date und Comment.

In dieser Comment List habe ich im OpenForm-Trigger den Code implementiert.

Rufe ich jetzt aus der Stammdatenform meine Comment List auf, dann geht die Liste erstmal wunderschön auf und zeigt auch das richtige an (sofern da schon was erfasstwar; war nix erfasst, ist die Liste natürlich leer).

Im leeren Fall steht der Cursor im Date-Feld. Ich drücke "Tab" und es kommt die Meldung:

The Comment Line already exists. Identification fields and values:
Comment Type = 'Substance', No. = '', Line No. = '10000'

In der Tabelle Comment Line steht dann ein neuer DS mit ordentlicher Line-No, Option "Substance" und leerem "No."-Feld.

Ich hab bisher verschwiegen, daß ich noch 6 Felder in der Comment Line habe für einen Timestamp, CreateDate, CreateTime, CreateUser und das ganze nochmal mit Change. Diese felder werden über den OnInsert- und OnModify-Trigger der Tabelle gesetzt. Das funktioniert auch einwandfrei, wird aber wohl kaum Einfluß auf das Problem haben, oder?

Ich werde jetzt auch mal versuchen, Dein Beispiel nach Deiner Beschreibung nachzubilden. Bin gespannt, ob DAS dann bei mir funktioniert.

Schalten Sie auch beim nächsten Mal wieder ein, wenn es heißt: "Was steht denn auf Ihrem Schirm" - "keine Ahnung, der hängt an der Garderobe..."

Bis gleich,

SF

19. Dezember 2006 10:35

Hallo Marc,

habe gerade Dein Beispiel nachgebildet: das funktioniert bei mir auch!

Also: Fröhliches Suchen!

Grüße,

SF

19. Dezember 2006 11:27

So, nun habe ich den fehler auch in unserem Modell-System reproduziert.

Allerdings hab ich jetzt so viel rumgefummelt, daß ich nicht weiß, was hierfür der entscheidende Schritt war. :-(

Ich berichte weiter...

SF

19. Dezember 2006 11:40

Hallo,

Ich hab den Übeltäter an den Hammelbeinen!!

Beim Button auf der Stammdaten-Karte habe ich auch noch den

RunFormLinkType = OnUpdate

Unter diesen Umständen entsteht der Fehler.
Der Fehler kommt *nicht*, wenn diese Eigenschaft auf OnOpen steht. Dies gilt für mein reales System, genauso wie für unser Modell-System.

Warum ist das so?

Kann man das umgehen?

Viele Grüße,

SF

21. Dezember 2006 16:00

Der Eigenschaftswert "OnUpdate" besagt ja folgendes: Wenn du beispielsweise auf der Debitorenkarte die Bemerkungen aufrufst, siehst du die Bemerkungen des Debitors über dem du die Form "Bemerkungen" aufgerufen hast. Gehtst du jetzt zurück auf die Debitorenkarte ohne die Form "Bemerkungen" zu schließen und rufst einen anderen Debitor auf, aktualisiert Navision die Form "Bemerkungen" automatisch in dem es die Bemerkungen des neuen Debitors zeigt.

Bei "OnOpen" wird die Fomr einfach nur geöffnet und bleibt so lange mit dem Inhalt da stehen, bis die Form geschlossen wird.

Gruß, Marc

21. Dezember 2006 17:35

Jaja, das ist schon richtig.

Das sollte aber doch eigentlich keinen Einfluß darauf haben, daß, wenn ich einen neuen DS in der Comments anlege, die Parameter Nummer und Typ von der Comment-Form in die Tabelle geschrieben werden. Die Information, auf welchem Stammdatensatz ich in der Hauptform stehe, muß ja auch beim OnUpdate an der Comment-Form ankommen.

Aber gerade DAS bekommt das Programm nicht gepeilt.

Ich könnte mir natürlich vorstellen, daß es eine System-Limitierung ist, daß diese Parameter beim OnUpdate nicht an die richtigen Stellen geschleust werden, sondern nur im OnOpen-Modus. Allein, es leuchtet mir nicht ein, warum.

Was übersehe ich da?

Viele Grüße,

SF