[Gelöst] Notizen auslesen

20. September 2010 17:45

Hallo zusammen,

ich stehe gerade vor folgendem Problem und vielleicht kann mir jemand helfen...

In einer WEB-Anwendung stelle ich Daten von der NAV Datenbank (SQL Server 2008) bereit. Aus der Tabelle [Record Link] möchte ich die Notitzen [Note] auslesen.
Jedoch gelingt mir das weder per SQL Abfrage noch per C# Programm, da die Daten nur kryptischer Form ausgegeben werden.

Daher meine Frage, hat bereits jemand dieses Feld ausgelsesen? Liegen die Daten in einer bestimmten Struktur vor oder gibt es eine Funktion die diese Daten ausliehst?

Vielen Dank
Zuletzt geändert von rush am 21. September 2010 16:57, insgesamt 1-mal geändert.

Re: Notizen auslesen

20. September 2010 18:29

Willkommen bei uns!
Leider gibt es keine Möglichkeit, die Daten direkt aus der Tabelle heraus zu verarbeiten. Tools sind mir auch nicht bekannt.
Es wurde bei MS schon ein Vorschlag eingereicht, das Feld in Zukunft lesbar zu machen. Ob MS den Vorschlag aufgreift - mal schauen.

Re: Notizen auslesen

20. September 2010 18:40

Hi rush,

"Eigentlich" ist das recht einfach. Das genaue Vorgehen ist in folgendem Blog Eintrag beschrieben: How do Record Links encode their data in SQL server?. Seit neustem gibt es auch eine Übersicht, über die dort verwendeten Codierungen von Datentypen: Table Data Type values (used in Record Links).

Denke das ist es, was du suchst. Eine Codeunit dazu musst du dir allerdings selbst schreiben...

Re: Notizen auslesen

20. September 2010 18:48

SilverX hat geschrieben:Hi rush,

"Eigentlich" ist das recht einfach. Das genaue Vorgehen ist in folgendem Blog Eintrag beschrieben: How do Record Links encode their data in SQL server?. Seit neustem gibt es auch eine Übersicht, über die dort verwendeten Codierungen von Datentypen: Table Data Type values (used in Record Links).

Denke das ist es, was du suchst. Eine Codeunit dazu musst du dir allerdings selbst schreiben...

Darum geht es nicht ;-)
Es geht um die Notiz-Funktion im RTC. Notizen werden auch in der Tabelle Record Links gespeichert, doch der Inhalt versteckt sich in einem BLOB-Feld.
Oder hab ich den entscheidenden Hinweis DAZU in deinen Links überlesen?

Wer Partnerstatus hat, möge das hier lesen: http://social.microsoft.com/Forums/en-U ... d76ca9bae2

Re: Notizen auslesen

20. September 2010 18:59

Ups, Scheibenhonig :) Ich gebe zu ich habe die Frage verstanden, allerdings die verlinkten Artikel leider nur gedeutet und nicht gelesen. Asche auf mein Haupt. Ich guck mal, ob ich dazu noch was anderes finde. Sorry!

Re: Notizen auslesen

20. September 2010 20:58

Soooooo. Um meinen Faux Pas auszubügeln hab ich mal geschaut, was da so abgeht. Gespeichert wird das ganze als Byte-Array mit führender Länge. Nach einigen Tests fiel mir die Art der Längencodierung auf und ich erinnerte mich an den BinaryReader bzw. den BinaryWriter des .NET Framework. Dieser speichert auf die gleiche Art. Hab das kurz angetestet, funktioniert.

Lösung also: EXPORT des BLOB-Feldes, Einlesen der Daten per Automation oder externem Programm per BinaryReader.ReadString() (http://msdn.microsoft.com/en-us/library ... tring.aspx)
Umgekehrt: Schreiben per BinaryWriter.Write() (http://msdn.microsoft.com/en-us/library/yzxa6408.aspx) und IMPORT in das BLOB-Feld.

Für eine Beispiel-Implementierung hab ich aber nun weder Zeit noch Lust :) Aber hier mein Code zum Einlesen nach dem Note.EXPORT():

Code:
string note = string.Empty;

using (StreamReader streamReader = new StreamReader(@"C:\Temp\9.bin"))
{
   using (BinaryReader reader = new BinaryReader(streamReader.BaseStream))
   {
      note = reader.ReadString();
      reader.Close();
   }

   streamReader.Close();
}

Re: Notizen auslesen

21. September 2010 11:33

Ersteinmal Danke für die zahlreichen Antworten, das ist echt ein super Forum!!!

@Natalie
das hatte ich schon befürchtet, das es keine Funktion dafür gibt…


@SilverX
ich habe versucht deinen Ansatz nachzubaunen, jedoch ohne dem erhofften Ergebnis…

Code:

//zuerst lese ich das Feld in eine Datei ein     
SqlConnection con = new SqlConnection("Server=***;uid=***;pwd=***;database=***");
SqlDataAdapter da = new SqlDataAdapter("Select * From [Record Link] where [Link ID]= 500", con);
SqlCommandBuilder MyCB = new SqlCommandBuilder(da);
DataSet ds = new DataSet("Note");

byte[] MyData = new byte[0];

da.Fill(ds, "[Record Link]");
DataRow myRow;
myRow = ds.Tables["[Record Link]"].Rows[0];

MyData = (byte[])myRow["Note"];
int ArraySize = new int();
ArraySize = MyData.GetUpperBound(0);

FileStream fs = new FileStream(@"C:\Note.bin", FileMode.OpenOrCreate, FileAccess.Write);
fs.Write(MyData, 0, ArraySize);
fs.Close();

//dann lese ich die Datei mit dem 'BinaryReader' aus   
//Code von SilverX       

string note = string.Empty;

using (StreamReader streamReader = new StreamReader(@"C:\Note.bin"))
{
     using (BinaryReader reader = new BinaryReader(streamReader.BaseStream))
     {
          note = reader.ReadString();
          reader.Close();
     }

     streamReader.Close();
}

}


Als Beispiel gehen wir davon aus, dass das Feld ‚Note‘ den Inhalt 0x01447C…. hat - Jedes ‚Note‘ Feld startet mit dieser Sequenz.
In diesem Fall würde der String 'note' lediglich den Buchstaben ‘D‘ enthalten. Aus folgendem Grund:
Der erste Teil des Feldes signalisiert die gesamt Länge des Feldes – in diesem Fall 1 (0x01)
Der zweite Teil des Feldes 0x44 entspricht dem Unicode für den Buchstaben ‚D‘

Das heißt diese Methode versucht lediglich das Feld ‚Note‘ in einen String umzuwandeln. Da jedoch die Struktur des Feldes ‚Note‘ unbekannt ist bring diese Funktion nicht den gewünschten Erfolg…
oder wende ich diese Funktion falsch an?!

Re: Notizen auslesen

21. September 2010 12:19

Hi rush,

ich denke, das erhoffte Ergebnis wird sich recht schnell einstellen, wenn du die Feldeigenschaft "Compressed" des Feldes "Note" auf "No" setzt. Im Standard wird jedes BLOB-Feld gepackt (Kennzeichen ist wohl die Sequenz 0x01447C) und du kannst die BLOB-Werte nicht 1:1 auslesen. Wie diese gepackt sind weiß ich leider auch nicht, aber an die Daten kommst du auf jeden Fall nach Änderung von "Compressed" auf dem SQL-Weg.

Meine Lösung hat die Daten ja Transparent aus Dynamics NAV per RecordLink.Note.EXPORT() gelesen, bei der die Daten natürlich automatisch entpackt werden :)

Re: Notizen auslesen

21. September 2010 16:57

Danke Carsten!
Du hattest recht, durch die "Compressed" Eigenschaft konnte ich die Notizen nicht auslesen...
Jetzt geht es…

Viele Grüße

Re: [Gelöst] Notizen auslesen

20. Dezember 2010 13:25

Hallo zusammen,

ich habe mit der Notiz aktuell im RTC auch ein Problem:
Ich würde gerne die CC Notizen im RTC benutzen, d.h. z. B. auf der Page (51) "Puchase Invoice" einen neuen Part "Notizen" einfügen, der dann auf die Tab (43) "Purch. Comment Line" verweist.
Dazu habe ich mir eine neue Page (50031) erstellt, die das Datumsfeld und das Bemerkungsfeld (aus Tab. 43) anzeigen.

Ziel ist es, dass der Benutzer in diesem neuen Part in der Einkaufsbestellung im RTC ein paar neue Notizzeilen eintragen kann.

Das Einbinden, Anzeigen und Eintragen der neuen Notizzeilen in dem neuen Part klappt ohne Weiteres, mit dem Spiechern klappt es aber leider nicht.
Ich habe schon mehrere Kombinationen in den page-Eigenschaften meiner neuen Page (50031) ausprobiert, aber ich bekomme es nicht hin, dass alle Zeilen (z.B. 3 neue Zeilen) alle gespeichert werden, sobald ich die Page (51) mit dem OK-Button wieder schließe.

Liegt es an den Eigentschaften meiner neuen Page oder ist es evtl. gar nicht möglich, was ich da vorhabe?
[img]

[/img]

Weiß jemand (aus dem Kopf), ob es irgendwo eine Standard-Page gibt, auf der das so schon realisiert ist?
Die Standard RTC Notizfunktion über das Einbinden einer FactBox vom Typ "System" ist ja nicht so glücklich gelöst.

Wer weiß Rat?
Gruß,
naviii
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: [Gelöst] Notizen auslesen

20. Dezember 2010 22:40

Danke, habe ich nun doch alleine rausgefunden.
Hatte das Problem mit dem Wald und den Bäumen ....

... einfach an der richtigen Stelle in meiner Page (50031) "Purch. Comment Line" im Feld Comment.OnValidate() den neuen Datensatz speichern (CurrPage.SAVERECORD(FALSE)).

naviii

Re: Notizen auslesen

22. Januar 2013 19:26

Natalie hat geschrieben:Willkommen bei uns!
Leider gibt es keine Möglichkeit, die Daten direkt aus der Tabelle heraus zu verarbeiten. Tools sind mir auch nicht bekannt.
Es wurde bei MS schon ein Vorschlag eingereicht, das Feld in Zukunft lesbar zu machen. Ob MS den Vorschlag aufgreift - mal schauen.


Was aber wohl geht ist die Tabelle "Record Link" in einer Page als Webservice zu veröffentlichen und diesen Service kann man dann ja wieder konsumieren. Was wohl aber nicht geht ist diese Tabelle in einer Page direkt zu öffnen.

Volker