![]() |
Re: Falsche Zeichen in einem DB-Feld per SQL finden
Hallo,
Zitat:
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:
Hier wird in Idoc_REAL."ScanCode" die 1 durch einen Leersting ersetzt und ist damit "weg".
replace(Idoc_REAL."ScanCode",1,'')
Das nächste Replace setzt nun auf diesem "Ergebnis" auf.
SQL-Code:
und damit sind die 1 und die 2 weg.
replace(replace(Idoc_REAL."ScanCode",1,''),2,'')
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 |
Re: Falsche Zeichen in einem DB-Feld per SQL finden
Zitat:
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. |
Re: Falsche Zeichen in einem DB-Feld per SQL finden
Und ab 2.5 reguläre Ausdrücke
|
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:
Wo trage ich diese Prozedur ein ?
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 ; ^ Soviel ich weiss, fangen Proceduren in Delphi mit Procedure TForm.blaBlaBla begin . . . end; an. Wie ist das mit obigen Code ? |
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.
|
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:
Anscheinend kennt er das <> nicht
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; |
Re: Falsche Zeichen in einem DB-Feld per SQL finden
Hallo,
Zitat:
So sollte es gehen.
Delphi-Quellcode:
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.
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; Stephan |
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; |
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
|
Re: Falsche Zeichen in einem DB-Feld per SQL finden
Hallo,
Zitat:
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. |
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