FIND('=<>');

13. Januar 2010 14:51

Hallo zusammen,

soll einfache Frage sein: kann jemand mir erklären was diese Code ausmacht?
Code:
rec.FIND[b]('=<>')[/b];


Danke.

Re: FIND('=<>');

13. Januar 2010 14:54

Schau mal hier:
viewtopic.php?f=7&t=6863
viewtopic.php?f=7&t=2335

Re: FIND('=<>');

13. Januar 2010 15:09

ehm... Danke für die Info. Komme ich aber nicht weiter. :oops:

Diese Code habe ich in Report 99001017 Calculate Plan - Plan. Wksh. gesehen
Code:
Item - OnPreDataItem()

SetAtStartPosition := TRUE;

ReqLine.SETRANGE("Worksheet Template Name",CurrTemplateName);
ReqLine.SETRANGE("Journal Batch Name",CurrWorksheetName);
PlanningErrorLog.SETRANGE("Worksheet Template Name",CurrTemplateName);
PlanningErrorLog.SETRANGE("Journal Batch Name",CurrWorksheetName);
IF PlanningErrorLog.FIND('-') AND ReqLine.FIND('-') THEN
  SetAtStartPosition := NOT CONFIRM(Text009 + Text010);

PlanningErrorLog.DELETEALL;


Code:
Item - OnAfterGetRecord()

IF NOT SetAtStartPosition THEN BEGIN
  SetAtStartPosition := TRUE;
  Item.GET(PlanningErrorLog."Item No.");
  Item.FIND('=<>');
END;


Kannst du mir erklären was diese FIND('=<>') macht?

Re: FIND('=<>');

13. Januar 2010 22:39

Mich hat die Frage auch schon öffters beschäftigt, die Theorie habe ich auch verstanden.
Nun habe ich es endlich mal getestet, leider kann ich kein brauchbares Ergebnis herstellen um mit diesem Befehl zu arbeiten.

Ich habe zum Test die Verkaufszeile auf die drei Prim.Key-Felder gefiltert (Art=Auftrag,Nr.=1003,Zeile 20000), es wurde jedoch kein DS gefunden.
Gegeben waren die Zeilen 10000 und 30000.

Wo ist der Denkfehler?

Re: FIND('=<>');

13. Januar 2010 23:58

Wenn ich mich recht erinnere, ging das so:
Gegeben seien Items mit No. 8,9,10.
Dann:
Code:
Item.reset;
Item."No.":='9';
Item.find('<'); // liefert 8. Oder
Item.find('='); // liefert 9. Oder
Item.find('>'); // liefert 10

Item.reset;
Item."No.":='11';
Item.find('=>'); // liefert Error. Oder
Item.find('=<>'); // liefert 10

Nun könnte man das noch beispielsweise mit einem SetFilter(Description,'%1','Test*'); kombinieren, um den nächsten mit dieser Eigenschaft zu finden.

Ich benutze das allerdings nie. Wenn ich irgendwo einen nächsten Datensatz suche, setze ich immer einen entsprechenden Filter ... könnte auf diese Art aber manchmal kürzer sein.
Zuletzt geändert von McClane am 17. Januar 2010 04:16, insgesamt 1-mal geändert.

Re: FIND('=<>');

14. Januar 2010 00:15

Record.FIND('=<>');
ist relativ einfach zu erklären:
Innerhalb der gesetzten Filter wird versucht, einen Datensatz zu finden.
Voraussetzung ist, dass bestimmte Primärschlüsselfelder vorher gesetzt wurden.
Beispiel: Item."No." := '4711';
Wird nun ein Item.FIND('=<>'); abgesetzt, so versucht NAV als
  1. Genau den (=) Datensatz '4711' zu finden
    gelingt dies nicht, so versucht NAV als
  2. den verherigen (<) Datensatz zu finden
    gelingt dies nicht, so versucht NAV als
  3. den nächsten (>) Datensatz zu finden
Gibt es also den Datensatz '4711' nicht, so sucht NAV nach dem nächsten Vorgänger. Gibt es auch hier keinen Treffer (weil z. B. die Artikel mit Nr. 5050 anfangen), so versucht NAV zum Schluß den nächsten Nachfolger zu finden. (In diesem Fall '5050').

Entscheidend ist also die Reihenfolge der Parameter Record.FIND('=<>');.

Re: FIND('=<>');

14. Januar 2010 00:25

So gesehen wäre also der Unterschied, dass man sich das ganze SetRange-Geschreibsel sparen kann und stattdessen die Schlüsselfelder direkt setzt, man aber im Gegenzug nie ein Recordset, sondern immer nur einen einzigen Datensatz erhalten kann.

Re: FIND('=<>');

14. Januar 2010 08:24

Bei einem SETFILTER / SETRANGE kannst du dir sicher sein, dass die gefundenen Datensätze auf jeden Fall deinen Kriterien entsprechen.
Bei einem FIND('=<>') kann der gefundene Datensatz deinen Kriterien entsprechen, muss aber nicht, da es auch ein anderer Datensatz in der Nähe sein könnte.

Re: FIND('=<>');

14. Januar 2010 09:18

Ok, danke für die Ausführung, jetzt weiß ich meinen Fehler. Ich habe mit SETRANGE gearbeitet, da konnte das System nichts finden.
:greenarrow: Was hat Mikka draus gelernt? Benutze kein Setrange :mrgreen:

Allerdings ist der Code merkwürdig:
- Es wird zunächst ein Item.GET gemacht. -->Daher muß der Artikel vorhanden sein, da das GET nicht abgefangen wird.
- dann das FIND('=<>'), was in meinen Augen unütz ist, da durch das GET der Artikel bereits im Zugriff ist?!
Code:
// Item - OnAfterGetRecord()

IF NOT SetAtStartPosition THEN BEGIN
  SetAtStartPosition := TRUE;
  Item.GET(PlanningErrorLog."Item No.");
  Item.FIND('=<>');
END;

Re: FIND('=<>');

14. Januar 2010 19:31

mikka hat geschrieben:Allerdings ist der Code merkwürdig:
- Es wird zunächst ein Item.GET gemacht. -->Daher muß der Artikel vorhanden sein, da das GET nicht abgefangen wird.
- dann das FIND('=<>'), was in meinen Augen unütz ist, da durch das GET der Artikel bereits im Zugriff ist?!

Das sehe ich genauso; das Item.FIND('=<>') ist meiner Meinung nach überflüssig, da durch den erfolgreichen Item.GET der Item.FIND denselben Datensatz finden wird (da der Parameter mit = anfängt).
Einzige Erklärung: Es könnte etwas mit dem SQL-Server zu tun haben :roll: