PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit select....



SNE
14.04.2001, 17:02
Hallo Kosch,
ich habe mit Ihrem Demoprogramm einige Tests gemacht.
Dabei habe ich die Datenbank um eine weiter Tabelle erweitert
und diese mit einem kleinen "Import" Programm mit ca. 2000
Datensätzen gefüllt. Dabei ist mir aufgefallen, wenn das
"Stringfeld" in der BDE-Tabelle leer ist, die IBConsole dieses Feld in der IB-Tabelle mit "null" als Inhalt anzeigt.<p>Wenn ich jetzt den Select-Script mit UPPER (NACHNAME) LIKE (:sName || '%') erweitere, fehlen diese Datensätze auch wenn der Parameter sName = '' ist.<p>Haben Sie eine Abhilfe ?<p>Harald Neu

Torsten Grundke
14.04.2001, 19:56
Hallo Harald

null heißt, dass das Datenfeld keine Daten enthält.Im Gegensatz dazu ist '' eine leere Zeichenkette.

Deine Abfrage müßte zu <b>... where ((UPPER(NACHNAME) LIKE (:sName || '%')) or (nachname is null))</b> erweitert werden.

Bei der Funktion Upper solltest Du beachten, dass Sonderzeichen wie z.B. "ä" nicht in den entsprechenden Großbuchstaben umgewandelt wird.

Tschüß

Torste

Andreas Kosch
17.04.2001, 07:41
Hallo,

der InterBase unterstützt zum Glück <b>UDF</b> (User Defined Functions), so dass man mit Delphi eigene UDF-Funktionen in Form einer DLL schreiben kann, die intern auf die Delphi-Funktionen <b>AnsiUpperCase</b> und <b>AnsiLowerCase</b> zurückgreifen. Somit werden dann bei der Umwandlung auch die deutschen Umlaute korrekt behandelt.

Ein Beispielprojekt dazu ist in meinem Buch <i>Client/Server-Datenbankentwicklung mit Delphi</i> zu finden

Torsten Grundke
17.04.2001, 08:49
Hallo Andreas,

es ist mir klar, das man es über eine UDF lösen kann, aber es gibt in meinen Augen 2 potentielle Probleme/Risiken.

1. werden UDF's von allen Betriebssystemen unterstützt auf denen der Interbase-Server lauffähig ist (bei früheren Interbaseversionen ging es ja zumindest nicht unter Novell) - auf jeden Fall muß man eine eigene UDF für jedes Betriebssystem bereitstellen und wenn nicht ein WIN-BS verwendet wird darfs Du in C programmieren

2. AnsiUpperCase benutzt bei der Umwandlung die aktuelle Ländereinstellung des Betriebssystems. Sollte die sich mal ändern, z.B. durch Übertragung auf einen anderen Rechner, kann das zu Problemen führen. Vermeiden ließe sich das nur, wenn man aus der Datenbank den verwendeten Zeichensatz ermittelt, daraus eine Ländereinstellung ableitet(spekulativ) und diese dann bei AnsiUpperCase vorgeben könnte (habe bis jetzt noch keinen Weg dafür gefunden - keine API-Funktion).

Tschüß

Torste

Andreas Kosch
17.04.2001, 13:02
Hallo,

die Plattformabhängigkeit ist nur scheinbar ein Problem. Da ein Entwickler, der Delphi einsetzt, nur eine sehr enge Auswahl an Betriebssystemen hat, kann man gut mit diesem Risiko leben ;-)

Solange der InterBase keine nativen UNICODE-Datentypen unterstützt, ist man beim Zeichensatz immer auf Kompromisse angewiesen (zumal auch in der Version 6 die Leute, die eine Datenbank/Tabellenspalte mit einem CHARACTER SET ungleich NONE anlegen, immer noch nur in der zweiten Reihe sitzen). Wenn das in einem Projekt wirklich ein wichtiges Kriterium ist, darf man den InterBase nicht einsetzen.
&#10

Torsten Grundke
17.04.2001, 13:51
Hallo Andreas,

ich wollte nur auf mögliche Stolperfallen hinweisen. Nur wenn mögliche Fallstricke bekannt sind kann man sein Anwendungs-/Datenbankdesign danach ausrichten bzw. bewußt mit bestimmten Einschränkungen leben.

Die Plattformunabhängigkeit sollte man nicht allzusehr vernachlässigen, schließlich läuft der Interbase-Server in der Regel auf einem separaten Rechner im Netz (private Nutzung mal aussen vorgelassen).
Damit stellt sich die Einschränkung, dass man mit Delphi nur für Windows bzw. Linux entwickeln kann in einem anderen Licht dar.

Tschüß

Torste

SNE
08.05.2001, 18:09
Hallo Torsten,

die Abfrage funktioniert zwar wenn ich als Parameter "" übergebe.
Wenn ich aber z.B. alle Namen mit B... haben will und als Parameter
"B" übergebe kommen die Datensätze mit null auch.

MfG

Haral

Torsten Grundke
08.05.2001, 20:06
Hallo Harald,

so gehts: <b> ...where ((UPPER(NACHNAME) LIKE (:sName || '%')) or ((nachname is null) and (:sName = '')))
</b>

Tschüß

Torste