AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Falsche Zeichen in einem DB-Feld per SQL finden
Thema durchsuchen
Ansicht
Themen-Optionen

Falsche Zeichen in einem DB-Feld per SQL finden

Ein Thema von nachtstreuner60 · begonnen am 16. Jul 2008 · letzter Beitrag vom 17. Jul 2008
Antwort Antwort
Seite 3 von 4     123 4      
nahpets
(Gast)

n/a Beiträge
 
#21

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

  Alt 17. Jul 2008, 10:13
Hallo,
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":
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.
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
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#22

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

  Alt 17. Jul 2008, 11:17
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.


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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#23

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

  Alt 17. Jul 2008, 11:20
Und ab 2.5 reguläre Ausdrücke
Markus Kinzler
  Mit Zitat antworten Zitat
nachtstreuner60

Registriert seit: 15. Jan 2007
Ort: Eisenach
54 Beiträge
 
Delphi 7 Professional
 
#24

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

  Alt 17. Jul 2008, 12:09
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 ('0123456789NOT 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 ?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#25

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

  Alt 17. Jul 2008, 12:16
Auf eine SP kannst du entweder wie auf ein Tabelle zugreifen oder verwendest die entsprechende Komponente deiner Zugriffsbibliothek.
Markus Kinzler
  Mit Zitat antworten Zitat
nachtstreuner60

Registriert seit: 15. Jan 2007
Ort: Eisenach
54 Beiträge
 
Delphi 7 Professional
 
#26

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

  Alt 17. Jul 2008, 13:03
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
Miniaturansicht angehängter Grafiken
fdelphi3_818.jpg  
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#27

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

  Alt 17. Jul 2008, 13:20
Hallo,

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
  Mit Zitat antworten Zitat
nachtstreuner60

Registriert seit: 15. Jan 2007
Ort: Eisenach
54 Beiträge
 
Delphi 7 Professional
 
#28

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

  Alt 17. Jul 2008, 13:28
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;
Miniaturansicht angehängter Grafiken
fdelphi4_396.jpg  
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#29

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

  Alt 17. Jul 2008, 13:34
Wie omata schon erwähnt hat, brauchst du bei FB1.5 eine externe UDF-Bibliothek für diese Funktion
Markus Kinzler
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#30

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

  Alt 17. Jul 2008, 13:37
Hallo,
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz