PDA

Vollständige Version anzeigen : formular automatisch neuen datensatz einfügen+neue nummer


havi
23.10.2003, 17:05
Hi!

es gibt ein rechnungsformular. dies kann man per button direkt aus dem kunden-fenster öffnen. Nun soll man gleich eine neue rechnung (sprich neuer datensatz) vor sich haben und nicht extra klicken müssen

das 2te problem das sich daraus ergibt ist das die rechnungsnummer immer weitergehen soll. das kann ich aber nicht mit autowert machen, da man rechnungen löschen und daher die rechnungsnummer wieder vergeben müssen kann. (fragt mich nicht wieso, mein "auftraggeber" will es so :p )

mfg

havi

jmc
23.10.2003, 17:37
Hi havi

kleine Randbemerkung: das sind 2 verschiedene Fragen, eigentlich 2 Threads, aber da die erste sehr einfach zu beantworten ist, lassen wir's mal

Beim mit dem Assi erstellten Button zum öffnen eines Formulars wird der eine Code-Zeile generiert, dazu schreibst du am Schluss noch das unten rot markierte

DoCmd.OpenForm stDocName, , , stLinkCriteria, acFormAdd

Zum Thema fortlaufende Rechnungsnummer:
wie soll denn das funktionieren, wenn du die Nummern 1 bis 10 hast und dann wird nachträglich die 8 gelöscht. Soll dann diese wieder verwendet werden ?

Abgesehen davon, dass es ein Murks ist, finde ich es auch aus Sicht der Nachvollziehbarkeit falsch, eine Rechnungsnummer, die womöglich auch schon gedruckt ist, einfach zu löschen und für eine ganz andere Rechnung wieder zu verwenden ...
Möglicherweise hat auch eine Revision etwas dagegen ..

Ich würde mir das auf jeden Fall vom Auftraggeben schriftlich und in allen Details mit den Regeln geben lassen !
Irgendwann musst du dann vielleicht das ganze wieder ändern und dann heisst es womöglich noch, dass du das gratis machen musst (ich gehe jetzt mal davon aus, dass es ein bezahlter Auftrag ist - du sprichst ja von Auftraggeber ..)
Damit können WIR dir dann auch weiterhelfen ;)

Gast
23.10.2003, 18:08
Hallo havi,

versuch es mal so.

Private Sub Form_Open(Cancel As Integer)

DoCmd.GoToRecord , , acNewRec

End Sub

Zur zweiten Frage: Du kannst das mit autowert machen wenn zuvor die Anwendung komprimiert wird. Dann werden wieder autowert Nummern generiert die gelöscht wurden allerdings nicht kleiner als die größte vergebene autowert-Nummer.

Wenn Du auch RechNummern wiedervergeben willst die kleiner sind als die größte vergebene RechNummer dann wird es schwieriger aber es ist möglich, allerdings auf kosten der geschwindigkeit je nach Menge der Datensätze. Nicht zu empfehlen.

Um die RechNummer manuell zu vergeben wenn sie kleiner sein soll als die größte vergebene RechNummer Erszellst du eine tabelle mit dem Namen z.B. tblRechNr in dieser Tabelle giebt es nur eine Spalte mit den Namen (RechNr) und eine Zeile dort steht dei aktuelle RechNr die als nächstes vergeben weden soll. Der rest ist VBA

Die folgende Prozedur gehört in die Ereignisprozedur des Formulars (vor Eingabe)

Private Sub Form_BeforeInsert(Cancel As Integer)
Dim rst As Object, rstSQL As String

On Error GoTo Err_Neu_Click

'Erhöht LaufendeNr in tblRechNr um 1

rstSQL = "SELECT RechNr " & _
"FROM [tblRechNr] "

Set rst = CurrentDb.OpenRecordset(rstSQL)
With rst
.Edit
.Fields("RechNr") = .Fields("RechNr") + 1
.Update
.Close
End With
Set rst = Nothing

Me.Recalc

Exit_Neu_Click:
Exit Sub

Err_Neu_Click:
MsgBox Err.Description & "Fehler in 'Form_BeforeInsert'"
Resume Exit_Neu_Click

End Sub

Ausser dem brauchst Du ein Feld auf deinem Formular das diese RechNr anzeigt und dessen Standardwert setzt Du auf

DomWert("[RechNr]";"tblRechNr")

Nun brauchst Du noch eine Form dersn Datenherkunft Du auf (tblRechNr) setzt und ein Feld welches die Aktuelle RechNr in der Tabelle tblRechNr anzeigt. Von hir kann die RechNr individuell eingestellt werden. Allerdings solltest Du Vorsichtsmasnahmen treffen so das verwendete RechNr nicht angenommen werden!

gruß

fomo

havi
23.10.2003, 19:46
puh... danke fürs rege schreiben, aber das wird mir wohl doch zu kompliziert :eek:

kA vielleicht will n kunde mal keine rechnung haben (is ja ein privatunternehmen, da geht man dohc schon hin und wieder auf solche illegalen kundenwünsche ein). dann fehlt natürlich eine nummer (aus rechnungswesen-sicht) die man dann wieder vergeben muss...

jmc
23.10.2003, 20:05
@fomo

ich hab' mal deine Funktion "freistehend" in ein Module gepackt und die Tabelle angelegt.
wenn ich die Funktion laufen lasse, dann wird wunderbar die RechNr hochgezählt.

ABER: kannst du mir jetzt sagen, wie das funktioniert, wenn dann in der Rechungstabelle die Nr. 7 gelöscht wird und in der tblRechNr bereits 11 steht ?
Wie wird dann mit deiner Methode die Nr 7 wieder verwendet ??

Diese Situation habe ich übrigens relativ eingehend in meinem Beitrag erwähnt, und dass es nicht sooo trivial ist sieht man nun ...

havi
27.10.2003, 14:22
hab mal diesen beitrag geschrieben um das thema wieder nach vorne zu holen. hat nohc jemand einen vorschlag bezüglich autowert ohne autowert

jmc
27.10.2003, 20:39
Hi

IMHO geht das nur mit einer VBA-Routine, mit der du die freien Nummern suchst.

havi
27.10.2003, 21:19
ja und wie geht das :(

jmc
27.10.2003, 22:09
Hi havi

... da geht man dohc schon hin und wieder auf solche illegalen kundenwünsche ein ...
Da nimmst du dir aber ziemlich viel vor, denn wenn du schon auf solche Kundenwünsche eingehen willst, dann solltest du zuerst etwas mehr von Access verstehen.
Ich hab mal deine bisherigen Fragen im Forum etwas angeschaut. Nimm's mir nicht übel, aber mit solchen (Un-)Kenntnissen gleich Kundenaufträge zu machen, finde ich ehrlich gesagt schon leicht frech (man hat ja das Forum, da helfen die dann schon, wenn ich nicht weiter weiss ... )
Jeder fängt ja mal an, aber ich hab' mich damals in ein paar Bücher und Beispiele vertieft und im Selbststudium Access gelernt. Etwas mehr Eigeninitiative deinerseits wäre angebracht!

Nun, ich will mal nicht so sein und gebe dir den Tip. Erstelle eine Funktion in einem globalen Module, die du dann am entsprechenden Ort aufrufen kannst, die sieht so aus (wobei wir ja nicht mal ne Ahnung haben, wie deine Tabellen und Felder heissen)

Public Function GetFirstFreeNr() As Long

Dim rs As DAO.Recordset
Dim lngRechnungNr As Long

Set rs = CurrentDb.OpenRecordset("tblRechnung", dbOpenDynaset)

With rs
.MoveFirst
lngRechnungNr = !RechnungNr
Do While Not .EOF
If !RechnungNr > lngRechnungNr Then
GetFirstFreeNr = lngRechnungNr
Exit Function
End If
lngRechnungNr = !RechnungNr + 1
.MoveNext
Loop
End With
Set rs = Nothing
GetFirstFreeNr = lngRechnungNr

End Function

Der Return-Wert ist die erste freie RechnungNr oder, wenn es keine dazwischen frei hat, die höchste gebrauchte + 1

Nouba
27.10.2003, 22:09
schau mal hier (http://www.ms-office-forum.net/forum/showthread.php?s=&threadid=96018)