Page 1 sur 1

FTsearch dans une vue?

MessagePublié: 05 Juin 2003 à 13:43
par aer
J'aimerais savoir comment marche le view.FTsearch. J'ai essayé mais je ne vois pas ce que ça fait ou ce que ça doit soi-disant faire: Dim session As New NotesSession Dim db As NotesDatabase Dim view As NotesView Dim doc As NotesDocument Dim j As Integer Set db = session.currentdatabase Set view = db.GetView( "Sans titre" ) j = view.FTSearch( "essai", 0 ) Call view.refreshDans tous les cas, rien ne se passe, la vue reste la meme. Est-ce que quelqu'un pourrait m'explquer comment marche cette methode? Merci.

Re: FTsearch dans une vue?

MessagePublié: 05 Juin 2003 à 13:47
par Raziel
Le ftsearch fait une recherche documentaire (en fonction de l'index documentaire de la base) sur la vue. En fonction du critère que tu lui donne, le "moteur" fait une recherche sur tous les docs de la vue et affiche uniquement ce correspondant au critère. FtSearch teretourne aussi le nombre de document répondant au filtre.

Re: FTsearch dans une vue?

MessagePublié: 10 Juin 2003 à 14:43
par Christine
Même problème...Queql'un pourrait-il me communiquer un exemple de code pour faire une recherche dans une vue ?Merci d'avance.

Re: FTsearch dans une vue?

MessagePublié: 10 Juin 2003 à 17:07
par Stephane Maillard
Bonjour,Attention le FTSearch ne retourne que 250 documents. Si mes souvenirs sont correct le FTSearch fonctionne en back end, arrière plan, donc sur la vue en cours d'affichage, front end ou avant plan, aucune modification ne sera effectuer.Je vous propose une solution un peu différente :Option PublicConst FT_SEARCH_SET_COLL = &H00000001Const FT_SEARCH_NUMDOCS_ONLY = &H00000002Const FT_SEARCH_REFINE = &H00000004Const FT_SEARCH_SCORES = &H00000008Const FT_SEARCH_RET_IDTABLE = &H00000010Const FT_SEARCH_SORT_DATE = &H00000020Const FT_SEARCH_SORT_ASCEND = &H00000040Const FT_SEARCH_TOP_SCORES = &H00000080Const FT_SEARCH_STEM_WORDS = &H00000200Const FT_SEARCH_THESAURUS_WORDS = &H00000400Const FT_SEARCH_EXT_RET_URL = &H00004000Const FT_SEARCH_EXT_DOMAIN = &H00020000Const FT_SEARCH_FUZZY = &H00080000Const DFLAGPAT_FOLDER$ = "(+-04n*F"Const DFLAGPAT_VIEWS_AND_FOLDERS$ = "-G40n"Const NOTE_CLASS_VIEW% = &H0008Const PKG_MISC% = &H0400Const ERR_NOT_FOUND = PKG_MISC + 4Const UPDATE_FORCE% = &H0001Dim batchSize As IntegerDim queryStr As StringDim dbHandle As LongDim status As IntegerDim searchHandle As LongDim searchOptions As LongDim retNumHits As LongDim numDocs As LongDim resultHandle As LongDim folderID As LongDim updateOptions As IntegerDim junkLong As LongDim junkBoolean As IntegerDim dbOpenFlag As IntegerDim searchHandleOpenFlag As IntegerDim searchResultsLockedFlag As IntegerDim folderNoteOpenFlag As IntegerDeclare Function apiDbOpen Lib "nnotes.dll" Alias "NSFDbOpen" (Byval PathName As String, rethDb As Long) As IntegerDeclare Function apiDbClose Lib "nnotes.dll" Alias "NSFDbClose" (Byval hDB As Long) As IntegerDeclare Function apiGetDBID Lib "nnotes.dll" Alias "NSFDbGetOpenDatabaseID" (Byval hDBU As Long) As LongDeclare Function apiFTOpenSearch Lib "nnotes.dll" Alias "FTOpenSearch" (rethSearch As Long) As IntegerDeclare Function apiFTCloseSearch Lib "nnotes.dll" Alias "FTCloseSearch" (Byval hSearch As Long) As IntegerDeclare Function apiFTSearch Lib "nnotes.dll" Alias "FTSearch" (Byval hDB As Long, phSearch As Long, Byval hColl As Integer, Byval query As String, Byval options As Long, Byval limit As Integer, Byval hlDTable As Integer, retNumDocs As Long, reserved As Long, rethResults As Long) As IntegerDeclare Function apiFTSearchExt Lib "nnotes.dll" Alias "FTSearchExt" (Byval hDB As Long, phSearch As Long, Byval hColl As Integer, Byval query As String, Byval options As Long, Byval limit As Integer, Byval hlDTable As Long, retNumDocs As Long, reserved As Long, rethResults As Long, retNumHits As Long, Byval Start As Long, Byval Count As Integer, Byval Arg As Integer, Byval hNames As Long) As IntegerDeclare Function apiIDEntries Lib "nnotes.dll" Alias "IDEntries" (Byval hTable As Long) As LongDeclare Function apiIDScan Lib "nnotes.dll" Alias "IDScan" (Byval hTable As Long, Byval fFirst As Integer, retID As Long) As IntegerDeclare Function apiIDDestroyTable Lib "nnotes.dll" Alias "IDDestroyTable" (Byval hTable As Long) As IntegerDeclare Function apiNIFFindDesignNoteExt Lib "nnotes.dll" Alias "NIFFindDesignNoteExt" (Byval hFile As Long, Byval noteName As String, Byval noteClass As Integer, Byval pszFlagsPattern As String, retNoteID As Long, Byval Options As Long) As IntegerDeclare Function apiNSFNoteUpdate Lib "nnotes.dll" Alias "NSFNoteUpdate" (Byval noteHandle As Long, Byval updateFlags As Integer) As IntegerDeclare Function apiNSFNoteClose Lib "nnotes.dll" Alias "NSFNoteClose" (Byval noteHandle As Long) As IntegerDeclare Function apiFolderDocAdd Lib "nnotes.dll" Alias "FolderDocAdd" (Byval hDataDB As Long, Byval hFolderDB As Long, Byval FolderNoteID As Long, Byval hTable As Long, Byval dwFlags As Long) As IntegerDeclare Function apiOSLoadString Lib "nnotes.dll" Alias "OSLoadString" (Byval hModule As Long, Byval StringCode As Integer, Byval retBuffer As String, Byval BufferLength As Integer) As IntegerDeclare Function apiOSLockObject Lib "nnotes.dll" Alias "OSLockObject" (Byval handle As Long) As LongDeclare Function apiOSUnLockObject Lib "nnotes.dll" Alias "OSUnlockObject" (Byval handle As Long) As IntegerFunction LimitlessFTSearch (Byval query As String, Byval destinationFolderName As String, Byval dbPath As String) As String LimitlessFTSearch = "" queryStr = query status = apiDbOpen(dbPath, DBHandle) If (status <> 0) Then LimitlessFTSearch = "apiDbOpen(): " + apiError(status) LimitlessFTSearch = LimitlessFTSearch + CleanUp() Exit Function Else dbOpenFlag = 1 End If status = apiFTOpenSearch(SearchHandle) If (status <> 0) Then LimitlessFTSearch = "apiFTOpenSearch(): " + apiError(status) LimitlessFTSearch = LimitlessFTSearch + CleanUp() Exit Function Else searchHandleOpenFlag = 1 End If status = apiNIFFindView(dbHandle, destinationFolderName, folderID) If (status <> 0) Then ' If (status = ERR_NOT_FOUND) Then' LimitlessFTSearch = {The folder named "} + destinationFolderName + {" doesn't exist. Cleaning up and exiting."}' End If LimitlessFTSearch = "apiNIFFindView(): " + apiError(status) LimitlessFTSearch = LimitlessFTSearch + CleanUp() Exit Function Else folderNoteOpenFlag = 1 End If Dim currentDocPointer As Long currentDocPointer = 0 retNumHits = 1 While (currentDocPointer <= retNumHits) status = RunSearch (currentDocPointer, batchSize) If (status <> 0) Then LimitlessFTSearch = "RunSearch(): apiFTSearchExt(): " + apiError(status) LimitlessFTSearch = LimitlessFTSearch + CleanUp() Exit Function End If %REM Print "............................................and the number of docs returned is...(actual)........... :" + Cstr(numDocs) Print "............................................and the number of total hits returned is..(poss)......... :" + Cstr(retNumHits)%END REM If (retNumHits <> 0) Then junkLong = apiOSLockObject(resultHandle) status = apiFolderDocAdd(dbHandle, 0, folderID, resultHandle, 0) If (status <> 0) Then LimitlessFTSearch = "apiFolderDocAdd(): " + apiError(status) LimitlessFTSearch = LimitlessFTSearch + CleanUpIDTable() LimitlessFTSearch = LimitlessFTSearch + CleanUp() Exit Function End If %REM numEntries& = apiIDEntries(resultHandle) Print "The table we have a handle on has this many entries : " + Cstr(numEntries&) boolean% = apiIDScan(resultHandle, 1, noteID&) While (boolean% = 1) Print "NoteID: " +Cstr(noteID&) boolean% = apiIDScan(resultHandle, 0, noteID&) Wend%END REM LimitlessFTSearch = LimitlessFTSearch + CleanUpIDTable() End If currentDocPointer = currentDocPointer + batchSize Wend LimitlessFTSearch = LimitlessFTSearch + CleanUp() End FunctionFunction CleanUp() As String CleanUp = "" If (searchHandleOpenFlag = 1) Then status = apiFTCloseSearch(SearchHandle) If (status <> 0) Then CleanUp = CleanUp + " - apiFTCloseSearch(): " + apiError(status) End If ' saveFolderNoteFlag = 1 ' If (saveFolderNoteFlag = 1) Then' updateOptions = UPDATE_FORCE' status = apiNSFNoteUpdate(folderID, updateOptions)' If (status <> 0) Then CleanUp = CleanUp + " - apiNSFNoteUpdate(): " + apiError(status)' End If ' If (folderNoteOpenFlag = 1) Then' status = apiNSFNoteClose(folderID)' End If 'Close the database, if needed. If (dbOpenFlag = 1) Then status = apiDbClose(DBHandle) If (status <> 0) Then CleanUp = CleanUp + " - apiDbClose(): " + apiError(status) End IfEnd FunctionFunction apiError (status As Integer) As String Dim Err_Mask As Integer Dim errorStr As String Err_Mask = &H00003fff status = status And Err_Mask errorStr = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" status = apiOSLoadString(0, status, errorStr , Len(errorStr) - 1) apiError = "apiError(): " + errorStrEnd FunctionFunction apiNIFFindView(Byval hFile As Long, Byval viewName As String, retNoteID As Long) As Integer apiNIFFindView = apiNIFFindDesignNoteExt(hFile, viewName, NOTE_CLASS_VIEW, DFLAGPAT_VIEWS_AND_FOLDERS, retNoteID, 0) End FunctionFunction RunSearch (Byval start As Long, Byval count As Integer) As Integer Dim collectionHandle As Integer Dim limit As Integer Dim idTableHandle As Long Dim reserved As Long Dim arg As Integer Dim namesHandle As Long collectionHandle = 0 limit = 0 idTableHandle = 0 reserved = 0 arg = 0 namesHandle = 0 searchOptions = FT_SEARCH_RET_IDTABLE RunSearch = apiFTSearchExt(dbHandle, searchHandle, collectionHandle, queryStr, searchOptions, limit, idTableHandle, numDocs, 0, resultHandle, retNumHits, start, count, arg, 0) End FunctionSub Initialize batchSize = 4900 dbOpenFlag = 0 searchHandleOpenFlag = 0 searchResultsLockedFlag = 0 folderNoteOpenFlag = 0 End SubFunction CleanUpIDTable() As String CleanUpIDTable = "" junkBoolean = apiOSUnlockObject(resultHandle) status = apiIDDestroyTable(resultHandle) If (status <> 0) Then CleanUpIDTable = CleanUpIDTable + " - apiIDDestroyTable(): " + apiError(status) CleanUpIDTable = CleanUpIDTable + CleanUp() Exit Function End IfEnd FunctionExemple d'utilisation :Créer un dossier 'test' par exemple.Dans un agent :Sub initialise dim s as new notessession dim db as notesdatabase set db = s.currentdatabase rc = LimitlessFTSearch("FIELD form=NomMasque", "test", db.FilePath) messagebox rcEnd SubAppel de la fonction :Query => Ce que vous voulez rechercherFolder => Le dossier ou vous voulez mettre les documents trouvédbpath => Le chemin d'accès à la base NotesDans le code vous avez la méthode pour ouvrir, fermer et traiter les erreurs API Notes.Attention : Plateforme Win32 uniquement.[%sig%]

Re: FTsearch dans une vue?

MessagePublié: 11 Juin 2003 à 15:13
par aer
Merci pour ton aide Stéphane mais 250 documents sont largement suffisants pour mon application. Je voudrais juste faire marcher cette fonction. Dans la doc il est dit que FTsearch "permet d'effectuer une recherche dopcumentaire dans une vue" et que la vue est ensuite filtrée pour inclure seulement les documents correspondant à la requete, ce qui me suffit amplement. Meme si FTsearch travaile en back end, pourquoi ma vue n'est-elle pas mise à jour avec mon code?

Re: FTsearch dans une vue?

MessagePublié: 11 Juin 2003 à 15:34
par Raziel
Salut,une petite explication semble s'imposée. Comme tu le sais, le FTSerach s'applique, dans notre cas, sur une notesview. Cette dernière étant une classe dorsale, le ftsearch ne va donc pas modifié la vue en classe frontale (même si cette dernière est actuellment en visu).Que fait le ftsearch ? Sur la vue dorsale sur laquelle tu applique cette fonction, le ftsearch va appliqué un filtre. Ensuite, tu peux parcourrir le résultat de cette recherche via les commandes getfirstdocument, getnextdocument....Exemple de code :Dim session As New NotesSessionDim db As NotesDatabaseDim view As NotesViewdim doc as notesdocument Dim j As Integer Set db = session.CurrentDatabaseSet view = db.GetView( "v_Com" )j = view.FTSearch( "catégories", 0 ) Msgbox Cstr(j)set doc = view.getfirstdocumentwhile not doc is nothingprint doc.getitemvalue("Name")(0)set doc = view.getnextdocument(doc)wendCet exemple me retourne, dans mon cas, 3 alors que le vue affiche normalement 200 documents. Mais le ftsearch n'a trouvé que 3 documents correspondant au filtre => j'obtiens 3 print dans ma barre d'état.Voilà, si tu veux plus d'explications, n'hésite pas.Raziel

Re: FTsearch dans une vue?

MessagePublié: 11 Juin 2003 à 15:40
par aer
Merci pour ton explication Raziel. Y-a-t-il alors une façon pour afficher ces documents filtrés dans une vue?

Re: FTsearch dans une vue?

MessagePublié: 12 Juin 2003 à 18:00
par Stephane Maillard
Bonjour,J'utilise deux méthodes différentes, la première est le code que j'ai cité ci-dessus avec la mise en place d'un dossier et la deuxième est d'avoir un champs caché qui s'appel CodeAffiche qui prend une valeur numérique, cela veut dire que tu auras autant de vue que de code numérique. Quand la recherche est finis je demande l'ouverture de la vue qui correspond au code numérique.[%sig%]

Re: FTsearch dans une vue?

MessagePublié: 13 Juin 2003 à 07:36
par aer
Salut, pour ta deuxieme methode, Stéphane, tu fait un ftsearch et ensuite tu met à jour un champ (CodeAffiche) dans chaque document retourné par le ftsearch, c'est bien ça? Et aprés tu ouvres une vue qui a pour critère de n'afficher uniquement les documents avec le CodeAffiche voulu. Si tu avais le code pour tout ça, je te serais grandement reconnaissant.

Re: FTsearch dans une vue?

MessagePublié: 13 Juin 2003 à 08:24
par Raziel
Salut,La deuxième méthode me semble un peu lourde et dangereuse.Lourde sur le fait que tous les docs correspodant à la recherche seront modifié (pb si la base est répliqué car tous ces modifications seront répercutées sur les répliques). Lourde aussi par le fait qu'il faut ensuite une vue par code : multiplication du nombre de vue et donc des index => alourdissement de la base et des temps de réponse + ajout d'une vue si l'on rajoute un code.Dangereuse sur le fait que puisque les docs sont modifié => on augmente le risque de généré des documents de conflits.Imaginons aussi que 2 personnes lance une recherche. Dans ces recherches, il y a un documents commun au deux (documents qui correspond au 2 critères de recherches). Le premier User va modifié le doc pour y mettre son code. Le deuxième user va aussi modifié ce doc pour y mettre son code. Dans le meilleur des cas, on obtiens un document de conflit. Dans le pire des cas, la modif du user 2 va intervenir après celle du user 1 => conséquence, lors de l'ouverture de la vue (correspondant au code) par le user 1, ce doc n'apparaittra pas dans la liste.Je serai plus pour passé par un dossier en faisant un PutInFolder

Re: FTsearch dans une vue?

MessagePublié: 13 Juin 2003 à 13:12
par Stephane Maillard
Bonjour,Je suis tout à fais d'accord avec toi. Il faut absolument que la base soit local.[%sig%]

Re: FTsearch dans une vue?

MessagePublié: 13 Juin 2003 à 13:15
par Stephane Maillard
Bonjour,Public Sub TestStampall() dim session as new NotesSession ' On demande une nouvelle session dim db as NotesDatabase dim col as NotesDocumentCollection dim vue as NotesView set db = session.currentdatabase ' On utilise la base actuelle set vue = db.getview("vuedetest") ' Dans cette base on prend la vue "vuedetest"' On recherche "CleOuTableauDeRecherche" en respectant exactement l'orthographe set col = vue.getalldocumentsbykey("CleOuTableauDeRecherche", true)' Et pour finir on met à jour le champs "ChampsAModifier" avec la valeur' "ValeurAMettre" dans tous les documents de la collection. call col.stampall("ChampsAModifier", "ValeurAMettre")end subAvec Stampall de la classe NotesDocumentCollection tu modifie un champs sur toute une collection.[%sig%]

Re: FTsearch dans une vue?

MessagePublié: 13 Juin 2003 à 13:23
par Raziel
Salut,c'est encore moi. Le fait que la base soit local ne suffit pas... Il ne faut surtout pas que cette base entre dans un quelconque processus de réplication. En effet, je peux avoir une bas en local que je fait répliqué avec celle du serveur (cas de la messagerie par exemple pour les poste nomade).Autre pb que soulève cette solution c'est la mise à jour de l'index. En effet, imaginons une base de 30000 documents sur laquelle s'applique cette méthode. A chaque ouverture de la vue, suite à la modification des documents, l'index de la vue sera remis à jour. Conséquence : risque de temps relativement important avant l'affichage des documents.