Header Image

Translate

zondag 21 juni 2015

Databaselog met callstack


Het komt vaak genoeg voor; een log om bepaalde records, velden of acties bij te houden. De database log is hierin een handige tool, maar deze geeft inzicht in onder welk account welke actie met welke waarden zijn gewijzigd, maar niet waar in de applicatie. Soms zijn bijwerkacties niet altijd vanzelfsprekend, en dan is het zoeken naar wat er voor een proces heeft plaatsgevonden. Vooral als de actie plaats vind als onderdeel van een proces in een maatwerk module is het zoeken.
Een kleine aanpassing om te helpen, werkt in AX2009 maar ook AX4.0; toevoegen van de callstack aan de databaselog.
image
Technisch zeer eenvoudig; een nieuw container veld op de sysdatabaselog krijg op moment van de insert de callstack:
1 public void insert()   2 {   3 container callStack; 4 ;   5 6 new SysDatabaseLogPermission().demand();   7 8 this.Username = UserInfoHelp::userName(curuserid()); 9 // INT Ghull - Begin - add calling callstack 10 callStack = xsession::xppCallStack(); 11 callStack = condel(callstack, 1, 6); // Skip the 3 top stack lines {...} 12 this.INTCallStack = callStack;  13 // INT Ghull - end - add calling callstack 14 super();  15 }
Omdat de insert van de databaselog ook op de stack staat, worden de bovenste 6 (3 regels van de callstack maar een callstack container bestaat uit paren van 2 waarden per callstack regel) verwijderd. Dit zijn de xrecord.update(), Application.LogUpdate() en SysDatabaseLog.Insert methoden (of het equivalent bij de insert/delete). Op het SysDatabaseLog form zelf een simpele knop met wel een securitykey om dit in een info te tonen:
1 //INT 20150621 Ghull - show callstack stored in database log 2 void clicked() 3 {   4 int stackLength = conlen(SysDatabaseLog.INTCallStack) / 2; // 2nd value line number 5 int idx; 6 ; 7 8 for (idx = 0; idx < stackLength; idx++)   9 {  10 info(strfmt('%1 (%2)', conpeek(SysDatabaseLog.INTCallStack, idx*2+1),   11 conpeek(SysDatabaseLog.INTCallStack, idx*2+2))); 12 } 13 }
Oplossing voor Ax2009 is te downloaden hier: INT20150622_AX2009_DatabaseLogCallStack.xpo De 4.0 variant is eigenlijk hetzelfde.

Gerrit


Geen opmerkingen:

Een reactie posten