Avatar billede -thomas- Nybegynder
02. oktober 2003 - 09:39 Der er 41 kommentarer og
2 løsninger

Fortløbende numre

Jeg har forgæves forsøgt at finde ud af, hvordan man kan have et felt, som bliver tildelt et fortløbende nummer, når formen gemmes.
Se http://www.eksperten.dk/spm/402639

Jeg har i ovenstående spg. fået koden:
_number:=@Subset(@DbColumn( "" : "NoCache" ; "" ; "Count" ; 1 );1);
FIELD ID := @If(@IsError(_number) | _number="";1;_number+1);
@Success

Men den synes ikke at virke efter hensigten - den første form jeg gemmer får 1, den næste 2 og alle efterfølgende også 2.

Jeg har fundet dette link, men synes heller ikke jeg kan få det til at virke: http://www-10.lotus.com/ldd/nd6forum.nsf/0/6314283d9a2f605985256d6c0042b521?OpenDocument

Er der nogen, der har en ide til hvordan det kan gøres så det virker?
Avatar billede yeager Nybegynder
02. oktober 2003 - 09:46 #1
Det er hvad man må betegne som et klassisk spørgsmål....
Problemet er at opdateringen skal ske på serveren, ellers risikere man at samme nummer tildeles flere doc.

Jeg har lavet en løsning hvor en agent hver 5 min opdaterer. Da det er en agent kører den sekventielt og løser problemet. Agenten tager mad value fra et view.

Med denne løsning har du dog det problem at nummeret ikke påføres med det samme. Tror du dette kunne være en løsning for dit problem.

MvHans
Avatar billede yeager Nybegynder
02. oktober 2003 - 09:47 #2
der skulle lige ha' stået "max value" og ikke " mad value"..... ;o)
Avatar billede -thomas- Nybegynder
02. oktober 2003 - 09:50 #3
Ja, har set spørgsmålet mange steder på nettet, og kan ikke forstå at det er så svært for Lotus at lave fortløbende numre - det er jo den nemmeste opgave i alle andre systemer...

Men er den forslåede løsning i http://www.eksperten.dk/spm/402639 ikke brugbar?

Hvorfor kan den kun finde ud af at tælle til 2?
Avatar billede yeager Nybegynder
02. oktober 2003 - 09:57 #4
Jeg må lige tænke . .  .
02. oktober 2003 - 10:01 #5
Ja, det er mig der lavede koden. Glemte at skrive at den første kolonne i Count view'et skulle sorteres i faldende orden (Descending). Undskyld.
Avatar billede yeager Nybegynder
02. oktober 2003 - 10:05 #6
Det kunne jo forklare 2,2,2,2 (lol)
Avatar billede -thomas- Nybegynder
02. oktober 2003 - 10:09 #7
kaspertm> Kan jo egentlig godt se logikken i at det skal være descending... det kunne jeg bare ikke lige selv nå frem til... :)

Det ser ud til at virke perfekt nu. Eneste problem er vel hvis man sletter det sidste nummer, så kan det blive oprettet igen - det må man jo så bare lade være med...

Tak for hjælpen! Smid nogle svar, så fordeler jeg nogle point :)
Avatar billede cdelicht Nybegynder
02. oktober 2003 - 10:10 #8
>>yeager: Notes understøtter ikke fortløbne numre umiddelbart fordi det er et distruberet system. Det er jo ikke til at se hvad nummer et nyt dokument skal have når man arberjder på en lokal replika uden adgang til serveren.
>> Løsningen er følgende: Opret en ny formular med et nummerisk felt indeholdende første nummere i din nummer serie.
De dokumenter der skal have nummer tilført, må have kode i QuerySave til at håndtere dette numer, f.eks. Doc.NummerFelt = SerNum, hvor SerNum bør være en central funktion.
I SerNum gør du følgende
Diverse dim'er, bla. SaveOK , RetryTimes as integer
sæt Doc = View.GetDocumentByUNID(<din formular m. nummerfelt>)
SaveOK = False
While not SaveOK
Nr = Doc.NrFelt(0) + 1
Doc.NrFelt = Nr
SaveOK = Doc.Save
If SaveOK = False
RetryTimes = RetryTimes +1
If RetryTimes = 20 Then ExitFunction
set Doc = nothing
sæt Doc = View.GetDocumentByUNID(<din formular m. nummerfelt>)
wend
SerNum = Nr
end function
Avatar billede cdelicht Nybegynder
02. oktober 2003 - 10:10 #9
nå det var jeg vist lidt for længe om at få skrevet :-)
Avatar billede -thomas- Nybegynder
02. oktober 2003 - 10:15 #10
cdelicht> Nu forvirrer du jo bare :-) - er det en bedre løsning, anyone?
Avatar billede cdelicht Nybegynder
02. oktober 2003 - 10:18 #11
Bedre: ?
Sikekr: Jep. Bullet proof. Bruger den i adskillige systemer hos forskellige kunder og internt. Har aldrig gevet problemer!
Avatar billede cdelicht Nybegynder
02. oktober 2003 - 10:19 #12
Man kan nemlig også håndtere loikale replika ved kun at tildele numre når basen er på serveren! Cool lille feature ;-)
Avatar billede -thomas- Nybegynder
02. oktober 2003 - 10:21 #13
Ok, kan du forklare hvad den præcis gør anderledes end den anden?
Avatar billede yeager Nybegynder
02. oktober 2003 - 10:22 #14
Jeg vil ikke have point for den minimale indsats!

Cdelicht; Roger, kan du hurtigt ridse ned i ord hvad din QuerySave gør. Jeg vil da overveje om din kode er bedre end mit agent system (der trods alt virker omend med forsinkelse)

Hygge
Avatar billede cdelicht Nybegynder
02. oktober 2003 - 10:26 #15
QS i meget forenklet udgave:
bla bla bla
Doc.NummerFelt = SerNum
bla bla bla

Bemærk lige at ovenstående SerNum beskrivelse også er noget forenklet - mere en principskitse.
Avatar billede -thomas- Nybegynder
02. oktober 2003 - 10:28 #16
Det er vel ikke Doc.NummerFelt = SerNum der er interessant, men hvordan SerNum-værdien tildeles, eller hvad?
Avatar billede cdelicht Nybegynder
02. oktober 2003 - 10:29 #17
look above!
Avatar billede cdelicht Nybegynder
02. oktober 2003 - 10:33 #18
der er ikke meget kode i QS -det ligger centralt.
Faktisk ligger hele nummer systemet central da jeg arbejder med mange forskelige nummer serier.
Avatar billede cdelicht Nybegynder
02. oktober 2003 - 10:33 #19
Central = egen db
02. oktober 2003 - 10:39 #20
thomas>Den løsning jeg har givet dig, bruger jeg i en database for vores revisionsafdeling uden problemer. Teoretisk kan der dog opstå problemer hvis en bruger laver et nyt dokument på en lokal replika, som cdelicht er inde på. Har dine brugere behov for det?
cdelicht> Opererer du med to formularer, en til at holde styr på numrene og en til de dokumenter, der skal nummereres? Hvis det er tilfældet, gemmer du så alle numrene i et dokument eller et dokument pr. nummer?
Avatar billede -thomas- Nybegynder
02. oktober 2003 - 10:43 #21
kaspertm> Databasen jeg skal bruge det på, bliver kun kørt på serveren - aldrig på en lokal replika. Så jeg kan godt bruge din kode uden problemer?
02. oktober 2003 - 10:49 #22
Ja, det kan du godt.
Avatar billede -thomas- Nybegynder
02. oktober 2003 - 10:52 #23
Ok, endnu engang tak for hjælpen, cdelicht får også lidt af pointene for forsøget.
Avatar billede yeager Nybegynder
02. oktober 2003 - 10:55 #24
Jeg ville ønske jeg lige havde det forkromede overblik over cdlicht's løsning... men jeg må hellere lade det ligge.
Avatar billede -thomas- Nybegynder
02. oktober 2003 - 10:56 #25
Ja, jeg ville ønske jeg forstod hvorfor lotus notes skal være så besværligt, men det må jeg også hellere lade ligge :-)
Avatar billede cdelicht Nybegynder
02. oktober 2003 - 10:56 #26
En formular pr. nummerserie!
Ja, min løsning er lidt mere kompleks, men gør det ikke sværere for dig selv end nødvendigt ;-)
Avatar billede cdelicht Nybegynder
02. oktober 2003 - 10:58 #27
Notes er IKKE besværlig, omend der er nogen bumiddelbare begrænsninger. Det er bare ikke MS!
Faktisk er Notes udviklere nogen af de mest kreative udviklere der findes, fordi nogen ting bare ikke er lige til i Notes.
Avatar billede -thomas- Nybegynder
02. oktober 2003 - 11:02 #28
Det med at tingene ikke er lige til i Notes, kan jeg godt nikke genkendende til. Men o man bliver kreativ eller pisseirriteret af det, det kan jeg ikke svare på. :)
Avatar billede jogii Nybegynder
02. oktober 2003 - 12:47 #29
Jeg har selv for nogle år siden prøvet cdelichts løsning. Det gode ved den er at den faktisk er meget præcis. Mens kaspertms løsning er den "gængse" gamle måde at gøre det på, så kan man faktisk fremprovokere dupletter ved at gemme mange dokumenter samtidig. cdelichts løsning tager højde for det ved at udnytte Notes safe-conflict håndtering.

ideen er som følger:
få adgang til serienummerdokumentet
inkrementer serienummeret
forsøg at gemme dokumentet
hvis det lykkes, tildel dokumentet der skal gemmes det godkendte serienummer.
hvis det ikke lykkedes, start forfra

cdelicht laver en tæller på 20 forsøg. Hvis det ikke lykkedes inden 20 forsøg tildeles ingen nummer. Nummeres skal derefter tildeles ved en anden lejlighed.

I ND6 kan man arbejde med dokumentlåse, som gør dette på den rigtige måde. men jeg har hørt nogle sige at dokumentlåse ikke er helt sikre endnu.

> thomas > ja, det kan være du synes det er besværligt, men hvis man tvang andre systemer at kunne gøre det samme som Notes, så ville disse komme frem med helt lignende løsninger. Nu har jeg arbejdet med Notes siden '93, og jeg LOVER dig jeg syntes det var besværligt, både administrationsmæssigt og programmeringsmæssigt. Men det er meget sjældent at de har taget fejl, de folk fra Lotus. Lige fra starten (V1-V2) har der være taget højde for mange af de problemer, som MS først nu er ved at opdage at de har. Og for det meste er der en fornuftig forklaring på hvorfor noget ikke kan lade sig gøre "nemt". Hav lidt tålmodighed og vær åben over for de muligheder systemet giver dig, så vil du opdage at dette er en meget bred infrastruktur, som kan rumme mange af de opgaver der skal løses, vel og mærke med selv samme produkt/platform.
//Jörg
Avatar billede -thomas- Nybegynder
02. oktober 2003 - 12:56 #30
jogii> Du har formentlig ret i, at ms-programmerne langt fra kan det som Notes kan. Men jeg forstår bare ikke, hvorfor helt basale ting som autonummerering ikke er indbygget i Lotus Notes. I f.eks. MS-SQL (eller en hvilken som helst anden database) er det jo en indbygget funktion, at databasen tildeler et autonummer-felt en værdi, når der oprettes en record.
Bortset fra det, kan jeg sagtens se hvad det smarte ved notes er - synes dog stadig, at tingene kunne gøres smartere. Men jeg vænner mig jo nok til det :)
Avatar billede pr0gm4n Nybegynder
02. oktober 2003 - 14:47 #31
Thomas>>
Der er skam autonummering i Lotus Notes, og det har der været fra start af.

Alle dokumenter bliver tildelt et nummer, når de bliver oprettet. Og Notes er tilmed så smart at dette nummer altid er unikt og derfor kan bruges til entydig identifikation af ethvert Notes-dokument (herunder design elementer).

At alle dokumenter har et unikt nummer er faktisk årsagen til at replikering kan fungere. Og Notes' replikering er jo grundstenen i det distribuerede miljø som jo er Notes' styke.

Brugerne kan arbejde  med Notes-databaser placeret på servere overalt i verdenen sågar lokalt og alligevel vil alle brugere kunne se de udarbejde dokumenter inden for en overskuelig tidshorisont (alt efter hvorledes replikeringen er sat op).

Og i et sådan distribueret miljø, er det jo nonsens at arbejde med fortløbende numre. For hvordan skulle en applikation der er spredt ud over hele verdenen kunne nummere fortløbende?

Nu kan mennesker jo noget bedre håndtere fortløbende numre i decimal systemet end Notes' unik ids i HEX, og det er også årsagen til at løsninger som de ovenfor beskrevne bliver lavet - og fred være med det.

Men husk Notes' store styrke er det distribuerede miljø, hvor sådanne numre ikke giver mening. Så derfor er det bestemt ikke en basal ting der mangler i Notes. Hvis der blev indbygget en funktion til autonummerering så ville den funktion jo samtidigt kræver at replikering af den pågældende base blev disablet.
Avatar billede -thomas- Nybegynder
02. oktober 2003 - 14:50 #32
pr0gm4n> Tak for forklaringen :)
Avatar billede -thomas- Nybegynder
02. oktober 2003 - 14:54 #33
Hvordan får jeg i øvrigt koden i Querysave til kun at blive udført, hvis dokumentet oprettes og ikke når det redigeres?
Avatar billede -thomas- Nybegynder
02. oktober 2003 - 14:55 #34
Altså noget lign:

Dim uidoc As NotesUIDocument
If uidoc.IsNewDoc Then ...

i LotusScript, men det skal ved også være i Formula?
Avatar billede -thomas- Nybegynder
02. oktober 2003 - 14:58 #35
Går udfra jeg skal bruge @If(@IsNewDoc;  men hvordan sætter jeg det ind i:

_number:=@Subset(@DbColumn( "" : "NoCache" ; "" ; "Count" ; 1 );1);
FIELD ID := @If(@IsError(_number) | _number="";1;_number+1);
@Success
Avatar billede -thomas- Nybegynder
02. oktober 2003 - 15:11 #36
Har lavet dette, så nu håber jeg det er rigtigt - det ser ud til at virke:

_number:=@Subset(@DbColumn( "" : "NoCache" ; "" ; "Count" ; 1 );1);
newID := @If(@IsError(_number) | _number="";1;_number+1);
FIELD ID := @If(@IsNewDoc;newID;ID);
@Success
Avatar billede yeager Nybegynder
02. oktober 2003 - 15:13 #37
halleluja - jeg tror ski' at jeg er ved at se lyset 8^)

Jörg's forklaring var vist nok lige det overblik jeg manglede.

Nu skal jeg bare lige overveje om det kan svare sig at lave min agentbaserede løsning om.
Tak Jörg!
Avatar billede jogii Nybegynder
02. oktober 2003 - 17:04 #38
Du skal ikke lave tildelingen af nummeret under åbningen af dokumentet (QueryOpen). Hvis nu brugeren fortryder oprettelsen, så er tildelingen forgæves. Tildelingen "committes" først når dokumentet bliver gemt. Når brugeren er flere minutter om at gemme, så vil andre personer få tildelt det samme nummer, sålænge dokumenterne ikke er gemt.
Du SKAL håndtere tildelingen i QS. Start med at spørge om dokumentet i forvejen har et serienummer. Hvis ikke, så tildel, ellers spring over.
//Jörg
Avatar billede -thomas- Nybegynder
02. oktober 2003 - 18:42 #39
jogii> Jeg tildeler det jo netop ikke i QueryOpen, men i QuerySave. Og jeg tjekker også om det er et dokument, som netop er oprettet eller et der bliver redigeret.
Avatar billede jogii Nybegynder
02. oktober 2003 - 19:15 #40
Undskyld. Der overså jeg. Det var bare brugen af @IsNewdoc der irriterede mig.
Jeg vil heller checke
@If(ID=""; @Return(""); @Success);
FIELD ID := <code>
Avatar billede -thomas- Nybegynder
02. oktober 2003 - 19:43 #41
Kan man da ikke regne med @IsNewDoc? Ellers kan jeg da ikke se, hvad forskellen skulle være?
Avatar billede jogii Nybegynder
02. oktober 2003 - 23:41 #42
Jeg har altid lagt denne kode ind i selve ID-feltet som et computed felt
@If( @IsNewdoc & @IsDocBeingSaved; @Success; @Return(ID));
<kode>
Så kan man bruge QS-eventen til andre formål.

@IsNewDoc virker fint. Man kan dog komme ud for situationer hvor man får oprettet dokumenter i forvejen (f.eks. via LotusScript), så vil @IsNewDoc ikke fange hændelsen.
Avatar billede jogii Nybegynder
02. oktober 2003 - 23:48 #43
Jeg glemte at fortælle vedr. cdelichts løsning, dengang jeg lavede den til Domino 4.6.1 i en web-løsning, så gik processor CPU op i 100% ved samtidig gemning af mange dokumenter, da multiple Web-QS-agenter tilsyneladende gik berserk og prøvede alt for ivrig at få lov. Jeg tror det var nødvendig at indsætte en kunstig pause efter et mislykket forsøg.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester