Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Kann ich in einer tabelle gezielt den Inhalt eines Feldes löschen?

Begonnen von Axel18, November 07, 2010, 16:04:10

⏪ vorheriges - nächstes ⏩

Axel18

Ich habe für meine Statistikauswertung eine recht umständliche Methode entwickelt, bin aber sicher, dass das auch besser geht. Daher wende ich mich heute ans Forum:

Es geht um Folgendes:

Ich habe eine Tabelle ,,Statistik", in der folgende Felder enthalten sind (in Wirklichkeit viel mehr, aber zur Erläuterung reichen die genannten Felder):

-   Kunde
-   UmsatzVorVorJahr
-   UmsatzVorJahr
-   UmsatzAktJahr

Diese Tabelle wird über eine Anfügeabfrage gespeist aus drei anderen Tabellen, nämlich:

AufträgeVorVorJahr
AufträgeVorJahr
Aufträge ... (akt.Jahr)

Das Vorgehen ist per Makro wie folgt:

1.   Löschen der Tabelle Statistik
2.   füllen per Anfügeabfrage von Statistik aus den 3 o.g. Tabellen

Das braucht natürlich eine gewisse Zeit.

Meine Überlegung nun:

Kann ich die Tabelle Statistik im Prinzip nicht bestehen lassen und lediglich den Inhalt des Feldes ,,UmsatzAktJahr löschen, und aus der Tabelle ,,Aufträge" neu befüllen?

Unter dBase konnte ich die Werte aus VorvorJahr und Vorjahr in Variablen speichern und kurzfristig abrufen. Das sollte doch in Access XP auch möglich sein? Aber wie?

Beste Grüße
Axel

Beste Grüße
Axel

database

#1
Hallo,

ZitatIch habe für meine Statistikauswertung eine recht umständliche Methode entwickelt
Leider geht aus deiner Problembeschreibung diese Umständlichkeit nicht hervor
Wobei ich mir gar nicht wirklich genau vorstellen mag, wieso du die Auftrage jedes Jahr in neue Tabellen schreibst ...  ???
Hier kommt mir der Gedanke an eine nicht normalisirte DB die dann bei diversen Auswertungen ein wenig länger braucht - was dann verständlicher Weise - als umständlich erscheint.

ZitatDas sollte doch in Access XP auch möglich sein
Freilich geht das - mit einer geeigneten Aktualisierungsbfrage.
... wenn in der Tabelle Statistik entsprechende Daten hinterlegt wurden, die einen Rückschluß auf die Aufträge zulassen. (Normalisierte Tabellen?)

ZitatDas braucht natürlich eine gewisse Zeit
Ich kenne zwar deine Datenbank nicht aber das scheint mir dann vielleicht doch mit der Umständlichkeit etwas zu tun zu haben.
Von wievielen Datensätzen sprechen wir denn wenn wir die Auftragstabellen meinen - insgesamt ?

Prinzipiell aktualisierst du die Tabelle Statistik so ähnlich wie unten - wobei man das in der Form nicht macht - ausser bei wirklich enormen Datenbeständen:

"UPDATE tblStatistik SET UmsatzAktJahr = " & NeuerWert
...wenn die neuen Umsatzzahlen in die Variable NeuerWert zuvor gepackt wurden.

Ich könnte mir vorstellen dass diese Umsätze in ähnlicher Weise zu ermitteln sein KÖNNTEN wenn die Umsäatze eines bestimmten Kunden zu aktualisieren sein sollten:

Dim NeuerWert as Double
Dim rst As DAO.Recordset

SET rst = CurrentDB.OpenRecordset("SELECT Sum(tblAuftraege.Umsatz) As UmsatzAktJahr, tblAuftraege.Kunde FROM tblAuftraege WHERE tblAuftraege.Kunde=" & KundenID)
NeuerWert = rst!UmsatzAktJahr

Wenn die gleiche Aktion für alle Kunden durchgeführt wird, muss nach Kunden gruppiert werden, die Übernahme in eine Variable ist dann nicht ganz so einfach...

ZitatDas braucht natürlich eine gewisse Zeit
Ich kenne zwar deine Datenbank nicht aber das scheint mir dann vielleicht doch mit der Umständlichkeit etwas zu tun zu haben.
Von wievielen Datensätzen sprechen wir denn wenn wir die Auftragstabellen meinen - insgesamt ?

Aber ich kann mir ehrlich nicht vorstellen, dass da ein unangenehm hoher Zeitraum zur Ermittlung notwendig sein kann ... das geht doch RuckZuck

Für wirklich konkrete Aussagen fehlen - MIR zumindest - ein paar detailiertere Infos.

Grüße
Peter

Axel18

Hallo Peter,

da hast Du Dir unglaublich viel Arbeit gemacht, ..... und ich verstehe kaum etwas. Dafür bin ich wohl zu viel Laie.

Nochmals die Frage, vielleicht etwas einfacher dargestellt:

Kann ich innerhalb einer Tabelle den Inhalt eines Feldes löschen und anschließend aus einer anderen Tabelle dieses Feld wieder füllen?
Wenn ja, wie geht das (einfach)?

Beste Grüße
Axel

Beste Grüße
Axel

DF6GL

Hallo,

"einfach" ginge es (vorgekaut) , wenn Du mal die Tabellen/Feldnamen und Datentypen verraten würdest, um die es geht und in welchem Datensatz (ID-Wert) man das Feld findest, das Du überschreiben willst.


database

Hallo,

der 'einfache' Weg ist es den neuen Wert zu ermitteln und mittels Aktualisierungsabfrage dem entsprechenden Feld zuzuordnen.

In etwa so wie ich schon geschrieben habe:
Zitat
"UPDATE tblStatistik SET UmsatzAktJahr = " & NeuerWert
...wenn die neuen Umsatzzahlen in die Variable NeuerWert zuvor gepackt wurden.
Dazu benötigst du noch die ID des Datensatzes der aktualisiert werden soll, sonst ändert die Abfrage ALLE Datensätze in der Tabelle.

Ich frage nochmal ... wieviele Datensätze sind in der Auftragstabelle, die da zusammengerechnet werden?
Nicht dass ich es dir neidig wäre - aber ich kann mit nicht vorstellen, dass da 2 Millionen Aufträge drin stehen, die dann kompliziert zusammengezählt werden müssen



Axel18

Zu Euren beiden Postings:

1. Die Feldnamen der Tabelle Statistik lauten:
- ksort (für Kundenname)
- UmsatzVj1 = Umsatz des VorVorjahres
- UmsatzVj0 = Umsatz des letzten Jahres
- UmsatzAktJahr = Umsatz des aktuellen Jahres - und hier kommen ja ständig neue Zahlen hinzu, und zwar aus Tabelle Aufträge

Aufträge hat u.a. als Feldbezeichnungen:
- ksort
- Umsatz

In Statistik habe ich derzeit ca. 10.000 Datensätze. Das sind die einzelnen Aufträge aus den 3 angesprochenen Jahren.
Die Umsatzziffern des Vorvorjahres und des Vorjahres ändern sich ja nicht mehr, daher würde ich die gerne stehen lassen und nur die Sätze löschen (aha, also nicht nur das Feld UmsatzAktjahr), die das aktuelle Jahr betreffen. Dann könnte ich ja alle Sätze (bisherige und neu hinzugekommene) aus 2010 anfügen.
Sehe ich das richtig?

Ich würde das mit meinen geringen Kenntnissen wie folgt umsetzen:

- lösche in Tabelle Statistik alle Datensätze, deren Datum 2010 heißt
- füge aus Aufträge alle Datensätze in Statistik an

Kann das so funktionieren?

Beste Grüße
Axel

Beste Grüße
Axel

database

Hallo Axel,

wie ich zu Beginn auch schon angemerkt habe stimmt dein Tabellenaufbau nicht wirklich.
Es macht relativ wenig Sinn die Aufträge nach Jahren getrennt in eigenen Tabellen zu führen.
Dass das irgendwann zum Problem werden kann, siehst du ja jetzt.

Deine Tabelle Statistik ist da dann m.E. nicht recht viel besser dran.
Wenn ich das alles so richtig interpretiere, dann hast du in der Tabelle Statistik Datensätze stehen, die Umsätze ebenfalls nach jahren getrennt in eigenen Spalten gespeichert haben.
Wenn das so ist - und davon gehe ich jetzt aus - ist auch das falsch ... bitte was machst du in 10 oder 15 Jahren?
Nach deinem Modell hättest du dann bald 20 Tabellen für die Aufträge und ebensoviele Spalten in der Statistik.

Na gut - du solltest dich DRINGEND mit der Normalisierung beschäftigen - bevor noch mehr Probleme auftreten!

Prinzipiell wäre es so, dass du die 'alten' Datensätze aus 2010 nicht löschen mußt wenn neue Daten dazu kommen.
Der richtige Weg in DEINEM JETZIGEN Fall wäre es, die neuen Datensätze an die bestehende Tabelle anzuhängen.
Würde der Tabellenaufbau stimmen könntest du dir alles ersparen, du hättest jetzt eine einzige Auftragstabelle mit ca 30.000 Datensätzen, die du zur Gewinnung von statistischen Aussagen ohne große Umschichterei heranziehen könntest.

Nun gut - gibt es die Möglichkeit in der Tabelle 'Statistik' festzustellen, welcher Datensatz der letzte übertragene aus der Tabelle Aufträge ist?
Ich fürchte fast, dass das nicht möglich sein wird, da du m.E. keine ID der Auftragstabellen mitgespeichert hast (in der Tabelle Statistik)
Wenn doch, dann kann man versuchen aus der Kombination ID und Jahr eine Art Schlüssel zu bilden, der dann als Basis für die Anfügeabfrage dienen KANN.


Die Anfügeabfrage müsste dann sinngemäß so in etwa aussehen:


INSERT INTO tblStatistik ( AuftragsID, ksort, jahr, UmsatzAktJahr )
SELECT tblAuftraege.AuftragsID, tblAuftraege.ksort, tblAuftraege.jahr, tblAuftraege.Umsatz FROM tblAuftraege
WHERE (tblAuftraege.AuftragsID Not In (select AuftragsID from tblStatistik where jahr = 2010)) AND tblAuftraege.jahr=2010;
 

Sie holt aus der Tabelle Auftraege jene Datensätze, die dem jahr 2010 entsprechen und deren AuftragsID nicht in der Tabelle Statistik in Kombination mit dem Jahr 2010 vorkommt.

Ein bisschen verwirrend, dein Datenmodell aber auch.

Kannst du damit was anfangen?

Grüße
Peter

Axel18

Hallo Peter,

ja, Du magst Recht haben. Meine Datenbank ist ein kleines Chaos. Das kommt daher, dass ich sie so übernommen habe und hin und wieder versuche, Dinge zu verbessern, ohne sie ganz von vorne aufzusetzen.

Ich brauche zur Statistik eigentlich immer nur die 3 letzten Jahre. Daher das "Auseinanderreißen" der Tabellen.

Wie das in 15 Jahren aussieht, ist mir relativ egal, dann bin ich 15 Jahre schon Rentner oder tot, wer weiß.

Ich denke aber, Du hast mir Lösungshilfen angeboten, die ich mit viel Zeit mal ausprobieren werde.
Danke für Deinen Einsatz

Beste Grüße und bis zur nächsten eigenartigen Frage
Axel
Beste Grüße
Axel

database

Hallo Axel ... also komm Rentner oder tot ...   :o

Es gibt immer wieder mehrere Wege ein Problem zu lösen, ich versuche so gut es geht die Gegebenheiten und das SOLL in verträglicher Weise zu vereinen.
Natürlich gebe ich auch dabei Hinweise - manchmal auch mit Nachdruck - dass die eine oder andere Normabweichung passiert ist.

Wenn du magst, kannst du die Statistik- und die Auftragstabellen in eine Neue Datenbank exportieren und mit ein paar wenigen Beispielhaften Datensätzen befüllen.
Diese DB lädtst du dann hier hoch und ich oder wer sonst noch Zeit findet schauen uns das an und versuchen eine vernünftige Lösung für dich zu finden, die sehr nahe am Echtsystem entwickelt wurde.

LG

Peter

p.s. Es gibt keine eigenartigen Fragen - nur seltsame Antworten  :-\ ;D :D

Axel18

Hallo Peter,

nett, dass du Dich da nochmals reinhängst. Ich füge mal eine Dummy-MDB an, in der ich zwei Tabellen habe: Aufträge und Statistik. In Wahrheit gibt es natürlich mehr Felder in den Tabellen.

In Realiter ,,lösche" ich den Inhalt der gesamten tblStatistik und baue sie per Anfügeabfragen aus verschiedenen Tabellen wieder auf.

Da aber die Werte der abgelaufenen Jahre statisch sind, sich also nicht mehr verändern, könnte Mann es doch einfacher machen, indem man lediglich (im Demofall) nur die Sätze löscht, die das aktuelle Jahr betreffen und per Anfügeabfrage dann sämtliche Sätze aus der Tabelle Aufträge (die sich ja seit der letzten Aktion ,,vermehrt" haben) einfügt.

Wäre das in Deinen Augen ein gangbarer Weg?

Beste Grüße
Axel



[Anhang gelöscht durch Administrator]
Beste Grüße
Axel

database

Hallo Axel,

ich habe in deiner Muster-DB eine Abfrage definiert, die auf Basis der vorhandenen Spalten die Datensätze aus Aufträge an Statistik anhängt, die seit der letzten Aktualisierung neu hinzugekommen sind.

Versuche mal die Abfragendefinition auf eine KOPIE deines Echtsystems zu übertragen und auszuführen.
Zu Demozwecken habe ich im Beispiel ein paar Datensätze aus Statistik gelöscht.
Führe mal die Abfrage im Beispiel aus - die Daten werden ergänzt.   ;)

HTH

Peter

Axel18

Beste Grüße
Axel

database

Sorry, in der Hektik und der Hitze des Gefechts ....

aber jetzt!

;)

[Anhang gelöscht durch Administrator]

Axel18

Hallo Peter,

in der Demo sieht das schon mal gut aus. Nun bin ich erst auf Geschäftsreise und komme zum Wochenende zurück. Dann habe ich hoffentlich Zeit, Deinen Tipp auszuprobieren. Melde mich dann nochmals.
Danke einstweilen.
Beste Grüße
Axel

Beste Grüße
Axel

database

Na dann wünsch ich eine erfolgreiche Geschäftsreise,

hoffe du kannst mit dem Vorschlag wirklich was tun.

Grüße
Peter