[gelöst]automatisiertes Erstellen eines 2. Datensatzes

25. März 2009 12:33

Hallo,

ich bin noch relativ neu in NAV und der damit verbundenen Programmierung. Studiere Wirtschaftsinformatik in Kooperation mit meinem Betrieb, von dem ich eine Aufgabe erhielt, dessen Lösung mir bisher noch verborgen blieb. :-?

Ich möchte gerne folgendes umsetzen:

Wenn ich auf der Mitarbeiterkarte einen Dartensatz anlege, dann soll automatisch dazu eine Ressource erstellt werden. Das Problem das ich damit hatte ist, dass ich nicht im OnInsert Trigger programmieren kann, weil das System den Datensatz zu diesem Zeitpunkt ja noch nicht erfasst hat. Leider habe ich bisher auch keinen anderen Trigger finden können, der mich näher an mein Ziel bringt.

Ich freue mich über hilfreiche Antworten.

MfG, Malte
Zuletzt geändert von mpetersen am 25. März 2009 15:15, insgesamt 1-mal geändert.

Re: automatisiertes Erstellen eines 2. Datensatzes

25. März 2009 12:58

Willkommen!

mpetersen hat geschrieben:Das Problem das ich damit hatte ist, dass ich nicht im OnInsert Trigger programmieren kann, weil das System den Datensatz zu diesem Zeitpunkt ja noch nicht erfasst hat.

Der letzte Teil des Satzes ist richtig, aber wieso hindert dich das, dort die Ressource anzulegen? Welche Informationen fehlen dir?

Re: automatisiertes Erstellen eines 2. Datensatzes

25. März 2009 13:05

Das Problem ist, ich hab versucht, die Ressource dort anzulegen. Aber man kann sich im OnInsert Trigger doch nicht auf die eingegebenen Daten beziehen, oder? Zumindest hat das bei mir nicht funktioniert.

Die Ressource soll ja in meinem Fall ein Abbild der gerade eingegebenen Daten erzeugen, also dich gleichen Informationen enthalten. (das hatte ich wohl eben vergessen :oops: )

Re: automatisiertes Erstellen eines 2. Datensatzes

25. März 2009 13:20

mpetersen hat geschrieben:Das Problem ist, ich hab versucht, die Ressource dort anzulegen. Aber man kann sich im OnInsert Trigger doch nicht auf die eingegebenen Daten beziehen, oder?

Die Daten die dir da zur Verfügung stehen, sind die Daten die zu dem Zeitpunkt des Einfügens (OnInsert) vorhanden sind. Also nur die Mitarbeiternr. Du musst deshalb im OnInsert- und im OnModify-Trigger programmieren. So könnte ich mir das vorstellen:

OnInsert:
Code:
[...]
IF NOT Resource.GET("No.") THEN BEGIN
  Resource.INIT;
  Resource.VALIDATE("No.","No.");
  Resource.Type := Resource.Type::Person;
  Resource.INSERT(TRUE);
END;

OnModify:
Code:
[...]
IF ("First Name" <> xRec."First Name") OR
   ("Middle Name" <> xRec."Middle Name") OR
   ("Last Name" <> xRec."Last Name") OR
   (Address <> xRec.Address) OR
   ("Address 2" <> xRec."Address 2")
THEN BEGIN
  Resource.GET("No.");
  Resource.VALIDATE(Name,FullName);
  Resource.Address := Address;
  Resource."Address 2" := "Address 2";
  Resource.MODIFY;
END;

Gruß, Marc

Re: automatisiertes Erstellen eines 2. Datensatzes

25. März 2009 13:27

mpetersen hat geschrieben:Aber man kann sich im OnInsert Trigger doch nicht auf die eingegebenen Daten beziehen, oder?

Doch, und wie man kann ;-)

Veröffentliche doch bitte deinen bisherigen Quelltext (der sich auf das Ressourcenproblem) bezieht, und sag bitte, WAS nicht geht - bekommst du eine Fehlermeldung? Inwiefern ist das Ergebnis nicht so, wie du es erwartet hast?

Re: automatisiertes Erstellen eines 2. Datensatzes

25. März 2009 14:21

Natalie hat geschrieben:Doch, und wie man kann ;-)


Da bin ich mal gespannt.

So, Code ist nix spektakuläres, da ich eine bestehende Funktionalität nutzen wollte. Es gab schon einen Report, über den man eine Ressource erstellen lassen kann. Ich hab die in diesem Report genutzte Funktion dann versucht im OnInsert Trigger anzusprechen. Hier mal ein Auszug des codes:

Code:
//Creates the Resource from the Employee
IF NOT TimeJnlSetup.GET() THEN
  ERROR(Text007,TimeJnlSetup.FIELDCAPTION(TimeJnlSetup."Worktype Code"),TimeJnlSetup.TABLECAPTION);
TimeJnlSetup.TESTFIELD("Product Posting Group");
IF Employee.GET(EmplNo) THEN BEGIN
  IF Res THEN BEGIN
    Resource.INIT;
    Resource.VALIDATE("No.");
    Resource.INSERT(TRUE);
    IF Employee."User ID" <> '' THEN BEGIN
      CheckResource(Employee."User ID");
      Resource."User ID" := Employee."User ID";
    END ELSE
      ERROR(Text003);
    Resource.Type := Resource.Type::Person;
    Resource.Name :=  Employee."First Name" + ' ' + Employee."Last Name";
    Resource."Search Name" := Employee."Last Name";
    Resource.Address := Employee.Address;
    Resource.VALIDATE("Gen. Prod. Posting Group",TimeJnlSetup."Product Posting Group") ;
    Resource."Address 2" := Employee."Address 2";
    Resource.City := Employee.City;
    Resource."Social Security No." := Employee."Social Security No.";
    Resource."Job Title" := Employee."Job Title";
    Resource."Employment Date" := Employee."Employment Date";
    Resource."Global Dimension 1 Code" := Employee."Global Dimension 1 Code";
    Resource."Global Dimension 2 Code" := Employee."Global Dimension 2 Code";
    IF (TimeJournalSetup.GET) AND (TimeJournalSetup."Worktype Code" <> '') THEN
      Resource."Base Unit of Measure" := TimeJournalSetup."Worktype Code"
    ELSE
      MESSAGE(Text002,TimeJournalSetup.TABLECAPTION,TimeJournalSetup.FIELDCAPTION(TimeJournalSetup."Worktype Code"),
              Resource.FIELDCAPTION(Resource."Base Unit of Measure"));
    Resource."Last Date Modified" := TODAY;
    Resource."Post Code" := Employee."Post Code";
    Resource.County := Employee.County;
    Resource."Country/Region Code" := Employee."Country/Region Code";
    Resource.VALIDATE("Gen. Prod. Posting Group",TimeJournalSetup."Product Posting Group");
    Resource.MODIFY;
    Employee.VALIDATE(Employee."Resource No.",Resource."No.");
    Employee.MODIFY;
    ResUnitMeasure.INIT;
    ResUnitMeasure."Resource No." := Resource."No.";
    ResUnitMeasure.Code := TimeJnlSetup."Worktype Code";
    ResUnitMeasure."Qty. per Unit of Measure" := 1;
    ResUnitMeasure."Related to Base Unit of Meas." := TRUE;
    ResUnitMeasure.INSERT;
  END;

END ELSE
  ERROR(Text001,EmplNo);


mit dieser Funktion war es leider nicht möglich. Folgende Fehlermeldung kam dann(Neuen Mitarbeiter anlegen und enter gedückt für die Nummer):
Der Mitarbeiter mit der Nummer ... existiert nicht.

Das Ergebnis ist insofern nicht so wie ich es erwartet habe, da ich dachte, wenn ich einen neuen Mitarbeiter anlege, kann ich gleichzeitig eine Ressource anlegen. Auch wenn die Felder wie Name und sonstiges nicht gefüllt sind, da ich diese eh über eine Funktion im OnModify Trigger von beiden Karten spiegeln wollte.

Re: automatisiertes Erstellen eines 2. Datensatzes

25. März 2009 14:35

mpetersen hat geschrieben:Der Mitarbeiter mit der Nummer ... existiert nicht.

Hat der Debugger dir verraten, an welcher Code-Stelle dieser Fehler auftritt?

Re: automatisiertes Erstellen eines 2. Datensatzes

25. März 2009 14:42

END ELSE
ERROR(Text001,EmplNo);



da springt er raus und der debugger sagt mir, dass die Mitarbeiternummer zum Zeitpunkt, wo die Abfrage durchgeführt wird leer ist. Deshalb meine Vermutung, dass er nur auf Daten anspringen kann, die tatsächlich schon in die Tabelle geschrieben wurden.

Re: automatisiertes Erstellen eines 2. Datensatzes

25. März 2009 14:48

Diesen "fehlerverursachenden Quelltextteil" hast du doch selbst geschrieben bzw. kopiert! :-)
Hat er überhaupt eine Daseinsberechtigung?
Code:
IF Employee.GET(EmplNo) THEN BEGIN
 //
END ELSE // natürlich nicht, den legst du ja gerade erst an
  ERROR(Text001,EmplNo);


Wenn du dieses Gerüst streichst, sollte es funktionieren.
So hatte es dir Marc auch schon vorgeschlagen.

Re: automatisiertes Erstellen eines 2. Datensatzes

25. März 2009 14:50

Hallo mpetersen,

du solltest natürlich nicht im OnInsert ein Get auf den Datensatz machen, weil der Datensatz ist natürlich noch nicht da :wink:. Wenn du den Employee.Get einfach weglässt, und stattdessen mit den Daten aus der Rec-Variable arbeitest, hast evtl. eine Chance die Resourcen anzulegen.

Gruß, Fiddi

Re: automatisiertes Erstellen eines 2. Datensatzes

25. März 2009 15:15

jo danke für die hilfe. hat funktioniert :-)

wie gesagt: wollte die funktion übernehmen also hab das selber keine aktien drin ^^