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 2 von 4     12 34      
mkinzler
(Moderator)

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

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

  Alt 16. Jul 2008, 15:15
Wrum? Ein Trigger läuft doch in der Datenbank und reagiert auf das Schreiben durch das Programm
Markus Kinzler
  Mit Zitat antworten Zitat
nachtstreuner60

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

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

  Alt 16. Jul 2008, 15:16
Hallo Union,

habe noch nie mit Triggern gearbeitet, wie funktionieren die ?

Muss hierfür in der Firebird Datenbank etwas gecodet werden ?
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#13

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

  Alt 16. Jul 2008, 15:21
Ja, sowas wie:
SQL-Code:
CREATE TRIGGER IDOC_CHECK FOR IDOC_REAL
ACTIVE AFTER INSERT
AS
begin
  if (INSERTING) then ...
end
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
nachtstreuner60

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

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

  Alt 16. Jul 2008, 15:32
Hallo union,

wenn ich das richtig verstanden habe, müsste ich in dem Abschnitt

if (INSERTING) then ... prüfen, ob die Zeichenfolge ab der zweiten Stelle keine Zahl ist ?

Aber wie sieht der Code hierzu aus ?

Wenn es sich um einen Fehlerhaften Datensatz handelt, muss dieser in eine andere tabelle geschrieben werden?
Oder reicht es aus, wenn ich in der Ursprungsdatenbank ein zusätzliches Feld wie etwa (STATUS = 'F') anlege u. dieses dann
je nach Ergebnis mit einem F fülle ?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

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

  Alt 16. Jul 2008, 15:47
Ich würde den Trigger nicht im AFTER INSERT sondern BEFORE INSERT machen. Dann kannst du die einzufügenden Werte noch ändern oder weitere Werte setzen (z.B. den Status)
http://udf.adhoc-data.de/dokumentati...eu_string.html
Markus Kinzler
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#16

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

  Alt 16. Jul 2008, 17:04
Hallo,

versuch doch mal sowas:

SQL-Code:
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'
Beim SQL-Server und Postgres funktioniert das.

Eventuell könntest Du auch noch das F mit rausfiltern und dann auf einen Leerstring abfragen.
Die Umwandlung in eine Zahl wird scheitern, da beim CAST(ScanCode as INT) beim ersten Satz, der ein ungültiges Zeichen enthält, ein Ausnahme geworfen wird. Die müsstest Du dann auch noch abfangen.

Stephan
  Mit Zitat antworten Zitat
nachtstreuner60

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

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

  Alt 16. Jul 2008, 19:53
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
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.350 Beiträge
 
Delphi 11 Alexandria
 
#18

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

  Alt 16. Jul 2008, 20:31
Hi,

ich würde für den Test eine Procedure schreiben:

SQL-Code:
SET TERM ^ ;

CREATE PROCEDURE CHECK_BARCODE (
    barcode varchar(20))
returns (
    result char(1))
as
begin
  /* check barcode */
  result = 'F';
  if (substring(:barcode from 1 for 1) <> 'F') then
  begin
    suspend;
    exit;
  end
  if (substring(:barcode from 2 for 1) not between '0and '9') then
  begin
    suspend;
    exit;
  end
  if (substring(:barcode from 3 for 1) not between '0and '9') then
  begin
    suspend;
    exit;
  end
  if (substring(:barcode from 4 for 1) not between '0and '9') then
  begin
    suspend;
    exit;
  end
  if (substring(:barcode from 5 for 1) not between '0and '9') then
  begin
    suspend;
    exit;
  end
  if (substring(:barcode from 6 for 1) not between '0and '9') then
  begin
    suspend;
    exit;
  end
  if (substring(:barcode from 7 for 1) not between '0and '9') then
  begin
    suspend;
    exit;
  end
  result = 'T';
  suspend;
end^
SET TERM ; ^
das where sollte dann so aussehen:

where (select result from check_barcode(ScanCode)) = 'F' Cu, Frank
Frank Reim
  Mit Zitat antworten Zitat
alex517

Registriert seit: 23. Nov 2004
Ort: Bernau b. Berlin
273 Beiträge
 
Delphi XE5 Enterprise
 
#19

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

  Alt 16. Jul 2008, 21:30
Hi

du könntest neben dem Feld SCANCODE ein zweites Feld z.B. "SCANCODE_CLEARED" in der Tabelle führen in der die bereinigten Scancodes stehen.
Dieses Feld "SCANCODE_CLEARED" wird immer durch einen Insert/Update-Trigger gesetzt.


SQL-Code:
CREATE OR ALTER TRIGGER SCANCODES_BI FOR SCANCODES
ACTIVE BEFORE INSERT OR UPDATE POSITION 0
AS
BEGIN
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GEN_SCANCODES_ID,1);

  NEW.SCANCODE_CLEARED = 'F'||F_STRIPSTRINGHOLD( F_STRCOPY(NEW.SCANCODE, 1, 10), '0123456789');
END
F_STRIPSTRINGHOLD() und F_STRCOPY() sind Funktionen aus der FreeAdHocUDF.
Die musst du natürlich vorher einbinden.

Abfrage für fehlerhaften Sätze:
SQL-Code:
select
  S.ID,
  S.SCANCODE,
  S.SCANCODE_CLEARED
from
  SCANCODES S
where
  S.SCANCODE <> S.SCANCODE_CLEARED
Abfrage für korrekte Sätze:
SQL-Code:
select
  S.ID,
  S.SCANCODE,
  S.SCANCODE_CLEARED
from
  SCANCODES S
where
  S.SCANCODE = S.SCANCODE_CLEARED
Das geht natürlich auch ohne extra Feld nur mit einen Select-Statement.
Kommt darauf an wie oft du Werte benötigst.
SQL-Code:
select
  S.ID,
  S.SCANCODE,
  'F'||F_STRIPSTRINGHOLD( F_STRCOPY(S.SCANCODE, 1, 10), '0123456789')
from SCANCODES S
where
  S.SCANCODE <> 'F'||F_STRIPSTRINGHOLD( F_STRCOPY(S.SCANCODE, 1, 10), '0123456789')
alex
Alexander
  Mit Zitat antworten Zitat
omata

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

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

  Alt 16. Jul 2008, 23:23
SQL-Code:
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 ; ^
SQL-Code:
SELECT *
FROM IDOC_REAL
WHERE (SELECT result FROM CLEARNUMERIC(ScanCode)) <> 'F'
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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 05: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