AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Daten in Tabelle korrigieren
Thema durchsuchen
Ansicht
Themen-Optionen

Daten in Tabelle korrigieren

Ein Thema von Ykcim · begonnen am 22. Jan 2013 · letzter Beitrag vom 23. Jan 2013
Antwort Antwort
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

AW: Daten in Tabelle korrigieren

  Alt 23. Jan 2013, 13:20
Hier eine Lösung mit Triggern.

Da in einem Trigger die Tabelle selber nicht geändert werden kann, benötigt man eine weitere Tabelle, in der die überarbeiteten Werte eingetragen werden.

Dadurch hat man aber auch eine Trennung zwischen der Eingangstabelle und der Tabelle mit der man letztendlich arbeitet.
Unterschiede in den Tabellen können leicht erkannt werden und helfen auch bei der Fehlersuche/Optimierung.

Hier die beiden Tabellen:
Code:
CREATE TABLE `as400temp` (
  `AuftragNr` varchar(9) NOT NULL DEFAULT '',
  `Arbeitsgang` varchar(8) NOT NULL DEFAULT '',
  `Rueckmeldung` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`AuftragNr`,`Arbeitsgang`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `erpstat` (
  `AuftragNr` varchar(9) NOT NULL DEFAULT '',
  `Arbeitsgang` varchar(8) NOT NULL DEFAULT '',
  `Rueckmeldung` varchar(50) DEFAULT NULL,
  `AutoState` tinyint(4) NOT NULL,
  PRIMARY KEY (`AuftragNr`,`Arbeitsgang`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Das Feld AutoState habe ich nur eingeführt, damit man sehen kann, wo wirklich Änderungen durch diese Vorgaben vorgenommen wurden.

Der Inhalt des INSERT/UPDATE Triggers von as400temp sieht dabei wie folgt aus:
Code:
INSERT INTO erpstat ( AuftragNr, Arbeitsgang, Rueckmeldung, AutoState )
VALUES( NEW.AuftragNr, NEW.Arbeitsgang, NEW.Rueckmeldung, 0 )
ON DUPLICATE KEY UPDATE Rueckmeldung = NEW.Rueckmeldung, AutoState = 0;

IF NOT ISNULL( NEW.Rueckmeldung ) THEN

  UPDATE erpstat
     SET Rueckmeldung = 'Fertig', AutoState = 1
   WHERE AuftragNr = NEW.AuftragNr AND Arbeitsgang < NEW.Arbeitsgang AND Rueckmeldung IS NULL;

ELSE

  IF ( SELECT COUNT(*)
         FROM erpstat
        WHERE AuftragNr = NEW.AuftragNr AND Arbeitsgang > NEW.Arbeitsgang AND Rueckmeldung IS NOT NULL ) THEN

    UPDATE erpstat
       SET Rueckmeldung = 'Fertig', AutoState = 1
     WHERE AuftragNr = NEW.AuftragNr AND Arbeitsgang = NEW.Arbeitsgang;

  END IF;

END IF;
SQL Fiddle DEMO
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
856 Beiträge
 
Delphi 12 Athens
 
#2

AW: Daten in Tabelle korrigieren

  Alt 23. Jan 2013, 20:18
Hallo Sir Rufo,

ich bin gerade dabei, Deinen Ansatz mit der temporären Tabelle umzusetzen und komme leider an einem Fehlern nicht vorbei...
So habe ich es versucht:

Delphi-Quellcode:
CREATE TEMPORARY TABLE tmpTab
 SELECT WAAUNR, WAAUPO, OAAGNR
   FROM as400temp as A
  WHERE OATLKZ = ''
    AND OAAGNR <
        ( SELECT Max( OAAGNR )
            FROM as400temp
           WHERE WAAUNR = A.WAAUNR
             AND WAAUPO = A.WAAUPO
             AND OATLKZ = '9' )
    AND OAMANR not REGEXP 'HD|FA|KO'; //Das ist noch ein Zusatz, den ich vorher in meiner Software zusammenbauen muss

//Bis hierhin scheint es zu funktionieren, denn wenn ich es alleine ausführe, dann kommt keine Fehlermeldung

UPDATE as400temp
    SET OATLKZ = '9'
  WHERE ( WAAUNR, WAAUPO, OAAGNR ) IN ( SELECT WAAUNR, WAAUPO, OAAGNR
                                          FROM tmpTab ); //Ich nehme an, dass der Fehler an dieser Stelle ausgelöst wird. Die tmpTab wird nicht gefunden...

 DROP TABLE tmpTab;

Die Fehlermeldung lautet: Unknown table 'tmptab'

Hast Du oder jemand anderes eine Idee, was ich falsch mache?

Vielen Dank
Patrick
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Daten in Tabelle korrigieren

  Alt 23. Jan 2013, 20:31
Wenn du nur das SELECT Statement ausführst, werden dann Datensätze angezeigt?
Code:
SELECT WAAUNR, WAAUPO, OAAGNR
  FROM as400temp as A
 WHERE OATLKZ = ''
   AND OAAGNR <
       ( SELECT Max( OAAGNR )
           FROM as400temp
          WHERE WAAUNR = A.WAAUNR
            AND WAAUPO = A.WAAUPO
            AND OATLKZ = '9' )
   AND OAMANR not REGEXP 'HD|FA|KO';
und wenn du das hier ausführst:
Code:
CREATE TEMPORARY TABLE tmpTab
SELECT WAAUNR, WAAUPO, OAAGNR
  FROM as400temp as A
 WHERE OATLKZ = ''
   AND OAAGNR <
       ( SELECT Max( OAAGNR )
           FROM as400temp
          WHERE WAAUNR = A.WAAUNR
            AND WAAUPO = A.WAAUPO
            AND OATLKZ = '9' )
   AND OAMANR not REGEXP 'HD|FA|KO';

SELECT *
  FROM tmpTab;
oder mal so
Code:
SELECT WAAUNR, WAAUPO, OAAGNR
  FROM as400temp as A
 WHERE IFNULL( OATLKZ, '' ) = ''
   AND OAAGNR <
       ( SELECT Max( OAAGNR )
           FROM as400temp
          WHERE WAAUNR = A.WAAUNR
            AND WAAUPO = A.WAAUPO
            AND OATLKZ = '9' )
   AND OAMANR not REGEXP 'HD|FA|KO';
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
856 Beiträge
 
Delphi 12 Athens
 
#4

AW: Daten in Tabelle korrigieren

  Alt 23. Jan 2013, 20:50
Hallo,

vielen Dank für die schnelle Antwort!!!

Hier werden Daten angezeigt!
Delphi-Quellcode:
 SELECT WAAUNR, WAAUPO, OAAGNR
   FROM as400temp as A
  WHERE OATLKZ = ''
    AND OAAGNR <
        ( SELECT Max( OAAGNR )
            FROM as400temp
           WHERE WAAUNR = A.WAAUNR
             AND WAAUPO = A.WAAUPO
             AND OATLKZ = '9' )
    AND OAMANR not REGEXP 'HD|FA|KO';
Hier kommt die Fehlermeldung: Table 'nedcom.tmptab' doesn't exist
Delphi-Quellcode:
CREATE TEMPORARY TABLE tmpTab
 SELECT WAAUNR, WAAUPO, OAAGNR
   FROM as400temp as A
  WHERE OATLKZ = ''
    AND OAAGNR <
        ( SELECT Max( OAAGNR )
            FROM as400temp
           WHERE WAAUNR = A.WAAUNR
             AND WAAUPO = A.WAAUPO
             AND OATLKZ = '9' )
    AND OAMANR not REGEXP 'HD|FA|KO';

 SELECT *
   FROM tmpTab;
Hier werden die gleichen Daten wie oben angezeigt
Delphi-Quellcode:
SELECT WAAUNR, WAAUPO, OAAGNR
   FROM as400temp as A
  WHERE IFNULL( OATLKZ, '' ) = ''
    AND OAAGNR <
        ( SELECT Max( OAAGNR )
            FROM as400temp
           WHERE WAAUNR = A.WAAUNR
             AND WAAUPO = A.WAAUPO
             AND OATLKZ = '9' )
    AND OAMANR not REGEXP 'HD|FA|KO';
Gruß
Patrick
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Daten in Tabelle korrigieren

  Alt 23. Jan 2013, 21:05
Führst du etwa jedes Statement einzeln aus?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
856 Beiträge
 
Delphi 12 Athens
 
#6

AW: Daten in Tabelle korrigieren

  Alt 23. Jan 2013, 21:21
Ich habe die ANweisungen erst zusammen ausgeführt, dann aber auch einzeln versucht...

Kann es sein, dass ich die Drop-Anweisung einzeln ausführen muss?

Ohne die habe ich es jetzt irgendwie ans Laufen bekommen, habe aber keine Ahnung warum.

Ich verwende den QueryBrowser. Kann es auch damit zusammenhängen?

Ich bin etwas verwirrt...
Patrick
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
856 Beiträge
 
Delphi 12 Athens
 
#7

AW: Daten in Tabelle korrigieren

  Alt 23. Jan 2013, 21:27
Also, wenn ich die Anweisungen jetzt einzeln durchgehe, scheinen sie zu laufen, aber zusammen geht im Query-Browser nicht. ABer vielleicht hat mein Programm damit keine Probleme. Ich bin zurzeit noch nicht an dem Punkt, dass ich mein Programm testen kann. Ich programmiere also gerade blind. Ich muss noch zwei große Proceduren fertig bekommen, dann kann ich das Programm testen...

Ich werde gleich mal eben ein kleines eigenes Programm machen...

Melde mich gleich wieder.

Danke
Patrick
Patrick
  Mit Zitat antworten Zitat
Antwort Antwort


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 23:27 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