10. Aug 2010 

Suche nach diakritischen Zeichen

Mit 4D zu arbeiten hat auch den Vorteil, daß mein Anwender auch dann sein Expose findet, wenn er und sie nicht mehr wissen, in welche Richtung der Accent kippt – Exposé oder Exposè – oder ob es überhaupt einen gibt.

langesooo

Sprachwissenschaftler sehen das etwas genauer. Dort will sie wirklich nur die Datensätze finden, die erdő enthalten und nicht erdö oder gar erdo.

Die TRIC-Ressource ist mit der utf-Fähigkeit, also V11/V12, verschwunden.

Aus dem 4D Customizer Plus Reference Manual zur V2003:
TRIC resources: The TRIC resource is present by default. Sorts are based on a table proposed by 4th Dimension (“e”, “é”, “è”, “ë”, “ê” are sorted separately; however, querying “é” will query “e”). This table varies depending on the language (special characters...). Once the TRIC resource is deleted, 4th Dimension rebuilds this table upon next launch.

Wat nun? Die Hilfe kommt wie immer aus der Mailing-Liste - die Foren sind weniger ergiebig. Daniel M.: Mit SQL. Standardmässig ist es diakritisch, kann man aber ausschalten. Klar, so geht es und ausschalten ist ausnahmsweise nicht das Gewünschte.

Und so sieht es aus:
Query_Exact ("SQL_Default";->[NAMEPARTS];->[NAMEPARTS]NP_Part;->$srchContains;True)
Sofort gekapselt, denn das brauche ich häufiger – wetten?

Das Konzept:

  1. Was soll getan werden
  2. mit dieser Tabelle
  3. mit diesem Feld
  4. mit diesem Suchkriterium
  5. wird nichts gefunden, nimm das normale QUERY
Und hier der wichtige Teil aus Query_Exact – die Zuweisung der Parameter zu sprechenden Variablen habe ich weggelassen:

: ($what="SQL_Default") //$1
  Case of
    : (Nil($P_QTable)) // $2
    : (Nil($P_QField)) //$3
    : (Nil($P_Qcontent)) //$4
  Else
    $textContent:=field_2_Text ($P_Qcontent)
    $fieldName:=Field name($P_QField)
    $srchFormula:=$fieldName+" = '"+$textContent+"'"
    QUERY BY SQL($P_QTable->;$srchFormula)
    Case of
      : ($findanyway_b=False) //$5
      : (Records in selection($P_QTable->)>0)
    Else
      QUERY($P_QTable->;$P_QField->=$P_Qcontent->)
    End case
  End case

Funktioniert prima! Selbst Sprachwissenschaftler sind nicht böse, daß die Anwendung – solange es keine exakte Übereinstimmung findet – auf nicht-diakritische Suche umschaltet.

Als ich nach dieser Option – wird nichts exakt passendes gefunden, ähnliches aufzulisten – vor der Realisierung fragte, hat das niemand verstanden. Obwohl ich es nicht technisch, sondern von der Logik zu erklären versuchte. Selbst Sprachwissenschaftler haben in diesem Feld der Logik kein feines Ohr. Deshalb habe ich nach der Realisierung auch nichts darüber gesagt – es wird gerne genommen.
Meine Erfahrung ist: wenn es funktioniert, interessiert es niemanden wie :-)

Die Methode field_2_Text hier als PDF.