Page 1 sur 1

Evaluate or not Evaluate

MessagePublié: 09 Oct 2003 à 15:10
par albator
Bonjour,Voici un bout de code :Dim vTmp As Variant' Créateur sTmp = docMail.From(0)sEvaluate$ = {@DbLookup("":"";@Subset(@DbName;1):"Names";"($Users)";"} & sTmp & {";"FullName")}vTmp = Evaluate(sEvaluate$)docDRG.dCreateur = vTmp(1)Ce code fonctionne parfaitement, SAUF si l'evaluate ne fonctionne pas (nom utilisateur transmis inconnu par ex). J'ai essayé :If vTmp(0) = "" Then blabla...If vTmp = "" Then .... (là, erreur de compil)En fait, quand je regarde en debug, vTmp n'est pas instancié, et l'erreur que j'ai c'est "variant does not contain a container"Comment puis je faire pour tester si evaluate retourne qque chose de correct ??Merci.

Re: Evaluate or not Evaluate

MessagePublié: 09 Oct 2003 à 16:46
par Droad
if isempty(vtmp) then ...if not isarray(vtmp) then ...[%sig%]

Re: Evaluate or not Evaluate

MessagePublié: 10 Oct 2003 à 08:17
par Cedric
Personnellement, je n'aime pas les @DbLookup en plein milieu de script.Je préfère utiliser le LS autant que possible dans les agents.Tu pourrais écrire une fonction DbLookup :)Sinon, si tu tiens à utiliser ton evaluate, rien ne t'empêche de faire un truc comme ça:sEvaluate$ = |tVal := @DbLookup("":"";@Subset(@DbName;1):"Names";"($Users)";" | & sTmp & | ";"FullName") ;@If(@IsError(tVal) ; "" ; tVal)|On peut vraiment mettre des formules complètes dans un evaluate, et donc passer par des variables intermédiaires :)

Re: Evaluate or not Evaluate

MessagePublié: 10 Oct 2003 à 10:34
par albator
Je suis complètement d'accord avec toi mais bon ... D'ailleurs, si tu as sous la main une fonction DBLookup qui permet de récupérer le nom d'un bonhomme dans le carnet d'adresses public à partir de son mail, je prend !!! ;-)

Re: Evaluate or not Evaluate

MessagePublié: 10 Oct 2003 à 10:36
par albator
Le isempty marche pile poilMerci

Re: Evaluate or not Evaluate

MessagePublié: 13 Oct 2003 à 09:19
par Dave
il faut que tu fasses une copie de la names.nsf sans copier la LCA pour avoir l'accès gestionnaire et tu cherches dans les vues, la vue ayant en première colonne l'adresse mail et là tu fais ton @dblookup.

Re: Evaluate or not Evaluate

MessagePublié: 13 Oct 2003 à 09:20
par Cedric
Alors, voila le code que j'utilise, je le donne sous licence "Domaine public" :o))Ce n'est pas juste une fonction DbLookup simple.J'ai ajouté un cache de vues. En effet, en LotusScript l'ouverture d'une vue prend beaucoup de temps (style 0,5s). Lorsqu'on a plusieurs recherches à effectuer dans la même vue, on voit clairement le problème.J'ai donc écrit une classe (J'aime bien la POO) qui gère un cache de vues.Ainsi lorsqu'on désire ouvrir une vue, il suffit d'appeler ce cache de lui indiquer le serveur, la base et la vue et il retournera la vue demandée (ou nothing si elle n'est pas accessible ou inexistante).Ma fonction DbLookup utilise ce cache, c'est pour ça que j'ai rajouté ce code.Pour l'utiliser dans une appli, copier/coller dans une librairie de Script.Ensuite faire un Use de la librairie et puis appeler le DbLookup :o)Voila, plus rien à ajouter.' Le cache des vues. A Interroger en priorité pour accéder à une vue rapidementDim gCache As ViewCacheClass ViewCacheEntry m_Db As NotesDatabase m_View As NotesView Function GetView() As NotesView Set GetView = m_View End Function Sub New (Srv As String , DB As String , ViewName As String ) Set m_Db = New NotesDatabase( "" , "" ) If m_Db.OpenWithFailOver( Srv , Db ) Then Set m_View = m_DB.GetView( ViewName ) End If End Sub End ClassClass ViewCache m_Views List As ViewCacheEntry Function GetView(Srv As String , DB As String , ViewName As String) As NotesView Dim Key As String Key = Lcase(srv) + "@" + Lcase( Db ) + "@" +Lcase(ViewName) If Iselement( m_Views(Key) ) Then Else Set m_Views(Key) = New ViewCacheEntry(Srv, Db, ViewName) End If Set GetView = m_Views(Key).GetView() End FunctionEnd ClassFunction DbLookup( DB As NotesDatabase, ViewName As String , Key As Variant , Formula As String) As Variant Dim V As NotesView Dim Doc As NotesDocument Dim Ret As Variant Set V = gCache.GetView(Db.Server, Db.FilePath, ViewName ) Set Doc = V.GetDocumentByKey( Key , True) If Not Doc Is Nothing Then DbLookup = Evaluate ( Formula , Doc ) Else Redim Ret(0) Ret(0) = "" DbLookup = Ret End If End Function