Code Coverage - Wo ist die Funktion dazu?

29. Juni 2006 12:38

Wenn ich Code Coverage gestartet habe, erhalte ich ja zum Abschluss eine Liste des Codes, der durchlaufen wurde.

Weiss jemand, wo die Funktion zu finden ist, die den SourceCode in die Tabelle Code Coverage schreibt?

Oder kennt jemand eine andere Möglichkeit, den SourceCode direkt auszulesen um ihn in eine Tabelle zu schreiben?

Bin dankbar für jeden Tip.

29. Juni 2006 13:40

Hallo Roger

Ich fürchte, weiss es aber nicht genau, auf diesen Programmteil hat man keinen Zugriff. Die Logik befindet sich sicher in fin.exe.
Aber hast Du schon mal versucht eine Record vom SubType Code Coverage zu deklarieren und darauf zu zugreifen?
Da steht alles Drin! Dann müsste man halt die Tabelle mit Repeat Until durchlaufen und die gewünschten Datensätze in eine eigene Tabelle schreiben.

Gruss
Martin

29. Juni 2006 13:50

martinst hat geschrieben:Aber hast Du schon mal versucht eine Record vom SubType Code Coverage zu deklarieren und darauf zu zugreifen?
Da steht alles Drin! Dann müsste man halt die Tabelle mit Repeat Until durchlaufen und die gewünschten Datensätze in eine eigene Tabelle schreiben.


Hallo Martin,
ja, das habe ich bereits versucht. Grundsätzlich ist der Code so im Klartext lesbar. Das Problem dabei ist, dass diese Tabelle gefüllt wird, wenn Programme durchlaufen werden nachdem Code Coverage gestartet wurde. Es sind also immer Codeauschnitte drin. Was ich möchte ist, dass ich z.B. ein Objekt angeben kann, und als Resultat den gesamten Code ausgelesen bekomme, der in diesem Objekt drin ist.

29. Juni 2006 14:00

Aha

So wird das vermutlich nicht gehen.
Du kannst höchstens an bestimmten Stellen im Code mit CODECOVERAGELOG := TRUE bzw. CODECOVERAGELOG := FALSE das Aufzeichnen starten bzw. beenden.
Aber dann wird natürlich aller code zwischen Start und Ende aufgezeichnet.
Du könntest dann aber mit den Felder Object Type und Object ID die Tabelle Code Coverage filtern.

Gruss
Martin

29. Juni 2006 14:07

Das habe ich befürchtet :-(

Andersrum gefragt. Navision speichert doch den Source Code in der Tabelle Objects im BLOB-Feld 'BLOB Reference', wenn ich das richtig sehe.

Gibt es einen Weg, den Code dort auszulesen? Existiert dazu ev. irgendwo ein Tool?

29. Juni 2006 14:17

Andersrum gefragt. Navision speichert doch den Source Code in der Tabelle Objects im BLOB-Feld 'BLOB Reference', wenn ich das richtig sehe.


Kein Problem. Ist aber der comiplierte Code. Der wird Dir nicht viel nützen.
Gruss

29. Juni 2006 17:56

Hallo Roger,
Was für eine Art von Tabelle soll das denn sein?
Du könntest ja das Objekt im TXT-Format exportieren, dann alles, was kein Code ist, aus der Textdatei löschen und dann den Rest, also den reinen C/AL-Code in eine Tabelle importieren.

Das Tool zum Auslesen des Codes gibt es, es heisst C/AL-Code und ist in Navision im Objektdesignmodus mit F9 aufzurufen :mrgreen: :mrgreen:
Allerdings hast du es dann noch nicht in einer Tabelle ;-) Aber auch hier funktioniert Cut&Paste ;-)

29. Juni 2006 20:09

Hallo Michael,
Ich bin auf der Suche nach einer Möglichkeit, Anpassungen an Standardobjekten möglichst einfach und schnell zu dokumentieren. Wenn ich also innerhalb von Navision über ein eigenes Programm den SourceCode lesen könnte, wäre ich in der Lage, anhand der Kommentare wie // AB1.0 usw. individuelle Änderungen in einer eigenen Tabelle festzuhalten. Zusammen mit der Information aus den Tabellen Object, Table und Field liesse sich dann auf Knopfdruck eine Doku erstellen.

Nur möchte ich das möglichst innerhalb von Navision lösen, quasi RealTime/Online, ohne den Weg über Textexport und externe Lösungen.

Aber ob ich etwas vernüftiges zustande bringe? :roll:

30. Juni 2006 09:09

Ich frage mich bei der ganzen Geschichte, wo ist der Source-Code in Navision in NICHT-Compilierter Form abgelegt?
Dann wäre es ein Kinderspiel.

30. Juni 2006 09:17

martinst hat geschrieben:Ich frage mich bei der ganzen Geschichte, wo ist der Source-Code in Navision in NICHT-Compilierter Form abgelegt?


Genau diese Frage stelle ich mir auch. Ich vermute aber, dass der C/AL Editor das Feld BLOB-Reference aus der Tabelle Object beim öffnen jeweils liest, und den kompilierten Code quais de-kompiliert. Ich habe nämlich auch schon die Tabellen nach dem Source im Klartext abgegrast, bin aber nicht fündig geworden.

Das es aber möglich ist, beweist das NDT. Das Tool kann nämlich direkt auf einen offenen Client zugreifen und den Code in lesbarer Form in einer Navision-Tabelle ablegen.

30. Juni 2006 09:21

Das es aber möglich ist, beweist das NDT. Das Tool kann nämlich direkt auf einen offenen Client zugreifen und den Code in lesbarer Form in einer Navision-Tabelle ablegen.


Ich meinte, dass DDE hier das Zauberwort ist.
Gruss

30. Juni 2006 12:17

das NDT liest das blobfeld aus und dekompiliert....

30. Juni 2006 13:12

das NDT liest das blobfeld aus und dekompiliert....


Ist das tatsächlich so, oder einfach eine Annahme?
Gruss

30. Juni 2006 17:12

kann natürlich sein, dass über dde die Funktion zum dekompilieren im Client aufgerufen wird, und die Daten im Klartext kommen, aber ich nehme eher an, dass der einfach das Blobfeld ausliest und selber dekompiliert, weil die kompilierten Daten schneller übertragen werden können.
Um das genau herauszufinden, muss man wohl einen der Entwickler fragen ;-)

1. Juli 2006 20:21

Also, ich bin der Sache jetzt einen grossen Schritt nähergekommen.

Fakt ist, der Code lässt sich definitiv nicht direkt aus der Tabelle Object auslesen. Er ist dort in kompilierten Form gespeichert, und wird vom Editor on-the-fly ausgelesen und in Klartext übersetzt.

Folgende Möglichkeit gibt es aber:
Man erstellt eine Codeunit und fügt sinngemäss folgenden Code dort ein:

Code:
CODECOVERAGELOG(TRUE);
FORM.RUN(0, SalesHeader);
CODECOVERAGELOG(FALSE);


Wird das Form wieder geschlossen, kann man das Form 566 - Code Overview aufrufen und sieht darin im Klartext den kompletten Code der Tabelle 36. Gespeichert ist das Ganze in der Tabelle Code Coverage. Diese ist im Object Designer nicht sichtbar. Man muss eine Form erstellen mit dieser Tabelle, dann sieht man die Einträge. Sehr schön zu sehen ist dann immer, wo, welcher Trigger beginnt, welche Zeilen Code beinhalten usw.

CodeUnits kann einfach mit RUN aufrufen und hat dann ebenfalls den gesamten Code in der Tabelle. Es ist jetzt natürlich ein Leichtes, nach bestimmten Triggern, Kommentaren usw. zu suchen.

Ist sicher noch nicht 100%, kommt aber dem was ich will, recht nahe. Das Starten von Tabellen z.B. ist nicht das Wahre über die LookupForm. MAn muss dann diese immer manuell schliessen. Zudem lässt sich der Record nicht dynamisch übergeben.

Vielleicht hat hier ja noch jemand weitere Ideen dazu.

1. Juli 2006 23:53

rotsch hat geschrieben:Zudem lässt sich der Record nicht dynamisch übergeben.

Vielleicht hat hier ja noch jemand weitere Ideen dazu.


RecRef geht nicht?

2. Juli 2006 00:01

Michael Schumacher hat geschrieben:RecRef geht nicht?


Leider nicht. :-(

Wenn du z.B. den Aufruf FROM.RUN(0, Rec) ausführen willst, muss Rec implizit der SourcTable des Forms entsprechen.

2. Juli 2006 00:07

und die Formnummer als Variable und dafür den REC weglassen?
Code:
zb. for i= 1 to 99008544 do begin
  CODECOVERAGELOG(TRUE);
  FORM.RUN(i);
  CODECOVERAGELOG(FALSE);
end;

Du hast dann allerdings ne menge Forms wieder zuzuklicken :mrgreen:

2. Juli 2006 00:13

Michael Schumacher hat geschrieben:und die Formnummer als Variable und dafür den REC weglassen?


Hab ich schon versucht, das frisst er leider nicht.

2. Juli 2006 00:17

dann bleibt Dir nur, für jede Form, die dich interessiert,eine Variable anlegen, was dann den Vorteil hat, dass du sie auch wieder schliessen kannst....

2. Juli 2006 10:40

Ja, ich denke, anders wird es kaum gehen. Wenn man die LookupFormID der Tabelle irgendwo auslesen könnte, dann könnte man wenigstens mit FORM.RUN(ID) arbeiten.

2. Juli 2006 11:17

Die steht leider in den Properties, die im BLOB verschlüsselt sind....

Aber hast du nicht vorher gesagt, dass er ID als Variable nicht frißt?

Wenn doch, könntest du vielleicht die Tabelle Object als quelle nutzen:

Code:
with object do begin
  setrange(type,type::form);
  setfilter(name, '%1|%2' , '*s' , '*List');
  if findset(false,false) then repeat
    CODECOVERAGELOG(TRUE);
    FORM.RUN(ID);
    CODECOVERAGELOG(FALSE);
  until next=0;
end;


Damit würde jede Form ausgeführt, die mit s endet, also alle Namen in der Mehrzahl (design Guide !!!), bzw die mit dem Wort List am Ende.
Damit dürften nahezu alle LookupForms gefunden sein.....

2. Juli 2006 11:42

Michael Schumacher hat geschrieben:Aber hast du nicht vorher gesagt, dass er ID als Variable nicht frißt?


Der Aufruf FORM.RUN(0, Rec) ruft autmatisch diejnige Form auf, die als LookupForm auf der Tabelle hinterlegt ist. dazu muss aber Rec der Tabelle entsprechen (ReRef geht nicht)

FROM.RUN(ID) ruft das Form auf, das der ID entspricht. Das kann irgendein Form, mit irgendeiner Tabelle dran sein.

Aber das mit der Tabelle Object werden ich mal versuchen, danke.