5. Apr. 2010 

Manchesmal ist groß eben nicht gleich Groß.

In meiner Datenbank will ich, wenn ich den Nachnamen Nagy suche nicht alle Vorkommen von nagy finden. Kann ich das mit 4D lösen?

nagyKlein

Eigentlich bin ich ganz froh, daß 4D nicht nach Groß- und Kleinschreibung unterscheidet. Im angefragten Beispiel geht es nur um den Anfangsbuchstaben.

Nee, die TRIC-Einstellungen helfen nicht. In der V11 gibt es im Thema SQL die Option Groß-/Kleinschreibung bei String Vergleich beachten.

Einfach einstellen geht nicht, schon gar nicht in der 2004. Aber in 4D findet sich immer ein Weg. Mein gefundener sieht so aus:

Erst wird die Standardmethode eingesetzt. Das Zwischenergebnis listet groß- und kleingeschrieben auf:
QUERY SELECTION([Haupttabelle];[Haupttabelle]Text=vString3+"@")
Das Zwischenergebnis wird dann verwendet, um mit einer eigenen Methode einzuschränken auf Anfangsbuchstabe wie im Suchtext
GroßKleinSchreibung (vString3;->[Haupttabelle]Text)

Hier die Methode GroßKleinSchreibung.

  • Auswahl in zwei Arrays,
    • a) den Text und
    • b) die Datensatz-ID
  • Schleife rückwärts durchs Arrays
  • Position des Suchbegriffs im Text ermitteln
  • die Ascii-Werte des 1. Buchstabens vergleichen
  • sind diese nicht identisch, die Array-Einträge löschen
  • schließlich mit dem Array der Datensatz-ID eine neue Auswahl herstellen

ARRAY LONGINT($t_RecordID_L;0)
ARRAY TEXT($t_Text;0)
SELECTION TO ARRAY([Haupttabelle]HTab_ID;$t_RecordID_L;[Haupttabelle]Text;$t_Text)
$N:=Size of array($t_RecordID_L)
For ($i;$N;1;-1)
  $foundFirstChar_L:=0
  $pos_L:=Position($sourceStr;$t_Text{$i})
  If ($pos_L>0)
    $foundFirstChar_L:=Ascii($t_Text{$i}≤$pos_L≥)
  End if
  If ($foundFirstChar_L=$asciiFirstChar_L)
  Else
    DELETE ELEMENT($t_RecordID_L;$i;1)
    DELETE ELEMENT($t_Text;$i;1)
  End if
End for
QUERY WITH ARRAY([Haupttabelle]HTab_ID;$t_RecordID_L)

Flott genug, auch interpretiert, um in 7.500 Datensätze während der Eingabe zu suchen und einzuschränken.

NagyGross

4D Themen: Berichte in Arbeit