Danjo's two cents NAV, Powershell, Android, C#, Lync, Win8, …

24Okt/140

NAV 2013 R2 – Änderungen werden erst nach Neustart des ServiceTiers aktiv

Diese Woche bin ich auf ein eher störendes Phänomen bei der Entwicklung in einer NAV 2013 R2 CU12 Datenbank gestosen. (Das verhalten konnte ich inzwischen auch in älteren Build-Versionen nachstellen)

Ich lege eine neue Tabelle an, erzeuge eine Page dazu und klicke auf RUN.

SQL-Fehler: Tabelle kann nicht gefunden werden.

Kurzer Blick auf dem Server, die Tabelle fehlt tatsächlich.

Export -> Lösche -> Import -> Tabelle fehlt

Sync-NAVTenant im Powershell aufrufen -> kein Fehler -> Tabelle fehlt

Neustart NST -> Tabelle fehlt -> Start RTC -> Tabelle wird angelegt

 

Diese Verhalten war Problemlos jederzeit reproduzierbar. Doch wo kam es her? An CU12 scheint es nicht zu liegen.

Fragen wir doch mal das Internet: Keine der üblichen Suchen bringt etwas das helfen könnte.

Dann hat es mir doch noch gedämmert: Es sieht so aus als ob der Trigger in der Object Metadata Tabelle fehlt.

Kurzer Blick: Stimmt, der ist nicht da.

 

Wie habe ich das den geschafft?

Mein Vorgehen war so:

- Neue Datenbank über SQL anlegen

- Import einer NAVDATA-Sicherung inkl. aller Objekte und Daten

 

In der Dev-Enviroment sieht alles gut aus. Der RTC läuft auch stabil.

 

Zum Schluß dann noch wie das ganze zu korrigieren ist:

Der Trigger lässt sich über SQL anlegen:

/****** Object: Trigger [dbo].[$ndo$objecttracking] Script Date: 23.10.2014 08:38:20 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TRIGGER [dbo].[$ndo$objecttracking] ON [dbo].[Object Metadata] FOR DELETE, INSERT, UPDATE AS SET NOCOUNT ON DECLARE @delCount INTEGER, @insCount INTEGER, @updatedRows INTEGER, @currentDBTS BIGINT SELECT @delCount = COUNT(*) FROM DELETED SELECT @insCount = COUNT(*) FROM INSERTED SELECT @updatedRows = 0 SELECT @currentDBTS = CAST(@@DBTS AS BIGINT) IF (@insCount > 0) BEGIN UPDATE [dbo].[Object Tracking] SET [Object Timestamp] = @currentDBTS FROM INSERTED AS I JOIN [dbo].[Object Tracking] AS T ON (T.[Object Type] = I.[Object Type] AND T.[Object ID] = I.[Object ID] AND T.[Change Type] = 0) SELECT @updatedRows = @@ROWCOUNT IF (@updatedRows < @insCount) BEGIN INSERT INTO [dbo].[Object Tracking] ([Object Type], [Object ID], [Change Type], [Object Timestamp]) SELECT I.[Object Type], I.[Object ID], 0, @currentDBTS FROM INSERTED AS I LEFT OUTER JOIN [dbo].[Object Tracking] AS T ON (I.[Object Type] = T.[Object Type] AND I.[Object ID] = T.[Object ID] AND T.[Change Type] = 0) WHERE T.[Object Type] IS NULL AND T.[Object ID] IS NULL END END IF (@delCount > 0) BEGIN IF (@updatedRows = 0) BEGIN UPDATE [dbo].[Object Tracking] SET [Object Timestamp] = @currentDBTS FROM DELETED AS D JOIN [dbo].[Object Tracking] AS T ON (T.[Object Type] = D.[Object Type] AND T.[Object ID] = D.[Object ID] AND T.[Change Type] = 0) SELECT @updatedRows = @@ROWCOUNT END IF (@updatedRows < @delCount) BEGIN INSERT INTO [dbo].[Object Tracking] ([Object Type], [Object ID], [Change Type], [Object Timestamp]) SELECT D.[Object Type], D.[Object ID], 0, @currentDBTS FROM DELETED AS D LEFT OUTER JOIN [dbo].[Object Tracking] AS T ON (D.[Object Type] = T.[Object Type] AND D.[Object ID] = T.[Object ID] AND T.[Change Type] = 0) WHERE T.[Object Type] IS NULL AND T.[Object ID] IS NULL END END GO

2Feb/120

Mit Powershell in C# neue Dienste anlegen

Derzeit bin ich damit beschäftigt das C#/Powershell-Projekt für NAV-Services des MS Dynamics NAV Team Blog's für mich anzupassen und zu erweitern.
(http://blogs.msdn.com/b/nav/archive/2011/09/19/using-powershell-to-configure-dynamics-nav-services.aspx)

Während einiges schnell umgesetzt werden kann, hat sich das Anlegen von Diensten, gerade über Remote-Zugriffe als nicht so trivial erwiesen. Das Hauptproblem für mich war das ich keine Beispiele online finden konnte. 😉
Nach einigen Tagen suchen und testen habe ich es mit wenigen Zeilen Code geschafft. (Dieser Codeschnipsel ist Teil des oben verlinkten Projektes, alle nicht hier definierten Objekte sind dort zu finden)

Schaut euch diesen MSDN-Artikel für eine Definition der Parameter und weitere Starttypen an.

31Jan/120

CMD Vervollständigung

Gestern hatte ich einen dieser Aha-Effekte, der Erstaunen bei einem selbst oder seinem Gegenüber auslöst während der andere etwas für ihn alltägliches tut.

Was genau ist also gestern passiert? Während ich in der Windows-Kommandozeile geschrieben habe, wurden dir Pfade und Dateinamen wie von Zauberhand eingefügt. Einige von euch werden jetzt sagen: "Das kenne ich schon. Was ist daran denn neu? Wir arbeiten ja nicht mit MS-DOS."

Für die jenigen unter euch die nicht so antworten, werde ich kurz erklären was passiert ist: In der Kommandozeile (und natürlich auch in Powershell) ist es möglich die Ordner- und Dateinamen nur anzufangen zu tippen und automatisch vervollständigen zu lassen. Das funktioniert in dem man die ersten Buchstaben noch eintippt und anschliessend die <TAB>-Taste drückt. Gibt es hierbei mehrere mögliche Vervollständigungen, so wird die erste verwendet. Um jetzt aber eine der anderen Möglichkeiten zu bekommen, drückt man noch einmal die <TAB>-Taste und die Ergänzung wechselt zur nächsten Möglichkeit, ...

In der Hoffnung damit einigen da draussen die Tipparbeit zu erleichtern 😉

 

 

   
%d Bloggern gefällt das: