Hallo Karl,
ich habe heute beim Schließen der Datenbank auf die Aufforderung Speichern, Zwischenablage oder Eigene Änderungen verwerfen mit "Eigene Änderungen verwerfen" geantwortet. Wie schon erwartet war die Parametertabelle nicht verstellt, damit ist Deine These vom hängenden Schreibprozess bestätigt.
"wo und wie die Nummern in die Parametertabelle geschrieben werden.
Das ist natürlich insg. der Hauptaspekt, den es zu prüfen gilt."
Ich bin wie folgt vorgegangen um den hängenden Schreibprozess zu finden: Ich konnte in meiner Recherche die Rechnung ausfindig machen, die **** den hängenden Schreibprozess ausgelöst hat. Ich konnte sie aufgrund der zurückgesetzten Rechnungsnummer und Auftragsnummer ermitteln. Im Folgenden habe ich den Sourcode überall dort wegelassen in der diese Auftragsart (Reparaturrechnung) und die Parametertabelle nicht involviert war.
Programmstruktur
Das Rechnungserstellungsprogramm ruf gleich bei Start eine Prozedur**VorbereitenRechnungsschreibung auf.**In dieser Prozedur wird die Parametertabelle gelesen. Zuerst wird geprüft, ob sie gesperrt ist, wenn ja wird gewartet und ein neuer Versuch unternommen. Wenn Sie frei ist, wird die Sperre gesetzt und die zuletzt gelesene Rechnungsnummer geholt. Die geholte Rechnungsnummer wird an die aufrufende Prozedur übergeben. Die Prozedur findest Du weiter hinten. Die aufrufende Prozedur erhöht die geholte Rechnungsnummer um einen Zähler, und erstellt die Rechnung.
Der Update der Rechnungsnummer in der Parametertabelle erfolgt erst am End der Hauptprozedur.
Bei erfolgreicher Rechnungsstellung wird die aktuelle Rechnungsnummer in die Parameter Tabelle zurückgeschrieben. Bei einem Abbruch erfolgt keine Rückschreibung in die Parametertabelle.
Sub RechnungenErstellen(ByVal Monat, ByVal Monatnumerisch, ByVal Rechnungsart, ByVal AuftragsID, ByVal Rechnungsvorschau, _
ByVal AutomatischeRechnungsschreibung, Abbruch)
Call datenbanköffnenLiftWin(l_cn)
Call VorbereitenRechnungsschreibung(ByVal Rechnungsart, ByVal AutomatischeRechnungsschreibung, Firmenkürzel, _
Rechnungsnummer, ArbeitenmitKontonummer, mehrwertsteuersatzstandard, StundensatzStandard, Monteurnameausweisen, _
Währungskurszwischenspeicher, AnlagenPfad, Rechnungsdatum, Nachschüssig)
If Abbruchkennzeichen = True Then
'MsgBox ("Abbruch")
DoCmd.RunMacro "Sanduhraus"
Exit Sub
End If
'Rechnungsnummer '
'Prüfen, ob Rechnungsnummer nicht schon vergeben wurde
Set l_rs30 = CreateObject("ADODB.Recordset")
l_rs30.CursorLocation = adUseClient
l_rs30.CursorType = adOpenStatic
l_rs30.LockType = adLockBatchOptimistic
l_sSQL = " SELECT * From Statistik where Rechnungsnummer=" & Rechnungsnummer
l_rs30.Open l_sSQL, l_cn
If l_rs30.RecordCount > 0 Then
MsgBox ("Die zugeordnete Rechnungsnummer " & Rechnungsnummer & " für die " & Rechnungsart & " ist schon vergeben, " _
& " Abbruch für diese Rechnungsart und Fabriknummer " & Fabriknummer & ". Bitte Support anrufen.")
Abbruch = True
DoCmd.RunMacro "Sanduhraus"
Exit Sub
End If
'Vergabe Rechnungsnummer
Rechnungsnummer = Rechnungsnummer + 1
'Code zum Erstellen der Rechnung. Die Parametertabelle wird nicht gelesen. .............................................
Call StatistikBuchen(ByVal Auftragsart, ByVal Rechnungsnummer, ByVal Positionsnummer, ByVal Konto, _
ByVal Firma, ByVal Rechnungsdatum, ByVal Rechnungstext, _
ByVal Gesamtpreis, ByVal Fabriknummer, ByVal Personalnummer, ByVal Serviceauftragsnummer, _
ByVal MitarbeiterNachname, ByVal Mehrwertsteuersatz, _
ByVal ZahlungsbedingungfürStatistik, ByVal FirmenZusatz, ByVal Zahlungsdatum)
Im Modul StatistikBuchen wird die Parametertabelle gelesen, und es wird der Mehrwertsteuersatz ausgelesen. Siehe Modul StatistikBuchen weiter hinten.
'Hier erfolgt bei erfolgreicher Rechnungsschreibung das Zurückschreiben der zuletzt verwendeten Rechnungsnummer in die Parametertabelle
'Zurückschreiben zuletzt vergebene Rechnungsnummer
Set l_rs3 = CreateObject("ADODB.Recordset")
l_rs3.CursorLocation = adUseClient
l_rs3.CursorType = adOpenStatic
l_rs3.LockType = adLockBatchOptimistic
l_sSQL = " Update Parameter set Rechnungsnummer=" & Rechnungsnummer
l_rs3.Open l_sSQL, l_cn
'Fakturiersperre rausnehmen und Arbeitstabellen löschen Modul ist weiter hinten einsehbar
clearRechnungstabellen
Call Rechnungsschreibung(ByVal Rechnungsart, ByVal AuftragsID, ByVal Rechnungsvorschau)
'Rechnungsschreibung aus dem Archiv die Parametertabelle wird nicht gelesen und nicht geschrieben
End Sub
Public Sub VorbereitenRechnungsschreibung_Doku(ByVal Rechnungsart, ByVal AutomatischeRechnungsschreibung, _
Firmenkürzel, Rechnungsnummer, _
ArbeitenmitKontonummer, mehrwertsteuersatzstandard, StundensatzStandard, Monteurnameausweisen, _
Währungskurszwischenspeicher, AnlagenPfad, Rechnungsdatum, Nachschüssig)
Call datenbanköffnenLiftWin(l_cn)
'Parameter Lesen 1
Set l_rs1 = CreateObject("ADODB.Recordset")
l_rs1.CursorLocation = adUseClient
l_rs1.CursorType = adOpenStatic
l_rs1.LockType = adLockPessimistic
l_sSQL = " SELECT * From Parameter"
l_rs1.Open l_sSQL, l_cn
'Bei der automatisierten Rechnungsschreibung wurde die Fakturiersperre schon gesetzt
'Fakturiersperre setzen oder abbrechen
If AutomatischeRechnungsschreibung = False Then
If l_rs1.Fields("Fakturiersperre") = True And Rechnungsart <> "RechnungennachZeitplan" And _
Rechnungsart <> "RechnungennachDurchführung" Then
MsgBox ("Die Rechnungs- und Angebotsschreibung ist gerade belegt. Bitte versuchen Sie es gleich nocheinmal")
Abbruchkennzeichen = True
l_rs1.Close
Exit Sub
Else
If l_rs1.Fields("Fakturiersperre") = True And (l_rs1.Fields("Windowuser") <> (Environ$("USERNAME")) Or _
IsNull(l_rs1.Fields("Windowuser"))) Then
MsgBox ("Die Rechnungs- und Angebotsschreibung ist gerade belegt. Bitte versuchen Sie es gleich nocheinmal")
Abbruchkennzeichen = True
l_rs1.Close
Exit Sub
End If
If l_rs1.Fields("Fakturiersperre") = True And l_rs1.Fields("Windowuser") = (Environ$("USERNAME")) And _
(l_rs1.Fields("ZurückgesetzteRechnungsnummer") = 0 _
Or IsNull(l_rs1.Fields("ZurückgesetzteRechnungsnummer"))) Then
MsgBox ("Die Rechnungs- und Angebotsschreibung ist gerade belegt. Bitte versuchen Sie es gleich nocheinmal")
Abbruchkennzeichen = True
l_rs1.Close
Exit Sub
End If
'Parameter Schreiben Fakturiersperre 1
'Setzen Fakturiersperre 1
l_rs1.Fields("Fakturiersperre") = True
l_rs1.Fields("Windowuser") = (Environ$("USERNAME"))
On Error GoTo FehlerVorbereitungRechnungsschreibung
l_rs1.UpdateBatch
End If
End If
Rechnungsnummer = l_rs1.Fields("Rechnungsnummer")
'Parametertabelle wird geschlossen 1
l_rs1.Close
Exit Sub
FehlerVorbereitungRechnungsschreibung:
l_rs1.Close
MsgBox ("Fehler in der Vorbereitung zur Rechnungsschreibung. Abbruch Bitte rufen Sie die Rechnungsschreibung noch einmal auf.")
Abbruchkennzeichen = True
End Sub
Sub StatistikBuchen_doku(ByVal Auftragsart, ByVal Rechnungsnummer, ByVal Positionsnummer, ByVal Konto, ByVal Firma, _
ByVal Rechnungsdatum, ByVal Rechnungstext, ByVal RechnungsPreis, ByVal Fabriknummer, ByVal Personalnummer, _
ByVal Serviceauftragsnummer, ByVal MitarbeiterNachname, ByVal Mehrwertsteuersatz, ByVal ZahlungsbedingungService, _
ByVal FirmenZusatz, ByVal Zahlungsdatum)
RechnungsnummerGleich = Rechnungsnummer
If IsNull(Fabriknummer) Or Trim(Fabriknummer) = "" Or IsEmpty(Fabriknummer) Then Fabriknummer = "Diverse"
If IsNull(Personalnummer) Or Trim(Personalnummer) = "" Or IsEmpty(Personalnummer) Then Personalnummer = 0
'Verbinden mit der Datenbank
Call datenbanköffnenLiftWin(l_cn)
'Lesen Parameter
Set l_rs1 = CreateObject("ADODB.Recordset")
l_rs1.CursorLocation = adUseClient
l_rs1.CursorType = adOpenStatic
l_rs1.LockType = adLockBatchOptimistic
l_sSQL = " SELECT * From Parameter"
l_rs1.Open l_sSQL, l_cn
mehrwertsteuersatzstandard = l_rs1.Fields("Mehrwertsteuersatz")
Firmenkürzel = l_rs1.Fields("Firmenkürzel")
l_rs1.Close
'Parametertabelle wird geschlossen 2
End Sub
Sub clearRechnungstabellen_Doku()
DoCmd.RunMacro "CleartemporäreRechnungstabellen"
Call Wait(4)
'Fakturiersperre löschen
Call datenbanköffnenLiftWin(l_cn)
Set l_rs3 = CreateObject("ADODB.Recordset")
l_rs3.CursorLocation = adUseClient
l_rs3.CursorType = adOpenStatic
l_rs3.LockType = adLockPessimistic
l_sSQL = " Select * from Parameter"
l_rs3.Open l_sSQL, l_cn
l_rs3.Fields("Fakturiersperre") = False
l_rs3.Fields("Windowuser") = Null
l_rs3.UpdateBatch
l_rs3.Close
l_cn.Close
weiter:
End Sub
Ich kann keinen Fehler finden. Hast Du eine Idee was ich falsch mache?
Gruß Hanns