Avatar billede leif Seniormester
12. juni 2008 - 00:14 Der er 36 kommentarer og
1 løsning

DBLookUp i View

Hej,

Jeg bruger følgende kode på et felt i en Form til at trække nogen oplysninger fra en anden form:
_key := @Text(msgid);
_list := @DbLookup( "" : "NoCache" ;"":""; "(notifikation)" ; _key ; 2);
@If(_list = ""; "Der er noget galt"; _list)


Nu ville jeg gerne have samme information ud i et View, men når jeg gør det er _list lige pludselig tom, men _key indeholder det den skal (Ser det i hvert til ud som om hvis jeg udskriver den i stedet for min fejl tekst.


Kan man ikke brugeDbLookUp i et view ?

/Leif
Avatar billede jogii Nybegynder
12. juni 2008 - 07:04 #1
Nej, desværre ikke. Det er et af de måske mest skuffende ting ved Notes.
Hvis man vil sådan noget, så skal man over at bruge DB2 som database backend, så kan man den slags i oversigter (på en DB2 måde). Det er en af de største fordele ved i fremtiden at gå over til DB2 istedet for NSF storage.
12. juni 2008 - 09:01 #2
Nej, det kan man ikke. Der er dog forskellige måder at opnå lidt af det samme på, f.eks. kan man lave en page med en tabel, hvor hver celle er Computed Text. Så kan du godt bruge DbLookup. Her er problemet, at du skal definere en tabel med et bestemt antal rækker. Eller du kan have en form med flere computed multivalue-felter  med new line separator ved siden af hinanden, der hver er defineret med en DbLookup. Her skal man passe på, at antallet af elementer er det samme for hvert felt, og at værdierne ikke bliver for lange, så de ryger ned på næste linie.

Både pages og forms kan du jo sætte ind i navigationen med en outline, så det kan godt komme til at ligne views.
Avatar billede leif Seniormester
12. juni 2008 - 09:37 #3
Det er lidt noget skidt, da jeg skal trække oplysninger 2 steder fra ellers bliver det rigtigt besværligt.


"Problemet" er at jeg modtager 2 http kald fra en anden side som skal kombineres således at jeg kan se den fulde status når jeg logger ind og kigger. (Det er ved afsendelse af SMSer, der får jeg først et kald med at de har modtaget SMSen og bagefter modtager jeg et kald når den er leveret til Mobiltelefonen)
12. juni 2008 - 16:22 #4
Kan du forklare lidt mere om opbygningen af view'et og hvad problemet er. Er hvert dokument i view'et en registrering af en afsendt SMS? Er der så et andet dokument med leveringskvittering, når den er leveret til mobiltelefonen?
Avatar billede leif Seniormester
12. juni 2008 - 16:38 #5
Dokument 1 med Registrering af afsendt SMS
Dokument 2 med Registrering af Leveringsstatus


Og i Viewet vil jeg meget gerne have kombineret de 2 dokumenter således at jeg får 1 linie med hele SMSen

Idag har jeg det som 2 linier til hver SMS og det ødelægger lidt overblikket over hvilke som er fejlet og hvilke som er leveret.

Jeg har da også overvejet om man kunne lave en Agent som læser Dokument 1, søger efter Dokument 2 (baseret på et msgid jeg får fra Gatewayen) og gemmer oplysningen om Leveringsstatus på Dokument 1 således at jeg kun skal læse fra Dokument 1 når jeg åbner viewet
Avatar billede jogii Nybegynder
12. juni 2008 - 16:41 #6
Dokument 2, kommer det ind som email?
Hvis ja, kan du lave en Pre-delivery agent, som sætter status på dokument 1, når dokument 2 er på vej ind i basen. Se, det er smart.
Avatar billede jogii Nybegynder
12. juni 2008 - 16:43 #7
Og så kan du lave dokument 2 om som et Response dokument til Dokument 1 i samme agent. Se nu får du brug for den anden løsning alligevel :-)
Avatar billede leif Seniormester
12. juni 2008 - 16:48 #8
Nej, begge kommer som et http kald og desværre til samme adresse fx:
www.domæne.dk/SMS.nsf/SMS?CreateDocument


Så reelt ser jeg forskellen på et felt de kommer med "requesttype"
Avatar billede leif Seniormester
12. juni 2008 - 16:49 #9
Jeg er ikke med på hvad du mener med: "Se nu får du brug for den anden løsning alligevel :-)" ?
Avatar billede jogii Nybegynder
12. juni 2008 - 17:15 #10
Jo denne her -> http://www.eksperten.dk/spm/830613

Make-response funktionen.

Vedr. HTTP:, så kan du til SMS-formularen tilknytte en WebQuerySave agent, som gør det du ønsker. Den finder ud af, om det er en leverings-post, hvis ja, så finder den den oprindelige afsendelses-post og stempler den.
Avatar billede leif Seniormester
12. juni 2008 - 21:25 #11
Hmm, lige nu blev det en Agent som opdaterer mit Dokument 1 med oplysninger fra Dokument 2, det sker så dog kun hver 5. min, men det må vi leve med lig nu.

Lavet med: http://www.eksperten.dk/spm/809635
Avatar billede leif Seniormester
12. juni 2008 - 21:27 #12
Forresten kan jeg med WebQuerySave reelt køre min agent ?
Avatar billede jogii Nybegynder
12. juni 2008 - 22:35 #13
Det kommer lidt an på din agent, men ja. Hvis agenten er skrevet i LotusScript, så giver propertien DocumentContext dig adgang til det dokument der er ved at blive gemt.
Ud fra nogle data på dette dokument skaffer du dig adgang til det oprindelige dokument1 og opdaterer det.
Avatar billede leif Seniormester
12. juni 2008 - 22:46 #14
Damn, jeg har ikke gennemskuet Lotusscript endnu, desværre.
Avatar billede jogii Nybegynder
12. juni 2008 - 22:48 #15
Post lige din agent her, måske kan den tilpasses. I teorien kan det også lavet i @formel
Avatar billede leif Seniormester
12. juni 2008 - 22:54 #16
SELECT requesttype = "mtstatus" & leveringstatus = "" | leveringstatus = "Entry not found in index";

_key := @Text(msgid);
_list := @DbLookup( "" : "NoCache" ;"":""; "(notifikation)" ; _key ; 2 );


@If( !@IsError( _list ) ; _list ; @Text( _list) = "Entry not found in index or view's index not built" : "Entry not found in index";  FIELD leveringsstatus := "Fejl ved opslag til Status" ;  FIELD leveringsstatus := _list )





Det virker fint hvis jeg har en Schedulet eller kører det fra Actions
Avatar billede leif Seniormester
15. juni 2008 - 14:31 #17
Hvis det kan laves en WebQuerySave er det jo sikkert det "sikreste" og det hurtigste så det gøres med det samme.

Men ellers har Jörg fået point for sit første svar, nemlig det kan man ikke med NSF
Avatar billede jogii Nybegynder
15. juni 2008 - 16:36 #18
løsningen vil være at lave en oversigt, som sorterer Dokument1-dokumenterne efter msgid. Altså en oversigt "modsat" din eksisterende "(notification)" oversigt.
Ideen er at den indkommende "notification/Dokument2" skal kunne finde sit moderdokument/Dokument1 ud fra MSGID. Når det er gjort, skal moderdokumentet opdateres.

Det bedste vil være hvis agenten først henter moderdokumentets UNID , som kan være angivet i kolonne 2 som @Text(@DocumentUniqueID).
Derefter anvendes @SetDocField( _unid; "leveringsstatus"; _status) for at sætte værdien på moderdokumentet.

'

smider lige lidt fra hjælpen ind :
@SetDocField 

Example
Given the unique ID of a document, sets the value of a specific field on that document. The document must reside in the current database.
Syntax
@SetDocField( documentUNID ; fieldName ; newValue )
Parameters
documentUNID
Text. The unique ID of a document. @DocumentUniqueID specifies the unique ID of the current document. To specify the unique ID of the parent document, use $Ref as the first parameter. $Ref is a special field on a response document that contains the unique ID of the parent document.
fieldName
Text. The name of a field on the document, enclosed in quotation marks. If you store the field name in a variable, omit the quotation marks here.
newValue
Text or text list; number or number list; time-date or time-date range. The value you want to give to the field.
Usage
This function does not work in column or selection formulas. @SetDocField is particularly useful in field, button, and agent formulas.
Note  Starting with Release 6, you can use @SetDocField to set the value of a field in the current document, not just in other documents in the same database.
Avatar billede leif Seniormester
15. juni 2008 - 19:21 #19
_status := statuscode;

_key := @Text(msgid);
_unid := @DbLookup( "" : "NoCache" ;"":""; "(afsendelser)" ; _key ; 2 );

@SetDocField( _unid; "leveringsstatus"; _status);



Utestet, men så vil det være noget i den retning, hvis jeg forstår dig rigtigt ?
Avatar billede jogii Nybegynder
15. juni 2008 - 19:29 #20
Det ser ud som noget jeg ville prøve mig med :-)
Avatar billede leif Seniormester
15. juni 2008 - 21:43 #21
Jeg har forsøgt mig med:
_date := @Text(datedelivery);
_statuscode := @Text(@If(statuscode = "0"; "DELIVRD (leveret)";statuscode = "1"; "INVALIDTEL (ugyldigt nummer)"; statuscode = "2"; "UNDELIV (ej leveret)"; "Waiting"));

_status := _statuscode + " " + _date;

_key := @Text(msgid);
_unid := @DbLookup( "" : "NoCache" ;"":""; "(afsendelser)" ; _key ; 2 );

@SetDocField( _unid; "leveringsstatus"; _status);
SELECT @All



Men tilsyneladende fordi at både status og notifiktation har et felt som hedder Statuscode så for den taget statuskoden fra status i stedet for fra Notifikation da den i hvert til får "Leveret" selvom at notifikation kommer med statuscode 2
Avatar billede jogii Nybegynder
16. juni 2008 - 00:41 #22
Umiddelbart nej. Agenten kender kun til det dokument som du er igang med.
Men hvorfor  ikke starte med blot at overføre statuskoden råt? Evt. over i et andet felt.

_date := @Text(datedelivery);
_statuscode := @Text(@If(statuscode = "0"; "DELIVRD (leveret)";statuscode = "1"; "INVALIDTEL (ugyldigt nummer)"; statuscode = "2"; "UNDELIV (ej leveret)"; "Waiting"));

_status := _statuscode + " " + _date;

_key := @Text(msgid);
_unid := @DbLookup( "" : "NoCache" ;"":""; "(afsendelser)" ; _key ; 2 );

@SetDocField( _unid; "leveringsstatus"; _status);
@SetDocField( _unid; "leveringsstatus2"; statuscode);
SELECT @All


Men en anden ting, kan det være at du sætter feltet statuscode til en default-værdi 0 i selve notification-formularen?
Avatar billede jogii Nybegynder
16. juni 2008 - 00:42 #23
Er statuscode text eller number?
Avatar billede leif Seniormester
16. juni 2008 - 09:19 #24
Alle felter er computed med "" og sat som Tekst i formen
Avatar billede jogii Nybegynder
16. juni 2008 - 09:26 #25
får du sat leveringsstatus og leveringstatus2 på Dokument1?
Avatar billede leif Seniormester
16. juni 2008 - 09:40 #26
Vi er enige om at det skal være en Agent som kører ik ?


Hvis jeg sender:
msgid: 1, requesttype: mtstatus og statuscode: 0
msgid: 1, requesttype: notifikationstatus og statuscode 2

Så bliver msgid 1 / requesttype mtstatus ikke opdateret, først når msgid 2 kommer så bliver msgid 1 opdateret både med leveringsstatus og leveringsstatus2


Er det sort snak ?
Avatar billede jogii Nybegynder
16. juni 2008 - 10:09 #27
ja, lidt.
Prøv vis mere præcis hvad der er input/output i hvert tilfælde.
Avatar billede leif Seniormester
16. juni 2008 - 10:35 #28
Der kommer 2 kald

Kald nr. 1:
msgid = 1
requesttype = mtstatus
message = "This is a test"
statuscode = 0


Kald nr. 2:
msgid = 1
requesttype = notifikationstatus
statuscode = 2
datedelivery = 08-08-2008 10:00:00


Jeg ønsker at Kald nr. 1 opdateres således jeg har:
msgid = 1
requesttype = mtstatus
message = "This is a test"
statuscode = 0
statuscode2 = Ej leveret 08-08-2008 10:00:00



Da statuscode 2 i notifikation betyder "Ej leveret"
Avatar billede jogii Nybegynder
16. juni 2008 - 10:47 #29
ja, og hvad kommer der over i feltet "leveringsstatus" og "leveringsstatus2"  på dokument1, efter at dokument2 er blevet submittet?
Avatar billede leif Seniormester
16. juni 2008 - 11:33 #30
Intet, Dokument 1 bliver opdateret når Dokument 3 (Er en ny SMS som er afsendt) kommer men så kommer der de rigtige informationer ind i feltet.
Avatar billede jogii Nybegynder
16. juni 2008 - 12:03 #31
Er det så ikke fordi din anden agent (som kører hvert 5. minut), i mellemtiden har kørt?
Det giver tilhvertilfælde ingen mening.
Avatar billede leif Seniormester
16. juni 2008 - 13:29 #32
Nope, den er nemlig disabled
Avatar billede jogii Nybegynder
16. juni 2008 - 16:10 #33
Leif, kan du ikke sende mig databasen? Det er efterhånden lidt uoverskueligt.
Og evt. en lille vejledning til hvordan webformularen bliver udfyldt.
Avatar billede leif Seniormester
16. juni 2008 - 16:43 #34
Jepper, det kan jeg sagtens gøre. Det bliver lige lidt senere.
Avatar billede leif Seniormester
16. juni 2008 - 21:45 #35
Sendt.
Avatar billede jogii Nybegynder
17. juni 2008 - 14:59 #36
Det blev LotusScript alligevel
Grunden til at din agent "virkede" forsinket var at den var sat til at køre på alle nye/redigerede dokumenter, men den kørte altså ikke på det her helt nye dokument, da det faktisk ikke er gemt endnu.
Den rigtige indstilling for WQS-agenter er scope=none. Men tilsyneladende virker @SetField(UNID...) ikke her.

Så løsningen bliver som jeg antydede fra starten , en LS-agent:

Sub Initialize
    Dim session As New NotesSession
    Dim thisdoc As NotesDocument
    Dim db As NotesDatabase
    Dim view As NotesView
    Dim coll As NotesDocumentCollection
    Dim doc As NotesDocument
   
    Set thisdoc = session.DocumentContext
   
    Set db=session.CurrentDatabase
    Set view = db.GetView( "(afsendelser)")
   
    Set coll = view.GetAllDocumentsByKey( thisdoc.MsgID(0), True)
   
    If coll.Count > 0 Then
        Set doc = coll.GetFirstDocument
        Call doc.ReplaceItemValue( "Leveringsstatus", thisdoc.statuscode(0) )
        Call doc.Save( True, False)
    End If
End Sub
Avatar billede leif Seniormester
17. juni 2008 - 20:58 #37
Kanon, det virker perfekt, med lidt extra udbygning, så som at sætte lidt flere felter samt oversætte den statuscode der er kommer til noget tekst. Jeg siger det mange gange, du styrer
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