Supportnet / Forum / Datenbanken
Access-Formular - Button für "Datei speichern unter" und "Datensätze aus Tabelle löschen"
Frage
Hallo, ich habe folgendes Problem:
Ich habe eine Access-Anwendung mit einer Tabelle sowie div. Abfragen, Formularen und Makros.
Diese Access-Anwendung dient als eine Art Lagerverwaltung, die es für jedes Jahr neu gibt.
Darin werden Materialbewegungen erfasst und automatisch die neuen Bestände aller Posten ausgerechnet.
Zum Jahresbeginn soll nun folgendes passieren:
Die Datei "Lagerverwaltung 2006" speichern unter neuem Dateinamen mit der aktuellen Jahreszahl, also "Lagerverwaltung 2007".
Dabei ist es egal ob dem Dateinamen die aktuelle Jahreszahl automatisch zugewiesen wird oder ob zur Eingabe des neuen Dateinamen aufgefordert wird.
Dann sollen in der neuen Datei 2007 in der einen Tabelle "Materialbewegungen" alle Datensätze bis auf den Letzten gelöscht werden,
so dass der letzte Datensatz von 2006 der Erste von 2007 wird.
Das Ganze soll möglichst über einen Button und Code-Generator im Hauptformular passieren.
So wie es aussieht müsste es zwei Button geben,
einen zum Erstellen der neuen Datei und einen,
um beim Öffnen der neuen Datei die Datensätze zu löschen.
Kann mir da jemand weiterhelfen?
Vielen Dank für Eure Hilfe,
freundliche Grüße,
Sven Weide.
Antwort 1 von Marie
Nö, das kann automatisch geschehen in der autoexec.
Kopier Dir mal den Code, entscheide Dich dann zum einen, ob das Update ganz automatisch erfolgen soll oder nicht und schreib zum anderen, falls Du jetzt nicht alleine klarkommst exakt hier rein wie das Feld heisst wo der letzte Datensatz erkennbar ist, damit wir eine Löschabfrage machen können.
Obigen Code kannst Du automatisch in der autoeexec aufrufen, dann wird bei jedem Start geprüft ob ein Update nötig ist, oder aber hinter einen Button legen, dann kannst Du das Update machen wann Du willst.
Gruß Marie
Option Compare Database
Option Explicit
Public Function fktJahresupdate()
On Error GoTo Jahresupdate_Err
Dim strGesamtPfad As String
Dim strPfad As String
Dim strDateiname As String
Dim inti As Integer
strGesamtPfad = CurrentDb.Name ' Das ist der komplette Name (Pfad + Datei)
inti = Len(strGesamtPfad)
Do Until Mid$(strGesamtPfad, inti, 1) = Chr$(92) ' Den kompletten Pfad durchsuchen nach Backslash
inti = inti - 1
Loop
strPfad = Left$(strGesamtPfad, inti - 1) ' Pfad ohne Ende-Backslash
inti = Len(strPfad)
strDateiname = Right$(strGesamtPfad, Len(strGesamtPfad) - inti - 1) ' Rest zurueckgeben
strDateiname = Left$(strDateiname, Len(strDateiname) - 4) ' Endung .mdb abschneiden
If strDateiname = Left$(strDateiname, Len(strDateiname) - 4) & Year(Date) Then
'MsgBox strDateiname
'kein Update nötig, Datei entspricht der aus dem aktuellen Jahr
Else
'MsgBox Left$(strDateiname, Len(strDateiname) - 4) & Year(Date) & ".mdb"
' Update hier anfertigen, entweder über Button, oder automatisch wie folgt
'1) Prüfen ob Die Datei Left$(strDateiname, Len(strDateiname) - 4) & Year(Date) & ".mdb" im aktuellen Pfad bereits existiert,
' wenn ja, dann nichts tun, dann wurde eine alte Datei geöffnet
' 2. Die aktuelle Datei kopieren als strDateiname.bak bevor Datensätze gelöscht werden
' 3. Die Datensätze löschen bis auf den Letzten, woran bitte kann ich den letzten erkennen? AutoID? Wenn ja wie heisst das Tabellenfeld?
' 4. Die Datei abspeichern unter dem neuen Namen Left$(strDateiname, Len(strDateiname) - 4) & Year(Date) & ".mdb"
' 5. Die Datei strDateiname.bak wieder umbenennen in strDateiname.mdb, nicht ausprobiert, falls das nicht geht beim nächsten
' Start prüfen, ob eine .bak Datei in dem Verzeichnis vorhanden, wenn ja umbenennen in .mdb
End If
Jahresupdate_Err:
If Err > 0 Then
MsgBox Error$, vbCritical, "Fehler Nr: " & Err.Number & " in fktJahresupdate"
Err.Clear
End If
End Function
Kopier Dir mal den Code, entscheide Dich dann zum einen, ob das Update ganz automatisch erfolgen soll oder nicht und schreib zum anderen, falls Du jetzt nicht alleine klarkommst exakt hier rein wie das Feld heisst wo der letzte Datensatz erkennbar ist, damit wir eine Löschabfrage machen können.
Obigen Code kannst Du automatisch in der autoeexec aufrufen, dann wird bei jedem Start geprüft ob ein Update nötig ist, oder aber hinter einen Button legen, dann kannst Du das Update machen wann Du willst.
Gruß Marie
Antwort 2 von sv_t
Hallo Marie,
vielen Dank für die schnelle Antwort.
Das was Du geschrieben hast geht doch etwas über meine aktuellen Access-Kenntnisse hinaus.
Deshalb habe ich ja auch hier im Forum nach Hilfe gesucht.
Ich habe mir so ein paar Kenntnisse selbst angelernt, kann auch schon mit dem Code-Generator arbeiten, aber mit den ganzen Befehlen scheitert es dann.
Jeder Datensatz hat eine Lfd-Nr. (AutoID), so heißt auch das erste Feld.
Diese wird automatisch erzeugt und weitergezählt, sobald ein neuer Datensatz eingegeben wird. Diese muss am Jahresanfang auch nicht wieder mit 001 anfangen. Pro Jahr sind ca. 150-200 Datensätze zu erwarten.
Ich würde gern die Variante mit dem Button machen, dann kann man am Jahresanfang noch die letzten Datensätze eingeben.
Der Button wäre dann "Formulare ! Hauptformular ! Jahreswechsel".
Die Zuordnung kriege ich aber hin.
Kann man auch den Inhalt in einem Textfeld ändern lassen.
Ich habe im Hauptformular ein Textfeld1 im Formularkopf , in dem immer die aktuelle Jahreszahl steht.
Ich bin am Wochenende wieder an meinem PC wo die Dateien drauf sind, dann werde ich das mal ausprobieren und meine Erfolge (oder Mißerfolge) schildern.
Wäre schön wenn ich dann noch einmal auf Deine Hilfe zurückgreifen könnte.
Nochmals vielen Dank,
freundliche Grüße,
Sven Weide.
vielen Dank für die schnelle Antwort.
Das was Du geschrieben hast geht doch etwas über meine aktuellen Access-Kenntnisse hinaus.
Deshalb habe ich ja auch hier im Forum nach Hilfe gesucht.
Ich habe mir so ein paar Kenntnisse selbst angelernt, kann auch schon mit dem Code-Generator arbeiten, aber mit den ganzen Befehlen scheitert es dann.
Jeder Datensatz hat eine Lfd-Nr. (AutoID), so heißt auch das erste Feld.
Diese wird automatisch erzeugt und weitergezählt, sobald ein neuer Datensatz eingegeben wird. Diese muss am Jahresanfang auch nicht wieder mit 001 anfangen. Pro Jahr sind ca. 150-200 Datensätze zu erwarten.
Ich würde gern die Variante mit dem Button machen, dann kann man am Jahresanfang noch die letzten Datensätze eingeben.
Der Button wäre dann "Formulare ! Hauptformular ! Jahreswechsel".
Die Zuordnung kriege ich aber hin.
Kann man auch den Inhalt in einem Textfeld ändern lassen.
Ich habe im Hauptformular ein Textfeld1 im Formularkopf , in dem immer die aktuelle Jahreszahl steht.
Ich bin am Wochenende wieder an meinem PC wo die Dateien drauf sind, dann werde ich das mal ausprobieren und meine Erfolge (oder Mißerfolge) schildern.
Wäre schön wenn ich dann noch einmal auf Deine Hilfe zurückgreifen könnte.
Nochmals vielen Dank,
freundliche Grüße,
Sven Weide.
Antwort 3 von Marie
Zitat:
Kann man auch den Inhalt in einem Textfeld ändern lassen.
Ich habe im Hauptformular ein Textfeld1 im Formularkopf , in dem immer die aktuelle Jahreszahl steht.
Kann man auch den Inhalt in einem Textfeld ändern lassen.
Ich habe im Hauptformular ein Textfeld1 im Formularkopf , in dem immer die aktuelle Jahreszahl steht.
Welchen Inhalt??
Die aktuelle Jahreszahl habe ich oben bereits aus Deinem Rechner ausgelesen:
Year(Date)
Wie der Button heisst muss ich nicht wissen, Du klickst einfach im Entwurfsmodus auf den Button, dann wird das bei Klick Ereignis korrekt benannt.
Der heisst sicher nicht "Formulare ! Hauptformular ! Jahreswechsel", denn Du musst den Code hinter den Button schreiben, dann heisst der einfach nur "Jahreswechsel"
Gruß Marie
Antwort 4 von sv_t
Hallo Marie,
mit dem Textfeld meine ich folgendes:
Ich habe mir die ganze Bedienung der Lagerverwaltung über Formulare gemacht, so dass die Tabellen und Abfragen im Hintergrund bleiben.
Damit so ein Formular auch schön ist habe ich in die Formularköpfe Überschriften eingefügt, also z.B. im Hauptformular die Texte "Lagerverwaltung" und "2007". Wenn ich nun das neue Jahr habe, möchte ich ja den Inhalt von YEAR in dieses Textfeld geschrieben haben. Ich glaube, da hatte mich aber auch vertan -> das sind wohl die Bezeichnungsfelder und nicht die Textfelder.
Mit dem Button hast Du natürlich recht, der heißt nur Jahreswechsel.
Freundliche Grüße,
Sven Weide.
mit dem Textfeld meine ich folgendes:
Ich habe mir die ganze Bedienung der Lagerverwaltung über Formulare gemacht, so dass die Tabellen und Abfragen im Hintergrund bleiben.
Damit so ein Formular auch schön ist habe ich in die Formularköpfe Überschriften eingefügt, also z.B. im Hauptformular die Texte "Lagerverwaltung" und "2007". Wenn ich nun das neue Jahr habe, möchte ich ja den Inhalt von YEAR in dieses Textfeld geschrieben haben. Ich glaube, da hatte mich aber auch vertan -> das sind wohl die Bezeichnungsfelder und nicht die Textfelder.
Mit dem Button hast Du natürlich recht, der heißt nur Jahreswechsel.
Freundliche Grüße,
Sven Weide.
Antwort 5 von Marie
Year(Date), siehe oben
Antwort 6 von sv_t
Hallo Marie,
ich habe Deinen Code mal übernommen und wie folgt angepasst:
Folgender Stand:
Der Dateiname wird neu zusammengestellt, die MsgBox -en werden auch richtig angezeigt.
Sowohl die mit dem neuen Dateinamen als auch die das die Datei schon existiert.
Nun muss ich noch die 3 Punkte 1. bis 3. abarbeiten.
Da scheiterts aber schon beim Punkt 1.
Die Anweisung ActiveWorkbook.SaveAs Left$(strDateiname, Len(strDateiname) - 4) & Year(Date) & ".mdb" funktioniert leider nicht.
Kannst Du mir da nochmal auf die Sprünge helfen?
Vielen Dank,
Gruß Sven.
ich habe Deinen Code mal übernommen und wie folgt angepasst:
Option Compare Database
Option Explicit
Public Function fktJahreswechsel()
On Error GoTo Jahreswechsel_Err
Dim strGesamtPfad As String
Dim strPfad As String
Dim strDateiname As String
Dim inti As Integer
strGesamtPfad = CurrentDb.Name ' Das ist der komplette Name (Pfad + Datei)
inti = Len(strGesamtPfad)
Do Until Mid$(strGesamtPfad, inti, 1) = Chr$(92) ' Den kompletten Pfad durchsuchen nach Backslash
inti = inti - 1
Loop
strPfad = Left$(strGesamtPfad, inti - 1) ' Pfad ohne Ende-Backslash
inti = Len(strPfad)
strDateiname = Right$(strGesamtPfad, Len(strGesamtPfad) - inti - 1) ' Rest zurueckgeben
strDateiname = Left$(strDateiname, Len(strDateiname) - 4) ' Endung .mdb abschneiden
If strDateiname = Left$(strDateiname, Len(strDateiname) - 4) & Year(Date) Then ' Prüfen ob Die neue Datei im aktuellen Pfad bereits existiert
MsgBox "Die Datei " & strDateiname & " existiert bereits. Kein Jahreswechsel nötig."
Else
MsgBox "Datei wird gespeichert als " & Left$(strDateiname, Len(strDateiname) - 4) & Year(Date) & ".mdb"
' 1. geöffnete (alte) Datei unter neuem Dateinamen speichern
' ActiveWorkbook.SaveAs Left$(strDateiname, Len(strDateiname) - 4) & Year(Date) & ".mdb"
' 2. Die aktuelle (neue) Datei kopieren als strDateiname.bak bevor Datensätze gelöscht werden
' 3. Die Datensätze löschen bis auf den Letzten
' Tabellenname : tbl_Bewegungen_und_Staende
' Feldname : ID_Bewegungen (formatiert als AutoID)
End If
Jahreswechsel_Err:
If Err > 0 Then
MsgBox Error$, vbCritical, "Fehler Nr: " & Err.Number & " in fktJahreswechsel"
Err.Clear
End If
End Function
Folgender Stand:
Der Dateiname wird neu zusammengestellt, die MsgBox -en werden auch richtig angezeigt.
Sowohl die mit dem neuen Dateinamen als auch die das die Datei schon existiert.
Nun muss ich noch die 3 Punkte 1. bis 3. abarbeiten.
Da scheiterts aber schon beim Punkt 1.
Die Anweisung ActiveWorkbook.SaveAs Left$(strDateiname, Len(strDateiname) - 4) & Year(Date) & ".mdb" funktioniert leider nicht.
Kannst Du mir da nochmal auf die Sprünge helfen?
Vielen Dank,
Gruß Sven.
Antwort 7 von Marie
Zitat:
' 1. geöffnete (alte) Datei unter neuem Dateinamen speichern
' ActiveWorkbook.SaveAs Left$(strDateiname, Len(strDateiname) - 4) & Year(Date) & ".mdb"
' 1. geöffnete (alte) Datei unter neuem Dateinamen speichern
' ActiveWorkbook.SaveAs Left$(strDateiname, Len(strDateiname) - 4) & Year(Date) & ".mdb"
das kann nun nicht wirklich funktionieren, Deine Frage hieß:
Access-Formular - Button für "Datei speichern unter" und "Datensätze aus Tabelle löschen"
und wurde im Forum "Datenbanken" gestellt. Also ging ich logischerweise davon aus, dass es sich um eine Access-Datenbank handelt, deshalb *.mdb. Ein ActiveWorkbook gibt es jedoch in Access nicht, das gibt es nur in excel und müsste dann abgespeichert werden als *.xls
Gruß Marie
Antwort 8 von sv_t
Hallo Marie,
das soll alles schon im Access passieren.
Ich kenne diesen Befehl von Excel und fand nichts anderes für Access.
Da dachte ich das das bei allen Office-Anwendungen gleich ist.
Gibts den Befehl "speichern unter" im Access-Code nicht?
Ich habe das Programmieren nicht gelernt und versuche mir alles mit div. Büchern selbst beizubringen.
Gruß Sven.
das soll alles schon im Access passieren.
Ich kenne diesen Befehl von Excel und fand nichts anderes für Access.
Da dachte ich das das bei allen Office-Anwendungen gleich ist.
Gibts den Befehl "speichern unter" im Access-Code nicht?
Ich habe das Programmieren nicht gelernt und versuche mir alles mit div. Büchern selbst beizubringen.
Gruß Sven.
Antwort 9 von Marie
Eine ACCESS-Datenbank ist kein Workbook.
Die aktive Datenbank heisst: CurrentDb
schau mal hier: http://www.ms-office-forum.net/forum/sitemap/index.php?t-184311.html
Gruß Marie
Die aktive Datenbank heisst: CurrentDb
schau mal hier: http://www.ms-office-forum.net/forum/sitemap/index.php?t-184311.html
Gruß Marie