Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: Axel18 am November 07, 2010, 16:04:10

Titel: Kann ich in einer tabelle gezielt den Inhalt eines Feldes löschen?
Beitrag von: Axel18 am November 07, 2010, 16:04:10
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

Titel: Re: Kann ich in einer tabelle gezielt den Inhalt eines Feldes löschen?
Beitrag von: database am November 07, 2010, 16:40:27
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
Titel: Re: Kann ich in einer tabelle gezielt den Inhalt eines Feldes löschen?
Beitrag von: Axel18 am November 08, 2010, 14:47:52
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

Titel: Re: Kann ich in einer tabelle gezielt den Inhalt eines Feldes löschen?
Beitrag von: DF6GL am November 08, 2010, 14:55:49
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.

Titel: Re: Kann ich in einer tabelle gezielt den Inhalt eines Feldes löschen?
Beitrag von: database am November 08, 2010, 15:18:06
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


Titel: Re: Kann ich in einer tabelle gezielt den Inhalt eines Feldes löschen?
Beitrag von: Axel18 am November 08, 2010, 15:43:35
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

Titel: Re: Kann ich in einer tabelle gezielt den Inhalt eines Feldes löschen?
Beitrag von: database am November 08, 2010, 20:32:09
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
Titel: Re: Kann ich in einer tabelle gezielt den Inhalt eines Feldes löschen?
Beitrag von: Axel18 am November 09, 2010, 16:19:38
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
Titel: Re: Kann ich in einer tabelle gezielt den Inhalt eines Feldes löschen?
Beitrag von: database am November 09, 2010, 21:04:18
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
Titel: Re: Kann ich in einer tabelle gezielt den Inhalt eines Feldes löschen?
Beitrag von: Axel18 am November 10, 2010, 08:55:44
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]
Titel: Re: Kann ich in einer tabelle gezielt den Inhalt eines Feldes löschen?
Beitrag von: database am November 10, 2010, 14:02:47
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
Titel: Re: Kann ich in einer tabelle gezielt den Inhalt eines Feldes löschen?
Beitrag von: Axel18 am November 10, 2010, 14:18:12
Sorry Peter, aber ich finde keinen Anhang ....
Titel: Re: Kann ich in einer tabelle gezielt den Inhalt eines Feldes löschen?
Beitrag von: database am November 10, 2010, 14:46:44
Sorry, in der Hektik und der Hitze des Gefechts ....

aber jetzt!

;)

[Anhang gelöscht durch Administrator]
Titel: Re: Kann ich in einer tabelle gezielt den Inhalt eines Feldes löschen?
Beitrag von: Axel18 am November 10, 2010, 16:24:24
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

Titel: Re: Kann ich in einer tabelle gezielt den Inhalt eines Feldes löschen?
Beitrag von: database am November 10, 2010, 20:07:12
Na dann wünsch ich eine erfolgreiche Geschäftsreise,

hoffe du kannst mit dem Vorschlag wirklich was tun.

Grüße
Peter
Titel: Re: Kann ich in einer tabelle gezielt den Inhalt eines Feldes löschen?
Beitrag von: Axel18 am November 13, 2010, 09:00:57
Hallo Peter,

also, deine Lösung klappt - übrigens auch meine - ABER: ichhatte da wohl einen blöden Gedankenfehler, der sicherlich in der Art der tabellen zu suchen ist. Das hattest Du ja schon mal angesprochen.

Wenn ich also deine Lösung nehme, klappt das während des laufenden Jahres prima. Aber sobald ein neues Jahr beginnt, bekomme ich Schwierigkeiten. Ich versuche, das mit Jahreszahlen zu belegen:

Heute (2010) habe ich Werte in den Feldern:
UmsatzVorVorjahr = 2008
UmsatzVorjahr      = 2009
UmsatzAktJahr      = 2010

Nach meiner neuen "Methode" will ich ja nur stets die Werte UmsatzAktJahr aktualisieren.

In 2011 würden zwar die Werte UmsatzAktjahr aktualisiert, aber die Werte in UmsatzVorJahr und UmsatzVorVorjahr wären dann nicht die Umsätze aus 2009 und 2010, sondern würden weiterhin die aus 2008 und 2009 bleiben.

Ich fürchte, ich habe Dir und Franz unnötig Arbeit gemacht und werde bei meiner alten Methode bleiben, die mich halt nur ein wenig mehr Wartezeit kostet, bis das Makro (Löschen und Anfügen) abgearbeitet ist.

Beste Grüße und ein schönes Wochenende
Axel
Titel: Re: Kann ich in einer tabelle gezielt den Inhalt eines Feldes löschen?
Beitrag von: database am November 13, 2010, 11:41:26
Hallo,

somit siehst du, dass du gar nicht erst 10 oder 15 Jahre warten musst - das problem beginnt schon beim nächsten Jahreswechsel.
Klar, dass es nicht zusammenstimmmt - im nächsten Jahr verschiebt sich der Begriff Vorjahr und VorvorJahr um 1 nach vorne.

Somit müsstest du DEINE Version am 1. Jänner laufen lassen - die 3 Tabellen neu befüllen und ab da dann die kürzere Variante von mir.
Da sich die ja wiederum nur aufs laufende Jahr bezieht und an den alten Daten nichts verändert, wäre es vielleicht eine Möglichkeit die Sache zu beschleunigen?

Grüße
Titel: Re: Kann ich in einer tabelle gezielt den Inhalt eines Feldes löschen?
Beitrag von: Axel18 am November 13, 2010, 14:16:10
Hallo Peter,

ich werde das im Januar erneut angehen. Bis dahin werden sich andere Fragen auftun.

danke nochmals für Deinen Einsatz
Beste Grüße
Axel