[gelöst] autom. Datensätze einfügen beim Öffnen einer Form

14. Juni 2006 19:08

Ich habe einen zusätzlichen Tab auf der Ressourcen Karte angelegt, in dem eine Subform dargestellt wird, die in Budgets verwendete Aktivitäten dieser Ressource auflisten soll, allerdings jede mögliche Kombination aus Phase, Task und Step nur einmal.
Dazu habe ich eine neue Tabelle angelegt, und möchte, dass immer, wenn eine Ressource angezeigt wird (also beim Öffnen der Form oder Wechsel des Datensatzes), eine Funktion überprüft, ob es neue Kombinationen in der Tabelle Budget Line gibt und diese dann an meine neue Tabelle anfügt.
Wenn ich diese Funktion von einem Button aus starte, funktioniert sie bestens.
Wenn ich die Funktion aber aus dem OnAfterGetCurrRecord aufrufe, was ja eigentlich der logische Platz für den Aufruf wäre, damit er mir für die angezeigte Ressource die Daten aktualisiert, dann erhalte ich so eine doofe Meldung von Navision:
Sie können keine Änderungen an der Datenbank vornehmen, ehe eine Transaktion gestartet wurde!
Was sollen mir diese Worte sagen?
wie kann ich denn eine Transaktion starten?
Wo wäre der Aufruf der Funktion besser aufgehoben, damit die Aktualisierung automatisch erfolgt?
Die Lösung mit dem Button ist nicht optimal.
Zuletzt geändert von Michael Schumacher am 15. Juni 2006 13:06, insgesamt 1-mal geändert.

15. Juni 2006 08:54

Hallo Schumi,

warum nicht auf dem OnAfterGetRecord Trigger?

Mit Ähnlich doofen Fehlern hatte ich auch schon zu kämpfen, ich hatte ebenfalls die Variante mit dem Button ausprobiert, das Funktionierte.
War der gleiche Code auf dem Trigger plaziert, gab es Fehler!

Auch wenn es ein Umweg ist, je nach Problem konnte ich mir helfen, in dem ich einen Report gestartet habe, der die Aktualisierung durchgeführt hat.
Gruß Mikka

15. Juni 2006 11:54

Den Trigger hab ich auch probiert, mit dem selben ergebnis, genau wie den onOpenForm....
aber das mit dem Report ist eine Idee....
probier ich gleich mal aus.

Nachtrag:
Das mit dem Report ist die Lösung.
Ich habe die Funktion in einen Report umgebaut und im onAfterGetRecord aufgerufen für alle interessierten hier die Daten:

1. Tabelle 50003:
Primary Key: Resource No., Phase Code, Task Code, Step Code
zusätzlich ein Feld Description und 3 Flowfields die die Descriptions zu den Code-Felder anzeigen.

2. Form Resource card:
Tabreiter mit Subform auf Tabelle 50003 (usable Activities)
Variablen:
BudgetLine=Record(Job Budget Line)
UpdateActivities=Report(UpdateUsableActivities)
im Trigger onAfterGetRecord der Resourcecard folgender Code:
Code:
Form - OnAfterGetRecord()
SETRANGE("No.");

//ab hier Änderung für automatische Aktualisierung:

budgetline.reset;
budgetline.setrange(type,BudgetLine.Type::resource);
BudgetLine.setrange("No.","no.");
if budgetline.findset(false,false) then begin
  UpdateActivities.SETTABLEVIEW(budgetline);
  UpdateActivities.RUN;
end;
clear(updateactivities);


3. Report UpdateUsableActivities:
Properties:
UseReqForm=No
ProcessingOnly=yes
Data Item= Job Budget Line
Variablen:
Usableactivities=Record(T 50003)
Code im OnAfterGetRecord des DataItems:
Code:
  IF NOT UsableActivities.GET("No.","Phase Code","Task Code","Step Code") THEN BEGIN
    UsableActivities.INIT;
    UsableActivities."Resource No.":="No.";
    UsableActivities."Phase Code":="Phase Code";
    UsableActivities."Task Code":="Task Code";
    UsableActivities."Step Code":="Step Code";
    UsableActivities.Description:=Description;
    UsableActivities.INSERT;
  END;

fertig ist die Laube ;-)

15. Juni 2006 13:56

Hallo Schumi,

freut mich, das ich dir auch mal helfen konnte. 8-)

Wie bereits beschrieben, das Problem kenne ich auch, aber mir hat bisher die Zeit gefehlt zu suchen woran es liegt.

Vieleicht kennt jemand anders die Lösung und lässt uns daran teilhaben?!
Gruß Mikka

4. Oktober 2007 09:15

Ey, euer Trick mit dem Report ist genial, darauf wäre ich nie gekommen - benötige ich aber im Augenblick ganz dringend (nur beim Verlassen der Form bzw. des Datensatzes), also danke danke danke!!! :-)

4. Oktober 2007 11:08

Habt ihr es schon mal mit dem OnAfterValidate Trigger probiert?

thread von dynamicsuser.net - vorletzter Eintrag

4. Oktober 2007 11:33

Hm, der verlinkte Beitrag hat zumindest mit meinem (ehemaligen :-)) Problem nichts zu tun ...

4. Oktober 2007 12:56

Jürgen, das war am Thema vorbei ;-)
es geht hier nicht um ein Feld-Validate,
es geht darum etwas automatisch auszuführen wenn man einen Datensatz öffnet, bzw. in Natalies Fall verläßt, z.B. ein Check ob Pflichtfelder gefüllt sind, oder Daten für eine Subform zu sammeln.
Da hier nichts validiert wird nützt auch kein onAfterValidate :mrgreen:

4. Oktober 2007 13:18

mikka hat geschrieben:
Wie bereits beschrieben, das Problem kenne ich auch, aber mir hat bisher die Zeit gefehlt zu suchen woran es liegt.


koennte es sein dass es daran liegt, dass ein modifizieren der datensaetze automatisch wieder einen OnAfterGetRecord mit sich ziehen würde, der ein modifizieren der Datensätze hervorruft der ein OnAfterGetRecord............ und so weiter...

Navision merkt das und wehrt sich.
Der Report trickst das ganze einfach aus, da er in einer komplett anderen instanz laeuft...

aber die idee ist super! hab mich naemlich auch schon drüber aufgeregt :-D

4. Oktober 2007 13:25

Nur als Beispiel (für Jürgen ;-):
Mein Problem war, dass wenn ein Benutzer eine Verkaufszeile hinzugefügt, geändert oder gelöscht hat, automatisch mehrere kundenspezifische Felder im Verkaufskopf akualisiert werden sollten.
Da hierfür aber ein SalesHeader.MODIFY notwendig ist, hat es immer zu jeder erdenklichen Gelegenheit Transaktionskonflikte gegeben ("Ein anderer Anwender hat...").
Grund für das Problem: Die Form Sales Order zeitgt gleichzeitig Datensätze der Tabellen Sales Header oder Sales Line.
Würde ich einen ANDEREN SalesHeader-Datensatz als den aktuellen ändern, wäre alles kein Problem.

Wie löse ich das also: Beim Aktualisieren einer SalesLine wird der Kopf NICHT geändert. Dies passiert erst beim Verlassen des SalesHeader-Datensatzes.

4. Oktober 2007 13:48

Ja - ihr habt recht. Mein Denkfehler war, dass der OnAfterValidate Trigger nur kompliziert von extern aufgerufen werden kann.