Archiv

Hallo Leute,

Wenn ich einen in einem Formular ausgefüllten Datensatz nicht nur in der dazugehörigen Tabelle, sondern in einer zweiten Tabelle, dem Archiv ablegen möchte, wie kann das aussehen ?
Ja, ja ich weiß, „redundante Datenhaltung ist zu vermeiden…“
Aber das hat in diesem einen konkreten Fall auch seine Berechtigung.

Kann jemand helfen ?

Christian

Hallo,

naja, da wäre mehr zu Bemängeln als nur die Redundanz…

Wie auch immer:

Sub Form_Afterupdate()
currentdb.Execute "Insert into tblArchiv select * from tblDeineTabelle where DeineTabelle_ID = " & Me!DeineTabelle_ID
End Sub

Viele Grüße
Franz,DF6GL

Hallo Franz,

Nach wie vor, Datensatz kommt in der einen Tabelle an, im Archiv aber nicht !

Kannst Du mir die Deklarationen von tbl noch mitschicken ?

Es muss also an irgend etwas anderem liegen.

Ich versuche am Montag auch noch mal etwas…

Gruß Christian

Hallo,

Nach wie vor, Datensatz kommt in der einen Tabelle an, im
Archiv aber nicht !

Kannst Du mir die Deklarationen von tbl noch mitschicken ?

???

Es wäre besser, Du würdest die Tabellennamen und ihre Felder hier offenlegen…

Viele Grüße
Franz,DF6GL

Hallo,

Ich habe eine Tabelle (ohne Indexfeld) einfach fünf Spalten. Tabelle heißt Kunde, Spalten heißen Spalte1, Spalte2…
Zweite Tabelle heiß Archiv.(Gleiche Spalten)
Die Tabellen sind genau gleich, habe die eine von der anderen kopiert.
Das Formular ist unmittelbar mit Kunde verknüpft.

hilft das ?

Gruß Christian

Hi,

Ich habe eine Tabelle (ohne Indexfeld) einfach fünf Spalten.

Ja, das ist eben suboptimal, kein ID-feld zu haben…

wodran erkennt man denn nun den akt. Datensatz?

Tabelle heißt Kunde, Spalten heißen Spalte1, Spalte2…
Zweite Tabelle heiß Archiv.(Gleiche Spalten)
Die Tabellen sind genau gleich, habe die eine von der anderen
kopiert.
Das Formular ist unmittelbar mit Kunde verknüpft.

hilft das ?

Naja, schon… und tausendmal schon gesagt: Normalisiere die Tabellen… Dazu gehört auch die Verwendung eines Primärschlüssels, weil das eben eine grundlegende Anforderung in einer Datenbank ist.

Currentdb.Execute „Insert into Archiv select * from Kunde where Spalte1= '“ & MeSpalte1 & „’ and Spalte2 =’“ & Me!Spalte2 & „’“ …

oder auch:

Currentdb.Execute „Insert into Archiv (Spalte1,Spalte2,Spalte3) Values (’“ & Me!Spalte1 & „’,’“ & Me!Spalte2 & „’,’“ & Me!Spalte3 & ')"

Hall Franz,

Die Syntax hab ich gefunden.

Bleibt nurnoch das Problem, dass der gesammte Tabelleninhalt (also alle Datensätze abgespeichert werden.

Ich möchte aber nur den Datensatz, der geändert wurde abspeichern.

Gruß Christian

Hallo,

Die Syntax hab ich gefunden.

Bleibt nurnoch das Problem, dass der gesammte Tabelleninhalt
(also alle Datensätze abgespeichert werden.

Ich möchte aber nur den Datensatz, der geändert wurde
abspeichern.

setz das Ding in die Form_Afterupdate-Ereignisprozedur und gut is…

Dabei kannst Du ja „Now()“ (Datum plus Uhrzeit) in einer Spalte mitführen…

Viele Grüße
Franz,DF6GL

Hallo Franz,

hab ich gemacht wie Du gesagt hast…

Leider kein Effekt !
Nach wie vor, werden alle Datensätze, der mit dem Formular verbundenen Tabelle, in die Tabelle Archiv geschrieben.

es soll aber ausschließlich der im Formular geänderte in die (Schatten-)Tabelle „Archiv“ geschrieben werden.

Ist das überhaupt machbar ?

Gruß Christian
p.s. Das mit Now() ist schon erledigt.

Hallo,

poste doch mal den Code, der im Form_Afterupdate-Ereignis steht…

Viele Grüße
Franz,DF6GL

Hallo,

Auch Hallo, oder besser guten Morgen…

poste doch mal den Code, der im Form_Afterupdate-Ereignis
steht…

Hier:
Private Sub Form_AfterUpdate()
CurrentDb.Execute "Insert into Archiv select Prozessnummer, Prozess, Kunde, Fehler, Regelprozess, Wahrscheinlichkeit from [Aktiv UB] where Prozess= " & Me!Prozess
End Sub

Das sieht schon echt super aus, aber jetzt meckert er noch:

„Laufzeitfehler 3061“
„1 Parameter wurden erwartet, aber es wurde zu wenig Parameter übergeben.“

Gruß Christian

Nochmal Hallo,

Private Sub Form_AfterUpdate()
CurrentDb.Execute "Insert into Archiv select Prozessnummer,
Prozess, Kunde, Fehler, Regelprozess, Wahrscheinlichkeit from
[Aktiv UB] where Prozess= " & Me!Prozess
End Sub

und was ist „[Aktiv UB]“ ??

Welchen Datentyp hat „Prozess“ in der Tabelle/Abfrage und ist das der Primärschlüssel?

Gruß
Franz, DF6GL

und was ist „[Aktiv UB]“ ??

[Aktiv UB] heißt bei mir das Formular mit dem ich die Datensätze ändere.

Welchen Datentyp hat „Prozess“ in der Tabelle/Abfrage und ist
das der Primärschlüssel?

Datentyp ist text. Hat noch keinen Primärschlüssel. - Soll ich das ändern ?

Gruß
Franz, DF6GL

Gruß zurück, Christian

Hallo,

[Aktiv UB] heißt bei mir das Formular mit dem ich die
Datensätze ändere.

ohmannn ohhhh mannnnnn…

Du kannst doch keine SQL auf ein Formular absetzen… NUR auf Tabellen oder Abfragen…

Welchen Datentyp hat „Prozess“ in der Tabelle/Abfrage und ist
das der Primärschlüssel?

Datentyp ist text. Hat noch keinen Primärschlüssel. - Soll ich
das ändern ?

Damit das richtig funktioniert braucht die Tabelle ein Primärschlüsselfeld… Ob das nun „Prozess“ ist oder ein anderes, hängt von Deinem Datenkonzept ab… Jedenfalls MUSS JEDE Tabelle ein Primärschlüsselfeld besitzen… In der Archiv-Tabelle dagegen darf in diesem Fall das PK-Feld nicht mit dem PK-Feld in der Ausgangstabelle übereinstimmen…

Bei TEXT muss das Kriterium in Hochkommata eingeschlossen werden:

CurrentDb.Execute „Insert into Archiv select Prozessnummer,
Prozess, Kunde, Fehler, Regelprozess, Wahrscheinlichkeit from
tblAusgangstabelle where IDFELD= '“ & Me!IDFELD & „’“

„IDFELD“ ist hier das Feld, das den DS eindeutig identifiziert. Es kann(!) „Prozess“ sein, wenn das Feld diese Anforderung erfüllt.

Viele Grüße
Franz,DF6GL

Hallo,

Hallo zurück

ohmannn ohhhh mannnnnn…

Du kannst doch keine SQL auf ein Formular absetzen… NUR auf
Tabellen oder Abfragen…

wieder was gelernt…

Damit das richtig funktioniert braucht die Tabelle ein
Primärschlüsselfeld… Ob das nun „Prozess“ ist oder ein
anderes, hängt von Deinem Datenkonzept ab… Jedenfalls MUSS
JEDE Tabelle ein Primärschlüsselfeld besitzen… In der
Archiv-Tabelle dagegen darf in diesem Fall das PK-Feld nicht
mit dem PK-Feld in der Ausgangstabelle übereinstimmen…

und ich nehme an, dass PK-Feld „Primary Key“ heißt - oder ?
Warum dürfen die Spalten denn nicht übereinstimmen ?
Würde dann etwas verwechselt werden ?

Bei TEXT muss das Kriterium in Hochkommata eingeschlossen
werden

Ist Text.

„IDFELD“ ist hier das Feld, das den DS eindeutig
identifiziert. Es kann(!) „Prozess“ sein, wenn das Feld diese
Anforderung erfüllt.

Ich werd bekloppt - das funktioniert !
Bis auf die Felder …, [Einzelfall_Schaden], [p_A_Wirkung_GuV_Relevanz]…
wird alles übertragen ! Bei diesen beiden Feldern meckert er wie folgt:

Laufzeitfehler 3103
Von Alias '[Einzelfall_Schaden], [p_A_Wirkung_GuV_Relevanz]'verursachter Zirkelbezug in der SELECT-Liste der Abfragedefinition.

Kannst Du mir dabei noch helfen ? !

Gruß Christian

Hallo,

wenn Du nicht den SQL-String der meckernden Abfrage und auch den aktuell verwendeten Code postest, dann nein … :wink:

Viele Grüße
Franz,DF6GL

…Tschulligung…
verwendet zur Zeit:
CurrentDb.Execute „Insert into Archiv select Prozessnummer,Prozess, Kunde, Fehler, Regelprozess, Wahrscheinlichkeit, [Einzelfall_Schaden], [p_A_Wirkung_GuV_Relevanz],‚Letzte_Änderung‘ from [Aktiv UB] where 'Prozess= '“ & Me!Prozess

Gemecker:
Kein Zielfeldname in INSERT-INTO Anweisung (‚Letzte_Änderung‘)angegeben.

Also, bis einschließlich Wahrscheinlichkeit wird absolut korrekt übertragen. Sobalt aber in der Bezeichnung Freizeichen verwendet werden, (Spaltenbezeichnungen und Steuerelementnamen bestehen aus mehreren Wörtern) überträgt er diese nicht mit.
Außerdem ist mir noch nicht ganz klar, wie ich Text (in diesem Fall ‚Letzte Änderung‘)übertrage.
Und die grundsätzliche Frage, die damit verbunden ist, gibt es bei der Übertragung von Text und Memo einen Unterschied ?

Gruß Christian

P.S.:smiley:u bist Großartig ! - Dass das bis hier schon klappt ist fenomenal !

Guten Tag,

…Tschulligung…

null problemo

verwendet zur Zeit:
CurrentDb.Execute „Insert into Archiv select
Prozessnummer,Prozess, Kunde, Fehler, Regelprozess,
Wahrscheinlichkeit, [Einzelfall_Schaden],
[p_A_Wirkung_GuV_Relevanz],‚Letzte_Änderung‘ from [Aktiv UB]
where 'Prozess= '“ & Me!Prozess

Gemecker:
Kein Zielfeldname in INSERT-INTO Anweisung
(‚Letzte_Änderung‘)angegeben.

kein Gemecker, schlichte Tatsachen…

Also, bis einschließlich Wahrscheinlichkeit wird absolut
korrekt übertragen. Sobalt aber in der Bezeichnung Freizeichen

??

verwendet werden, (Spaltenbezeichnungen und Steuerelementnamen
bestehen aus mehreren Wörtern)

auch schon tausendmal erzählt: Keine Sonder- und Leerzeichen in Objektnamen verwenden !

Wenn mans’s doch nicht lassen kann, UNBEDINGT Eckklammern benutzen.

überträgt er diese nicht mit.
Außerdem ist mir noch nicht ganz klar, wie ich Text (in diesem
Fall ‚Letzte Änderung‘)übertrage.

sag ich unten

Und die grundsätzliche Frage, die damit verbunden ist, gibt es
bei der Übertragung von Text und Memo einen Unterschied ?

Nein

Gruß Christian

P.S.:smiley:u bist Großartig ! - Dass das bis hier schon klappt ist
fenomenal !

gegen Tadel kann man sich wehren, gegen Lob ist man machtlos :wink:

CurrentDb.Execute „Insert into Archiv select
Prozessnummer,Prozess, Kunde, Fehler, Regelprozess,
Wahrscheinlichkeit, Einzelfall_Schaden , p_A_Wirkung_GuV_Relevanz ,‚Letzte_Änderung‘ AS TabellenfeldnameInDasDerTextGeschriebenWerdenSoll from [Aktiv UB] where 'Prozess= '“ & Me!Prozess & "’"

Fazit: die „selectierten“ Namen müssen mit den entspr. Tabellenfeldnamen in der Zieltabelle übereinstimmen, notfalls halt über den „As“-Operator entspr. „umbenennen“ (Aliasname).

Gruß
Franz, DF6GL

Guten Tag,

Guten Morgen

Tatsache:

Kein Zielfeldname in INSERT-INTO Anweisung
(‚Letzte_Änderung‘)angegeben.

auch schon tausendmal erzählt: Keine Sonder- und Leerzeichen
in Objektnamen verwenden !

Wenn mans’s doch nicht lassen kann, UNBEDINGT Eckklammern
benutzen.

Wird künftig beachtet !

Außerdem ist mir noch nicht ganz klar, wie ich Text (in diesem
Fall ‚Letzte Änderung‘)übertrage.

sag ich unten

CurrentDb.Execute „Insert into Archiv select
Prozessnummer,Prozess, Kunde, Fehler, Regelprozess,
Wahrscheinlichkeit, Einzelfall_Schaden ,
p_A_Wirkung_GuV_Relevanz ,‚Letzte_Änderung‘ AS
TabellenfeldnameInDasDerTextGeschriebenWerdenSoll
from
[Aktiv UB] where 'Prozess= '“ & Me!Prozess & "’"

Funktioniert nicht - Die Tabellenfelder heißen genauso, wie im Ursprung.

Fazit: die „selectierten“ Namen müssen mit den entspr.
Tabellenfeldnamen in der Zieltabelle übereinstimmen, notfalls
halt über den „As“-Operator entspr. „umbenennen“
(Aliasname).

Und wie sehe das dann Deiner Meinung nach aus ?

Gruß
Christian

Hilfeeee…

Ich hab also alle Felder in der Select Liste über das direkt Fenster und debug.print erwischt. Nun fehlt nur noch, wie ich die Feldinhalte in der Tabelle Archiv in der richtigen Spalte wieder loswerde.

CurrentDb.Execute „Insert into Archiv select Prozessnummer,Prozess, Kunde,[Kommentar Kunde], Fehler, Regelprozess, Wahrscheinlichkeit as [Kommentar Kunde]from [Aktiv UB]where Prozess= '“ & Me!Prozess & „’“

Meldung ist:
Doppelter Alias-Name für Ausgabe '[Kommentar Kunde].

Klar, das passiert wenn ich die gleichen Feldbezeichnungen in der Archiv-Tabelle benutze.

Also entweder Tabelle Archiv alle Spalten mit Textinhalt ändern, oder vielleicht andere Lösungen ???

Ich brauch Hilfeeee…

Christian