Probleme mit FIND

12. Oktober 2006 15:25

Ich verfolge gerade eine Diskussion in einem anderen Forum, über das Statement find('=<>'). Dieses taucht im Zahlungsverkehr auf und verursacht auf dem SQL Server 2005 erhebliche Probleme. Ich hoffe diese Problem damit beseitigt zu haben in dem ich (vorschlag vom anderen Forum und macht auch Sinn) dieses Statement mit einem Find('-') ausgetauscht habe. Dieses Statement scheint noch ein Relikt aus Blau zu sein. Jetzt frage ich mich aber => was ist mit dem folgenden Statement : Find('=><'). Ist das dann ein find('+'). Gefunden habe ich so ein Statement in Verkaufsbeleg kopieren fkt. Ansicht BelNr. Ist es Sinnvoll auch diese Statement auszutauschen?

Danke Gruß
Sandra

12. Oktober 2006 15:46

Den von dir angeführten Befehl Find('=><') kenne ich nicht, rsp. habe ich so noch nie angewandt.

In diesem Zusammenhang sollten jedoch aus Performance-Gründen die Befehle FIND('-') bzw. FIND('+') durch die neuen Befehle FINDFIRST, FINDLAST oder FINDSET ersetzt werden.

12. Oktober 2006 16:10

Vorsicht! Ich habe gehört dass der Befehl Findfirst eine andere Auswirkung hat als find('-').
Das Problem mit find('=<>') ist, dass das System einen grauenhaften select befehl zusammen baut, der (meiner Meinung nach) nur funktioniert weil vor dem setrange keine reset gemacht wird. Das System sucht dann wirklich nach = dann nach < und dann nach > und durch den Puffer bleibt der "alte" Wert erhalten und wird dann entdeckt. Zu sehen im deutschen Zahlungsverkehr - Codeunit 5001901.
Gruß
Sandra

12. Oktober 2006 16:35

Das ist richtig, FINDFIRST hat nicht dasselbe Resultat zur Folge wie FIND('-'). Deshalb habe ich noch den Befehl FINDSET aufgeführt.

Auszugsweise hier die Online-Hilfe
FINDFIRST (Record)
Use this function to find the first record in a table based on the current key and filter.

FINDLAST (Record)
Use this function to find the last record in a table based on the current key and filter.

Diese beiden Befehle werden verwendet, wenn man entweder genau den ersten oder den letzten Datensatz haben muss.


Dann gibt es noch
FINDSET (Record)
Use this function to find a set of records in a table based on the current key and filter. The records can only be retrieved in ascending order.

Der kommt zum Einsatz, wenn mit REPEAT - UNTIL über eine gefilterte Menge von Datensätzen gelaufen werden muss.

Diese Befehle sind genau aus diesem Grunde entwickelt worden:
dass das System einen grauenhaften select befehl zusammen baut

12. Oktober 2006 16:50

FIND('=<>') ist kein Relikt aus alten Zeiten. Wenn FIND mit diesen Parametern verwendet wird, müssen den Primärschlüsselfeldern vorher Werte zugewiesen werden. Dann wird die Tabelle in der Reihenfolge der Parameter abgearbeitet, um einen Datensatz zu finden, der entweder diesen Werten entspricht, wenn nicht, dann der erste mit kleineren Werten, wenn der auch nicht vorhanden ist, dann der erste mit größeren Primärschlüsselwerten. FIND('-') kann je nach vorheriger Filterung einen ganz anderen Datensatz finden.
Mit FIND('=<') wird auch im Standard z.B auf die Rundungstabelle 42 zugegriffen (in Report 794), nachdem man den Rundungscode dem ersten und den Minimalbetrag dem zweiten Primärschlüsselfeld zugewiesen hat.

12. Oktober 2006 17:47

rotsch hat geschrieben:FindSet ...
Der kommt zum Einsatz, wenn mit REPEAT - UNTIL über eine gefilterte Menge von Datensätzen gelaufen werden muss.


FindSet(false,False) ...
Zu bedenken ist bei diesem Befehl jedoch, dass er immer die ersten meist 500 DS (Definiert ist dieser Wert in der SQL-DB Einrichtung) auf den Client kopiert und danach den Cursor löscht. Wenn man mehr DS benötig werden ziemlich langsame Befehle abgesetzt. Ich halte die Umsetzung der Befehle für nicht sehr gelungen.