Page 1 sur 1

Traitement de masse de documents notes

MessagePublié: 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

MessagePublié: 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

MessagePublié: 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

MessagePublié: 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

MessagePublié: 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

MessagePublié: 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

MessagePublié: 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

MessagePublié: 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

MessagePublié: 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

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