Bodo's Dynamics NAV Blog

Bodo ist ein Dynamics NAV Urgestein. Er programmiert NAV seit DOS Zeiten und hat auch keine Scheu vor .NET und schon gar nicht vor Dynamics 365 oder Azure. Viele Neueinsteiger wurden von ihm in den letzten Jahren zu NAV Entwicklern ausgebildet.

In diesem Blog veröffentlichen Bodo und andere Superhelden Interessantes aus der Welt von Dynamics NAV, Dynamics 365 und Azure.

NAV 2009 – Notizen und Benachrichtigungen an Active Directory Gruppen

Verfasst von Bodo am Montag, 11. Juli 2011

Tags: rtc, nav, active directory, 2009

Mit dem NAV 2009 Role Tailored Client hat Microsoft die Notizen erfunden, die man an jeden beliebigen Datensatz hängen kann, und gleichzeitig die Möglichkeit geschaffen, andere Benutzer über die angehängte Notiz zu benachrichtigen.

Dabei werden bei der Auswahl des Benachrichtigungsempfängers die eingerichteten Windows Anmeldungen angezeigt. Sowohl die Active Directory Benutzer (z.B. der Administrator) als auch die Active Directory Gruppen (z.B. das Dynamics NAV Team), wie die folgende Abbildung zeigt:

Unglücklicherweise verschwinden Benachrichtigungen an Active Directory Gruppen im Nirwana und werden nicht den Gruppenmitgliedern zugestellt.

Diese Einschränkung wollte ich durch eine kleine Umbaumaßnahme beseitigen und bin dabei zunächst auf ein anderes Problem gestoßen, dass ich in meinem letzten Artikel dokumentiert habe: NAV 2009 – Interner Fehler 12 in Modul 40. Mit Hilfe der dort entwickelten .NET Assembly ist der Rest allerdings ein Kinderspiel.

Die Notizen werden in der Tabelle 2000000068 Record Link gespeichert. Wir müssen daher nur das OnInsert-Ereignis dieser Tabelle so erweitern, dass Record Links für alle Mitglieder der gewählten Active Directory Gruppe generiert werden.

OnInsert-Trigger
RecordLink    Record Record Link 
Search        DotNet 'Comporsys.LdapSearch, Version=1.0.0.0, Culture=neutral, PublicKeyToken=bdf4f6702c4e909e'.Comporsys.LdapSearch.Search
List          DotNet 'Comporsys.LdapSearch, Version=1.0.0.0, Culture=neutral, PublicKeyToken=bdf4f6702c4e909e'.Comporsys.LdapSearch.WindowsGroupMemberList
Member        DotNet 'Comporsys.LdapSearch, Version=1.0.0.0, Culture=neutral, PublicKeyToken=bdf4f6702c4e909e'.Comporsys.LdapSearch.WindowsGroupMember
WinObj        DotNet 'Comporsys.LdapSearch, Version=1.0.0.0, Culture=neutral, PublicKeyToken=bdf4f6702c4e909e'.Comporsys.LdapSearch.WindowsObject
i             Integer
 
// --- 001
IF NOT Notify THEN BEGIN
  EXIT;
END;
 
Search := Search.Search('comporsys-hansa');  // ToDo: Servername sollte konfigurierbar sein
WinObj := Search.FindUserOrGroup("To User ID");
IF WinObj.Type = 'user' THEN BEGIN
  EXIT;
END;
 
List := Search.FindGroupMember("To User ID");
FOR i := 0 TO List.Count - 1 DO BEGIN
  Member := List.Item(i);
  CLEAR(RecordLink);
  RecordLink.COPY(Rec);
  RecordLink."To User ID" := Member.MemberId;
  RecordLink.INSERT;
END;
// +++ 001

Hierzu nur noch folgende Anmerkungen:

1) Der Primärschlüssel „Link ID“ der Tabelle Record Link ist auf „AutoIncrement“ gesetzt und muss bzw. darf daher nicht manuell gesetzt werden.
2) Die Methode COPY() des Record-Datentyps kopiert auch den Inhalt der BLOB-Spalte „Note“ um.

 

OnInsert-Trigger

 

RecordLink    RecordRecord Link 

Search        DotNet'Comporsys.LdapSearch, Version=1.0.0.0, Culture=neutral, PublicKeyToken=bdf4f6702c4e909e'.Comporsys.LdapSearch.Search

List          DotNet'Comporsys.LdapSearch, Version=1.0.0.0, Culture=neutral, PublicKeyToken=bdf4f6702c4e909e'.Comporsys.LdapSearch.WindowsGroupMemberList

Member        DotNet'Comporsys.LdapSearch, Version=1.0.0.0, Culture=neutral, PublicKeyToken=bdf4f6702c4e909e'.Comporsys.LdapSearch.WindowsGroupMember

WinObj        DotNet'Comporsys.LdapSearch, Version=1.0.0.0, Culture=neutral, PublicKeyToken=bdf4f6702c4e909e'.Comporsys.LdapSearch.WindowsObject

i             Integer

 

// --- 001

IF NOT Notify THEN BEGIN

  EXIT;

END;

 

Search := Search.Search('comporsys-hansa');  // ToDo: Servername sollte konfigurierbar sein

WinObj := Search.FindUserOrGroup("To User ID");

IF WinObj.Type = 'user' THEN BEGIN

  EXIT;

END;

 

List := Search.FindGroupMember("To User ID");

FOR i := 0 TO List.Count - 1 DO BEGIN

  Member := List.Item(i);

  CLEAR(RecordLink);

  RecordLink.COPY(Rec);

  RecordLink."To User ID" := Member.MemberId;

  RecordLink.INSERT;

END;

// +++ 001


Kontakt

Comporsys Hansa GmbH
Spitzerdorfstr. 3
22880 Wedel, Deutschland

Tel. +49 (0)4103 12117 - 0
Fax +49 (0)4103 12117 - 29
E-Mail: info@comporsys.de