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
Seite 1 von 2  1 2      
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
804 Beiträge
 
Delphi 10.4 Sydney
 
#1

Daten in Tabelle korrigieren

  Alt 22. Jan 2013, 20:47
Datenbank: MySQL • Version: 5 • Zugriff über: UniDac
Hallo Zusammen,

ich habe wieder ein MySQL-Problem, bei dem ich alleine nicht weiterkomme und bitte Euch um Hilfe.

Ich habe eine Tabelle, in der ich Fertigungsauftragsdaten habe. Diese Tabelle kommt aus unserem ERP-System und sieht vereinfacht so aus:

AuftragNr Arbeitsgang Rückmeldung
000004711 00000001 Fertig
000004711 00000002 Fertig
000004711 00000003 Fertig
000004711 00000004 Fertig
000004711 00000005 Dieser Arbeitsgang ist noch nicht fertig, deshalb steht dort kein "Fertig" drin.
000004711 00000006
000000815 00000001 Fertig
000000815 00000002 Fertig
000000815 00000003 Hier ist ein Rückmeldefehler, denn hier müsste auch "Fertig" stehen, aber hier steht nichts
000000815 00000004 Fertig
000000815 00000005 Fertig
000000815 00000006
000000815 00000007
000000815 00000008

Also alle Arbeitsgängen eines Auftrags, wo ein "Fertig" drinsteht, sind beendet. Wo nichts drinsteht, die sind noch nicht beendet.
Es ist nicht möglich, dass Arbeitsgang 6 vor Arbeitsgang 5 gemacht wird. Deshalb ist in unserem Beispiel bei Auftrag 000000815 beim Arbeitsgang 3 ein Rückmeldefehler.

Diese Fehler werden zwar irgendwann von der Produktionsplanung behoben, aber bis dahin verursachen sie Fehler in meinem Programm. Daher möchte ich gerne eine update-Anweisung anwenden, mit der ich solche Rückmeldefehler beheben kann.

Leider habe ich keine Idee, wie ich das anstellen soll und hoffe, dass Ihr mir weiterhelft.

Vielen Dank
Patrick
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Daten in Tabelle korrigieren

  Alt 22. Jan 2013, 20:58
Vielleicht in dieser Art?
SQL-Code:
UPDATE
  Tabelle A
SET
  Rückmeldung = 'Fertig'
WHERE
  Rückmeldung = ''
AND EXISTS(
  SELECT
    *
  FROM
    Tabelle
  WHERE
    AuftragNr = A.AuftragNr
  AND
    Arbeitsgang > A.Arbeitsgang
  AND
    Rückmeldung = 'Fertig'    
)
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#3

AW: Daten in Tabelle korrigieren

  Alt 23. Jan 2013, 08:40
Oder erstmal alle betroffenen finden:

Code:
Select AuftragNr||Arbeitsgang From Tabelle A
Where Rückmeldung is NUll
And Arbeitsgang <
(
Select Max(Arbeitsgang) From Tabelle
Where AuftragNr=A.AuftragNr
And Rückmeldung = 'Fertig'
)
und da dann ein Update drüber


Code:
UPDATE Tabelle A
SET Rückmeldung = 'Fertig'
WHERE
AuftragNr||Arbeitsgang in ("obigem Select")
Nicht schön, aber selten...
Ralph
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
804 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Daten in Tabelle korrigieren

  Alt 23. Jan 2013, 11:14
Hallo DeddyH,

vielen Dank für Deinen Vorschlag. Ich habe noch eine Frage:
Du scheinst zwei verschiedene Tabellen zu verwenden, denn die eine Tabelle heißt Tabelle A und die andere nur Tabelle...
Ich habe die Daten ja in einer Tabelle, daher habe ich es so versucht:
Delphi-Quellcode:
UPDATE
   as400temp as A
SET
   A.OATLKZ = '9//Das ist das Feld für Rückmeldungen
WHERE
   A.OATLKZ = ''
AND EXISTS(
   SELECT * FROM as400temp as B
   WHERE
     B.WAAUNR = A.WAAUNR //Das ist das Feld für die AuftragsNr
   AND
     B.WAAUPO = A.WAAUPO //Das ist ein Zusatzfeld, dass zur AuftragsNr gehört
   AND
     B.OAAGNR > A.OAAGNR //Das ist das Feld für den Arbeitsgang
   AND
     B.OATLKZ = '9'
Leider funktioniert das nicht, weil ich in einer Update-Anweisung nicht die gleiche Tabelle in der SubQuery verwenden darf.
Ich bekomme diese Fehlermeldung:

You can't specify target table 'A' for update in FROM clause
Kann mir da jemand weiterhelfen?

Vielen Dank
Patrick
Patrick
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
804 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Daten in Tabelle korrigieren

  Alt 23. Jan 2013, 11:42
Hallo Jumpy,

Vielen Dank für Deinen Vorschlag. Wenn ich es nicht in einer SQL-Anweisung realisieren kann, werde ich ihn verwenden. Ich habe es gerade schon mal ausprobiert und das Ergebnis der Select-Anweisung scheint korrekt zu sein. Daraus könnte ich mir dann in Delphi eine Update-Anweisung zusammenbauen...

Schöner wäre es aber mit einer Anweisung, aber es viel besser als wie ich es vor zwei Jahre gelöst habe (ich entwickel eine alte Software gerade neu), in der ich nämlich die relevanten Aufträge mittels einer For-Schleife aus allen Datensätzen heraus ermittelt habe....

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
 
#6

AW: Daten in Tabelle korrigieren

  Alt 23. Jan 2013, 11:51
Ja, du kannst die betroffenen Datensätze in eine temp. Tabelle schreiben und dann in deinem UPDATE Statement benutzen.
Code:
CREATE TEMPORARY TABLE tmpTab

SELECT AuftragNr, Arbeitsgang
  FROM Tabelle A
 WHERE Rueckmeldung IS NULL
   AND Arbeitsgang <
       ( SELECT Max( Arbeitsgang )
           FROM Tabelle
          WHERE AuftragNr = A.AuftragNr
            AND Rueckmeldung = 'Fertig' );
   
UPDATE Tabelle
   SET Rueckmeldung = 'Fertig'
 WHERE ( AuftragNr, Arbeitsgang ) IN ( SELECT AuftragNr, Arbeitsgang
                                         FROM tmpTab );

DROP TABLE tmpTab;
SQL Fiddle DEMO

Wenn du sicherstellen willst, dass diese Fehler nicht mehr auftauchen, so würde ich einen TRIGGER (INSERT,UPDATE) empfehlen, der dieses gewährleistet.
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
804 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Daten in Tabelle korrigieren

  Alt 23. Jan 2013, 12:15
Zitat:
SQL Fiddle DEMO
Was ist das denn? Das habe ich ja noch nie gesehen! Cool!

Vielen Dank für die Vorschläge, dass sieht wirklich klasse aus!!!
Ich glaube, dass ich es so schaffen kann.

Zitat:
Wenn du sicherstellen willst, dass diese Fehler nicht mehr auftauchen, so würde ich einen TRIGGER (INSERT,UPDATE) empfehlen, der dieses gewährleistet.
Was meinst Du damit? Die Rückmeldefehler? Die entstehen, weil es den Kollegen in der Produktion passiert, dass sie die Rückmeldungen in unser ERP-System vergessen, oder weil Rückmeldemechanismen ausfallen. Aber menschliche Fehler sind der größere Teil. Auf das ERP-System habe ich keinen Einfluss, dass ich auch logischer Weise ein andere Datenbank, aus der ich alle 30 min. frische Daten für mein System bekomme...

Aber mit TRIGGERN kenne ich mich gar nicht aus. Hast Du dafür einen guten Link?

Vielen Dank für Eure Unterstützung bis hier

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
 
#8

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
804 Beiträge
 
Delphi 10.4 Sydney
 
#9

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
 
#10

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
Antwort Antwort
Seite 1 von 2  1 2      


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 22:31 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