13. juli 2004 - 10:45Der er
6 kommentarer og 1 løsning
Hente felt fra underdokument
Jeg har en database, der er bygget op med ét hoveddokument pr. kunde og en række underdokumenter til den enkelte kunde, der indeholder eksempelvis regnskabsoplysninger.
Er der mulighed for på hoveddokumentet at lave et felt, der automatisk henter oplysninger fra et felt på underdokumentet ?
Jeg er ikke så skrap til programmering i Notes endnu, men jeg har forsøgt mig med formlen: @GetDocField(ParentID;'Feltnavn'). (ParentID skulle indeholde DocID fra "Forældre"-dokumentet). Men jeg bliver afvist med at UNID skal være en 32-cifret hexstreng.
Hvilke af dine dokumenter (hoved eller under) er det aktive?
Når man opretter et responsdokument (et underdokument) opretter Notes automatisk et felt på dette dokument, som identificere dokumentets hoveddokument. Dette felt hedder $Ref. Du kan således, hvis du har underdokumentet som aktivt dokument, skrive og hente oplysninger rimeligt let til og fra hoveddokumentet via @SetDocField og @GetDocField.
Hvis du derimod 'står på' hoveddokumentet og ønsker at opsumerer hvad der står på underdokumenterne, så skal der lidt mere til. Og her vil brugen af LotusScript gør det meget nemmere for dig. Da man i LotusScript udfra et dokument kan få en 'liste' (NotesDocumentCollection) med alle underdokumenter.
Så alt i alt - Du har fat i noget af det rigtige; men alt efter hvorledes din applikation er struktureret så er du kortere eller længere fra målet.
Tak for dit svar. Jeg står på hoveddokumentet, og vil hente oplysninger fra underdokumentet. Så jeg skal vist til at kigge på noget LotusScript, der pt. er lukket land for mig...
Kender du noget sted på nettet, hvor jeg evt. kan oplysninger om dette ???
Der findes masser af gode steder på nettet; men som alt andet på nettet kræver det et vist niveau af indsigt i emnet, at finde det rigtige. Jeg vil derfor ubetinget anbefale dig at benytte Lotus Notes Designer hjælpen istedet for nettet. Men hvis du er helt blank i LotusScript (og ikke har prøvet Visual Basic, VBscript eller lign) så kan det godt være at du umiddelbart finder den svær også.
Hvis du har mod på at kaste dig ud i LotusScript, så skal du vide lidt om klasserne i Notes.
Advarsel!! :-) Følgende vil måske skære en "rigtig programør" i hjertet, og måske er det noget du ved allerede.
En klasse (class) er simpelt sagt en beskrivelse af noget. Noget kan i Notes sammenhæng være et view, et dokument, et felt eller noget helt andet. Klasserne har nogle metoder og nogle properties (egenskaber). Metoderne er noget man kan gøre med klassen, eksempelvis kan man gemme et dokument. Properties fortæller noget om klassen, eksempelvis om dokumentet har været gemt ('IsNewNote').
Dernæst skal du kende den måde klasserne hænger sammen på i Notes, ved første øjekast kan det virke lidt uoverskueligt; men når man tænker over det er faktisk ret naturligt. Eksempelvis kan man fra et dokument få fat i et Richtextfelt på dokumentet.
Og hvad der er smart for dig fra et dokument kan du få fat i (få en handle) til de underdokumenter der er. Da der typisk er mere end et underdokument får man fat i en 'NotesDocumentCollection'.
Med det i baghovedet kan man/du/jeg regne ud at hvis du skal finde noget i hjælpen ang. det du vil løse så skal du kigge under 'NotesDocument' og se på den propertie der hedder 'responses'.
Til næsten alle emner i hjælpen er der eksempler, og langt de fleste eksempler er rigtigt gode, så kast et blik på eksemplet til 'notesdocument.responses' og se om det kan bidrage med indsigt.
I version 6 hjælpen er eksemplet noget med at putte dokumenter i en folder (mappe); men med lidt ihærdighed kan det sagtens modificeres til at du hente nogle værdier i stedet for.
Det næste du så ryger udi er at du skal finde et tidspunkt at udføre dit script på. Skal det eksempelvis være en agent der kører om natten, eller skal det ske når brugeren åbner hoveddokumentet?
Det her er mere simpelt end det lyder til (og især simpelt når man har gjort det før). Men du kan også overveje om strukturen i din applikation er korrekt. Du kunne alternativt benytte formula-language (@) til at skrive oplysninger til hoveddokumentet når underdokumenterne bliver gemt; hvorvidt dette er muligt kommer helt an på hvorledes din applikation er indrettet.
Nu har jeg lidt at arbejde videre med. Desværre er det sidste ikke helt en mulighed, da jeg allerede har flere hundrede hoved- og underdokumenter, at arbejde med. Så jeg vil begive mig ud i LotusScipts forunderlige verden ;o)
Du kan godt anvende GetDocField med følgende mellemvej:
Du kan evt. lave en (hjælpe-)oversigt, som sorterer alle dokumenter på "@Text($REF)". $REF er det felt der angiver at et dokument er "barn" til et andet dokument, samt hvilket. I anden kolonne angiver du "@Text(@DocumentUniqueID)". Så ved først at lave DBLookup op oversigten får du fra anden kolonne UNID'er på alle response-dokumenter.
Nu kommer det jo også an på hvilke type dokumenter der kan/skal hentes data fra. Det er nok ikke alle dokumenter der indeholder de data du efterlyser. Så kan du kombinere data i kolonne 1 eller 2 med ekstra data, som beskriver dokumenttypen. F.eks. kunne første kolonne indeholde formlen "@Text($REF) + Form". Formlen til din DBLookup kunne se sådan ud: _view := "vResponseDocs.Form.UNID"; _key := @Text(@DocumentUniqueID) + "Regnskab"; _column := 2; _lookup := @DbLookup( "":"NoCache"; ""; _view; _key; _column); _unid := @If(@IsError(_lookup); ""; _lookup; _data := @if(_unid = ""; "ingen responseformular af typen REGNSKAB fundet"; @GetDocField( _unid; "Feltnavn");
Jogii har (som altid) ret. Jeg tror dog at hvis man er forholdsvis blank i både @ og LS så vil LS-vejen virke mest intuitiv, specielt hvis man som ny Notes-udvikler har bare et minimum af erfaring med et andet VB-alike sprog.
Men vi er mange, formentlig inklusiv Jogii, som af og til tænker: "Hvad pokker var det lige vi gjorde før vi fik LS i Notes", hvorefter vi kommer i tanke om alle de fantastiske ting der kunne lade sig gøre i R3 ;-)
Tak for dit svar Jogii. Jeg må jo erkende at jeg har brugt din løsning, da det falder mig lettere end LotusScrip. Er der nogen måde hvorpå jeg kan give dig point også ???
Jeg kunne i øvrigt godt tænke mig at bruge samme funktion i et view, men jeg kan ikke rigtig får den til at vise noget !!!
Burde jeg ikke kunne køre en @DbLookup i en kolonne???
Synes godt om
Ny brugerNybegynder
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.