[Gelöst] SourceTabel dynamisch auf aktuellem Form ändern

7. August 2008 12:22

Hallo zusammen.
Gibt es irgendwie die Möglichkeit den SourceTable auf dem aktuellen Form dynamisch zu ändern?

Hintergrund ist, ich möchte gerne Daten einer temp. Tabelle, die das Form erstellt hat, im aktuellen Form anzeigen...

Bitte nicht steinigen dass ich auf der Form programmiere, aber in dem Fall lässt es sich nicht vermeiden ;)

Gruß
Zuletzt geändert von ChristophE am 11. August 2008 11:35, insgesamt 1-mal geändert.

Re: SourceTabel dynamisch auf aktuellem Form ändern

7. August 2008 12:25

ChristophE hat geschrieben:Hintergrund ist, ich möchte gerne Daten einer temp. Tabelle, die das Form erstellt hat, im aktuellen Form anzeigen...

Die temp. Tabelle ist selber mit genau einer Tabelle verknüpft (und nicht dynamisch mit verschiedenen).

Was du meinst ist also, wie du Datensätze eines temp. Records auf einer Form anzeigen lassen kannst?
Hierzu findest du zahlreiche Beiträge im Forum.
Bis zu NAV 4.0 war es notwendig, dass du dir alles von der Form 6510 abguckst (Formtrigger).

Re: SourceTabel dynamisch auf aktuellem Form ändern

7. August 2008 12:55

F6510 (OnFindRecord & OnNextRecord) habe ich mir auch schon angeschaut, aber ich muss gestehen dass ich die beiden Code Teile nicht richtig verstehe.
Wir sind Technisch schon auf 5.0 (Objekte 4.0).
Könnte ich dann mit dem Property SourceTableTemporary arbeiten?
Wenn ich das aktiviere wird beim Aufrufen der Form gar nichts mehr angezeigt.
Oder kann ich das Property auch per Code setzen nachdem die temp. Tabelle gefüllt wurde?
Die temp. Tabelle wird erst durch eine Funktion nach setzen eines Controlls gefüllt...

Im übrigen, alles Gute zum Geburtstag ;)

Re: SourceTabel dynamisch auf aktuellem Form ändern

7. August 2008 13:24

ChristophE hat geschrieben:F6510 (OnFindRecord & OnNextRecord) habe ich mir auch schon angeschaut, aber ich muss gestehen dass ich die beiden Code Teile nicht richtig verstehe.

Du musst ihn nicht richtig verstehen, sondern nur kopieren können ;-)
Aber das musst du ja jetzt nicht zwingend:

Wir sind Technisch schon auf 5.0 (Objekte 4.0).
Könnte ich dann mit dem Property SourceTableTemporary arbeiten?
Wenn ich das aktiviere wird beim Aufrufen der Form gar nichts mehr angezeigt.

Richtig. In dem Augenblick, wo du die Property setzt, wartet NAV darauf, dass du auf der Form die Variable Rec füllst.
Wie das geht, steht zum einen (glaub ich) hier im Forum SourceTableTemporary.

Oder kann ich das Property auch per Code setzen nachdem die temp. Tabelle gefüllt wurde?

Nein.

Die temp. Tabelle wird erst durch eine Funktion nach setzen eines Controlls gefüllt...

Schon auf der Form, die die Daten anzeigen soll? Dann ersetze in deinem Quelltext einfach deine temp. Recordvariable mit Rec!

Im übrigen, alles Gute zum Geburtstag ;)

Oh, vielen Dank! :-)

Re: SourceTabel dynamisch auf aktuellem Form ändern

7. August 2008 14:48

Das is ja der Wahnsinn, es funktioniert! :-D
Vielen Dank.

Ich fülle Rec nun bei Aufrufen der Form im OnOpen Trigger via
Code:
ItemRec2.FIND('-');
REPEAT
  TRANSFERFIELDS(ItemRec2);
  INSERT;
UNTIL ItemRec2.NEXT = 0;

Das Problem ist jetzt nur, dass es recht lange dauert bis die Form geöffnet ist, da sich ca 90.000 Datensätze in der Tabelle befinden.
Macht es einen Untschied ob ich Rec := ItemRec2 oder TRANSFERFIELDS(ItemRec2) nehme?
Von der Performance konnte ich nichts feststellen.
Wie bekomme ich das ganze beim öffnen etwas performanter?

Des weiteren bekomme ich beim wechseln in die Zeilen die Meldung:
Artikel kann in diesem Formular nicht verändert werden.
Ich kann nach Bestätigen mit OK aber trotzdem ganz normal in den Zeilen rum springen.

Re: SourceTabel dynamisch auf aktuellem Form ändern

7. August 2008 15:17

ChristophE hat geschrieben:
Code:
ItemRec2.FIND('-');
REPEAT
  TRANSFERFIELDS(ItemRec2);
  INSERT;
UNTIL ItemRec2.NEXT = 0;

Das Problem ist jetzt nur, dass es recht lange dauert bis die Form geöffnet ist, da sich ca 90.000 Datensätze in der Tabelle befinden.
Macht es einen Untschied ob ich Rec := ItemRec2 oder TRANSFERFIELDS(ItemRec2) nehme?
Von der Performance konnte ich nichts feststellen.
Wie bekomme ich das ganze beim öffnen etwas performanter?

Ich persönlich würde in diesem Fall eher auf Rec := ItemRec2; zurückgreifen, da TRANSFERFIELDS für den Datentransfer zweier verschiedener Tabellen gedacht ist und zusätzlich noch prüft, ob die Felder zusammenpassen.
Bei der direkten Übertragung wird diese Prüfung nicht durchgeführt. Somit müsste es doch etwas schneller sein. Und wenn nicht, dann ist es wenigstens sauberer programmiert ;-)

Darüber hinaus verwendest du ItemRec2.FIND('-');
Erstens solltest du den performanteren Befehl ItemRec2.FINDSET verwenden, andererseits solltest du auch den Fall abfangen, dass mal keine Datensätze gefunden werden:
Code:
IF ItemRec2.FINDSET THEN
  REPEAT
    Rec := ItemRec2;
    INSERT;
  UNTIL ItemRec2.NEXT = 0;

Re: SourceTabel dynamisch auf aktuellem Form ändern

8. August 2008 09:34

Danke für die Erklärung, Timo.
Das mit dem SourceTableTemporary Property is ne super Sache, aber ich denke in dem Fall leider nicht geeignet.
Das Öffnen der Form dauert einfach zu lange.
Das kann man keinem Anwender antun.
Mir wäre es egal, ich würd mir in der Zeit einfach ne Tasse Kaffee holen :wink:

Dann muss ich wohl doch auf händische Art zurück greifen :-(

Natalie hat geschrieben:Du musst ihn nicht richtig verstehen, sondern nur kopieren können ;-)


Also du meinst 1:1 aus den beiden Triggern kopieren und halt die Variablen ändern?
Das habe ich aber gestern so gemacht und hatte anschließend nur einen leeren DS.
Ich nehm an ich muss in der Funktion die die temp. Tabelle füllt noch irgendwas machen!?

Sorry dass ich so nerve ;)

Gruß

Re: SourceTabel dynamisch auf aktuellem Form ändern

8. August 2008 11:51

ChristophE hat geschrieben:Also du meinst 1:1 aus den beiden Triggern kopieren und halt die Variablen ändern?

Ja, aber nicht nur das! Dies betraf die Recordanzeige.

Das habe ich aber gestern so gemacht und hatte anschließend nur einen leeren DS.
Ich nehm an ich muss in der Funktion die die temp. Tabelle füllt noch irgendwas machen!?

Ja, du musst selbst dafür sorgen, dass die Variable auch gefüllt ist. Sonst nützt die schönste Anzeige nicht ;-)
Aber so weit warst du doch schon, nur mit der Performance nicht zufrieden.

Re: SourceTabel dynamisch auf aktuellem Form ändern

8. August 2008 15:33

Nee bzw. ja :)

Die Performance mit dem SourceTableTemporary Property war nicht OK, da beim Aufrufen der Übersicht erst mal alle 90.000 Datensätze in den Temp. SourceTable geladen werden.

Deswegen will/muss ich nun leider mit einem normalen SourceTable arbeiten und erst wenn die Funktion, in der gefiltert wird, aufgerufen wird, soll ein temp. Record gefüllt und direkt angezeigt werden.

Siehe Form 6510

Re: SourceTabel dynamisch auf aktuellem Form ändern

11. August 2008 11:34

OK, habs hin bekommen.
War doch gar nicht so schwer.
Bin so zu sagen ein paar mal "dran vorbei gelaufen" :-D

Für die jenigen die vor dem gleichen "Problem" stehen:
Aus dem Form 6510 kann der Inhalt der OnFindRecord und OnNextRecord Trigger übernommen werden.
Der temp. Record muss dann anschließend nur noch mit den entsprechenden Datensätzen gefüllt werden.

Gruß

Re: SourceTabel dynamisch auf aktuellem Form ändern

11. August 2008 19:29

Timo Lässer hat geschrieben:Darüber hinaus verwendest du ItemRec2.FIND('-');
Erstens solltest du den performanteren Befehl ItemRec2.FINDSET verwenden, andererseits solltest du auch den Fall abfangen, dass mal keine Datensätze gefunden werden:
Code:
IF ItemRec2.FINDSET THEN
  REPEAT
    Rec := ItemRec2;
    INSERT;
  UNTIL ItemRec2.NEXT = 0;



Öhm, Veto!

FINDSET ist grundsätzlich performanter als der "alte" FIND('-'). Allerdings bezieht sich das nur auf obige Konstrukte, wenn es sich um <= 500 (oder die konfigurierte Anzahl Datensätze im Alter Database) Datensätze handelt. Enthält das zu erwartende Ergebnis mehr als die 500 Datensätze, dann wird, was wiederum inperformanter ist, wieder zum Standardverhalten zurück geschaltet.

Ergo ist der FIND('-') bei 90.000 erwarteten Datensätzen besser geeignet als FINDSET.

Genau hab ichs grad nicht zur Hand, aber es geht hier soweit ich mich erinnere um ein anderes Cursorverhalten. Man möge Veto einlegen, falls das nicht korrekt ist :)