Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Falsche Zeichen in einem DB-Feld per SQL finden (https://www.delphipraxis.net/117348-falsche-zeichen-einem-db-feld-per-sql-finden.html)

nahpets 17. Jul 2008 10:13

Re: Falsche Zeichen in einem DB-Feld per SQL finden
 
Hallo,
Zitat:

Zitat von nachtstreuner60
Hallo Stephan,

danke für deine Antwort. Ich steige bei diesem SQL Statement nicht durch. Kannst Du mir etwas genauer erklären, was dieses Statement macht. Insbesondere das REPLACE .

Danke schon mal

habe das Statement gegen eine SQL-Server-Datenbank getestet und kann nicht sagen, ob es dem SQL-Standard entspricht und damit gegen jede Datenbank läuft. Mit Postgres müsste es auch funktionieren.

Zu Deiner Frage:

So, wie es im Statement aussieht ist's zugegeben ein bisserl verwirrend.

Replace ersetzt einfach eine Zeichenfolge.

Also erstmal "einfach":
SQL-Code:
replace(Idoc_REAL."ScanCode",1,'')
Hier wird in Idoc_REAL."ScanCode" die 1 durch einen Leersting ersetzt und ist damit "weg".

Das nächste Replace setzt nun auf diesem "Ergebnis" auf.
SQL-Code:
replace(replace(Idoc_REAL."ScanCode",1,''),2,'')
und damit sind die 1 und die 2 weg.

Das Spiel führen wir jetzt fort, bis alle Ziffern weg sind.
Gültige Werte beginnen mit einem "F" und dürfen nur Ziffern enthalten.
Wir machen alle Ziffern weg und es darf somit nur ein "F" übrigbleiben.

Die Abfrage auf <> 'F' liefert uns nun alle die Sätze, bei denen was anderes als ein alleinstehendes "F" übrigbleibt und dies müssten die fehlerhaften Datensätze sein.

Die Prozedure von omata macht eigentlich genau dies, sie nimmt Stück für Stück die Ziffern aus der Zeichenfolge und läßt im "Idealfall" ein "F" über.

Stephan

omata 17. Jul 2008 11:17

Re: Falsche Zeichen in einem DB-Feld per SQL finden
 
Zitat:

Zitat von nahpets
Die Prozedure von omata macht eigentlich genau dies, sie nimmt Stück für Stück die Ziffern aus der Zeichenfolge und läßt im "Idealfall" ein "F" über.

:thumb:

Firebird 1.5 kennt kein REPLACE, dies muss dann über eine UDF aus einer externen DLL nachgeladen werden. Mein Ansatz benötigt keine Zusätze, sondern kommt mit dem Befehlsumfang von Firebird 1.5 aus, um das Problem zu lösen. Dein REPLACE-Ansatz ist aber genau die richtige Vorgehenweise.
Bei MySQL kann der LIKE-Operator sogar reguläre Ausdrücke. Firebird ist da aber etwas eingeschränkt, besonders in der 1.5-Version. Ab 2.1 ist sogar ein REPLACE standardmäßig vorhanden.

mkinzler 17. Jul 2008 11:20

Re: Falsche Zeichen in einem DB-Feld per SQL finden
 
Und ab 2.5 reguläre Ausdrücke

nachtstreuner60 17. Jul 2008 12:09

Re: Falsche Zeichen in einem DB-Feld per SQL finden
 
So da bin ich wieder,

ich werde jetzt mal alle dargebotenen Tipps ausprobieren. Ich danke euch erstmal ganz herzlich für die Tipps.

Über das Ergebnis informiere ich natürlich noch.

mfg
Nachtstreuner

PS :
Delphi-Quellcode:
SET TERM ^ ;
CREATE OR ALTER PROCEDURE CLEARNUMERIC (
  INPUTSTR Varchar(100)
)
RETURNS (Result Varchar(100)) AS
BEGIN
  Result = '';
  WHILE (InputStr <> '') DO BEGIN
    IF ('0123456789' NOT LIKE '%' || SUBSTRING(InputStr FROM 1 FOR 1) || '%') THEN
    BEGIN
      Result = Result || SUBSTRING(InputStr FROM 1 FOR 1);
    END
    InputStr = SUBSTRING(InputStr FROM 2);
  END
  SUSPEND;
END^
SET TERM ; ^
Wo trage ich diese Prozedur ein ?

Soviel ich weiss, fangen Proceduren in Delphi mit

Procedure TForm.blaBlaBla
begin
.
.
.
end;

an.

Wie ist das mit obigen Code ?

mkinzler 17. Jul 2008 12:16

Re: Falsche Zeichen in einem DB-Feld per SQL finden
 
Auf eine SP kannst du entweder wie auf ein Tabelle zugreifen oder verwendest die entsprechende Komponente deiner Zugriffsbibliothek.

nachtstreuner60 17. Jul 2008 13:03

Re: Falsche Zeichen in einem DB-Feld per SQL finden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Stephan

also bei diesem Tipp bekomme ich folgende Fehlermeldung (Screenshot).

Delphi-Quellcode:
with zConFehler do begin
     zquery1.First;

     zQuery1.SQL.Clear;
     zquery1.sql.text := 'Select * from IDOC_REAL where '+
'replace(replace(replace(replace(replace(replace(replace(replace(replace(replace'+
'(Idoc_REAL."ScanCode",1,''),2,''),3,''),4,''),5,''),6,''),7,''),8,''),9,''),0,'')'+
' <> ''F''';
zquery1.ExecSQL;
zQuery1.Active := true;

end;
Anscheinend kennt er das <> nicht

nahpets 17. Jul 2008 13:20

Re: Falsche Zeichen in einem DB-Feld per SQL finden
 
Hallo,

Zitat:

Zitat von nachtstreuner60
Anscheinend kennt er das <> nicht

nein, das sieht mir nicht so aus. Wenn Du im Screenshot genau hinschaust, so befindet sich hinter jeder Ziffer ein Komma und ein Hochkomma. Sprich: Die Zeichenfolgen sind nicht abgeschlossen. Du muss in Deinem Quelltext die Hochkommata noch richtig maskieren.

So sollte es gehen.
Delphi-Quellcode:
with zConFehler do begin
     zquery1.First;

     zQuery1.SQL.Clear;
     zquery1.sql.text := 'Select * from IDOC_REAL where '+ 
'replace(replace(replace(replace(replace(replace(replace(replace(replace(replace'+ 
'(Idoc_REAL."ScanCode",1,''''),2,''''),3,''''),4,''''),5,''''),6,''''),7,''''),8,''''),9,''''),0,'''')'+ 
' <> ''F''';
zQuery1.Active := true;

end;
Das zquery1.ExecSQL; ist meiner Meinung nach überflüssig. Die Abfrage wird mit zQuery1.Active := true; geöffnet. ExecSQL dient zur Ausführung von SQL-Statements, die keine Ergebnismenge liefern. Statt zQuery1.Active := true; geht auch zQuery1.Open;, das macht den Unterschied vielleicht deutlicher.

Stephan

nachtstreuner60 17. Jul 2008 13:28

Re: Falsche Zeichen in einem DB-Feld per SQL finden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Stephan,

das mit active und open habe ich verstanden und den Test mit dem geänderten Code
durchgeführt. Allerdings wieder mit einer Fehlermeldung. Diesmal erkennt er den Befehl REPLACE nicht

Delphi-Quellcode:
     zQuery1.SQL.Clear;
     zquery1.sql.text := 'Select * from IDOC_REAL where '+
'replace(replace(replace(replace(replace(replace(replace(replace(replace(replace'+
'(Idoc_REAL."ScanCode",1,''''),2,''''),3,''''),4,''''),5,''''),6,''''),7,''''),8,''''),9,''''),0,'''')'+
' <> ''F''';
zQuery1.Active := true;

mkinzler 17. Jul 2008 13:34

Re: Falsche Zeichen in einem DB-Feld per SQL finden
 
Wie omata schon erwähnt hat, brauchst du bei FB1.5 eine externe UDF-Bibliothek für diese Funktion

nahpets 17. Jul 2008 13:37

Re: Falsche Zeichen in einem DB-Feld per SQL finden
 
Hallo,
Zitat:

Zitat von nachtstreuner60
Diesmal erkennt er den Befehl REPLACE nicht

das habe ich nach dem Post von omata, dass Firebird 1.5 kein Replace kennt, befürchtet. Da brauchst Du entweder eine neuere Datenbankversion oder versuchst Dich am Lösungsansatz von omata. Tut mir leid, dass Dir meine Lösung nicht weiterhilft.

Omata's Prozedur ist jedoch keine Delphi-Procedur, wie Du vermutet hast, sondern eine Datenbankprozedur. Da ich mich mit Firebird nicht auskenne, kann ich Dir nicht sagen, wie Du dort am einfachsten eine Datenbankprozedur anlegst.

Stephan


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:26 Uhr.
Seite 3 von 4     123 4      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz