PDA

Vollständige Version anzeigen : Formulardarstellung Tabellenvergleich


marcohom
18.06.2012, 11:32
Hallo liebe Community,

der Tabellenvergleich tbl_Bestand und tbl_Import über Inkonsistenzabfrage läuft.
Ich bin nur gerade etwas ratlos, wie man das Ergebnis schön in einem Formular präsentieren kann.

Der User soll am Besten in einem Formular sehen, welches Feld sich in der tbl_Import zur tbl_Bestand geändert hat und dieses Feld wird dann rot hinterlegt.

Mein Ansatz: Auf die Inkonsistenzabfrage eine Kreuzabfrage und die Kreuzabfrage dann im Form darstellen.
Aber ich bin mir total unsicher und daher frage ich lieber mal, ob es da eine einfachere Möglichkeit gibt.

Ich bedanke mich auf jedenfall schon mal für euren Input!

Viele Grüße
Marco Hombach

Atrus2711
18.06.2012, 11:43
der Tabellenvergleich tbl_Bestand und tbl_Import über Inkonsistenzabfrage läuft.
Das ist fein, klingt aber so, als wüssten hier schon alle, was du damit meinst und wie du das umgesetzt hast. Dem ist nicht so...

marcohom
18.06.2012, 11:55
Danke Dir für die Antwort.

Ich wollte das Thema Tabellenvergleich nicht neu hier erörtern. Dazu gibt es hier ja bereits eine Menge gute Beiträge.

Das Ergebnis der Inkonsistenzabfrage gibt mir auf jedenfall die Vertrag_ID zurück, wo sich im Vergleich zwischen tbl_Bestand und tbl_Import etwas geändert hat.

Als Beispiel hat sich im Feld "Vertragsende" in der tbl_Import das Datum geändert.
Und z.B. in einem Endlosformular dann (evt.) so dargestellt werden:

Vertrags_ID --- "Vertragsende" --- "Datum aus Tabelle Bestand" --- "Datum aus Tabelle Import"

Ich hoffe, dass ich es besser erklärt habe. Wenn nicht, bitte melden!

Viele Grüße
Marco Hombach

P.S.: Mein Ansatz mit der Kreuztabelle ist vielleicht gar nicht so verkehrt.
Ich müsste dem wahrscheinlich eine Union voransetzen mit tbl_Bestand und tbl_Import basierend auf dieser herausgefundenen Vertrags_ID?

Atrus2711
18.06.2012, 14:01
Das Ergebnis der Inkonsistenzabfrage gibt mir auf jedenfall die Vertrag_ID zurück, wo sich im Vergleich zwischen tbl_Bestand und tbl_Import etwas geändert hat.
Und jetzt geht es nur noch um die Felder, die verändert wurden?

Wenn Performace keine Rolle spielt, könntest du in der bedignten Formatierung die FElder pärchenweise (Bestand/Import) vergleichen und bei Abweichung einfärben.

marcohom
18.06.2012, 14:11
Korrekt.
Am liebsten wäre mir wirklich, dass er nur zu dieser Vertrags_ID dieses eine Feld "Vertragsende" ausgibt mit den zwei Werten.

Leider musst Du mir nochmal kurz erklären, wenn Du Zeit hast, was Du genau mit
"bedignten Formatierung die FElder pärchenweise (Bestand/Import) vergleichen"
meinst. Performance spielt erstmal keine Rolle :)

Danke Dir!

P.S.:
Ich probiere gerade folgendes(, da ich oben mit Kreuztabelle etc. nicht weiterkomme)
- ich speichere mir diese gefundene Vertrags_ID in eine tbl_Änderung
- mache ein Hauptformular basierend auf tbl_Änderung und habe mir als Ufrms die tbl_bestand und tbl_import mit verknüpfter Vertrags_ID nebeneinander dargestellt mit allen Feldern... aber das ist wirklich zu viel für den User. :)
weiter bin ich aber noch nicht. :)

Zweiter Ansatz:
Ich mache eine tbl_Kontrolle mit Vertrags_ID, Feldname, Wert1 und Wert2.
Ich trage dann in Wert1 den Wert von tbl_Bestand und in Wert2 in Wert von tbl_import (über aktualisierungsabfragen.)
erm. ja. :)

Atrus2711
18.06.2012, 14:15
Wenn Import und Bestand die gleichen Felder haben, kann der Import - bei Syn anhand der VertragsID - grundsätzlich in jedem Feld abweichen. Die Restriktion auf "Das eine" Feld kann also allenfalls durch einen nur dir bekannten Vorbehalt resultieren.

Wenn du Bestands- und Importwert der relevanten Spalte(n) in deinem Formular darstellst, kannst du über eine bedingte Formatierung Färbungen vornehmen. Die Bedingung wäre dann ein Ausdruck z.B. dieser Art:
[Import_Nachname] <> [Bestand_Nachname]

marcohom
18.06.2012, 14:36
Import und Bestand haben die gleichen Felder.

Die bedingte Formatierung in Formularen habe ich bisher noch nie genutzt. Muss ich mir mal unbedingt ansehen! Danke Dir für den Tipp!

In meinen obigen Ansatz mit den beiden Unterformularen nebeneinander mache ich jetzt im Unterformular "frm_Datenänderung_Import" ein neues Textfeld mit =Wenn([Vertragsablauf]<>Formulare!.....!Formular!frm_Datenänderung_Bestand![Vertragsablauf];"ÄNDERUNG";"")

Aber so ganz gefällt mir das nicht, da ich ja jetzt auf Formularebene den Vergleich ziehe und zwar pro Feld. (Wir reden schon von etwa 20 Felder, die miteinander verglichen werden.)

Schöner wäre es, er würde mir "irgendwie" nur das Feld "Vertragsablauf" ausspucken, da sich ja nur dort etwas geändert hat.
Werde mir wohl jetzt als dritten Ansatz eine kleine VBA Schleife über die recordsets basteln, dort vergleichen und die Änderung dann so ermitteln. Oder? :)

*den Wald vor lauter Bäumen nicht mehr seh :(*

Atrus2711
18.06.2012, 15:08
Versuche, über eine Vereinigung der Bestands- und Importdaten solchen Aufbau zu erzeugen:
VertragsID Vertragsablauf_Bestand Vertragsablauf_Import
Die kannst du dann im Formular darstellen. Entweder mit bedingter Formateirung, oder eben gleich mit der Bedingung Vertragsablauf_Bestand < > Vertragsablauf_Import, damit du nur die Abweichungen siehst.

Ein Wenn-Vergleich mit Formulabezug ist unsinnig, da der auf der aktuellen Cursorposition basiert. Die darf aber keine Rolle spielen.

marcohom
19.06.2012, 10:37
Unter der Prämisse, dass ich eine 1:1 Beziehung zwischen tbl_Bestand und tbl_Import habe, habe ich nun folgenden VBA Code entwickelt, welcher die Felder, die sich geändert haben, in eine neue tbl_Änderung_Darstellung schreibt. Diese tbl nutze ich dann später zur Darstellung für den User.

Dim db As Database
Dim rs0 As Recordset
Dim rs1 As Recordset
Dim rs2 As Recordset
Dim rs3 As Recordset
Dim i As Integer
Dim MaxColumn As Integer

'urspr. Inhalt der tbl_Änderung_Darstellung löschen
DoCmd.OpenQuery "qyr_1c_tbl_Änderung_Darstellung_löschen"

'Es sind 46 Felder/Spalten, die miteinander verglichen werden müssen
MaxColumn = 46

Set db = CurrentDb

'in tbl_Änderung werden die Vertrags_IDs gespeichert, wo eine Abweichung der Daten von tbl_Bestand zu tbl_Import mit Hilfe von anderen Abfragen ermittelt wurde.
Set rs0 = db.OpenRecordset("tbl_Änderungen", dbOpenDynaset)

'in tbl_Änderung_Darstellung wird das Feld und die veränderten Werte eingetragen
Set rs3 = db.OpenRecordset("tbl_Änderungen_Darstellung", dbOpenDynaset)

rs0.MoveFirst
Do Until rs0.EOF
'MsgBox "Änderung in: " & rs0.Fields(0)
'zeige entsprechend den Bestandsdatensatz
Set rs1 = db.OpenRecordset("SELECT * FROM tbl_Bestand WHERE tbl_Bestand.Vertragsnummer = '" & rs0.Fields(0) & "';", dbOpenDynaset)

'zeige dazu den Importdatensatz
Set rs2 = db.OpenRecordset("SELECT * FROM tbl_Import_Neu WHERE tbl_Import_Neu.Vertragsnummer = '" & rs0.Fields(0) & "';", dbOpenDynaset)

'Starte einen String Vergleich
For i = 1 To MaxColumn
If StrComp(rs1.Fields(i), rs2.Fields(i)) <> 0 Then
'Eine Änderung wurde festgestellt, schreibe es in tbl_Änderung_Darstellung
rs3.AddNew
rs3![Vertragsnummer] = rs1.Fields(0)
rs3![Feldbezeichnung] = rs1.Fields(i).Name
rs3![Wert_Bestand] = rs1.Fields(i)
rs3![Wert_Import] = rs2.Fields(i)
rs3.Update
'MsgBox "Bestand: " & rs1.Fields(i).Name & ": " & rs1.Fields(i) & " - Import: " & rs2.Fields(i).Name & ": " & rs2.Fields(i)
End If
Next i
rs0.MoveNext
Loop

rs0.Close
rs1.Close
rs2.Close
rs3.Close


Wie man sieht, ist performance erstmal zweitrangig :p