-
Record compare
Moin zusammen,
ich habe eine Anforderung drei Sätze miteinander zu vergleichen. Die Tabellen enthalten über 200 Spalten und die Anforderung besteht darin die Spalten zu bekommen, in denen die Felder unterschiedlich sind.
Optimal wäre eine Konfigurationsmöglichkeit, womit man Spalten selektiv von dem Vergleich ausschließen könnte.
Alternativ können die Daten natürlich auch in drei Tabellen ausgegeben werden, wobei als Ergebnis in jedem Fall die unterschiedlichen Spalten ausgewiesen werden müssen. Die unterschiedlichen Sätze reicht nicht aus, da die Sätze in jedem Fall unterschiedlich sind.
Hintergrund ist eine laufende Anwendungsmodernisierung, wobei die Einträge von der alten und der neuen Umgebung geschrieben werden und im Rahmen des Tests Unterschiede aufgedeckt werden müssen, wobei es natürlich Spalten gibt die im neuen System nicht mehr vorhanden sind und somit vom Test ausgeschlossen werden sollten.
Natürlich kann man das auch im SQL programmieren, aber vielleicht kennt jemand ein Tool, das diese Anforderungen mit sich bringt. Mit dem direkten Zugriff auf das System i sind meine Anforderungen wahrscheinlich zu hoch geschraubt
Vielen Dank
-
Ich glaube kaum, dass des da ein fertiges Tool gibt, denn diese Anforderung ist schon sehr spezifisch.
Die einzige Chance ist hier wirklich SQL, da du mit SQL die Feldvergleiche dynamisch anstellen kannst.
Irgendwer muss ja zumindest sagen, was mit was verglichen werden soll.
-
Wir schieben die Sätze in eine
D a_XXSatz E DS extname(XXFILE) prefix (a_)
und b_
dann vergleichen wir in Schleife Byte für Byte von a_xxSatz und b_xxsatz.
Bei ungleich können wir über die pos das Feld bestimmen ->dspffd in eine Outfile, key auf PufferPos
Robi
Das Notwendige steht über dem technisch machbaren.
(klingt komisch, funktioniert aber!)
-
Vielen Dank erst Mal - vielleicht hat jemand anderes noch eine Idee.
Der Vergleich soll Spalte für Spalte erfolgen, d.h. in einer Tabelle stehen ja sowieso 3 Sätze mit dem gleichen Aufbau und es werden die drei Werte in Spalte 1 miteinander verglichen, die drei Werte in Spalte 2... usw.
Bei der Ausgabe in 3 Tabellen habe ich ebenso 3 Tabellen mit dem gleichen Aufbau und es wird die erste Spalte in allen drei Tabellen miteinander vergleichen, die zweite Spalte..., die dritte Spalte... usw.
-
... was ist jetzt die Frage? was spricht da gegen if, else, if, das geht in jeder Programmiersprache, mehrwertige Verzweigungen sind da unterschiedlich. Aber programmieren muss man da so oder so!
D*B
-
Hallo,
wenn ich das richtig verstanden hab suchst du Felder, die in den Dateien voneinander abweichen.
So müsste das funktionieren:
SELECT DBILIB, DBIFIL, DBIFLD
FROM qadbilfi a
join (select * from qadbilfi b where dbilib = 'Lib 2' and
dbifil = 'dat 2'
) as b on a.DBIFLD = b.DBIFLD
where a.dbilib ='lib 1' and a.dbifil = 'dat 1'
and (a.dbiiln <> b.dbiiln or a.dbiitp <> b.dbiitp or
a.dbityp <> b.dbityp or a.dbicln <> b.dbicln or
a.dbiccc <> b.dbiccc or a.dbinln <> b.dbinln or
a.dbinsc <> b.dbinsc)
evtl. musst du etwas genauer definieren welche Unterschiede du brauchst.
Hab hier jetzt Typ, CCSID und Längen genommen.
Falls es dir auch um den Inhalt geht kannst du die Felder die hier herauskommen ja in Schleife dynamisch in ein Sql setzen lassen und so vergleichen.
-
Ich würde die Catalog View SYSCOLUMNS verwenden. (Auf die QADB... Tabellen, hat nicht jeder Zugriff!)
Für den Abgleich, würde ich die Catalog-View mehrfach über FULL JOINS verknüpfen und dann die Abweichungen über Case-Anweisungen ermitteln (und ggf. filtern) etwa so:
Code:
Select Coalesce(a.Table_Schema, b.Table_Schema) Schema,
Coalesce(a.Table_Name, b.Table_Name) Table,
Coalesce(a.Column_Name, b.Column_Name) Column,
Case When a.Data_Type <> b.Data_Type Then 'DataType' Else '' End DiffType,
Case When a.Length <> b.Length Then 'Length' Else '' End DiffLength,
Case When a.Numeric_Scale is Distinct from b.Numeric_Scale Then 'Numeric Scale' Else '' End DiffNumScale,
....
From (Select *
From SysColumns
Where System_Table_Name = 'YOUR1TABLE'
and System_Table_Schema = 'SCHEMA1') a
Full Join
(Select *
From SysColumns
Where System_Table_Name = 'YOUR2TABLE'
and System_Table_Schema = 'SCHEMA2') b
on a.System_Column_Name = b.System_Column_Name
Falls die abweichenden Datensätze ermittelt werden sollten, kann dies mit Hilfe der EXCEPT-Klausel erfolgen:
Code:
Select Col1, Col2, ... ColN
From SCHEMA1.YOUR1TABLE
Except
Select Col1, Col2, ... ColN
From SCHEMA2.YOUR2TABLE
Birgitta
-
Die QADB... ist Basis für SYSCOLUMNS und ohne Lesezugriff (Default) könnte man auch die SYSCOLUMNS nicht lesen.
Similar Threads
-
By harkne in forum NEWSboard Programmierung
Antworten: 10
Letzter Beitrag: 08-12-15, 14:31
-
By samik in forum IBM i Hauptforum
Antworten: 6
Letzter Beitrag: 12-02-03, 15:22
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks