PDA

Vollständige Version anzeigen : Benutzerdefinierte Counter


TommyK
01.12.2003, 14:22
Hallo zusammen,

mir ist aufgefallen, das es immer wieder Thema im MOF ist, wie kann ich einen Zähler erstellen mit dem Datum oder mit dem Monat usw.?

Ich möchte jetzt hier keine Diskussion über den Sinn und Verwendung solcher Zähler lostreten.
Meine Idee war nur mal ein Bsp zu diesem Thema zu schaffen.

Der Kern des Bsp ist eine Funktion die je nach Argumenten verschiedene Zähler mit verschiedenen Einstellungen zur Verfügung stellt.

Public Function UniCounter(intNoLen As Integer, strTabName As String, strFeldName As String, intType As Integer, _
boolStart As Boolean, boolAlign As Boolean, Optional strArg As String = "-", _
Optional strArg2 As String = "") As String
'*******************************************
'Name: UniCounter (Function)
'Purpose: Erstellt einen benutzerdefinierten Tageszähler
'Author: Tommyk
'Date: November 27, 2003, 04:03:35
'Inputs: intNoLen=Anzahl der Zählerstellen, strTabName= Name der Tabelle des Zählers,
' strFeldName=Name des Zählfeldes, boolStart= Beginn des Zählers (True bei 1, False bei 0),
' boolAlign=Ausrichtung des Zählers (True Zähler Rechts, False Zähler Links), strArg=Trennzeichen Standard "-"
' strArg2=Datumstrennzeichen Standard ""
' intType= DatumsTyp, 1=Tage (yymmdd), 2=Tage (ddmmyyyy), 3=Tage (ddmmyyyy formatiert), 4=Woche (wwyyyy formatiert)
' 5=Monat (mmyyyy formatiert), 6=Jahr (yyyy)
'Output: benutzerdefinierten Zähler
'Example: Standardwert des Zählfeldes im Form: z.B. UniCounter(3;"tbl_Test";"Zaehler_ID";3;True;True;"-";".")
'*******************************************
On Error GoTo ErrHandler

Dim strBedingung As String
Dim strNo As String, strDate As String
Dim strMax, intLenStr As Integer
Dim strAlignment As String

' Ermitteln des Datumformates
Select Case intType
Case Is = 1 'Tageszähler1
strDate = Format(Date, "yymmdd")
Case Is = 2 'Tageszähler2
strDate = Format(Date, "ddmmyyyy")
Case Is = 3 'Tageszähler3
strDate = Format(Date, "dd") & strArg2 & Format(Date, "mm") & strArg2 & Year(Date)
Case Is = 4 ' Wochenzähler
strDate = Format(Date, "ww") & strArg2 & Year(Date)
Case Is = 5 ' Monatszähler
strDate = Format(Date, "mm") & strArg2 & Year(Date)
Case Is = 6 ' Jahreszähler
strDate = Year(Date)
Case Else
GoTo ExitHere
End Select

' Festlegen ob Zähler Rechts oder Links
If boolAlign = True Then
strAlignment = "LEFT"
Else
strAlignment = "RIGHT"
End If

' Länge des Datumstrings
intLenStr = Len(strDate)

' Bedingung für den letzten Wert festlegen
strBedingung = strAlignment & "([" & strFeldName & "]," & intLenStr & ")='" & strDate & "'"

' Letzen Wert suchen
strMax = DMax(strFeldName, strTabName, strBedingung)

If IsNull(strMax) Then
' Start mit 0 oder 1
If boolStart = False Then
strNo = String$(intNoLen, "0")
Else
strNo = String$(intNoLen - 1, "0") & "1"
End If
Else
' Zähler Links oder Rechts
If boolAlign = True Then
strNo = Right(strMax, intNoLen)
Else
strNo = Left(strMax, intNoLen)
End If
' Zähler setzen
strNo = Format$(Val(strNo) + 1, String$(intNoLen, "0"))
End If

' Zählerstring zusammensetzen
If boolAlign = True Then
UniCounter = strDate & strArg & strNo
Else
UniCounter = strNo & strArg & strDate
End If

ExitHere:
Exit Function
ErrHandler:
Dim strErrString As String
strErrString = "Error Information..." & vbCrLf
strErrString = strErrString & "Error#: " & Err.Number & vbCrLf
strErrString = strErrString & "Description: " & Err.Description
MsgBox strErrString, vbCritical + vbOKOnly, "Function: WeekCounter"
Resume ExitHere
End Function

Eine genaue Funktionsbeschreibung und Anwendung ist in der Bsp-DB enthalten.


Bedanken möchte ich mich noch bei Jan Eilers, der mir noch ein paar Tipps zur allgemeinen Verständlichkeit, des Bsp's gab.

Also wenn es Kritik, Meinungen oder Vorschläge zu der DB gibt, dann immer raus damit.

TommyK
23.01.2004, 17:17
hopp

heini
28.01.2004, 11:55
Hallo Tommy!

Ich habe eben mal dein Beispiel getestet.
Es funktioniert super und ist mir doch glatt 4 Sterne wert :biggrinl:

:top:

Beko
09.05.2004, 15:02
Hallo Tommy!

So ganz verstehe ich deine DB nicht ich bin Anfänger könntest du mir ein Beispiel bringen wie ich die von dir so gut ausgearbeitete DB einsetzen kann wäre das möglich?

Gruß
Bernd :eek:

Michael
17.06.2004, 23:10
Hallo Thommy,
Ich habe soeben deine Beispiel DB heruntergeladen.
Wie kann ich über einen Schalter den laufenden Counter erzeugen.
Formular -> Schalter --> Neuer Vorgang und jetzt muss doch die Prozedur
aufgerufen werden. Aber wie........
Bei mir geht heute nicht mehr. Vielleicht kannst Du mir ja weiterhelfen.
mfg,
Michael

oliverV
24.06.2004, 11:20
Vielen Dank Tommy,

dadurch habe ich viel Zeit beim Erstellen einer zusammengesetzten Rechnungsnummer gespart.

Gruß

Oliver

TroyMcLure
05.01.2006, 17:57
Hallo Tommy,

Danke für Deine Rechnungsnummer-Lösung, funktioniert wunderbar bei mir.
Jetzt habe ich vor den UniCounter in einem Access-Projekt einzusetzen (also Access auf SQL-Server 2K) und scheitere an dem Punkt, bei dem der höchste Wert des Datensatzes in der Tabelle gesucht wird:
---
' Letzen Wert suchen
strMax = DMax(strFeldName, strTabName, strBedingung)
---
Dies müsste nun sicher per DAO/ADO geschehen, leider reichen meine VBA-Kenntnisse dafür nicht. Hättest Du eine Lösung dafür?

Besten Dank im Vorraus
Troy Mc Lure

TommyK
06.01.2006, 07:13
Hallo,

da bin ich jetzt etwas überfragt.
Denn auch über DAO/ADO und ein Recordset käme die Funktion DMax zum Einsatz. Testen könnte ich es auch nicht, da ich kein SQL-Server installiert habe.

TroyMcLure
06.01.2006, 10:15
Moin Moin Tommy,

Danke für die schnelle Antwort, ich werde nochmal als "frische" Frage ins Forum werfen - vielleicht fällt jemandem etwas ein.


Beste Grüße
TroyMcLure

TommyK
04.03.2006, 10:55
Hallo,

es gibt ein Update des Unicounter.
Neu: Zähler mit beliebigen Präfixen
Neu: Zähler mit variablen Bezugsdatum, um z.B. Zähler rückwirkend zu erstellen.
Info und Download: Erstellung von benutzerdefinierten Zählern (http://www.access-beispiele.tommyk-webbox.de/bsp_frm.php#frm_count)

Marco E
18.05.2008, 16:04
Hallo

Kann mir jemand helfen? Ich kann die Datenbank nicht öffnen, sie ist ja auch knapp 4 Jahre alt.
Ich bräuchte eine Rechnungsnummer: Jahr (letzten beiden Zahlen oder komplett vierstellig) und eine fünfstellige (oder siebenstellige) Nummer. getrennt kann das ganze beispielsweise durch einen Bindestrich, ein Leerzeichen oder gar nicht sein.
Also das Jahr soll aus dem System ausgelesen werden und der Rest wie ein Index. Geht das? MS Access 2003

Vielen Dank,

Grüße

Marco

TommyK
18.05.2008, 18:58
Hallo Marco,

hier findest Du die aktuelle Version:
Erstellung von benutzerdefinierten Zählern (http://www.tksoft-online.de/MS-Access-Bsp.-DB-s/Bsp.-Downloads-Formulare/Erstellung-von-benutzerdefinierten-Zaehlern.html)
Registrierung erforderlich.

Marco E
18.05.2008, 19:37
Guten Abend nochmal, ich hab mich mal registiert aber nichts passendes so recht gefunden. Gibts auch ne möglichkeit ohne VBA? Kann mir jemand anhand der Beschreibung helfen?

Grüße

Also ich präzisiere es nochmal:

Ich habe jetzt die Syntax:
UniCounter_New(7;"T_Rechnung";"Zaehler_ID_Jahr";7;Wahr;Wahr;"-")

Aber das kann ich ja schlecht als "Eingabeformat" ins RechnungsID Feld eintragen, funktioniert nicht!

TommyK
19.05.2008, 03:43
Gibts auch ne möglichkeit ohne VBA?
Wenn das ginge bräuchte ich ja nicht so einen Aufwand machen.

Aber das kann ich ja schlecht als "Eingabeformat" ins RechnungsID Feld eintragen, funktioniert nicht!
In der Bsp-DB ist genau beschrieben wie es geht.
Auf jeden Fall nicht im Eingabeformat.

Josef P.
19.05.2008, 14:31
Gibts auch ne möglichkeit ohne VBA?
Wenn das ginge bräuchte ich ja nicht so einen Aufwand machen.
... man könnte die Teile einer "benutzerdefinierten Nummer" trennen, damit der Zähler in einem eigenen Feld steht und dann per SQL die nächste freie Nummer im Bereich ermitteln.
Damit hat man dann zwar mehrere Felder, die mittels SQL zu einem Feld zusammengefügt werden müssen, wenn man im Formular nur ein Feld haben will, aber es wäre eine Möglichkeit ohne VBA. :D

Marco E
19.05.2008, 15:25
Soweit ist ja alles klar. Ich habe nur nie im VBA programmiert und weis nicht, wie der Aufbau sein soll. Also wie ich ich das Modul fertigen soll, welche lediglich die Zeile beinhaltet.

UniCounter_New(7;"T_Rechnung";"Zaehler_ID_Jahr";7;Wahr;Wahr;"-")

Josefs Variante ist mir auch schon durch den Kopf gegangen, jedoch möchte ich die Jahreszahl vom System auslesen lassen, und nicht extra eingeben.

TommyK
20.05.2008, 07:05
Hallo Marco,

Also wie ich ich das Modul fertigen soll, welche lediglich die Zeile beinhaltet.

Überhaupt nicht.
Du kopierst das Modul aus der Bsp-DB in Deine DB.
Der Aufruf erfolgt dann wie im Bsp im Standardwert des betreffenden Feldes in Deinem Formular.

Marco E
22.05.2008, 14:56
Hey...!

Vielen Dank, es funktioniert erstmal. Danke! Große Klasse!