Zitat
taurec schrieb:
Auch bei einem DBColumn kannst du einen Schlüssel angeben
In meiner Designer Hilfe steht:
@DbColumn( class : cache ; server : database ; view ; columnNumber )
Wo kann man da einen Schlüssel angeben? :-?
Zitat
taurec schrieb:
Auch bei einem DBColumn kannst du einen Schlüssel angeben
In meiner Designer Hilfe steht:
@DbColumn( class : cache ; server : database ; view ; columnNumber )
Wo kann man da einen Schlüssel angeben? :-?
Sorry, mein Fehler
Aber du kannst ja noch ein @trim(@Right(Values;"Wert")) machen, dann hättest du auch nur die die mit einem bestimmten Wert anfangen
Zitat
taurec schrieb:
Sorry, mein Fehler
Aber du kannst ja noch ein @trim(@Right(Values;"Wert")) machen, dann hättest du auch nur die die mit einem bestimmten Wert anfangen
Verstehe ich jetzt nicht. Ich hab in der Ansicht nachher bspw. folgende Werte:
05/ZX/0001
05/GH/1236
05/GH/1235
05/GH/1234
04/GH/1235
05/AB/1024
05/AB/1023
05/AB/1022
Aufbau JJ/MM/ZZZZ (J=Jahr, M=Kürzel Mitarbeiter, ZZZZ=Zähler für das Jahr und den Mitarbeiter)
Wenn ich nun das aktuelle Maximum für das Jahr 2005 und Mitarbeiter GH haben will, müsste 1236 rauskommen. Ich hab das dann einfach mit mehreren Spalten in der Tabelle gelöst. Angezeigt werden momentan nur Dokument mit Zahl aktuellen Jahr. In der ersten Spalte habe ich das Kürzel sortiert. Dann kann ich mir mit @DbLookup einfach die Werte für einen Mitarbeiter holen, bspw. GH. Das Ergebnis wäre dann eine Liste:
1236:1235:1234
Dann nehme ich mir das erste Element, zähle es um eines hoch und baue meinen neuen Zähler:
05/GH/1237
Dann sagst du @Trim(@Right(Werte aus dem DBColumn;"05/GH/")) und nimmst davon dann das erste Element.
Die Formel macht eigentlich nichts anderes als aus deiner kompletten Liste, nur noch das rechts von dem angegebenen Wert zu extrahieren.
Ist der in einer Zeile nicht drin kommt ein Leertext zurück.
Die Leertexte entfernt man mit @trim und somit bleiben dann nur noch die Zahlen in den zeilen übrig, in denen am Beginn "05/GH/" steht
Zitat
taurec schrieb:
Dann sagst du @Trim(@Right(Werte aus dem DBColumn;"05/GH/")) und nimmst davon dann das erste Element.
Die Formel macht eigentlich nichts anderes als aus deiner kompletten Liste, nur noch das rechts von dem angegebenen Wert zu extrahieren.
Ist der in einer Zeile nicht drin kommt ein Leertext zurück.
Die Leertexte entfernt man mit @trim und somit bleiben dann nur noch die Zahlen in den zeilen übrig, in denen am Beginn "05/GH/" steht
Okay, werde ich mal ausprobieren. In der Hoffnung, dass ich dann die aktuellen Werte aus der Ansicht bekomme. Aber soweit mal: Schankedön.
Nein, hat nix geholfen. Funktioniert zwar prinizipiell wunderbar, hat aber das gleiche Problem wie die @DbLookup Methode: Die Ansicht liefert nicht die aktuellen Daten.
also dann muss an der DB irgend etwas anders sein als bei anderen DBs.
Benutze ich einen DBColumn oder DBLookup, dann werden immer die aktuellen Werte ausgelesen. Kannst Du nicht mal eine neue leere DB anlegen und ein Grundgerüst für die Funktion nachbauen (Nix reinkopieren) und dann probieren, ob es in der neuen DB funktioniert?
Liegt die DB auf einem Server oder lokal?
Gruß
Dirk
Was für Rechte haben denn die Benutzer mit denen du diesen Effekt bekommst ?
Das Problem taucht sowohl auf dem Server als auch lokal auf. Und momentan teste ich es mit meinem Benutzer. Und der ist Manager der Datenbank.
So, habe das Problem gelöst.
Die alte Variante mit der Formelsprache:
REM {Kuerzel bestimmen};_Name := ADM;_List := @Explode(_Name; " ");_Kuerzel := @If(@Count(_List) = 1; @UpperCase(_Name);@UpperCase(@Left(_List[1]; 1)) + @UpperCase(@Left(_List[@Count(_List)]; 1)));REM {Jahr bestimmen};_Jahr := @Right(@Text(@Year(@Today)); 2);REM {Naechste Nummer bestimmen};_Nummern := @DbLookup("": "NoCache"; ""; "AngebotsnummerView"; _Kuerzel; 2);_Nummer := @If(@Elements(_Nummern) > 0; _Nummern[1]; @IsNull(_Nummern); "1"; _Nummern);_Neue_Nummer := @If(@IsNumber(@TextToNumber(_Nummer)); @TextToNumber(_Nummer) + 1; 1);_Volle_Nummer := @If(@Length(@Text(_Neue_Nummer)) = 1; "000" + @Text(_Neue_Nummer);@Length(@Text(_Neue_Nummer)) = 2; "00" + @Text(_Neue_Nummer);@Length(@Text(_Neue_Nummer)) = 3; "0" + @Text(_Neue_Nummer);@Text(_Neue_Nummer));FIELD Angebotsnummer :=@If(@IsNull(Angebotsnummer) | Angebotsnummer = ""; _Jahr + "/" + _Kuerzel + "/" + _Volle_Nummer; Angebotsnummer);@Success
Die neue und funktionierende Variante mit Lotus Script.
Sub Querysave(Source As Notesuidocument, Continue As Variant)
Dim session As New NotesSession
Dim db As NotesDatabase
Dim allDocuments As NotesDocumentCollection
Dim searchCriteria As String
Dim ADM As String
Dim Token As String
Dim Kuerzel As String
Dim Index As Integer
Dim Jahr As String
Dim Angebotsnummer As String
Dim AngebotsnummerR As String
Dim KuerzelAngebot As String
Dim Nummer As Integer
Dim MaxNummer As Integer
Dim NeueNummer As String
If (Source.EditMode And Source.IsNewDoc) Then
Set db = session.CurrentDatabase
searchCriteria = "(!@IsNull(Angebotsnummer))"
searchCriteria = searchCriteria + " & (Angebotsnummer != """")"
searchCriteria = searchCriteria + " & (@Left(Angebotsnummer; 2) = @Right(@Text(@Year(@Today)); 2))"
searchCriteria = searchCriteria + " & (!@IsError(@TextToNumber(@Right(Angebotsnummer; 4))))"
REM Kürzel bestimmen
ADM = Cstr(Source.Document.GetFirstItem("ADM").Text)
Token = ADM
Kuerzel = Left$(Token, 1)
While (Instr(Token, " ") > 0)
Index = Instr(Token, " ")
Token = Right$(Token, Len(Token) - index)
Kuerzel = Kuerzel + Left$(Token, 1)
Wend
Kuerzel = Ucase$(Kuerzel)
REM Jahr bestimmen
Jahr = Format$(Date, "yy")
REM Nächste Nummer bestimmen
maxNummer = 0
Set allDocuments = db.Search(searchCriteria, Nothing, 0)
Set doc = allDocuments.GetFirstDocument
If (Not doc Is Nothing) Then
Messagebox "Verarbeite " + Cstr(allDocuments.Count) + " Dokumente", MB_OK, "Verarbeite"
Do
If (doc.HasItem("Angebotsnummer")) Then
Angebotsnummer = doc.GetFirstItem("Angebotsnummer").Text
AngebotsnummerR = Right$(Angebotsnummer, 4)
KuerzelAngebot = Mid$(Angebotsnummer, 4, 2)
If (Kuerzel = KuerzelAngebot) Then
If (Isnumeric(AngebotsnummerR)) Then
Nummer = Cint(AngebotsnummerR)
If (Nummer > MaxNummer) Then
MaxNummer = Nummer
End If
End If
End If
End If
Set doc = allDocuments.GetNextDocument(doc)
Loop Until (doc Is Nothing)
End If
REM Neue Nummer setzen
NeueNummer = Jahr + "/" + Kuerzel + "/" + Format$(MaxNummer + 1, "0000")
Call Source.FieldSetText("Angebotsnummer", NeueNummer)
End If
End Sub
Alles anzeigen
Wobei Source.EditMode And Source.IsNewDoc wahrscheinlich doppelt gemobbelt ist.