Hallole,
im Moment plagt mich ein Problem, und ich komme absolut nicht darauf, woran es liegen kann.
Hier mal der Code, wo der Fehler (in Zeile 60) auftritt. Mehr dazu weiter unten:
ZitatPrivate Sub cmdschliessen_Click()
10 On Error GoTo cmdschliessen_Click_Error
Dim lng_ID As Long
Dim frm As Form
Dim rec As Recordset
20 lng_ID = Me!rech_nr
Forms("frmRechUebersicht").Requery
30 Set frm = Forms("frmRechUebersicht")
40 Set rec = frm.RecordsetClone
50 With rec
60 .FindFirst "[rech_nr]=" & lng_ID
70 If Not .NoMatch Then
80 frm.Bookmark = rec.Bookmark
90 End If
100 End With
110 Set rec = Nothing
120 Set frm = Nothing
140 DoCmd.Close acForm, "frm_Rechnung"
150 On Error GoTo 0
160 Exit Sub
cmdschliessen_Click_Error:
170 MsgBox "Error " & Err.Number & " in Zeile " & Erl & " (" & Err.Description & ") in procedure cmdSchliessen_Click of VBA Dokument Form_frm_Rechnung"
End Sub
Ich habe ein Rechnungsübersichtformular (frmRechUebersicht), woraus ich die Detailrechungen (frm_Rechnung) öffnen kann.
Im Schließen-Button des "frm Rechnung" ist der obige Code.
Nun zum Phänomen:
Öffne ich das Rechnungsübersichtformular und im Anschluß das Rechnungsformular und schließe es wieder, ist alles in Ordnung.
Wenn ich jetzt aus dem Rechnungsübersichtsformular eine neue Rechnung anlege, lande ich schlußendlich (es sind ein paar Formulare dazwischen) im Rechnungsformular.
Wenn ich dann das Formular schließe, bekomme ich den Fehler 3420 (Das Rechnungsformular bleibt offen).
Das Übersichtsformular ist bereits durch das Forms (...). Requery aktualisiert.
Jetzt wird es interessant:
Schließe ich das Rechnungsübersichtsformular und öffne es wieder, kann ich ohne Probleme das Rechnungsformular schließen. Es kommt kein Fehler!
Was kann da die Ursache sein? Habe ich irgendwo in den Formularen, welche ich zur Rechnungserstellung brauche, irgendwas nicht sauber deklariert?
Kann es mit der Abfrage zusammenhängen, auf welche sich das Rechnungsübersichtsformular bezieht?
Blockiert diese womöglich den Zugriff, obwohl das Formular offen ist?
Der Fehler 3420 scheint meinen Recherchen nach schon so manchen zur Verzweiflung gebracht haben.
Grüßle
Hubert
Markiert der Debugger die auslösende Zeile nicht?
Hallo Breaker s.a.
Nein. Oder sollte ich den Code zur Fehlermeldung mal ausblenden, damit der Debugger auslöst?
Ein Versuch ist es ja wert;-) Mal sehen, ob es die gleiche Zeile ist.
Grüßle
Hubert
Hallole,
also der Debugger bleibt auch in Zeile 60 stehen.
habe jetzt in dem Code nach dem Forms(...). Requery
ein schließen und öffnen des Übersichtsformular eingebaut.
Jetzt bleibt der Fehler aus.
Vielleicht hat jemand eine Idee was da sein könnte?
Oder hat womöglich die Datenbank einen defekt?
Grüßle
Hubert
Hallo!
Vieleicht wäre das so ne möglichkeit
Option Compare Database
Option Explicit
Private Const mod_formModule As String = "frm_Rechnung."
Private Function IstFormularGeoeffnet(ByVal strFormularname As String) As Boolean
If SysCmd(acSysCmdGetObjectState, acForm, strFormularname) <> 0 Then
If Forms(strFormularname).CurrentView <> 0 Then
IstFormularGeoeffnet = True
Else
IstFormularGeoeffnet = False
End If
End If
End Function
Private Sub cmdschliessen_Click()
Dim frm As Form
Dim varBookmark As Variant
If IstFormularGeoeffnet("frmRechUebersicht") Then
Set frm = Forms!frmRechUebersicht.Form
With frm
If .FilterOn = True Then .FilterOn = False
varBookmark = .Recordset.Bookmark
.Requery
.Recordset.FindFirst "[rech_nr]=" & Me!rech_nr
If Not .NoMatch Then
.SetFocus
Else
.Recordset.Bookmark = varBookmark
End If
End With
End If
Exit_ErrHandler:
If Not frm Is Nothing Then Set frm = Nothing
Exit Sub
Err_ErrHandler:
Select Case Err.Number
Case 3420
DoCmd.Close acForm, "frm_Rechnung"
Case Else
MsgBox Err.Number & Err.Description & " in cmdSchliessen_Click " & formModule
End Select
Resume Exit_ErrHandler
End Sub
Gruß Frank
Hallo Frank,
also ich habe Deinen Code bei dem Rechnungsformular eingebaut.
Wenn ich jetzt aus dem Rechnungsübersichtsformular eine bestehende Rechnung öffne und anschließend schließe, meldet der Debugger den Fehler:
Laufzeitfehler '2465':
Anwendungs- oder objektdefinierter Fehler.
Beim Debuggen wird die Zeile
If Not .NoMatch Then
gelb markiert.
Wenn ich eine neue Rechnung erstelle, kommt beim schließen des Formulars wieder der Fehler:
Laufzeitfehler'3420':
Das Objekt ist ungültig, oder es ist nicht mehr festgelegt.
Beim Debuggen wird die Zeile
varBookmark = .Recordset.Bookmark
gelb markiert.
Ich habe mich jetzt einfach mal bei dem schließen code mit :
40 DoCmd.Close acForm, "frmRechUebersicht"
50 DoEvents
60 DoCmd.OpenForm "frmRechUebersicht"
beholfen.
Es würde mich aber schon interessieren, ob ich da irgendwo was falsch programmiert habe, oder was da sonst sein könnte.
Grüßle
Hubert
Hallo,
es geht halt einfach nicht, ein Formular zu referenzieren und dieses Form dann zu schließen und wieder zu öffnen. Dadurch wird die vorherige Referenz zerstört...
(falls ich den Ablauf richtig interpretiere)
Hallo Franz,
auf welchen Code beziehst Du dich jetzt?
Meinst Du das bei mir eingefügte
40 DoCmd.Close acForm, "frmRechUebersicht"
50 DoEvents
60 DoCmd.OpenForm "frmRechUebersicht"
Oder bei dem was Frank77 vorgeschlagen hat.
Bei nachfolgendem Code bleibt mir der Fehler 3420 jetzt mal weg, wobei ich denke, dass das Formular schließen und wieder öffnen programmiertechnisch nicht schön ist :D
Private Sub cmdschliessen_Click()
10 On Error GoTo cmdschliessen_Click_Error
Dim lng_ID As Long
Dim frm As Form
Dim rec As Recordset
20 lng_ID = Me!rech_nr
30 Forms("frmRechUebersicht").Requery
40 DoCmd.Close acForm, "frmRechUebersicht"
50 DoEvents
60 DoCmd.OpenForm "frmRechUebersicht"
70 Set frm = Forms("frmRechUebersicht")
80 Set rec = frm.RecordsetClone
90 With rec
100 .FindFirst "[rech_nr]=" & lng_ID
110 If Not .NoMatch Then
120 frm.Bookmark = rec.Bookmark
130 End If
140 End With
150 Set rec = Nothing
160 Set frm = Nothing
170 DoCmd.Close acForm, "frm_Rechnung"
180 On Error GoTo 0
190 Exit Sub
cmdschliessen_Click_Error:
200 MsgBox "Error " & Err.Number & " in Zeile " & Erl & " (" & Err.Description & ") in procedure cmdSchliessen_Click of VBA Dokument Form_frm_Rechnung"
End Sub
Grüßle Hubert
Hallo!
Ich denke du wirst da eine beispiels DB Hochladen müssen.
LG
Hallo,
Das müsste ich hinkriegen. Wie groß darf den die Datei sein? Gezippt komme ich auf ca. 5,5 MB
Werde wohl eh die Datenbank auf das allernotwendigste verkleinern müssen.
Gruß
Hubert
Minimalbeispiel - kurz erklärt:
=======================
Das Erstellen eines Minimalbeispiels ist eine Methode zur Fehlererkennung und -behebung, sowie zum Bestimmen der Ursache eines bestimmten Verhaltens.
Minimalbeispiele sollten möglichst klein und lauffähig sein, d.h. sie besitzen den Grundaufbau einer Access-Datenbank und sind ohne Ergänzen von Elementen bis auf das Fehlverhalten ausführbar.
Das Minimalbeispiel sollte vollständig und lauffähig sein, damit
* der Fragende nicht aus Unkenntnis, Informationen, die für die Diagnosewichtig sind, weglassen kann,
* der Antwortende das Beispiel einfach ausprobieren kann.
Das Minimalbeispiel sollte klein sein,
* damit der Antwortende sich nicht durch lange, unwichtige Codezeilen quälen muss,
* weil dadurch die möglichen Fehlerquellen eingegrenzt werden,
* weil man kurze Beispiele gut posten kann und den Server hier nicht zumüllt,
* damit der Fokus auf das Wesentliche gelenkt wird.
Also: vereinfachen, unnötige Teile entfernen, Grafiken entfernen, soviele anonyme Beispieldaten belassen, wie es die Problematik erfordert, Dienstprogramm Komprimieren und reparieren vor dem Archivieren ausführen.
Hallo Lachtaube,
danke für Deinen ausführlichen Bericht. :D
nur noch kurze Frage dazu.
Sollen die Tabellen vom Backend dann wieder ins Frontend integriert sein, damit es nur eine Datei ist?
Grüßle
Hubert
Ja, das erleichert den Umgang des Antwortenden mit der DB.
Hallo,
habe jetzt das Problem, die Datei unter 1 MB (gezippt) zu bekommen.
Die Dateigröße liegt jetzt bei knapp unter 9 MB und mit WinZip komme ich auf maximal 1,45 MB.
Habe alles an Formularen rausgeworfen, ebeso in den übrigen Formularen alles was nicht gebraucht wird.
Ebenso die Datenbank komprimiert.
Tabellen und Abfragen löschen bringt nicht viel an Minimierung.
Grafiken habe ich keine in den Formularen. Liegt es an dem Design? Hintergrundfarbe Textfarbe etc?
Es sind ja nur noch 10 Formulare (einschließlich Unterformulare) übrig.
Was braucht denn da so viel Platz?
Gruß
Hubert
Hallo!
kannst das Archiv teilen in 2 zip Dateien und separat Hohladern, das könnte ja dann einer der Admins nachher korrigieren
oder du lädst es hier hoch https://www.zippyshare.com/ (https://www.zippyshare.com/)
und Postest den link
Gruß Frank
Zitat von: trebuh am Mai 23, 2018, 19:06:24habe jetzt das Problem, die Datei unter 1 MB (gezippt) zu bekommen.
Ich habe die Begrenzung auf 3MB erhöht. - Falls sich der Speicherbedarf dadurch zu stark wächst, werde ich das evtl. wieder reduzieren.
Zitat von: Frank77 am Mai 23, 2018, 22:48:59kannst das Archiv teilen in 2 zip Dateien und separat Hohladern, das könnte ja dann einer der Admins nachher korrigieren
Das
könnte einer der Admins vermutlich schon. - Aber, um ehrlich zu sein, es fehlt für solche Operationen die Zeit.
Für diesen Konkreten Fall sollte das mit dem erhöhtem Limit jetzt kein Problem mehr sein. Falls es tatsächlich mal um große Dateien geht, die nicht komprimierbar/reduzierbar sind, dann bitte wirklich einen externen Speicherort dafür verwenden.
Hallole.
Zunächst vielen Dank an PhilS für das erhöhen des Datenvolumens.
Das minimieren macht ganz schön arbeit. ???
Also im Anhang die Beispieldatei.
Kurze Erklärung zum anlegen einer neuen Rechnung:
Schritt 1: Käufer auswählen
Schritt 2: Eine oder mehrere Holzlisten auswählen
Schritt 3: Ein oder mehrere Lose auswählen
Schritt 4: Preise eingeben
Schritt 5: Kann mit "Weiter" direkt übersprungen werden.
Das Endformular schließen.
Falls jetzt noch kein Fehler auftaucht. Das Formular manuell schließen "X" und dann nochmal eine neue Rechnung erstellen.
Spätestens dann müsste der Fehler auftauchen (zumindest bei mir).
Grüßle
Hubert
Nachtrag: Wie ich durch Lachtaube festgestellt habe, habe ich die falsche Datei gezippt. Sorry :-[
Dein Beispiel scheitert schon in Schritt 1, weil man zuerst Code auskommentieren muss, wozu ich eigentlich überhaupt keine Lust habe.
Im Schritt 2 wird dann die temporäre Tabelle nicht mehr befüllt.
Weiter schaue ich mir das Disaster nicht an. :)
PS: Ich würde auch doppelte Indexe, sowie Einzelindexe auch von Fremdschlüsselfeldern entfernen, für die referentielle Integrität eingestellt ist.
PPS: Nach einem Decompile (http://www.donkarl.com/FAQ/FAQ1Grundlagen.htm#1.23) schrumpft die DB auf ca. 3,5 Mb, was gezippt ca. 400 Kb ausmacht.
Hallo Lachtaube,
Sorry, ich habe die falsche Datei gezippt. :(
Decompile? Das kannte ich noch gar nicht.
Habe es immer mit dem Komprimieren und Reparieren gemacht.
Also die Datei müsste jetzt funktionieren.
Das mit den doppelten Indexen schaue ich mir mal an.
Grußle Hubert
Hallo Hubert,
ZitatDas mit den doppelten Indexen schaue ich mir mal an.
Da musst du aufpassen, denn die stehen in der Tabellenentwurfsansicht
nicht in der Indexliste. Diese werden beim Anlegen einer Beziehung mit
RI von Access automatisch angelegt. Sehen kannst du die nur wenn du
per VBA die Indexauflistung des Tabledef-Objektes ausliest.
Public Function ListeIndices(ByVal TabName As String)
Dim dbe As DAO.Database
Dim tdf As DAO.TableDef
Dim idx As DAO.Index
Dim idxfld As DAO.Field
Set dbe = CurrentDb
Set tdf = dbe(strTabelle)
For Each idx In tdf.Indexes
Debug.Print idx.Name
For Each idxfld in idx.Fields
Debug.Print idxfld.Name
Next idxfld
Next idx
End Function
gruss ekkehard
Nun, Schritt 1 hast Du nicht bereinigt.Option Compare Database
Option Explicit
Private Sub cmdschliessen_Click()
10 On Error GoTo cmdschliessen_Click_Error
'Datensatz ggf. speichern!!!
20 If Me.Dirty Then Me.Dirty = False
30 With Forms("frmRechUebersicht")
40 .Requery
'der Datensatz muss gefunden werden!!!
50 .Recordset.FindFirst BuildCriteria("rech_nr", dbLong, Me.rech_nr)
60 End With
70 DoCmd.Close acForm, Me.Name, acSaveNo
80 Exit Sub
cmdschliessen_Click_Error:
90 MsgBox "Error " & Err.Number & " in Zeile " & Erl & _
" (" & Err.Description & ") in Sub cmdSchliessen_Click " & _
"im VBA Dokument Form_frm_Rechnung"
End Sub
Hallo
Zitat von: Lachtaube am Mai 24, 2018, 12:22:04
Weiter schaue ich mir das Disaster nicht an. :)
Sehr unübersichtlich :-)
Ich hab mal zeit und versuche mal die strucktur zu über arbeiten soweit ich da durchblicke.
Man hat mir hier auch schon sehr viel geholfen
Gruß
Hallo,
Ohh, da bekomme ich aber ein schlechtes Zeugnis ausgestellt.
Geht doch bitte nicht so hart ins Gericht mit mir. :D
@ Lachtaube
Danke für Deinen Code. Einfach und Übersichtlich.
Nur leider kommt der Fehler 3420 immer noch bei:
50 .Recordset.FindFirst BuildCriteria("rech_nr", dbLong, Me.rech_nr)
;)
Gruß
Hubert
Hallo!
Das Datenmodel sollte mal Überarbeiten und die Sachen anders und übersichtlicher benennen.
Ist wie bei mein ersten versuch ewig Zeit investiert und immer dazu gebastelt zum Schluss blöd aus der Wäsche geglotzt und dazu gelernt.
Kuck dir mal Kontakt Stemmdaten und Kontaktform an.
Ich denke du Speicherst vieles doppelt und dreifach und das sehr unübersichtlich
Ich habe mal nur die Felder umbenannt und in den Beziehungen das sortiert was ich nachvollziehen kann sowie ids angelegt wo keine sind, den Rest musst mal sortieren.
Was ist der Artikel und welche Referencen /Arten gehören zum Artikel.
Wer kauft was und warum und Skonto und MwSt in den Artikel z.b. und nicht in den Kontakten den das bezieht sich auf den Artikel.
Kontakt = 19% kauft aber Essen das hat 7% ergo Passt nicht
1000 Abfragen das Blickt echt keiner das musst überarbeiten sonst Verschwendest echt deine zeit
http://www.access-im-unternehmen.de/index1.php?BeitragID=294&id=300 (http://www.access-im-unternehmen.de/index1.php?BeitragID=294&id=300)
Bastell mal ein Kontakt eingabe zusammen und Artikel eingabe dann sieht man weiter
Grus Frank
ZitatNur leider kommt der Fehler 3420 immer noch bei:
Stimmt denn der Datentyp?
..., dbLong, Me.rech_nr)
Hallole,
also zur Info, das meiste an Formularen und Berichten habe ich wegen der Übersicht rausgeworfen.
Die Abfragen beziehen sich die meisten auf Auswertungen in Berichten.
Die Steuer bezieht sich auf den Kunden. Der eine Waldbesitzer verbauft sein Holz mit 5,5 ein anderer mit 19%.
Mag ja sein, das meine Datenbank nicht die beste ist (Ist auch meine Erste). Aber was hat das jetzt mit dem Fehler in den paar Formularen zu tun, welche in der Beispieldatei ist?
Der Code in den Formularen ist doch überschaubar?
@Breaker:
Der Datentyp dürfte stimmen. Jeweils eine Zahl.
Mich wundert es halt, das wenn ich per VBA das Formular schließe und wieder öffne, der Fehler ausbleibt.
Na ja... ich lasse es halt mal so.
Gruß und Dank an alle für die Bemühungen.
Hubert
Hallolo,
habe die Ursache gefunden.
Es hat mit der Transaktion im "Weiter"-Button des Formulars frm_Rech_Zu_und_Abschlaege zu tun.
Ob ich die Transaktion so richtig programmiert habe (wahrscheinlich nicht) weiß ich nicht.
War damals mein einziger Versuch mit der Transaktion.
Jedenfalls habe ich das mal außen vor gelassen.
Jetzt habe ich Zugriff auf das Formular. D.h. Der Fehler ist jetzt weg. ;D ;D ;D
Grüßle Hubert
Hallo!
Zitat von: trebuh am Mai 24, 2018, 22:54:42
Die Steuer bezieht sich auf den Kunden. Der eine Waldbesitzer verbauft sein Holz mit 5,5 ein anderer mit 19%.
Ich geh jetzt mal davon aus das du EK-VK betreiben willst?
Jetzt nehmen wir mal folgendes an
Die hinterlegten 5,5% sind der Verkauf des eigenen Holzes vom VK also dein EK
Jetzt macht der die aber ein unschlagbares Angebot seines EK den er dir aber zum VK mit 19% geben muss da er die Steuer weiter gibt ... was machst dann?
Dazu gibt er dir noch Brennholz:
,,Der für Brennholz geltende Umsatz- bzw. Mehrwertsteuersatz ergibt sich aus Anlage 2 (zu § 12 Abs. 2 Nrn. 1 und 2), lfd. Nr. 48 des Umsatzsteuergesetzes.
Danach beträgt der Umsatz- bzw. Mehrwertsteuersatz für Brennholz 7 %."
5,5 - 19 - 7 dann stürzt dein gesamter Geschäftsvorfall ab
(habe über mehrere Jahre eine Holzofenbäckerei betrieben und CA 40 Stehr in Jahr verbrannt)
EK-Artikel hat Lieferanten und Lieferanten hat preis zu Datum
(http://www.bilder-upload.eu/thumb/5194cd-1527332371.png) (http://www.bilder-upload.eu/show.php?file=5194cd-1527332371.png)
Grus Frank
Hallo Frank,
Also es ist so:
Wenn ein Waldbesitzer sein Holz an ein Sägewerk verkauft, kommt es darauf an, ob er pauschaliert, oder optiert.
Daher die 5,5% oder 19%
Das Programm dient lediglich dazu, Holzlisten zu schreiben, und ggf. eine Rechnung zu erstellen.
In der Regel bekommt man ja vom Sägewerk die Gutschrift.
Des weiteren kann man auch Holzlisten für andere Waldbesitzer schreiben, und auch für die ggf. eine Rechnung für das Sägewerk schreiben.
Hat also nichts mit Bestellungen und Verkauf von anderen Waren und Artikel zu tun.
Übrigens noch Danke, für Deine Arbeit mit den Tabellen.
Hatte auch schon mal vor, die Datenbank komplett neu aufzubauen, da man als Laie ja mit Null anfängt, und dann wenn man sich mal ein wenig mit der Materie befasst hat, feststellt, dass man es auch anders angehen kann.
Gruß
Hubert
Hallo!
Verstehe du schreibst also dir Rechnung für den Verkauf an den Käufer und stellst damit das zwischen Glied dar, sozusagen wie der STB für Faule
Dann wird's natürlich komplizierter, meine Intension war das es für Schausteller keine DB gibt
Ja ist ein langer Weg sich das als Laie anzueignen, hab alle Bücher gekauft und fest gestellt ist immer der gleiche Mist
Aber die 2 haben mir dann an besten geholfen, ohne Werbung für die machen zu wollen
https://shop.minhorst.com/buecher/273/anwendungen-entwickeln-mit-access (https://shop.minhorst.com/buecher/273/anwendungen-entwickeln-mit-access)
https://shop.minhorst.com/buecher/300/access-und-office?c=76 (https://shop.minhorst.com/buecher/300/access-und-office?c=76)
ich bin mir sicher du kannst, dass alles extrem reduzieren in der DB
Gruß Frank
Hallolo,
Ja ist ein langer Weg sich das als Laie anzueignen, hab alle Bücher gekauft und fest gestellt ist immer der gleiche Mist
:D
Ja da hast Du recht.
Da geht es meistens immer um die gleichen Datenbanken. Vereine, Bücherverleih etc.
Von Minhorst habe ich auch Bücher. Die finde ich auch gut.
Dann halt die Suche im Internet. Da findet man viel. Nur wenn dann das Thema kommt, wo man sucht,
hört der Text auf. Mehr kann man dann erfahren, wenn man diverse Fachzeitschriften abonniert.
Wäre ja grundsätzlich nicht schlecht, aber für den privaten Hobby-Gebrauch dann doch etwas zu teuer.
Hätte in jungen Jahren wohl doch in die IT-Branche einsteigen sollen. ;D
Gruß
Hubert