Codeunit 1 Sammlung Funktions IDs

22. November 2011 11:50

Hallo,

wie die meisten vielleicht wissen hat ja die Codeunit 1 bestimmte "magische" Trigger welche leider nicht wirklich gut dokumentiert sind (Bsp. ID 99 -> steuert NAS). Allerdings habe ich vergeblich nach einer Liste hierüber gesucht welche ID was tut. Aber vielleicht kann ich die ja mit eurer Hilfe komplettieren:


ID 1 - Damit konnte man in der Vergangenheit ein automatisches Hauptmenü triggern welches auch über F12 aufgerufen wurde. Mit Nav 2009 hat das allerdings einen unerwünschten Nebeneffekt, da hier das eingestellte Haupmenü auch bei anderen Aktivitäten in anderen Forms getriggert wird

NAV 2009 R2
ID 25 - GetDatabaseTableTriggerSetup
ID 26 - OnDatabaseInsert
ID 27 - OnDatabaseModify
ID 28 - OnDatabaseDelete
ID 29 - OnDatabaseRename

Quelle: http://mibuso.com/blogs/mandyk/2011/01/ ... n-2009-r2/

Meiner Kenntnis setzen hierauf z.B. der Objekt Manager Advanced auf um die Source Code-Änderungen mitzubekommen.

ID 99 - Code wird von NAS getriggert
Zuletzt geändert von holger1076 am 22. November 2011 16:54, insgesamt 1-mal geändert.

Re: Codeunit 1 Sammlung Funktions IDs

22. November 2011 12:08

ID120 kann OnReportRun triggern. :greenarrow: http://blogs.msdn.com/b/nav/archive/201 ... usage.aspx

Re: Codeunit 1 Sammlung Funktions IDs

22. November 2011 16:13

ID 109 MakeCode: :greenarrow: http://www.comporsys.de/dynamics-nav-bl ... de-feldern
Filtert überflüssige Steuerzeichen aus Codefeldern.

Im Standard bereits vorhanden:
  • MakeDateTimeText (114)
  • MakeDateText (105)
  • MakeTimeText (106)
  • MakeText (107)
  • MakeDateTimeFilter (214)
  • MakeDateFilter (205)

Re: Codeunit 1 Sammlung Funktions IDs

22. November 2011 17:29

Trigger 26 bei Objekt import durch txt wird NICHT ausgelöst. Dies ist ein Bug, welcher IDYN an MS reportet hat.

Aus Codeunit 1 W1 2009R2:
    1 Run
    2 ApplicationVersion
    3 ApplicationBuild
    4 ApplicationLanguage
    5 SetGlobalLanguage
    6 CodeCoverage
    11 FindPrinter
    12 AutoFormatTranslate
    14 ReadRounding
    15 CaptionClassTranslate
    20 GetGlobalTableTriggerMask
    21 OnGlobalInsert
    22 OnGlobalModify
    23 OnGlobalDelete
    24 OnGlobalRename
    25 GetDatabaseTableTriggerSetup
    26 OnDatabaseInsert
    27 OnDatabaseModify
    28 OnDatabaseDelete
    29 OnDatabaseRename
    30 CompanyOpen
    31 CompanyClose
    50 DefaultRoleCenter
    51 GetSystemIndicator
    99 NASHandler
    105 MakeDateText
    106 MakeTimeText
    107 MakeText
    114 MakeDateTimeText
    116 LaunchApp
    117 SelectStyleSheet
    118 ManageStyleSheets
    205 MakeDateFilter
    214 MakeDateTimeFilter

Re: Codeunit 1 Sammlung Funktions IDs

22. November 2011 22:07

Folgende Funktion wird zwar mit den Standard-Datenbanken nicht ausgeliefert, wurde jedoch mit Version 4.00 (oder da in dem Dreh) eingeführt und in der dazugehörigen Changes.doc beschrieben:

212122 GetUidOffset
Code:
GetUidOffset() : Integer
EXIT(50000);


Diese Funktion legt fest, ab welcher ID die Variablen, Funktionen und TextConst hochgezählt werden.
Je nach verwendeter Lizenz startet die Hochzählung nämlich sonst bei 1 (welches für den NAV-Standard verwendet wird), oder im Mrd.-Bereich.
Für Branchenlösungen empfiehlt es sich, in der Funktion die Basis-ID des von Microsoft zugwiesenen Nummernbereich (5.xxx.xxx) zu verwenden.
Für kundenindividuelle Anpassungen bietet sich (die oben verwendete) ID 50.000 an, welche allgemein mit der "Customer Object Area" in Verbindung gesetzt wird. ("50.000er-Bereich")

Re: Codeunit 1 Sammlung Funktions IDs

23. November 2011 09:46

Einige habe ich auch gefunden und versucht die bisherigen Tipps zusammengetragen. :-D

Die rot markierten IDs sind (bisher) undokumentierte Trigger, welche im Standard nicht mit einer globalen Funktion in der CU 1 versehen sind.
Die orange markierten IDs sind plausibel aber unsicher, hier muss die Quelle noch geprüft werden.

Zunächst noch eine allgemeine Information:
:greenarrow: Description of the reserved C/SIDE Function IDs in Codeunit 1 (Link)
Wobei man sich anscheinend aber auch nicht gänzlich nur auf die ersten 20.000 IDs beschränkt. :wink:

    1 CompanyOpen (<= NAV 3)
    2 ApplicationVersion
    3 ApplicationBuild
    4 ApplicationLanguage
    5 SetGlobalLanguage
    6 CodeCoverage (Link)
    11 FindPrinter (Link)
    12 AutoFormatTranslate (Link)
    14 ReadRounding (Link)
    15 CaptionClassTranslate (Link)
    20 GetGlobalTableTriggerMask (>= NAV 4)
    21 OnGlobalInsert (>= NAV 4)
    22 OnGlobalModify (>= NAV 4)
    23 OnGlobalDelete (>= NAV 4)
    24 OnGlobalRename (>= NAV 4)
    25 GetDatabaseTableTriggerSetup (>= NAV 2009 R2) (Link) :idea: holger1076
    26 OnDatabaseInsert (>= NAV 2009 R2) (Link) (Link) :idea: holger1076, JanGD
    27 OnDatabaseModify (>= NAV 2009 R2) (Link) :idea: holger1076
    28 OnDatabaseDelete (>= NAV 2009 R2) (Link) :idea: holger1076
    29 OnDatabaseRename (>= NAV 2009 R2) (Link) :idea: holger1076
    30 CompanyOpen (>= NAV 4)
    31 CompanyClose (>= NAV 4)
    50 DefaultRoleCenter (>= NAV 2009)
    51 GetSystemIndicator (>= NAV 2009 R2) (Link)
    75 GetPaperTrayForReport (>= NAV 2013) (Link) :idea: winfy
    99 NASHandler (Link)
    100 MakeSpecial (Link)
    101 MakeBoolean (Link)
    102 MakeOption (Link)
    103 MakeInteger (Link)
    104 MakeDecimal (Link)
    105 MakeDateText
    106 MakeTimeText
    107 MakeText
    109 MakeCode (Link) :idea: Natalie
    110 MakeBinary (Link)
    111 MakeBLOB (Link)
    112 MakeBigInteger (Link)
    113 MakeDuration (Link)
    114 MakeDateTimeText (>= NAV 4) (Link)
    115 MakeGUID (Link)
    116 LaunchApp (>= NAV 2009)
    117 SelectStyleSheet (>= NAV 2009)
    118 ManageStyleSheets (>= NAV 2009)
    120 OnReportRun (Link) :idea: McClane
    200 MakeSpecialFilter (Link)
    201 MakeBooleanFilter (Link)
    202 MakeOptionFilter (Link)
    203 MakeIntegerFilter (Link)
    204 MakeDecimalFilter (Link)
    205 MakeDateFilter
    206 MakeTimeFilter (Link)
    207 MakeTextFilter (Link)
    209 MakeCodeFilter (Link)
    210 MakeBinaryFilter (Link)
    211 MakeBLOBFilter (Link)
    212 MakeBigIntegerFilter (Link)
    213 MakeDurationFilter (Link)
    214 MakeDateTimeFilter (>= NAV 4)
    215 MakeGUIDFilter (Link)
    304 Fmt Decimal (<= NAV 4)
    404 Eval Decimal (<= NAV 4)
    10001 LogInStart (<= NAV 3)
    10002 LogInEnd (<= NAV 3)
    10011 GetSeparateDateTime (>= NAV 4) (Link)
    212122 GetUidOffset (Link) :idea: Timo Lässer
    1000000 BaseApplicationBuild (>= NAV 2009)
    1100000 AccessToCartera (>= NAV ES 4) (Link)
    1100001 BaseApplicationBuild (= NAV ES 4)
    1140000 BaseApplicationBuild (= NAV 4)
    1102601001 ValidateApplicationlLanguage (>= NAV 2009)
    1102601005 LookupApplicationlLanguage (>= NAV 2009)

mfg,
winfy
Zuletzt geändert von winfy am 3. Dezember 2014 15:47, insgesamt 2-mal geändert.

Re: Codeunit 1 Sammlung Funktions IDs

24. April 2013 12:26

McClane hat geschrieben:ID120 kann OnReportRun triggern. :greenarrow: http://blogs.msdn.com/b/nav/archive/201 ... usage.aspx

Leider hat die Funktion einen kleinen Haken: Es lassen sich keine Reports mehr modal starten, da Schreibtransaktionen und RUNMODAL sich gegenseitig ausschließen.

Workaround:
Man nehme eine SingleInstance-Codeunit (z. B. meine immer wieder beliebte GlobalVariableManagement) und definiere dort zwei Funktionen:
LogReportExecution(ReportID : Integer)
und
WriteRepExecLog2Database()

In der LogReportExecution füllt man nur eine temporäre Tabelle.
In der WriteRepExecLog2Database überträgt man die temporären Datensätze in die Datenbank.

In Codeunit 1 - OnReportRun ruft man dann die Funktion LogReportExecution auf.
In Codeunit 1 - LogInEnd ruft man dann die Funktion WriteRepExecLog2Database auf.

Vorteil: Funktioniert auch mit modal gestarteten Reports

Nachteile:
Die Daten stehen erst nach Ende der Benutzer-Session zur Verfügung.
Die gesammelten Daten landen im Nirvana, wenn der Client abstürzt.

Meiner Meinung nach sind die Nachteile jedoch akzeptabel, da man in der Regel keine 100%ig genauen Daten in Echtzeit benötigt, sondern einen Überblick haben möchte, ob und wie oft ein bestimmter Report gestartet wurde.

Re: Codeunit 1 Sammlung Funktions IDs

24. April 2013 12:55

Timo Lässer hat geschrieben:Leider hat die Funktion einen kleinen Haken: Es lassen sich keine Reports mehr modal starten, da Schreibtransaktionen und RUNMODAL sich gegenseitig ausschließen.

Doch, das geht :shock: Meinst du ein simples report.runmodal(123456, true, false, rec) oder etwas anderes?

Re: Codeunit 1 Sammlung Funktions IDs

24. April 2013 13:29

McClane hat geschrieben:
Timo Lässer hat geschrieben:Leider hat die Funktion einen kleinen Haken: Es lassen sich keine Reports mehr modal starten, da Schreibtransaktionen und RUNMODAL sich gegenseitig ausschließen.

Doch, das geht :shock: Meinst du ein simples report.runmodal(123456, true, false, rec) oder etwas anderes?

Ja genau, ich meine ein REPORT.RUNMODAL(ReportSelection."Report ID",TRUE,FALSE,SalesHeader);, wie es z. B. die Codeunit 229 aufruft.
(Hier beim Kunden ist die RunTime 6.00.33194 im Einsatz.)

Re: Codeunit 1 Sammlung Funktions IDs

24. April 2013 14:20

In meiner NAV5 hat es problemlos funktioniert. Hab aber in dem Blog-Beitrag die Einträge mit dem runmodal-Problem gesehen.

Re: Codeunit 1 Sammlung Funktions IDs

2. Dezember 2013 19:18

Wenn man hier schon den Umweg über eine SI-Codeunit gehen muß, könnte man dann nicht auch diese CU mit einem Timer belegen, so daß die Einträge im Report Log bspw. alle fünf Minuten weggesichert werden würden? Oder seht ihr da ein anderes Folgeproblem (z.B. Performance oder dergleichen)?

Ich meine, dann hätte man die Wahrscheinlichkeit von Datenverlust durch einen Absturz des Clients reduziert und gleichzeitig die Aktualität des Report Logs erhöht. Es gibt ja viele Benutzer, die melden sich morgens einmal an und abends dann erst wieder ab.

Hab ich das jetzt richtig verstanden, daß die Lösung nach OnInitReport greift? Das heißt doch dann wohl, daß der Eintrag im Report Log bei einem Fehler zur Laufzeit des Reports trotzdem bestehen bleibt, oder? Gibt es keinen Trigger, der nach OnPostReport läuft?

Wie kann man nur Reports verfolgen, die auch eine Ausgabe erzeugen? Ich meine, Claus schreibt ja in seinem Blog, daß FindPrinter nur aufgerufen wird, wenn UseSystemPrinter auf Nein steht. Eine Black bzw. White List, wie in den Kommentaren vorgeschlagen, finde ich auch nicht so praktikabel, weil man ja dann bei jedem neuen Report auch immer diese Einrichtung mit beachten muß. Ich denke, das geht auf lange Sicht schief, besonders wenn unterschiedliche Kunden unterschiedliche Lösungen haben, die nicht immer den Report Log enthalten.