Auf DateTime Feld filtern

9. Februar 2007 15:20

Hallo,

auf der Kontaktkarte gibt es eine Verlinkung zur Tabelle "Change Log Entry". Ich möchte die Tabelle u. a. auf das Feld "Date and Time" filtern.

Code:
ChangeLogEntry_rec.SETRANGE("Date and Time",DateTime);

Die Variable DateTime wird als Parameter aus einer Funktion übergeben. Unabhängig davon habe ich auch probiert die Tabelle manuell zu filtern. Das gleich Ergebnis, nämlich keins!

Kennt jemand das Problem oder habe nur ich das?

9. Februar 2007 15:28

Könnte es sein, dass dir die Inhalte dieser Tabelle als temporäre Tabelle aufbereitet werden?

9. Februar 2007 15:35

So wie ich das sehe, werden für die Darstellung einfach nur Filter auf die Tabelle "Change Log Entry" gelegt:

- Tabellennummer (5050)
- aktuelle Kontaktnummer

9. Februar 2007 15:38

Dann verrate mir doch mal bitte, wo genau ich dieses Formular dargestellt bekomme... habe auf meiner Kontaktkarte nämlich nichts gefunden.

9. Februar 2007 15:43

Sorry, hatte vergessen zu schreiben, dass die Tabelle nicht im Standard enthalten war. Wurde von einem anderen Navision Partner erzeugt.

9. Februar 2007 15:55

Dachte ich es mir *g*
Also, steht in der Form im OnFindRecord zufällig sowas hier drin?
Code:
Beispielrec := Rec;
IF NOT Beispielrec.FIND(Which) THEN
  EXIT(FALSE);
Rec := Beispielrec;
EXIT(TRUE)

9. Februar 2007 16:00

Ne, leider nicht.

9. Februar 2007 16:13

Hier noch ein paar Infos zur Vervollständigung:

Die Sourcetable des Formulars ist die Tabelle "Change Log Entry".

Die Properties des Menu Items sind:

RunFormLink: Table No.=CONST(5050),Primary Key Field 1 Value=FIELD(No.)

RunFormView: SORTING(Table No.,Primary Key Field 1 Value)

RunObject: Form Change Log Entries

9. Februar 2007 16:16

Und wenn du also direkt auf dieser Tabelle bist und dort manuell einen Filter eingibst, was passiert dann genau?
Hast du schon in den Tabellenquelltext geschaut?

9. Februar 2007 16:33

Also folgendes, Der Eintrag in der Tabelle wird so erzeugt:

Code:
  ChangeLogEntry."Date and Time" := ROUNDDATETIME(CURRENTDATETIME,1000);


Und so erzeuge ich den Wert meiner Variable im Form - OnModifyRecord Trigger:
Code:
datetime := ROUNDDATETIME(CURRENTDATETIME,1000);


Die Variable übergebe ich als Parameter an die Funktion in der Tabelle Contact. Wenn ich mir den Wert der Variable per message ausgeben lasse, stimmt dieser. Das funktioniert also soweit.

Wenn ich die Tabelle manuell filter passiert folgendes: Wenn man einen "Feldfilter" benutzt und den vorgeschlagen Wert nimmt, funktioniert der Filter. Wenn man allerdings den vorgeschlagen Wert nimmt, die letzt Ziffer der Minuten löscht und durch die selbe Ziffer ersetzt, dann ist die Tabelle leer.

Ich habe allerdings festgestellt, dass wenn man eine Range eingibt, die zwischen der letzten und der folgenden Minute setzt, dann funktioniert der Filter.

Bsp. 11:30:15..11:30:16

Offensichtlich werden die Sekunden oder Millisekunden nicht dargestellt.

9. Februar 2007 16:43

Warum steht deine Funktion denn in der Form und nicht in der Tabelle?

9. Februar 2007 16:48

Tja, wir setzen noch ein Webportal ein. Die User bekommen auf dem Webportal die Daten per NAS zur Verfügung gestellt. Änderungen im Web und in Navision werden durch den NAS synchronisiert. Ich möchte jetzt eine Auswertung der Änderungen machen, die direkt in Navision durchgeführt worden sind. Also habe ich mich einfach an den Form-OnModifyRecord Trigger gehängt. Das sollte doch kein Problem darstellen. So kann ich zwischen Änderungen aus dem Web und Änderungen in Navision unterscheiden.

9. Februar 2007 16:52

Soooo ... (musste mich erst einmal sortieren).
Deine Funktion scheint den richtigen Wert zu übergeben und damit sollte der SETRANGE auch funktionieren.

Könnte es sein, dass du die Form, auf der du gerade filterst, erst noch mit einem
Code:
CurrForm.UPDATE
aktualisieren musst?

9. Februar 2007 16:57

Ich glaube, ich hab eben wieder was falsch verstanden...

Also, wenn du auf der Contact-Form irgend einen Inhalt änders, wird der dazu gehörige Protokolleintrag um die aktuelle Zeit (gerundet auf volle Sekunden) aktualisiert.

Wozu brauchst du jetzt überhaupt einen Filter? Wann brauchst du ihn?

9. Februar 2007 16:58

mmmmh, mal probieren.

9. Februar 2007 17:01

Ok, ok, muss jetzt doch ein bisschen weiter ausholen. Also, wenn in Navision direkt eine Änderung an einem Kontakt durchgeführt wird, soll per Automation Server eine Mail erzeugt werden, die die geänderten Felder beinhaltet.

Ich persönlich glaube allerdings, dass diese Rundungsfunktion nicht richtig funktioniert, da ich ja ein Ergebnis erziele, sobald ich statt einen Wert eine Range von 1 Sekunde eintrage.

9. Februar 2007 17:13

Ich würde mir das so herleiten:

Der DatenTyp DateTime erwartet die Eingabe von Millisekunden, siehe auch Onlinehilfe zu DATETIME fast ganz unten.

Wenn ich die Tabelle manuell filter passiert folgendes: Wenn man einen "Feldfilter" benutzt und den vorgeschlagen Wert nimmt, funktioniert der Filter.

Ja: Der Wert, der drin steht, ist auf tausendstel Sekunden genau drin und du kopierst ihn nur.

Wenn man allerdings den vorgeschlagen Wert nimmt, die letzt Ziffer der Minuten löscht und durch die selbe Ziffer ersetzt, dann ist die Tabelle leer.

Ja, weil du durch die Eingabe einer eigenen Nummer (auch wenns zunächst die gleiche ist) die ganzen Nachkommastellen (=Millisekunden) überschrieben werden. Ich weiß jetzt nicht, ob da intern die aktuellen Millisekunden standardmäßig eingesetzt werden... Dies würde aber erklären, warum dieser Filter dann kein Ergebnis liefert.

Ich habe allerdings festgestellt, dass wenn man eine Range eingibt, die zwischen der letzten und der folgenden Minute setzt, dann funktioniert der Filter.

Bsp. 11:30:15..11:30:16

ja, weil dazwischen die exakte in der Datenbank gespeicherte Millisekundenanzahl liegt.

9. Februar 2007 17:14

So, habe jetzt festgestellt, dass die Rundung zwar funktioniert, es werden aber nur Minuten angezeigt. Ich bastele mir jetzt eine Range wie folgt:

Code:
DateTime2 := CREATEDATETIME(DT2DATE(DateTime), (DT2TIME(DateTime) + 100000));

ChangeLogEntry_rec.SETFILTER("Date and Time",'%1..%2',DateTime,DateTime2);


Ist vielleicht ein bisschen grob, da ich hier eine Range auf eine volle Minuten habe.

9. Februar 2007 17:18

Ja ich glaube, du bastelst jetzt nur am Sympthom, und nicht an der Ursache ;-)

Auf was möchtest du eigentlich filtern? Was ist das jetzt für eine Zeit?

9. Februar 2007 17:34

Ich möchte auf die Zeit filtern, die dann im Form - OnModifyRecord Trigger erzeugt wird, wenn eben eine Änderung durchgeführt wird. Dann befülle ich meine Variablen mit den geänderten Werten, die dann mit der mail verschickt werden. Also, jede Änderung, die über die Kontaktkarte erzeugt wird, wird eine Mail generiert.

9. Februar 2007 17:47

Das heißt doch, dass es eine gefüllte DateTime-Variable geben muss, mit der
a) Der Datensatz in "Change Log Entry" erzeugt oder aktualisiert wird
b) der Filter gefüllt wird.

Ohne Variable werden a) und b) niemals gleich sein, weil zwischen Speicherung und Filtersetzung mehrere Millisekunden vergehen.

Machst du es denn bereits schon?
Oh Mann, es wäre so viel einfacher zu verstehen, wenn ich die Objekte vor mir hätte ;-)

9. Februar 2007 17:54

Nun ja, es funktioniert immer noch nicht so recht wie ich mir das vorstelle. Bekomme kein Ergebnis, wenn ich mit SetFilter abgrenze. So, muss mich jetzt aber ins Wochenende verabschieden, muss zum Zug.

Erst mal Danke dafür, dass Du Dir auch den Kopf zerhämmerst. Vielleicht bis nächste Woche Montag....

So long...

Markus

nochmal hervorgekramt ...

17. April 2008 09:24

Hallo,

ich krame den Thread nochmal vor, weil ich ein ähnliches Problem habe. Ich habe in einer Tabelle einenPrimary key, welche sich aus einer Mitarbeiter-ID (Code) und einem Datetimefeld zusammensetzt. über eine Funktion hole ich mir das Datetimefeld wieder in eine Variable vom Typ Datetime. Wenn ich aber nun auf diese Datetime + MitarbeiterID filtere, bekomme ich keinen Datensatz zurück. Kann es sein das der Filter selber irgendwas aus dem Datetime abschneidet? Im Debugger wird das Feld nämlich auch nur mit z.B. "17.04.08 08:65" angezeigt ... Nun stellt sich mir die Frage ob im Hintergrund da wirklich die volle Datetime "17.04.08 08:56:32.123" drinsteht ....

Edit: Kann das mit "AutoFormatType" und "AutoFormatExpr" zusammenhängen aus den Properties, dass da Werte abgeschnitten werden?
Zuletzt geändert von CaddyM am 17. April 2008 09:35, insgesamt 1-mal geändert.

17. April 2008 09:32

Wenn ich mir eine Tabelle mit einem DateTime-Feld ansehe, stehen da Werte wie z.B. 12.03.08 17:40 drin.

Gebe ich einen Filter ein, der so aussieht: 12.03.08 17* (alles vom 12.03.08 mit 17 Uhr nochwas), dann gibts einen Fehler.
Setze ich dagegen den Filter nur auf das Datum, dann erhalte ich keinen Fehler. Es werden mir brav alle Einträge mit diesem Datum angezeigt.

Wechsle ich jedoch jetzt noch einmal in den Feldfilter, sehe ich, was NAV wirklich aus meinem Datumsfilter gemacht hat: 12.03.08 00:00..12.03.08 23:59

Das heißt, dein Filter sollte diesen Aufbau haben.

Für mein Beispiel mit der bestimmten Uhrzeit hieße die richtige Lösung
12.03.08 17:00..12.03.08 17:59

Wenn ich auf nur einen bestimmten Zeitpunkt filtern möchte, liefert mir 12.03.08 17:00 auch das richtige Ergebnis. Bei dir aber kommt kein Datensatz?

17. April 2008 09:37

Genau, kein Datensatz, obwohl ich mir über die Funktion gerade die Datetime für diesen einen vorhandenen Datensatz aus der Tabelle abgeholt habe, darum habe ich die beiden oben im Edit beschriebenen Properties des Feldes in der Tabelle in Verdacht ....