Page 1 sur 1
Traitement de masse de documents notes

Publié:
04 Juil 2014 à 13:53
par valou66
Bonjour,
J'ai créé une base lotus pour gérer la catégorisation des logiciels provenant d'une appli de gestion de parc (suite à un import). Je voudrai modifier plusieurs champs de plusieurs documents en même temps dans une vue (plusieurs fiches logiciel de même nom par exemple) au lieu de modifier fiche par fiche.
Je ne sais pas si j'ai été assez claire

mais si vous pouvez m'aider ça serait gentil

je ne sais même pas si c'est possible
Je voulais savoir aussi s'il est possible de faire un contrôle à l'import sur l'existence de doublons ?
Merci d'avance
Re: Traitement de masse de documents notes

Publié:
04 Juil 2014 à 14:10
par pascal29
Comment réalises-tu ton import ?
Pour modifier plusieurs docs, tu pourrais créer un agent / actions simples. Si tu connais le nom du champ que tu veux modifier, c'est pas trop compliqué.
Re: Traitement de masse de documents notes

Publié:
04 Juil 2014 à 15:14
par valou66
Merci pour ta réponse
Je réalise mon import grâce à un agent
Sub Initialize
On Error Goto err_ImportExcel
' Variable de sélection de fichier
Dim tmpFic As Variant
Dim sFic As String
' Variable de traitement de fichier Excel
Dim xlsApp As Variant ' Application Excel
Dim xlsWorkBook As Variant ' Classeur
Dim xlsSheet As Variant ' Feuille de calcul
Dim xlsLigne As Integer ' Ligne
Dim xlsColonne As Integer ' Colonne
Dim nomlogiciel As String
' Demande de sélection du fichier Excel à traité
tmpFic = OuvreXLS()
sFic = tmpFic(0)
' Tableau de données
Dim sLig() As String ' Met dans un tableau les données de la ligne
Dim sCol() As String ' Met dans un tableau les entêtes de colonne
' Compteur de boucle
Dim iCompteur As Integer
Dim iCompteurLigne As Integer
Dim iCompteurColonne As Integer
' Vérification des champs vide
Dim vVF As Variant
' Traitement sur le fichier Excel
Print "Connexion à Excel..."
Set xlsApp = CreateObject("Excel.Application") ' Création de l'instance
Print "Ouverture du fichier : " & sFic
xlsApp.Workbooks.Open sFic ' Ouverture du fichier
Set xlsWorkBook = xlsApp.ActiveWorkbook ' Récupère le classeur actuel
Set xlsSheet = xlsWorkBook.ActiveSheet ' Récupère la feuille active
xlsApp.Visible = False ' Affiche Excel
xlsSheet.Cells.SpecialCells(11).Activate
xlsLigne = xlsApp.ActiveWindow.ActiveCell.Row ' Nombre de ligne à traiter
xlsColonne = xlsApp.ActiveWindow.ActiveCell.Column' Nombre de colonne à traiter
' Récupère les entêtes de colonne
xlsSheet.Cells(1, 1).Select
For iCompteurColonne = 1 To xlsColonne
If iCompteurColonne = 1 Then
Redim sCol(iCompteurColonne) As String
sCol(iCompteurColonne) = xlsSheet.Cells(1, iCompteurColonne).Value
Else
Redim Preserve sCol(iCompteurColonne) As String
sCol(iCompteurColonne) = xlsSheet.Cells(1, iCompteurColonne).Value
End If
Next
' Récupère les valeurs des cellules d'une ligne
For iCompteurLigne = 2 To xlsLigne
xlsSheet.Cells(iCompteurLigne, 1).select
For iCompteurColonne = 1 To xlsColonne
If iCompteurColonne = 1 Then
Redim sLig(iCompteurColonne) As String
sLig(iCompteurColonne) = xlsSheet.Cells(iCompteurLigne, iCompteurColonne).Value
Else
Redim Preserve sLig(iCompteurColonne) As String
sLig(iCompteurColonne) = xlsSheet.Cells(iCompteurLigne, iCompteurColonne).Value
End If
Next
' Vérifit que le tableau n'est pas vide.
vVF = False
For iCompteur = 1 To Ubound(sLig)
If sLig(iCompteur) <> "" Then
vVF = True
Exit For
Else
vVF = False
End If
Next
Print "Traitement de la ligne " & iCompteurLigne & " sur " & xlsLigne
If vVF = True Then
Call CreationDocument(sLig, xlsColonne, sCol())
End If
Next
Print "Déconnexion d'Excel..."
xlsWorkBook.Close False ' Ferme le classeur
xlsApp.Quit ' Quitte Excel
Set xlsApp = Nothing ' Ferme l'instance
Print "Fin de l'importation du fichier Excel"
Exit Sub
err_ImportExcel:
Resume Next
End Sub
Sub CreationDocument(aLigneATraiter() As String, NbColonne As Integer, sCol() As String)
Dim Session As NotesSession
Dim Db As NotesDatabase
Dim Doc As NotesDocument
Dim iCompteur As Integer
On Error Goto err_CreationDocument
Set Session = New NotesSession
Set Db = Session.CurrentDatabase
Set Doc = Db.CreateDocument
' Nom du masque à utiliser
Doc.Form = "fichelogiciel"
For iCompteur = 1 To NbColonne
' Insère les valeur dans les champs MonChampsX
Call doc.ReplaceItemValue(sCol(iCompteur), aLigneATraiter(iCompteur))
Next
' Sauvgarde le masque
Call Doc.Save(True, False, False)
' Sort de la routine de création du masque
Exit Sub
err_CreationDocument:
Exit Sub
End Sub
Function OuvreXLS() As Variant
Dim ws As New NotesUIWorkspace
' Affiche la fenêtre de sélection
' Le False correspond à une sélection simple
OuvreXLS = ws.OpenFileDialog(False, "Ouverture d'un fichier Excel", "Fichiers Excel | *.xls", "c:")
End Function
En ce qui concerne le nom des champs à modifier je les connaît mais ils sont variables
Peux tu me guider un peu dans l'écriture de cet agent stp
Re: Traitement de masse de documents notes

Publié:
07 Juil 2014 à 07:45
par pascal29
Salut,
Pour la recherche de doublons, il faudrait modifier le code dans ce style là : (je ne sais pas sur quoi serai basée une clé unique pour identifier tes doublons)
Sub Initialize
On Error Goto err_ImportExcel
' Variable de sélection de fichier
Dim tmpFic As Variant
Dim sFic As String
' Variable de traitement de fichier Excel
Dim xlsApp As Variant ' Application Excel
Dim xlsWorkBook As Variant ' Classeur
Dim xlsSheet As Variant ' Feuille de calcul
Dim xlsLigne As Integer ' Ligne
Dim xlsColonne As Integer ' Colonne
Dim nomlogiciel As String
' Demande de sélection du fichier Excel à traité
tmpFic = OuvreXLS()
sFic = tmpFic(0)
' Tableau de données
Dim sLig() As String ' Met dans un tableau les données de la ligne
Dim sCol() As String ' Met dans un tableau les entêtes de colonne
Dim keyTab() as String ' >> POUR VERIF DOUBLONS
' Compteur de boucle
Dim iCompteur As Integer
Dim iCompteurLigne As Integer
Dim iCompteurColonne As Integer
' Vérification des champs vide
Dim vVF As Variant
' Traitement sur le fichier Excel
Print "Connexion à Excel..."
Set xlsApp = CreateObject("Excel.Application") ' Création de l'instance
Print "Ouverture du fichier : " & sFic
xlsApp.Workbooks.Open sFic ' Ouverture du fichier
Set xlsWorkBook = xlsApp.ActiveWorkbook ' Récupère le classeur actuel
Set xlsSheet = xlsWorkBook.ActiveSheet ' Récupère la feuille active
xlsApp.Visible = False ' Affiche Excel
xlsSheet.Cells.SpecialCells(11).Activate
xlsLigne = xlsApp.ActiveWindow.ActiveCell.Row ' Nombre de ligne à traiter
Redim keyTab(xlsLigne) as String ' >> init
xlsColonne = xlsApp.ActiveWindow.ActiveCell.Column' Nombre de colonne à traiter
' Récupère les entêtes de colonne
xlsSheet.Cells(1, 1).Select
For iCompteurColonne = 1 To xlsColonne
If iCompteurColonne = 1 Then
Redim sCol(iCompteurColonne) As String
sCol(iCompteurColonne) = xlsSheet.Cells(1, iCompteurColonne).Value
Else
Redim Preserve sCol(iCompteurColonne) As String
sCol(iCompteurColonne) = xlsSheet.Cells(1, iCompteurColonne).Value
End If
Next
' Récupère les valeurs des cellules d'une ligne
For iCompteurLigne = 2 To xlsLigne
xlsSheet.Cells(iCompteurLigne, 1).select
ForAll val in keyTab
if val=xlsSheet.Cells(iCompteurLigne, 2).Value Then ' >> Imaginons que la clé est basée sur la valeur de la colonne 2
Goto prochaineLigne '>> si on retrouve une clé identique on passe à la ligne suivante ...
End
Next
keyTab(iCompteurLigne) = xlsSheet.Cells(iCompteurLigne, 2).Value
For iCompteurColonne = 1 To xlsColonne
If iCompteurColonne = 1 Then
Redim sLig(iCompteurColonne) As String
sLig(iCompteurColonne) = xlsSheet.Cells(iCompteurLigne, iCompteurColonne).Value
Else
Redim Preserve sLig(iCompteurColonne) As String
sLig(iCompteurColonne) = xlsSheet.Cells(iCompteurLigne, iCompteurColonne).Value
End If
Next
' Vérifit que le tableau n'est pas vide.
vVF = False
For iCompteur = 1 To Ubound(sLig)
If sLig(iCompteur) <> "" Then
vVF = True
Exit For
Else
vVF = False
End If
Next
Print "Traitement de la ligne " & iCompteurLigne & " sur " & xlsLigne
If vVF = True Then
Call CreationDocument(sLig, xlsColonne, sCol())
End If
prochaineLigne :
Next
Print "Déconnexion d'Excel..."
xlsWorkBook.Close False ' Ferme le classeur
xlsApp.Quit ' Quitte Excel
Set xlsApp = Nothing ' Ferme l'instance
Print "Fin de l'importation du fichier Excel"
Exit Sub
Pour les agents / actions simples, tu crées un agent >> au lieu de Type = "LotusScript", tu sélectionnes "actions simples".
Ensuite ça t'ouvre une fenêtre vide avec "Sélection de document", tu verras en bas tu pourras cliquer sur "Ajouter critère" >> Ici , tu dois sélectionner le masque concerné par les modifs. Puis dans la partie "Action", pareil, tu cliques sur "Ajouter action" >> ici, tu choisis ton action et le champs visé, tu verras c'est assez simple.
Quand ton agent sera créé tu pourras normalement l’appeler depuis ta base (menu Actions).
Voilà en espérant que ça t'aidera. A+
Re: Traitement de masse de documents notes

Publié:
07 Juil 2014 à 14:56
par valou66
Salut,
Merci beaoucoup pour ton aide mais malheureusement ça ne fonctionne pas, plus rien n'est importé
ma clé est basée sur un champ "nomlogiciel" 2ème colonne de ma vue, je dois tester dans cet import si il existe déja dans ma vue
j'ai du mal à comprendre le fonctionnement de forall peut être l'ai-je mal configuré ?
Re: Traitement de masse de documents notes

Publié:
07 Juil 2014 à 15:27
par pascal29
Oui désolé, je t'avais donné un code sans le déboguée (à l'arrache ...).
Ça marchera surement mieux comme ça (j'espère) :
- Code : Tout sélectionner
Sub Initialize
On Error GoTo err_ImportExcel
' Variable de sélection de fichier
Dim tmpFic As Variant
Dim sFic As String
' Variable de traitement de fichier Excel
Dim xlsApp As Variant ' Application Excel
Dim xlsWorkBook As Variant ' Classeur
Dim xlsSheet As Variant ' Feuille de calcul
Dim xlsLigne As Integer ' Ligne
Dim xlsColonne As Integer ' Colonne
Dim nomlogiciel As String
' Demande de sélection du fichier Excel à traité
tmpFic = OuvreXLS()
sFic = tmpFic(0)
' Tableau de données
Dim sLig() As String ' Met dans un tableau les données de la ligne
Dim sCol() As String ' Met dans un tableau les entêtes de colonne
Dim keyTab() As String ' >> POUR STOCKAGE CLES
Dim doublon As Boolean ' >> POUR FLAG DOUBLON
' Compteur de boucle
Dim iCompteur As Integer
Dim iCompteurLigne As Integer
Dim iCompteurColonne As Integer
' Vérification des champs vide
Dim vVF As Variant
' Traitement sur le fichier Excel
Print "Connexion à Excel..."
Set xlsApp = CreateObject("Excel.Application") ' Création de l'instance
Print "Ouverture du fichier : " & sFic
xlsApp.Workbooks.Open sFic ' Ouverture du fichier
Set xlsWorkBook = xlsApp.ActiveWorkbook ' Récupère le classeur actuel
Set xlsSheet = xlsWorkBook.ActiveSheet ' Récupère la feuille active
xlsApp.Visible = False ' Affiche Excel
xlsSheet.Cells.SpecialCells(11).Activate
xlsLigne = xlsApp.ActiveWindow.ActiveCell.Row ' Nombre de ligne à traiter
ReDim keyTab(xlsLigne) As String ' >> init
xlsColonne = xlsApp.ActiveWindow.ActiveCell.Column' Nombre de colonne à traiter
' Récupère les entêtes de colonne
xlsSheet.Cells(1, 1).Select
For iCompteurColonne = 1 To xlsColonne
If iCompteurColonne = 1 Then
ReDim sCol(iCompteurColonne) As String
sCol(iCompteurColonne) = xlsSheet.Cells(1, iCompteurColonne).Value
Else
ReDim Preserve sCol(iCompteurColonne) As String
sCol(iCompteurColonne) = xlsSheet.Cells(1, iCompteurColonne).Value
End If
Next
' Récupère les valeurs des cellules d'une ligne
For iCompteurLigne = 2 To xlsLigne
doublon = False
xlsSheet.Cells(iCompteurLigne, 1).select
ForAll Valeur In keyTab
If Valeur=xlsSheet.Cells(iCompteurLigne, 2).Value Then ' >> Imaginons que la clé est basée sur la valeur de la colonne 2
doublon = True
Exit For
End If
End ForAll
If Not doublon Then
keyTab(iCompteurLigne) = xlsSheet.Cells(iCompteurLigne, 2).Value
For iCompteurColonne = 1 To xlsColonne
If iCompteurColonne = 1 Then
ReDim sLig(iCompteurColonne) As String
sLig(iCompteurColonne) = xlsSheet.Cells(iCompteurLigne, iCompteurColonne).Value
Else
ReDim Preserve sLig(iCompteurColonne) As String
sLig(iCompteurColonne) = xlsSheet.Cells(iCompteurLigne, iCompteurColonne).Value
End If
Next
' Vérifit que le tableau n'est pas vide.
vVF = False
For iCompteur = 1 To UBound(sLig)
If sLig(iCompteur) <> "" Then
vVF = True
Exit For
Else
vVF = False
End If
Next
Print "Traitement de la ligne " & iCompteurLigne & " sur " & xlsLigne
If vVF = True Then
Call CreationDocument(sLig, xlsColonne, sCol())
End If
End If
Next
Print "Déconnexion d'Excel..."
xlsWorkBook.Close False ' Ferme le classeur
xlsApp.Quit ' Quitte Excel
Set xlsApp = Nothing ' Ferme l'instance
Print "Fin de l'importation du fichier Excel"
Exit Sub
Attention ici je ne fais pas de test dans ta vue et les documents qu'elle contient. Je fais les tests de doublons au niveau de ton doc excel ligne par ligne.
Pour le forall, c'est une boucle en fait : pour toutes les clés que j'ai sauvegardé dans mon tableau depuis que j'ai commencé à lire le fichier, je teste si la clé de la ligne actuelle a déjà été traité.
Re: Traitement de masse de documents notes

Publié:
07 Juil 2014 à 16:03
par valou66
merci !!! je vais testé et je te tiens au courant
en tout cas le traitement de masse fonctionne à merveille mille merci tu m'enlèves un poids

Re: Traitement de masse de documents notes

Publié:
08 Juil 2014 à 08:47
par valou66
Salut Pascal,
Toujours le même problème l'import ne se fait plus. La je viens de lancer le debuggeur ça reste bloqué sur doublon = true je vais voir ça de plus près et je te redis
Re: Traitement de masse de documents notes

Publié:
08 Juil 2014 à 09:25
par pascal29
ah oui déjà c'est pas Exit For mais Exit ForAll
Re: Traitement de masse de documents notes

Publié:
10 Juil 2014 à 14:35
par valou66
bon bah l'import refonctionne mais il ne gère pas les doublons snif ...