Office Forum
www.Office-Loesung.de
Access :: Excel :: Outlook :: PowerPoint :: Word :: Office :: Wieder Online ---> provisorisches Office Forum <-
Abgleich von Ident-Nr. zwischen 2 Systemen in MsSQL 2008
zurück: Tabelle aktualisieren vs. SQL Sicht weiter: SQL Alle Datumswerte anzeigen, auch bei leeren Datensätzen Unbeantwortete Beiträge anzeigen
Neues Thema eröffnen   Neue Antwort erstellen     Status: Antwort Facebook-Likes Diese Seite Freunden empfehlen
Zu Browser-Favoriten hinzufügen
Autor Nachricht
Norwegen60
Im Profil kannst Du frei den Rang ändern


Verfasst am:
28. Jan 2014, 16:47
Rufname:

Abgleich von Ident-Nr. zwischen 2 Systemen in MsSQL 2008 - Abgleich von Ident-Nr. zwischen 2 Systemen in MsSQL 2008

Nach oben
       Version: Office 2003

Hallo zusammen,

ich gleiche die Daten zwischen einem ERP-System und einer Auswertesoftware ab. Dabei ist es nun bei Wareneingängen so, dass bei Teillieferung für die Teillieferungen neue Datensätze generiert werden und die Originalsätze um die gelieferte Teilmenge reduziert und wieder als offene Bestellung weiter laufen. An diesem Ablauf kann ich nichts ändern.

Sobald ein neuer Bestellvorgang im ERP erzeugt wurde, wird dieser stündlich mit der ERP-ID in das Auswertesystem kopiert.

Sobald die Ware eingeht, wird der Eingang im Auswertesystem gemeldet und eventuell gefundene Fehler zugeordnet.

Problem ist nun, dass sich, sobald die Teillieferung im ERP erfasst wird, dort eben ein neuer Datensatz mit neuer ID angelegt wird. Und damit verliere ich zunächst die Besziehung zwischen ERP und Auswertesystem

Mit folgende SQL können 2 Mustertabellen erzeugt werden.
Code:
CREATE TABLE Tabelle1 (
 id1 int NULL,
 id2 int NULL);
 
Insert Into Tabelle1(id1, id2) Values (3, 0)
Insert Into Tabelle1(id1, id2) Values (4, 0)
Insert Into Tabelle1(id1, id2) Values (12, 5)
Insert Into Tabelle1(id1, id2) Values (13, 5)
Insert Into Tabelle1(id1, id2) Values (14, 6)
Insert Into Tabelle1(id1, id2) Values (5, 0)
Insert Into Tabelle1(id1, id2) Values (6, 0)


CREATE TABLE Tabelle2 (
 id3 int NULL,
 OrgID int NULL);
 
Insert Into Tabelle2(id3, OrgID) Values (3, 3)
Insert Into Tabelle2(id3, OrgID) Values (4, 4)
Insert Into Tabelle2(id3, OrgID) Values (12, 5)
Insert Into Tabelle2(id3, OrgID) Values (5, 5)
Insert Into Tabelle2(id3, OrgID) Values (6, 6)
Hier der Code zum ansehen der Daten und die Ergebnisse. Im Beispiel war id=12 schon mal eine Teillieferung von 5
Code:
Select * from Tabelle2

Select * from Tabelle1
3   0
4   0
12   5
13   5
14   6
5   0
6   0

Select * from Tabelle2
3   3
4   4
12   5
5   5
6   6


Select T2.id3, T2.OrgID, T1.id1, T1.id2
    from Tabelle2 T2
    left outer join (select id2, id1 from Tabelle1 where (id2 > 0) and (id1<>id2)
  and not (id1 in (select id3 from Tabelle2))) T1 on T1.id2 = T2.id3
  where not T1.id2 is null
5   5   13   5
6   6   14   6
Der Code zeigt also korrekt an, dass sich bei den Sätzen 5 und 6 die ID auf 13 und 14 geändert hat.
Der aufwändige Code für den Join ist nur entstanden weil ich sicherstellen wollte, dass der Datensatz mit der id1 = 12 nicht mehr berücksichtigt wird da er ja schon in Tabelle 2 enthalten ist

Und mit
Code:
Update Tabelle2 Set
  id3 = T1.id1
    from Tabelle2 T2
    left outer join (select id2, id1 from Tabelle1 where (id2 > 0) and (id1<>id2)
  and not (id1 in (select id3 from Tabelle2))) T1 on T1.id2 = T2.id3
  where not T1.id2 is null

Select * from Tabelle2
3   3
4   4
12   5
13   5
14   6
werden die ID auch korrekt geändert. In einem nächsten Schritt würden jetzt die beiden wieder fehlenden Sätze 5 und 6 eingefügt.

Leider funktioniert dieses Update-SQL aber nicht bei allen Tabellen obwohl diese nahezu identisch aufgebaut sind. In http://forums.whirlpool.net.au/archive/1067227 habe ich auch gelesen, dass NOT IN zu Problemen führen kann. Dies habe ich auch mehrfach festgestellt. Es ging lange gut und plötzlich kommen falsche Ergebniss raus. Ich habe die Abfrage deshalb fast überall duch "WHERE NOT EXISTS (SELECT 1 ..." ersetzt.

Wie aber stelle ich obiges SQL so um dass es immer funktioniert

Vielen Dank
Gerd
Bitsqueezer
Office-VBA-Programmierer


Verfasst am:
29. Jan 2014, 16:39
Rufname:


AW: Abgleich von Ident-Nr. zwischen 2 Systemen in MsSQL 2008 - AW: Abgleich von Ident-Nr. zwischen 2 Systemen in MsSQL 2008

Nach oben
       Version: Office 2003

Hallo,

Du gibst Beispiele an, die funktionieren, also ist es eher unmöglich zu sagen, warum es in anderen Tabellen, die "nahezu identisch" aufgebaut sind, nicht funktioniert. Bugs sind häufig nur an den konkreten Details zu identifizieren und allgemein kann man sowas nicht beantworten.

Es ist auch falsch (und steht so nicht in dem zitierten Thread) das ein "NOT IN" zu Problemen führen kann, es ist lediglich so, daß die EXISTS-Methode im Regelfall bedeutend schneller ist, wo sie einsetzbar ist, da sie keine Ergebnisliste zurückliefert, die mit einem Wert verglichen werden muß, sondern der Ausdruck nur ein True oder False zurückgibt und daher keine Feldliste benötigt wird (weswegen man hier sogar SELECT * schreiben darf, da das tatsächlich ebenso ignoriert wird).

Wenn also die Bedingungen korrekt sind, funktioniert "NOT IN" genauso perfekt wie "EXISTS", nur meistens langsamer.

Der UPDATE-Befehl ist allerdings mehr trickreich, da es hier bei Verwendung von mehr als einer Tabelle leicht dazu kommen kann, daß nicht die gewünschten Daten aktualisiert werden. Ím Gegensatz zu Access kann ein UPDATE auf dem SQL Server immer nur genau eine Tabelle aktualisieren und die JOINs hier korrekt zu setzen, ist nicht so einfach.

Gruß

Christian
Norwegen60
Im Profil kannst Du frei den Rang ändern


Verfasst am:
29. Jan 2014, 19:12
Rufname:

AW: Abgleich von Ident-Nr. zwischen 2 Systemen in MsSQL 2008 - AW: Abgleich von Ident-Nr. zwischen 2 Systemen in MsSQL 2008

Nach oben
       Version: Office 2003

Hallo,

es ist so, dass ich bei einigen Updates oder Inserts Probleme hatte, als ich sie noch mit NOT IN ausgeführt habe. Von daher vermute ich, dass es damit zusammenhängt.
Ich wüsste auch nicht worin sich die beiden Fälle bei mir unterscheiden. In beiden Fällen gehe ich von derselben ERP-Tabelle aus. Hier die beiden SQL-Statements:
Code:
SET @QUERY = 'Update PPS_TermBest Set
  ErpID = z.ErpID
    from PPS_TermBest P
    left outer join (select ErpIDitem, ErpID from zzzPPS_TermbestTmp where (ErpIDitem > ''0'') and (ErpID<>ErpIDitem)
  and not (ErpID in (select ErpID from PPS_TermBest))) z on z.ErpIDitem = p.ErpID
  where not z.ErpIDitem is null'
Code:
SET @QUERY = 'Update PrArProt Set
  ErpID = z.ErpID
    from PrArProt P
    left outer join (select ErpIDitem, ErpID from zzzPPS_TermbestTmp where (ErpIDitem > ''0'') and (ErpID<>ErpIDitem)
  and not (ErpID in (select ErpID from PrArProt))) z on z.ErpIDitem = p.ErpID
  where not z.ErpIDitem is null'

Die Tabellen PPS_TermBest und PrArProt unterscheiden sich nur durch unterschiedliche Felder. Die upzudatenden Felder sind aber genau gleich. (incl. Typ = nvarchar(20))

Vielleicht hat aber jemand eine andere Idee, wie man das SQL aufbauen könnten

Danke
Gerd
Bitsqueezer
Office-VBA-Programmierer


Verfasst am:
30. Jan 2014, 11:15
Rufname:


AW: Abgleich von Ident-Nr. zwischen 2 Systemen in MsSQL 2008 - AW: Abgleich von Ident-Nr. zwischen 2 Systemen in MsSQL 2008

Nach oben
       Version: Office 2003

Hallo,

ich habe die Erfahrung gemacht, daß es bei UPDATE besser ist, die Tabelle, die man ändern möchte, nicht direkt mit einer anderen zu verknüpfen, sondern erst eine Unterabfrage zu erstellen und dann die Tabelle mit dem Ergebnis der Unterabfrage zu verknüpfen und ein WHERE anzuhängen, das führt zu sicheren Ergebnissen.

In Deinem Beispiel etwa so:
Code:
UPDATE Tabelle2
SET  id3 = Q2.id1
FROM
(SELECT T2.id3, Q1.id1 FROM Tabelle2 AS T2
INNER JOIN (SELECT id1,id2 FROM Tabelle1 AS T1
          WHERE NOT EXISTS (SELECT id3 FROM Tabelle2 WHERE id3 = T1.id1)
            AND id2 > 0) AS Q1 ON T2.id3 = Q1.id2) AS Q2
WHERE Tabelle2.id3 = Q2.id3
oder etwas weniger kompakt, dafür aber besser les- und kommentierbar als CTE:
Code:
WITH Q1 AS
(
   SELECT id1,id2 FROM Tabelle1 AS T1
    WHERE NOT EXISTS (SELECT id3
                   FROM Tabelle2
                  WHERE id3 = T1.id1)
      AND id2 > 0
), Q2 AS
(
   SELECT T2.id3, Q3.id1 FROM Tabelle2 AS T2
   INNER JOIN (SELECT id1, id2 FROM Q1) AS Q3
      ON T2.id3 = Q3.id2
)
UPDATE Tabelle2
   SET  id3 = Q2.id1
  FROM Q2
 WHERE Tabelle2.id3 = Q2.id3

Gruß

Christian
Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind
GMT + 1 Stunde

Diese Seite Freunden empfehlen

Seite 1 von 1
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen

Verwandte Themen
Forum / Themen   Antworten   Autor   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge Microsoft Access und MS SQL Server: ADP in ACCDB importiert - MSSQL - Verbindung fehlt noch 1 Hansklein 228 28. Jan 2014, 00:28
Bitsqueezer ADP in ACCDB importiert - MSSQL - Verbindung fehlt noch
Keine neuen Beiträge Microsoft Access und MS SQL Server: MSSQL: Zwei Tabellen verbinden 0 Donsk 298 11. Okt 2013, 23:02
Donsk MSSQL: Zwei Tabellen verbinden
Keine neuen Beiträge Microsoft Access und MS SQL Server: Kommentar an Spalte im SQL Server 2008 4 Paul Hema 506 02. Nov 2012, 09:08
Paul Hema Kommentar an Spalte im SQL Server 2008
Keine neuen Beiträge Microsoft Access und MS SQL Server: select abgleich mit aktuellen Datum 0 datenmaus 1203 21. Aug 2012, 14:01
datenmaus select abgleich mit aktuellen Datum
Keine neuen Beiträge Microsoft Access und MS SQL Server: SQL Management Studio 2008 / Replace Abfrage 3 Jaith 3548 13. Jun 2012, 17:51
Gast SQL Management Studio 2008 / Replace Abfrage
Keine neuen Beiträge Microsoft Access und MS SQL Server: SQL Reporting Services 2008 R2 - keine Berechtigung 3 hagener 3780 15. Jan 2012, 12:34
Bitsqueezer SQL Reporting Services 2008 R2 - keine Berechtigung
Keine neuen Beiträge Microsoft Access und MS SQL Server: Welche Lizenz für SQL Server 2008 R2 brauche ich denn nun? 1 MV 2323 06. März 2011, 21:05
- Rick - Welche Lizenz für SQL Server 2008 R2 brauche ich denn nun?
Keine neuen Beiträge Microsoft Access und MS SQL Server: Mit ODBC eine Tabelle nach MSSQL exportieren 0 Jacques 1896 13. Okt 2010, 16:11
Jacques Mit ODBC eine Tabelle nach MSSQL exportieren
Keine neuen Beiträge Microsoft Access und MS SQL Server: Access 2003 => MS-SQL 2005 Zugriff so Schwierig? 3 Chr!ss 2226 12. März 2010, 14:06
Bitsqueezer Access 2003 => MS-SQL 2005 Zugriff so Schwierig?
Keine neuen Beiträge Microsoft Access und MS SQL Server: MSSQL 2005 - Datenbankbackup mit einem variablen Dateinamen 1 schmitty 2106 18. Apr 2009, 18:33
mpdd MSSQL 2005 - Datenbankbackup mit einem variablen Dateinamen
Keine neuen Beiträge Microsoft Access und MS SQL Server: Import in Access aus MSSQL - Zeichensatzproblem!? 0 Onemahutu 1398 16. Jan 2009, 13:14
Onemahutu Import in Access aus MSSQL - Zeichensatzproblem!?
Keine neuen Beiträge Microsoft Access und MS SQL Server: Migration von Access to MSSQL 2 serdarcolak 2111 09. Jan 2009, 16:50
heph Migration von Access to MSSQL
 

----> Diese Seite Freunden empfehlen <------ Impressum - Besuchen Sie auch: HTML CSS