Supportnet Computer
Planet of Tech

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.

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.

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.


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.

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:


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"



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.

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