Avatar billede mobj Nybegynder
13. juli 2004 - 10:45 Der 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.

Er jeg helt på vildspor ?
Avatar billede pr0gm4n Nybegynder
13. juli 2004 - 18:03 #1
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.

Håber det hjalp dig - spørg endelig yderligere.
Avatar billede mobj Nybegynder
14. juli 2004 - 08:31 #2
Hej pr0gm4an

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 ???
Avatar billede pr0gm4n Nybegynder
14. juli 2004 - 13:07 #3
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.
Avatar billede mobj Nybegynder
14. juli 2004 - 13:45 #4
Tusind tak for inputtet.

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)
Avatar billede jogii Nybegynder
15. juli 2004 - 11:42 #5
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");

Nu indeholder variablen _data de ønskede værdier.
Avatar billede pr0gm4n Nybegynder
16. juli 2004 - 11:18 #6
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 ;-)
Avatar billede mobj Nybegynder
28. juli 2004 - 13:03 #7
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???
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