Announcement

Collapse
No announcement yet.

Umlaute mit Funktion UPPER

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Umlaute mit Funktion UPPER

    Hallo zusammen <br>
    Ich habe das Problem, dass die Funktion UPPER Umlaute wie ä, ö oder ü nicht in die Großbuchstaben Ä, Ö oder Ü umwandelt. In einem SELECT-Statement kommen in Vergleichswerten Umlaute als Großbuchstaben vor. Wie kann ich mit UPPER Umlaute in Großbuchstaben erzeugen ?<br>
    <br>
    Im voraus besten Dank<br>
    <br>
    Frank Ulm

  • #2
    Hallo,

    ich würde dazu mit Delphi eine eigene UDF (User Defined Funktion) schreiben, in der die Umwandlung über <b>AnsiUpperCase</b> (Unit SysUtils) erfolgt. Diese Funktion wandelt auch deutsche Umlaut korrekt in Großbuchstaben um

    Comment


    • #3
      Hallo Herr Kosch,<br>
      ich habe dies versucht, doch leider schaffe ich es nicht, die DLL in die Datenbank einzubinden. Der Code der DLL sieht <br>
      folgendermassen aus:<br>
      <br>
      <it>
      library My_Upper;<br>
      <br>
      uses<br>
      SysUtils,<br>
      Classes;<br>
      <br>
      {$R *.RES}<br>
      <br>
      function My_Upper_Func(input: ShortString): ShortString; stdcall;<br>
      begin<br>
      My_Upper_Func := AnsiUpperCase(input);<br>
      end;<br>
      <br>
      exports<br>
      My_Upper_Func name 'MUPPER';<br>
      <br>
      begin<br>
      end.<br>
      <it>
      <br>
      Diese habe ich kompilliert und in das BIN-Verzeichnis von Interbase kopiert (Version 6.0 auf NT-Workstation). Anschliessend <br>
      habe ich mit folgenden SQL-Script die UDF in die Datenbank eingebunden:<br>
      <br>
      DECLARE EXTERNAL FUNCTION MUPPER<br>
      VARCHAR(256)<br>
      RETURNS VARCHAR(256) FREE_IT<br>
      ENTRY_POINT 'MUPPER' MODULE_NAME 'My_Upper.dll';<br>
      <br>
      Doch wenn ich in einem SQL-Befehl die Funktion MUPPER benutze, erhalte ich die Fehlermeldung:<br>
      <br>
      Invalid request BLR at offset 63<br>
      function MUPPER is not defined<br>
      module name or entrypoint could not be found<br>
      <br>
      Wo kann hier der Fehler liegen. Habe ich was eintscheidendes vergessen ?<br>
      <br>
      Im voraus vielen Dank<br>
      <br>
      Frank Ul

      Comment


      • #4
        Hallo,

        ich gehe immer so vor:
        <pre>
        library Osudf5;

        uses
        SysUtils,
        OSUDFUnit in 'OSUDFUnit.pas';

        exports
        OSLOWER name 'OSLOWER' resident,
        OSSOUNDEX name 'OSSOUNDEX' resident,
        OSDaysAdd name 'OSDAYSADD' resident,
        OSSOUNDEX2 name 'OSSOUNDEX2' resident;

        begin
        IsMultiThread := True;
        end.
        </pre>
        Die exportierten DLL-Funktionen werden über <b>Resident</b> ständig in der Exporttabelle vorgehalten und über <b>IsMultiThread</b> wird Delphi vorgewarnt, dass es mit mehreren Threads rechnen soll.

        Immer dann, wenn man den in der DLL angeforderten Speicher über FREE_IT freigeben will, muss die eigene DLL die von InterBase bereitgestellte Unit <b>ib_util.pas</b> (aus dem SDK\include-Untervereichnis) nutzen. Der Speicher darf nur über die dort aus ib_util.dll exportierte Funktion <b>ib_util_malloc</b> angefordert werden.

        Im Handbuch <i>InterBase Developers Guide</i> (DevGuide.pdf) wird das im Abschnitt <i>Working with UDFs and Blob Filters</i> ausführlicher behandelt.

        Die Fehlermeldung <i>Invalid request BLR</i> kommt auch dann, wenn die Deklaration der Parameter/Rückgabewerte nicht korrekt ist. Alle indirekt eingebundenen DLLs müssen ebenfalls im Zugriffspfad liegen

        Comment


        • #5
          Hallo Herr Kosch<br>
          leider schaffe ich es nicht den fehler zu beseitigen. nachdem ich es erst so versucht habe, wie Sie es angehen und dies auch nicht fruchtete, habe ich mir als Beispiel die FreeUdfLib heruntergeladen. Doch selbst diese (ich denke auch getestete) Funktionen wurden mit dem gleichen Fehler nicht ausgeführt. Und dies, obwohl ich das mitgelieferte SQL-Script ausgeführt habe. Zudem habe ich alle benötigten DLL's sowohl ins System32-Verzeichnis, als auch ins Interbase-Bin Verzeichnis kopiert. Leider ohne Erfolg. Es erscheint immer die Fehlermeldung:
          <br>
          <br>
          Invalid token.<br>
          invalid request BLR at offset 63.<br>
          function F_MYUPPER is not defined.<br>
          module name or entrypoint could not be found.<br>
          <br>
          Müssen die Eingabewerte einen besondere Type besitzen ? Die Funktion ist mit CString deklariert.<br>
          <br>
          Frank Ul

          Comment


          • #6
            Hallo Frank,

            kopier die DLL's in das Verzeichnis Deines Programm's. Das hat zumindest bei mir das letzte Mal geholfen.

            Tschüß

            Torste

            Comment


            • #7
              Hallo,

              in dieser Situation würde ich den ersten Test mit den "Bordmitteln" des InterBase machen. Im Fall des InterBase 6 sieht das so aus:

              1. Prüfen, ob im Unterverzeichnis <b>UDF</b> und <b>BIN</B> die beiden DLLs ib_udf.dll und ib_util.dll vorhanden sind.

              2. Im Unterverzeichnis <b>Examples\udf</b> liegt ib_udf.sql rum, dort heraus wird die Deklaration von <b>lower</b> in die Zwischenablage kopiert:

              <pre>
              DECLARE EXTERNAL FUNCTION lower
              CSTRING(80)
              RETURNS CSTRING(80) FREE_IT
              ENTRY_POINT 'IB_UDF_lower' MODULE_NAME 'ib_udf';
              </pre>

              3. In der IBConsole wird die eigene Datenbank connected und ISQL geöffnet, um die DECLARE EXTERNAL FUNCTION-Anweisung abzuschicken. Dabei darf keine Fehlermeldung kommen.

              4. In ISQL sollte nun auch die SELECT-Abfrage über lower erfolgreich sein.

              Wenn irgendwo eine Fehlermeldung kam, würde ich nachschauen, ob auf dem Rechner auch wirklich die Version 6.038xx (oder höher) von <b>MSVCRT.DLL</b> installiert ist.

              P.S: Welche InterBase-Version wird überhaupt verwendet

              Comment


              • #8
                Hallo Franky,

                bei Interbase 6 gibt es ein eigenes Verzeichnis für UDF-Dll's. Kopier die DLL ins Verzeichnis \UDF und probier das Ganze nochmals.

                Thoma
                Thomas Steinmaurer

                Firebird Foundation Committee Member
                Upscene Productions - Database Tools for Developers
                Mein Blog

                Comment


                • #9
                  Hallo

                  Da ich der Minung bin, das UDF's der geradlinigste Weg sind relativ 'stabile' Serversysteme zu unterminieren, habe ich das dämliche Umlaut-Problem gelöst, indem ich den Suchausdruck immer clientseitig als UpperCase() und AnsiUppercase() Version in die where-Klausel einbinde.

                  z.B.

                  UserFilter := '(UPPER('+FltField+')='+UpperCase( FltExpr+')';
                  UserFilter := UserFilter+' or '+AnsiUpperCase( UserFilter );

                  Gruß
                  Gesin

                  Comment

                  Working...
                  X