modify klappt nicht bei DateTime Variable

15. Juni 2021 09:11

Hallo zusammen,

ich möchte ein Record-Feld (DateTime) durch ein Modify beschreiben, aber klappt nicht. Den Wert kann ich ausgeben, aber nicht in die Tabelle schreiben.
Was mache ich falsch?

Code:
procedure SetEnddateLastPost():DateTime
    var
        prodorderline: Record "Prod. Order Line";
        prodorderroutingline: Record "Prod. Order Routing Line";
        prodorder: Record "Production Order";
    begin 
        prodorder.SetFilter("No.","No.");     
        if prodorder.FindFirst then begin
            prodorderline.SetFilter("Prod. Order No.","No.");
            prodorderline.SetFilter("Line No.",Format(10000));

            if prodorderline.FindSet then begin
                prodorderroutingline.SetFilter("Prod. Order No.",prodorderline."Prod. Order No.");
                prodorderroutingline.SetFilter("Routing Reference No.",Format(prodorderline."Routing Reference No."));

                if prodorderroutingline.FindLast then begin 
                    prodorder."End Date-Time Last Post":=prodorderroutingline.GetLatestPostedEndDateTime;
                    prodorder.Modify;

                    exit(prodorder."End Date-Time Last Post");

                end;

            end;
               
        end;
       
    end;


Gruß,
Christian

Re: modify klappt nicht bei DateTime Variable

15. Juni 2021 09:17

Hallo,

wie lautet denn die Fehlermeldung? Meine Glaskugel ist gerade etwas trübe :mrgreen:

Gruß Fiddi

Re: modify klappt nicht bei DateTime Variable

15. Juni 2021 09:24

der Code ist auch ein wenig wirr, aber egal.

Die Funktion

"GetLatestPostedEndDateTime" auf der "Prod. Order Routing Line" - ist die selbst geschrieben?
Gibt die denn überhaupt was Ordentliches zurück?

Re: modify klappt nicht bei DateTime Variable

15. Juni 2021 10:32

wie lautet denn die Fehlermeldung? Meine Glaskugel ist gerade etwas trübe :mrgreen:

es gibt leider keine Fehlermeldung, er schreibt es nur nicht in die Tabelle.

"GetLatestPostedEndDateTime" auf der "Prod. Order Routing Line" - ist die selbst geschrieben?
Gibt die denn überhaupt was Ordentliches zurück?

GetLatestPostedEndDateTime ist nicht von mir, gibt aber den richtigen Wert zurück.

die Funktion in der Tableextension habe ich nochmal etwas geändert:

Code:
procedure SetEnddateLastPost():DateTime
    var
        prodorderline: Record "Prod. Order Line";
        prodorderroutingline: Record "Prod. Order Routing Line";
       
    begin 
       
            prodorderline.SetFilter("Prod. Order No.","No.");
            prodorderline.SetFilter("Line No.",Format(10000));
            if prodorderline.FindSet then begin
                prodorderroutingline.SetFilter("Prod. Order No.",prodorderline."Prod. Order No.");
                prodorderroutingline.SetFilter("Routing Reference No.",Format(prodorderline."Routing Reference No."));
                if prodorderroutingline.FindLast then begin               
                    exit(prodorderroutingline.GetLatestPostedEndDateTime);
                   
                end;

            end;
       
    end;


Der dazugehörige OnAfterGetRecord Trigger in der Pageextension sieht so aus:
Code:
trigger OnAfterGetRecord();
   
    begin
       
        "End Date-Time Last Post":=SetEnddateLastPost();
        if Format("End Date-Time Last Post") <> '' then
            Modify;
    end;


Die Felder werden in der ListPage richtig ausgegeben. Aber in der Table bleibt das Feld leer!

Gruß,
Christian

Re: modify klappt nicht bei DateTime Variable

15. Juni 2021 12:05

sprich wenn du anstatt

Code:
trigger OnAfterGetRecord();
   
    begin
       
        "End Date-Time Last Post":=SetEnddateLastPost();
        if Format("End Date-Time Last Post") <> '' then
            Modify;
    end;


das hier:
Code:
trigger OnAfterGetRecord();
   
    begin
       
        "End Date-Time Last Post":=SetEnddateLastPost();
        Message(Format("End Date-Time Last Post"));

    end;


machst, steht in der Message alles richtig drin?
is "End Date-Time Last Post" auch ein Tabellenfeld?

Re: modify klappt nicht bei DateTime Variable

15. Juni 2021 13:06

Fußt deine Page auf einer Temporären Tabelle oder hast du im Page on Modify Trigger Anweisungen geschrieben?

Re: modify klappt nicht bei DateTime Variable

15. Juni 2021 13:25

machst, steht in der Message alles richtig drin?
is "End Date-Time Last Post" auch ein Tabellenfeld?


im Feld "End Date-Time Last Post" der Page werden alle Werte und auch im richtigen Format, zB.: 12.04.2021 20:26 dargestellt und angezeigt. wenn ich die Zelle aus der Page heraus kopiere, sieht es so aus: 12.04.2021 20:26:39,180

Wenn ich das Feld per Messagebox ausgebe, dann hat das Jahr nur 2 Stellen: 12.04.21 20:26

Re: modify klappt nicht bei DateTime Variable

15. Juni 2021 13:30

okay - und wenn du die Tabelle bzw. deine TableExtension dann per SQL-MGT-Studio öffnest, dann steht da nicht dieser Wert drin?

Re: modify klappt nicht bei DateTime Variable

15. Juni 2021 13:38

Fußt deine Page auf einer Temporären Tabelle

nein

oder hast du im Page on Modify Trigger Anweisungen geschrieben?

nein

Re: modify klappt nicht bei DateTime Variable

15. Juni 2021 14:20

und wenn du die Tabelle bzw. deine TableExtension dann per SQL-MGT-Studio öffnest, dann steht da nicht dieser Wert drin?

unter SQL steht in dem Feld der Tableextension überall 1753-01-01 00:00:00.000 drin

Re: modify klappt nicht bei DateTime Variable

15. Juni 2021 15:26

nur um noch mal ganz sicher zu gehen:
das Feld "End Date-Time Last Post" ist ein Feld in deiner Tabelle und definitiv nirgends ggf. noch mal als lokale/globale Variable angelegt?

Du schreibst ja selbst, dass es in der Page richtig dargestellt wird, nur das der Wert nicht in der Tabelle steht - was den Anschein hat, dass du "End Date-Time Last Post" ggf nochmal als Variable angelegt hast

Re: modify klappt nicht bei DateTime Variable

15. Juni 2021 15:58

das Feld "End Date-Time Last Post" ist ein Feld in deiner Tabelle und definitiv nirgends ggf. noch mal als lokale/globale Variable angelegt?


habe ich als neues Feld in Tab. Prod. order angelegt, per Tableext.

das Datum hole ich über eine globale Funktion aus einer anderen Tabelle.

Der Feldname ist neu und eindeutig in dieser Tabelle

Re: modify klappt nicht bei DateTime Variable

15. Juni 2021 17:33

tja, was soll ich sagen...ich kann den Fehler nicht nachstellen (ok, hab's unter BC14 fix getestet, nicht unter NAV2018)
welches CU hast du?

hier mal der TestCode:
Code:
tableextension 50100 MyExtension extends Customer
{
    fields
    {
        field(50100; MyDateTimeBlub; DateTime)
        {

        }
    }

}


Code:
pageextension 50100 MyExtension extends "Customer List"
{
    layout
    {
        addlast(Control1)
        {
            field(MyDateTimeBlub; MyDateTimeBlub)
            { }
        }
    }
    trigger OnAfterGetRecord()
    begin
        if "No." = '10000' then begin
            MyDateTimeBlub := CreateDateTime(Today, Time);
            Modify;
        end;
    end;

}

Re: modify klappt nicht bei DateTime Variable

16. Juni 2021 11:19

kann die die Version sagen. 11.0.42633

Re: modify klappt nicht bei DateTime Variable

16. Juni 2021 11:54

passt - funktioniert in deiner Version bei mir ebenfalls wunderbar (also mein Code) - daher gehe ich davon aus, dass noch etwas bei dir schief liegt.
Dein geposteter Code sieht erstmal ok aus (klar du musst z.B. DateTime nicht erst formatieren, um zu prüfen, ob es leer ist, aber egal)

also entweder ich verstehe dich komplett falsch, oder ich kapiere es einfach nicht.

du schreibst
im Feld "End Date-Time Last Post" der Page werden alle Werte und auch im richtigen Format, zB.: 12.04.2021 20:26 dargestellt und angezeigt. wenn ich die Zelle aus der Page heraus kopiere, sieht es so aus: 12.04.2021 20:26:39,180


Somit ist doch alles ok, oder nicht?

Re: modify klappt nicht bei DateTime Variable

16. Juni 2021 18:01

Somit ist doch alles ok, oder nicht?

In der Page passt es, das es angezeigt wird, aber ich kann nach dem Feld nicht filtern, da die Tabelle ja in dem Feld leer bleibt.

Re: modify klappt nicht bei DateTime Variable

17. Juni 2021 08:51

ok, wie gesagt, bei mir funktioniert es ohne Probleme und das was du beschreibst, deutet für mich auf eine glob. Variable hin.
Da ich deinen Quellcode nicht im Ganzen kenne, kann ich atm nicht weiterhelfen.
Du kannst mir gern deine al-files die für diese Thematik notwendig sind, hochladen, oder per PN schicken - sofern da nichts Kritisches drin ist - die eine Fremdfunktion auf die du dich berufst bekommt man noch so hin^^

Re: modify klappt nicht bei DateTime Variable

17. Juni 2021 17:20

Naja,
aus der Page, wo ich den Wert her habe, wurde der Wert ursprünglich einer globalen Variable übergeben, also es war kein typisches Tabellen Feld.
Ich habe die globale Prozedur (prodorderroutingline.GetLatestPostedEndDateTime) aus einer Tableextension verwendet (nicht meine Tableext.) um an den Wert zu kommen,
aber mein neues Feld, dem ich den Wert übergebe ("End Date-Time Last Post"), ist wieder ein normales Tabellenfeld, vom Typ DateTime.

Grüße,
Christian

Re: modify klappt nicht bei DateTime Variable

18. Juni 2021 09:44

ahh - es tut mir leid, meine Glaskugel ist aktuell beim TÜV. Leider wurde mir gerichtlich verboten, Vorhersagen mit Hühnerknochen o.ä. zu treffen.
Ich versuche es trotzdem, aber bitte nicht weitersagen!

diese ominöse globale Variable heißt aber nicht zufällig ebenfalls "End Date-Time Last Post"?
Wenn wir dir helfen sollen, brauchen wir mehr ordentlichen Code (meine Meinung)

Re: modify klappt nicht bei DateTime Variable

18. Juni 2021 09:47

Wenn wir dir helfen sollen, brauchen wir mehr ordentlichen Code (meine Meinung)

:!: :!: :!:

Re: modify klappt nicht bei DateTime Variable

18. Juni 2021 11:01

Wenn wir dir helfen sollen, brauchen wir mehr ordentlichen Code (meine Meinung)


ja, ich versuche es mal damit:

das neue Tabellenfeld "End Date-Time Last Post", was ich beschreiben möchte, bekommt das Datum und Zeit aus einer Funktion GetLatestPostetEndDateTime(Rec), welche den Wert aus der Betriebsdatenerfassung holt.
Hierbei sind die BDE Posten als temporäre Tabelle definiert: TempFDCDetailedEntry: Record "FDC - Detailed Entry" temporary;
Siehe Funktion:

Code:
procedure GetLatestPostedEndDateTime(Rec: Record "Prod. Order Routing Line") LatestEndDateTime: DateTime;
    var
        TempFDCDetailedEntry: Record "FDC - Detailed Entry" temporary;
    begin
        if (CollectFDCDetailedEntries(Rec, TempFDCDetailedEntry)) then begin
            TempFDCDetailedEntry.SetRange("FDC Entry Type", TempFDCDetailedEntry."FDC Entry Type"::Recording);
            TempFDCDetailedEntry.SetRange(Canceled, false);
            if (not TempFDCDetailedEntry.IsEmpty()) then begin
                TempFDCDetailedEntry.FindSet();
                repeat
                    if (TempFDCDetailedEntry."End Date-Time" <> 0DT) then
                        if (LatestEndDateTime = 0DT) or (LatestEndDateTime < TempFDCDetailedEntry."End Date-Time") then
                            LatestEndDateTime := TempFDCDetailedEntry."End Date-Time";
                until (TempFDCDetailedEntry.Next() = 0);
            end;
        end;

        exit(LatestEndDateTime);
    end;

Re: modify klappt nicht bei DateTime Variable

18. Juni 2021 14:27

öhm, also ich bin davon ausgegangen, dass genau diese Funktion das tut, was sie soll - dementsprechend brauchen wir diese definitiv nicht.
es geht ja darum, dass das "errechnete" Datum nicht weggeschrieben wird - dementsprechend brauchen wir den Code, wo das passieren soll - wenn du der Meinung bist, dass du diesen bereits vollständig gepostet hast, poste ihn bitte einfach noch mal.
Geh bitte auf Nummer sicher, dass jemand Fremdes damit auch etwas anfangen kann.
Ich Frage jetzt ein letztes mal:
Diese ominöse globale Variable heißt aber nicht zufällig ebenfalls "End Date-Time Last Post"?

poste bitte den Code, wo die Zuweisung und das Modify passieren soll - dabei sagst du uns bitte auch, welche Tabelle in SourceTable eingetragen ist und ZWINGEND(!) gibst du uns alle globalen Variablen mit.
Da ich davon ausgehe, dass es eine Extension ist, kannst du gern den gesamten Code nehmen und hier einstellen - Unternehmenskritische Stellen entfernst du einfach

Re: modify klappt nicht bei DateTime Variable

18. Juni 2021 21:11

Was mich interessieren würde:
- warum muss das Ganze unbedingt im OnAfterGetRecord-Trigger angestossen werden? Ist ja keine übliche Stelle für eine DB-Transaktion (würde mich auch eines Besseren belehren lassen). Man könnte ja auch testweise das Ganze aus einer PageAction anstossen (inkl. anschließendem CurrPage.UPDATE(FALSE):)

- bleibt der Wert auch dann nicht gespeichert, wenn man den MODIFY immer ausführt?
Also statt

Code:
 "End Date-Time Last Post":=SetEnddateLastPost();
        if Format("End Date-Time Last Post") <> '' then
            Modify;

dann so:

Code:
"End Date-Time Last Post":=SetEnddateLastPost();
Modify;


- gibt es evtl Subscriber auf den MODIFY-Trigger der SourceTable der Page? Wenn ja, können die vlt. die Ursache dafür sein, dass der Wert wieder verworfen wird?

Re: modify klappt nicht bei DateTime Variable

8. Juli 2021 13:13

Hallo,

- gibt es evtl Subscriber auf den MODIFY-Trigger der SourceTable der Page? Wenn ja, können die vlt. die Ursache dafür sein, dass der Wert wieder verworfen wird?


Nein, mit dem trigger hatte es letzt endlich doch geklappt und ich konnte die DateTime ins neue Tabellenfeld über tragen:
Code:
trigger OnAfterGetRecord();
   
    begin       
        "End Date-Time Last Post Irl":=SetEnddateLastPost();       
        Modify;
    end;


dann hatte ich aber das Problem, dass die Datensätze nicht aktualisiert wurden.

Um den Datenbankzugriff aus dem Page Trigger zu verbannen und das Feld erst die richtigen Daten enthält, wenn der entsprechende Datensatz mal von einem Benutzer angezeigt wird, habe ich es mit einem EventSubscriber versucht.
Dieser funktioniert leider nicht richtig. Das Tabellenfeld bleibt wieder leer.
Code:
[EventSubscriber(ObjectType::table, Database::"Production Order", 'OnBeforeModifyEvent', '', false, false)]
   
    local procedure ProductionOrderEvent(var Rec : Record "Production Order"; xRec : Record "Production Order"; RunTrigger: Boolean);
    begin
        if Rec.SetEnddateLastPost <> Rec."End Date-Time Last Post Irl" then
            Rec.Validate("End Date-Time Last Post Irl", Rec.SetEnddateLastPost);
    end;