Autor Thema: Primärschlüssel: JJJJ-XXXX bzw. Jahr-ID, durchlaufende Nummerierung, Zählwerk  (Gelesen 6665 mal)

Offline padkey

  • Aktives Mitglied
  • ***
  • Beiträge: 107
hallo zusammen,

mal wieder ein Problem mit einer Datenbank. Die Datenbank soll für jedes neu erstellte Dokument, einen "Primärschlüssel" vergeben. Der Aufbau soll sein:JJJJ-XXXX, bsp 2010-0001, 2010-0002 usw. Im Endeffekt eine durchlaufende Nummerierung.

Realisiert wurde dies durch ein Lotus Script. Es gibt ein Document Namens "Documentnumber", welches immer die aktuelle Nummer enthält. Ein Dokument erhält die Nummer erst, wenn es gespeichert wird und ein neues Dokument ist.
Das Script befindet sich in der Form des Dokuments unter Querrysave.

Der Code:
Code
....
If validateForm(uidoc) = True Then
		Set view = db.GetView("$lookup")
		Set doc = view.GetDocumentByKey("Documentnumber")		
		If uiDoc.IsNewDoc = True Then		
			Dim t As Integer
			t = doc.hiddenDocumentNumber(0)
			If Year(Today) <> doc.hiddenYear(0) Then
				Call uidoc.FieldSetText("DocumentNumber",Year(Today) +"-" + "0001")
				' damit nicht Doppel 1 kommt, sollte, eine 2 hin
				doc.hiddendocumentnumber = 2
				doc.hiddenyear = Year(Today)
				Call doc.Save(True,False)
			Else
				Call uidoc.FieldSetText("DocumentNumber", Cstr(Year(Today) +"-" + Right("0000" + Cstr(t),4)))
				doc.Log = doc.Log(0) + "Uhrzeit :" + Cstr(Now) + "Number :" + Cstr(doc.HiddendocumentNumber(0)) + "  UniqueID : " + Cstr(uidoc.Document.UniversalID) + Chr(10)
				doc.hiddenDocumentNumber = t + 1
				Call doc.Save(True,False)
				Call uidoc.Refresh
			End If
'	Else
		End If
	Else
		Continue = False
		Exit Sub
	End If

Fehler:
Es werden Ids ausgelassen, bzw erhalten Dokumente mehrere IDs und werden überspeichert... Dazu befindet sich ein "Log" in DocumentNumber welcher dies verdeutlicht:



So sieht die Sache dann in der Ansicht aus:


Meine Annahme ist, dass der User "irgendwie" doppelt das Dokument abspeichert und er somit irgendwie die Erzeugung einer neuen ID verursacht, obwohl schon eine vergeben ist. Replizierungsprobleme können ausgeschloßen werden, da die DB nur auf dem Server gestartet werden kann.

Hat jmd eine Idee, woran dies liegen könnte?

Wie könnte ich eine besseres Zählwerk erstellen?
Hat Notes dazu schon was zur Verfügung?

Vielen Dank!!!

botschi

  • Gast
Vielleicht gibt es einen Speicherkonflikt mit dem Documentnumber? Was ist denn, wenn 2 oder mehrere User gleichzeitig ein neues Dokument anlegen?

Wird die Nummer auch nur bei neuen Dokumenten vergeben?
Ist das Dokument denn auch wirklich neu?
Ich meine, wenn ein neues Doc mit Script erzeugt wird, ist "isnewedoc" = false...


Matthias

Offline padkey

  • Aktives Mitglied
  • ***
  • Beiträge: 107
Danke...^^
Vielleicht gibt es einen Speicherkonflikt mit dem Documentnumber? Was ist denn, wenn 2 oder mehrere User gleichzeitig ein neues Dokument anlegen?

Wird die Nummer auch nur bei neuen Dokumenten vergeben?
Ist das Dokument denn auch wirklich neu?
Ich meine, wenn ein neues Doc mit Script erzeugt wird, ist "isnewedoc" = false...


Matthias
Die Nummer wird ja erst beim Speichern vergeben,also kommt es drauf an wer zuerst auf Speichern klickt. Speicherkonflikt gibt es nicht.

"Wird die Nummer auch nur bei neuen Dokumenten vergeben?
Ist das Dokument denn auch wirklich neu?"
Das sollte doch durch die Abfrage abgefragt werden...
In der Datenbank werden keine neuen Dokumente per Script erzeugt. Es gibt zu einer Nummer nicht unterschiedliche Dokumente, so dass eine Nummer mehrfachbelegt sit. Sondern ein und das selbe Dokument hat mehrere Nummern!!!

Offline Ralf_M_Petter

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.879
  • Geschlecht: Männlich
  • Jeder ist seines eigenen Glückes Schmied
    • Ralf's Blog
Abgesehen davon, dass man sowas in Notes nicht machen soll, auch wenn ich es selber schon gemacht habe, sollte man zumindest das Dokument, dass der Speicher für die Nummer ist vor dem Verändern Sperren und erst nach dem Ändern wieder entsperren. Dafür muss die Datenbank natürlich für Documentlocking eingerichtet sein.

Grüße

Ralf
Jede Menge Tipps und Tricks zu IT Themen findet Ihr auf meinem Blog  Everything about IT  Eine wahre Schatzkiste sind aber sicher die Beiträge zu meinem Lieblingsthema Tipps und Tricks zu IBM Notes/Domino Schaut doch einfach mal rein.

Offline padkey

  • Aktives Mitglied
  • ***
  • Beiträge: 107
okay, wieso, sperren und entsperren?

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
... das geht auch ohne Sperren - wobei es immer problematisch ist mit sequentiellen Nummern zu arbeiten, vor allem bei Anwendungen, die repliziert vorliegen.

Die übersprungenen Nummern deuten für mich entweder auf Löschungen oder abgebrochene Speicherungen hin. Es kommt darauf an, wo der Code für die Nummernberechnung erfolgt.

Es gibt dazu einen Lib im Netz, mit der man solche sequentiellen Nummern vergeben kann. Die Architektur ist ähnlich der angesprochenen Methode.

Toni

Grüßle Toni :)

Offline Ralf_M_Petter

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.879
  • Geschlecht: Männlich
  • Jeder ist seines eigenen Glückes Schmied
    • Ralf's Blog
Hallo Toni!

Kannst du das erklären, warum dass ohne sperren auch geht?

Grüße

Ralf
Jede Menge Tipps und Tricks zu IT Themen findet Ihr auf meinem Blog  Everything about IT  Eine wahre Schatzkiste sind aber sicher die Beiträge zu meinem Lieblingsthema Tipps und Tricks zu IBM Notes/Domino Schaut doch einfach mal rein.

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
... ich schau heute Abend nach dem Code - da ist es ohne Sperrung drin und funktioniet auch.

Toni
Grüßle Toni :)

Offline Ralf_M_Petter

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.879
  • Geschlecht: Männlich
  • Jeder ist seines eigenen Glückes Schmied
    • Ralf's Blog
@Toni!

hattest du dann mal Zeit das anzuschauen?

Grüße

Ralf
Jede Menge Tipps und Tricks zu IT Themen findet Ihr auf meinem Blog  Everything about IT  Eine wahre Schatzkiste sind aber sicher die Beiträge zu meinem Lieblingsthema Tipps und Tricks zu IBM Notes/Domino Schaut doch einfach mal rein.

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
... sorry - ich schau gleich jetzt nochmal...

Toni  :-[
Grüßle Toni :)

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
... hab jetzt gleich einen Termin - später dann ...

Toni
Grüßle Toni :)

Offline Ralf_M_Petter

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.879
  • Geschlecht: Männlich
  • Jeder ist seines eigenen Glückes Schmied
    • Ralf's Blog
Nicht weiter tragisch, schau es an, wenn du zeit hast.

Grüße

Ralf
Jede Menge Tipps und Tricks zu IT Themen findet Ihr auf meinem Blog  Everything about IT  Eine wahre Schatzkiste sind aber sicher die Beiträge zu meinem Lieblingsthema Tipps und Tricks zu IBM Notes/Domino Schaut doch einfach mal rein.

Offline heini_schwammerl

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 697
  • Geschlecht: Männlich
Kann es nicht sein das der Benutzer noch einen Validierungsfehler erhält?
Du speicherst ja das Schlüsseldokument und hoffst danach das der QuerySave klappt.
Geht der aus irgendeinem Grund schief (z.B. weil eine Formel meckert) geht der Spass evtl. wieder von vorne
los. IsNewDoc ist ja dann immer noch "New".

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
... ich habe es noch nicht vergessen, aber ich habe erst am WE - wenn ich wieder zu Hause bin - Zugriff auf die Datei...

Toni

EDIT:

@padkey

Könntest du in deinem Beitrag mit dem Code eventuell einen Zeilenumbruch veranlassen, damit man den Screen nicht ständig horizontal scollen muß - es würde die Arbeit sehr erleichtern - Danke
« Letzte Änderung: 29.01.10 - 08:01:06 von ata »
Grüßle Toni :)

Offline spookycoder

  • Frischling
  • *
  • Beiträge: 21
  • Geschlecht: Männlich
  • Harald
    • Harrys Blog
Hallo,

eine ganz schicke Lösung für Dein Problem findet sich innerhalb des Assono Frameworks (nein, damit hab ich nix zu tun).

http://www.openntf.org/Projects/pmt.nsf/ProjectLookup/assono%20Framework%202

Da gibt es drinnen mehrere Script Bibiliotheken - darunter auch eine "Common Notes/Domino utils" und darin die Funktion "GetNextCounterFromServer" bzw. "ResolveCounterSaveConflicts.

Diese Funktion:
- holt über einen definierten View ein Dokument in dem die Nummer drinnensteht,
- holt die nummer raus,
- überschreibt sie mit dem gleichen Wert nochmal,
- versucht zu speichern, testet dabei auf Speicherkonflikte und behebt die eventuell auftretenden Speicherkonflikte
- erhöht den Zähler
- speichert den wert ab
- versucht zu speichern, wenn das mit einen konflikt fehlschlägt ruft sich die funktion solange wieder selbst auf, bis das ganze erfolgreich ist.

Weiters gibts bei IBM einen schönen WIKI Eintrag dazu:  http://www-10.lotus.com/ldd/ddwiki.nsf/dx/sequential-numbering.htm

lg

Harald

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
... ich habe nach dem Code geschaut. Das Original habe ich leider nicht mehr gefunden, aber den von mir vor einigen Jahren angepassten Code:

Code
Option Explicit
' # Globale Variablen und Konstanten
Const gsCodePos 		= "Lib.Tools-SequentialNumber."
'
' # Y = yearly | M = monthly | D = daily | N = never
Const csDefaultReset 		= "Y" 			
Const csDefaultMask 		= "YY-###.###"
' # Maskenname fürSetup-Dokument des Nummernkreises
Const csFormSetupSeqNumber 	= "Setup_SeqNumber" 	
' # Ansicht zum Initialisieren des Nummernkreis-Dokumentes => sortiert nach "KeyName"
Const csViewSeqNumber 	= "(#Setup)" 		
Dim sErrText As String
'
Private Function CheckSequentialNumber(  sSetupKey As String , sNumber As String ) As Variant
   ' # Checks the last computed SequentialNumber - does the document exist?
   ' # Returns true or false
   Dim sCodePos As String
   sCodePos = gsCodePos + "CheckSequentialNumber."
   sErrText = ""   
   '
   ' On Error Goto ErrorHandling
   '
   Dim session As New NotesSession
   Dim dbThis As NotesDatabase
   Dim view As NotesView
   Dim doc As NotesDocument
   
   Set dbThis = session.CurrentDatabase
   Set view = dbThis.GetView( "($Setup)" ) ' view is required
   If view Is Nothing Then
      sErrText = " Das Setupdokument für den Nummernkreis konnte nicht initialisiert werden - "
      sErrText = sErrText & "Die Ansicht '" & csViewSeqNumber & "' fehlt in der Datenbank"
      CheckSequentialNumber = False
      Goto wayout
   Else
      ' # Search for document
      Set doc = view.GetDocumentByKey( sNumber , True )
      If Not doc Is Nothing Then
         CheckSequentialNumber = True
         sErrText = " Setup-Dokument gefunden - OK - " & sNumber
      Else
         sErrText = " Setup-Dokument für Nummernkreis konnte nicht gefunden werden - " & sNumber
         CheckSequentialNumber = False
         Goto wayout
      End If
   End If
wayout:
   Print sCodePos & " Report:"     
   Print "..." + sErrText
   Exit Function
ErrorHandling:
   Print sCodePos & " Fehler-Report:"     
   Print Cstr( Err ) + " " + Error + " in Zeile: " & Cstr( Erl ) + sErrText   
   Exit Function
End Function
Private Function GetSetup_SequentialNumber( sSetupKey As String ) As NotesDocument
   ' # Initialize Setup-document - Das Setup-Dokument für den Nummernkreis initialisieren
   ' # Create new doc if not found - Wird keines gefunden, wird ein neues erstellt.
   Dim sCodePos As String
   '
   sCodePos = gsCodePos + "GetSetup_SequentialNumber."
   sErrText = ""
   '
   Dim session As New notesSession
   Dim sName As String
   Dim sLastName As String
   Dim dbThis As NotesDatabase
   Dim viewNumber As NotesView
   Dim docSetup As NotesDocument
   
   ' On Error Goto ErrorHandling
   
   Set GetSetup_SequentialNumber = Nothing
   sName = session.CommonUserName
   sLastName = strRight( sName , " " )
   If Trim( sSetupKey ) <> "" Then
      Set dbThis = session.CurrentDatabase
      Set viewNumber = dbThis.GetView( "($Setup)" ) ' lookup view required
      Set docSetup = viewNumber.GetDocumentByKey( sSetupKey , True )
      
      If docSetup Is Nothing Then
         Set docSetup = dbThis.CreateDocument
         With docSetup
            .Form = csFormSetupSeqNumber
            .KeyName = sSetupKey
            .SeqNumber = 0
            .Reset = csDefaultReset ' => Declarations
            .Mask = "YY-" &  UCase( Left( sName , 1 ) ) & UCase( Left( sLastName , 2 ) ) & "-###.###"    ' csDefaultMask ' => Declarations
            .Year = Cint( Year(Today()) )
            .Month = Cint( Month(Today()) )
            .Day = Cint( Day(Today()) )
            Call docSetup.Save( True , True )
         End With
      End If
      Set GetSetup_SequentialNumber = docSetup
   Else
      sErrText = "Kein Schlüssel für Setup des Nummernkreises."
      Goto ErrorHandling
   End If
   Exit Function
   GoTo wayOut
ErrorHandling:
   Print sCodePos & " Error-no " & Cstr( Err ) + " in row " & erl & ": " & Error & & " => " & sErrText   
   Resume Next
WayOut:
End Function
Private Function MaskSequentialNumber( newnum As Integer, mask As String, sYear As String, sMonth As String, sDay As String ) As String
     ' Returns the masksed (formatted) sequential number string
	
	Dim sNewnumString As String
	Dim sMaskedNewNum As String
	Dim sChar As String
	Dim nLen As Integer
	Dim nPos As Integer
	Dim yPos As Integer
	Dim mPos As Integer
	Dim dPos As Integer
	Dim c As Integer
              
	' On Error Goto errorHandling
	
	sNewnumString = Cstr( newnum )
	sMaskedNewNum = "" ' the formatted seq. num. string
	nLen = Len(Cstr(newnum))
	nPos = 0
	yPos = 0
	mPos = 0
	dPos = 0
	
	For c = Len(mask) To 1  Step -1 ' read backwards
		sChar = Mid$( mask, c, 1 )
		Select Case sChar  ' # Ucase(mChar )
		Case "#" : 
			nPos = nPos + 1
			If nPos > nLen Then 
				sMaskedNewNum = "0" & sMaskedNewNum 
			Else 
				sMaskedNewNum = Mid( sNewnumString, (nLen - (nPos - 1)), 1) & sMaskedNewNum
			End If
		Case "Y" :
			yPos = yPos + 1
			If yPos < 5 Then sMaskedNewNum = Mid( sYear, 5 - yPos, 1) & sMaskedNewNum
		Case "M" :
			mPos = mPos + 1
			If mPos < 3 Then sMaskedNewNum = Mid( sMonth, 3 - mPos, 1) & sMaskedNewNum
		Case "D" :
			dPos = dPos + 1
			If dPos < 3 Then sMaskedNewNum = Mid( sDay, 3 - dPos, 1) & sMaskedNewNum
		Case Else
			sMaskedNewNum = sChar & sMaskedNewNum
		End Select
	Next ' character in mask
	
     ' return masked number
	MaskSequentialNumber = sMaskedNewNum$
      
	' Exit Function
	GoTo wayOut
errorHandling:
	Print "SequentialNumber.MaskSequentialNumber reports error-no" & Cstr(Err) & " in row " & erl & ": " & Error
	Resume Next
wayOut:
End Function
Function GetSequentialNumber( sSetupKey As String , bLookup As Variant ) As String
   ' # Ermittelt die nächste Nummer im Nummernkreis sSetupKey.

  ' # die Anschlußprüfung ist derzeit deaktiviert
   bLookup = False

%REM
sNumber = GetSequentialNumber( "Anton Tauscher.Person" , True ) 
' # Pers. Setup-Dokument für Nummernkreis "Person" mit Anschlußprüfung der Nummer
sNumber = GetSequentialNumber( "Anton Tauscher.MainTask" , False ) 
' # Pers. Setup-Dokument für Nummernkreis "MainTask" ohne Anschlußprüfung der Nummer

%END REM

   '
   Print "GetSequentialNumber => " & sSetupKey
   Dim sCodePos As String
   sCodePos = gsCodePos + "GetSequentialNumber."
   sErrText = ""
   '
   
   Dim session As New NotesSession
   Dim doc As NotesDocument
   
   Dim bSaved As Integer ' acts as semaphor
   Dim tries As Integer
   Dim delay  As Long ' record locking     
   Dim num  As Integer
   Dim newnum  As Integer ' current and next number     
   Dim currentYear  As Integer
   Dim  currentMonth  As Integer
   Dim currentDay  As Integer ' today in numbers
   Dim sYear As String
   Dim sMonth As String
   Dim sDay As String ' today in text
   Dim proNum  As Integer
   Dim proYear As Integer
   Dim proMonth  As Integer
   Dim proDay As Integer ' last vals (in profileNumber)
   Dim sMask As String
   Dim sResetNum As String ' formatting (in profileNumber)
   Dim sMaskedNewNum As String ' the final result  
   Dim sMaskedOldNum As String ' the last result
   Dim bChecked As Variant
   
   Dim nServer As New NotesName( session.CurrentDatabase.Server ) 
   Dim sServer As String
   sServer = nServer.Abbreviated
   If sServer = "" Then sServer = "[Local]" ' Server darf nicht leer sein
   
   ' On Error Goto errorHandling
   
   bSaved = False
   currentYear = Year( Today )
   currentMonth = Month( Today )
   currentDay = Day( Today )
   tries = 1
   
     ' Loop while document profileNumber is not saved
     ' If another user has the document open then it can not be saved.
     ' Aborts after 10 tries and returns 0000 as number
   While bSaved = False
      
      Set doc = GetSetup_SequentialNumber( sSetupKey )
      
      ' # Kein Setup-Dokument für diesen Nummernkreis vorhanden
      If doc Is Nothing Then 
         Print sErrText + " Kein Setup-Dokument für diesen Nummernkreis gefunden: " & sSetupKey
         Goto ErrorHandling
      End If
      '
      If doc.mask(0) = "DISABLED" Then ' # out of order
         GetSequentialNumber = ""
         Exit Function    
      End If
      
      ' # Initialisieren der Setup-Parameter
      If Not IsNumeric( doc.SeqNumber(0) ) Then
         Print sErrText + " Es kann keine Zahl eingelesen werden: " & sSetupKey & " => '" & Cstr(doc.SeqNumber(0)) & "'"
         Goto ErrorHandling
      Else
         Print "... letzte vergebene Nummer für " & sSetupKey & " => '" & doc.SeqNumber(0) & "'"
      End If
      '
      proNum = CInt( doc.SeqNumber(0) )
      num = proNum
      proYear = CInt( doc.Year(0) )
      proMonth = CInt( doc.Month(0) )
      proDay = CInt( doc.Day(0) )
      sMask = doc.Mask( 0 ) 
      sResetNum = doc.Reset( 0 )   
      
      ' # jährlich
      If proYear <> currentYear Then doc.year = currentYear 
      sYear = Cstr( currentYear )
      ' # monatlich
      If proMonth <> currentMonth Then doc.month = currentMonth
      If currentMonth < 10 Then sMonth = "0" & Cstr(currentMonth) Else sMonth = Cstr(currentMonth)
      ' # täglich
      If proDay <> currentDay Then doc.day = currentDay 
      If currentDay < 10 Then sDay = "0" & Cstr( currentDay ) Else sDay = Cstr( currentDay )
      
      ' # Zurücksetzen
      Select Case sResetNum
      Case "N" : num = proNum ' niemals
      Case "Y" : If proYear = currentYear Then num = proNum Else num = 0 ' jährlich
      Case "M" : If proMonth = currentMonth Then num = proNum Else num = 0 ' monatlich
      Case "D" : If proDay = currentDay Then num = proNum Else num = 0 ' täglich
      End Select
      
      newnum = num + 1 ' # neue Nummer berechnen
      
      ' # Maskierung und Formatierung der neuen Nummer
      sMaskedNewNum = MaskSequentialNumber( newnum, sMask, sYear, sMonth, sDay )     
      
      If bLookup Then
         sMaskedOldNum = MaskSequentialNumber( num, sMask, sYear, sMonth, sDay ) 
         bChecked = CheckSequentialNumber( sSetupKey , sMaskedOldNum )
         If num = 0 Then   bChecked = True         
      End If
      
      ' # Die aktuelle Nummer hinterlegen
      If bLookup Then
         If bChecked Then
            doc.SeqNumber = newnum
         Else
            ' # auf die letzte Nummer zurückgreifen
            While bChecked = False
               num = num - 1
               sMaskedOldNum = MaskSequentialNumber( num, sMask, sYear, sMonth, sDay ) 
               sErrText = " Check für: " + sMaskedOldNum
               bChecked = CheckSequentialNumber( sSetupKey , sMaskedOldNum )
               If num = 0 Then bChecked = True
            Wend
            sMaskedNewNum = MaskSequentialNumber( num + 1 , sMask, sYear, sMonth, sDay ) 
            doc.SeqNumber = num + 1
         End If         
      Else
         doc.SeqNumber = newnum
      End If
      
      ' # Speichern des Setup-Dokumentes
      bSaved = doc.save( False, False )       
      If bSaved = False Then 
         Set doc = Nothing ' release to prevent deadlock
         tries = tries + 1
         If tries > 20 Then
            ' timeout feststellen nach 20 Läufen
            sErrText = " TimeOut"
            Goto ErrorHandling
         Else 
            For delay = 1 To 10000
                         ' warten
                         ' 20 x mal versuchen...
            Next               
         End If
      Else
       '  Print "... Fortlaufende Nummer: " & sMaskedNewNum
      End If
      
   Wend ' while bSaved = false
   '
   GetSequentialNumber = sMaskedNewNum
   '
   'Exit Function
   GoTo wayOut
   '
errorHandling:
   '
   Print sCodePos & " error-no" & err & " in row: " & Erl & ": " error & " => " sErrText
   GetSequentialNumber = "0000"
   Resume wayOut
wayOut:
End Function


... ich hoffe es hilft dir weiter. Schau dir den Code an. Es wird mit Lookup-ansichten gearbeitet, die dann natürlich entsprechend erstellt werden müssen...

Toni  ;)
Grüßle Toni :)

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz