Page 2 sur 2

MessagePublié: 21 Déc 2010 à 16:11
par edcj
Salut à tous, un grand merci pour votre aide.
Voici un exemple de code qui fonctionne entre 2 bases, traitement calculer le total pour une même clé depuis une 2 ème base et mettre à jour ce total dans une autre base (base en cours), le traitement s'appuie sur 2 vues indexés selon vos besoins.
Cordialement

Sub Initialize

On Error Goto ErrorHandler

Dim s As New NotesSession
Dim db1 As NotesDatabase, db2 As NotesDatabase
Dim view1 As NotesView, view2 As NotesView
Dim dc2 As NotesDocumentCollection
Dim doc1 As NotesDocument, doc2 As NotesDocument
Dim prefix As String,ticket As String, cle As String, clelue As String
Dim total As Double,hr As Double
Dim server As String,bases As String
Dim vue1 As String, vue2 As String

'Initialisation Serveur
server ="NOM du SERVEUR"
'Initialisation 2ème Base
bases = "iExtensions\IENTime.nsf"
'Initialisation1ère vue de la base en cours
vue1= "(AllTickets)"
'Initialisation 2ème vue de la 2ème Base
vue2= "(Intervention Par Ticket)"

' instancier la vue des docs Demande INTERVENTION de la base courante
Set db1 = s.CurrentDatabase
Set view1 = db1.GetView(vue1)
If view1 Is Nothing Then
Msgbox "Erreur déclaration 1ère vue base en cours..."
Exit Sub
End If
' instancier la vue des docs detail Des Fiches D'Intervention dans la base 2 (sur le même serveur)
Set db2 = New NotesDatabase(server, bases )
If Not db2.IsOpen Then
Msgbox "Erreur déclaration serveur..."
Exit Sub
End If

Set view2 = db2.GetView(vue2 )
If view2 Is Nothing Then
Msgbox "Erreur déclaration 2ème vue 2ème base..."
Exit Sub
End If

' Parcourir les docs Demandes D'Intervention
Set doc1 = view1.GetFirstDocument()
While Not doc1 Is Nothing
' remettre le compteur à 0 quand on change de doc Demande Intervention
total = 0
' Rechercher les docs detail associés
prefix = doc1.GetItemValue("IENTicketPrefix")(0)
ticket = doc1.GetItemValue("IENTicket")(0)
cle = prefix+ticket

' Set dc2 = view2.GetAllDocumentsByKey( cle, True )
' Parcourir les docs detail pour calculer le total
Set doc2 = view2.GetDocumentByKey(cle)
While Not doc2 Is Nothing
' incrémenter le compteur
clelue = doc2.GetItemValue("css_ticket_display")(0)
'test si même clé
If Not cle = clelue Goto suite
'Totalisation Heures
hr = doc2.GetItemValue("IENTime")(0)
total = total + hr

' passer au doc detail suivant
Set doc2 = view2.GetNextDocument(doc2)
Wend

suite:
' mettre à jour le doc Demande Intervention

Set item= doc1.ReplaceItemValue("IENUserHelpSysNumber03Value",total)
Call doc1.Save(True,True)
' passer au doc Demande Intervention Suivante
Set doc1 = view1.GetNextDocument(doc1)
Wend

Exit Sub

ErrorHandler :
Msgbox "Erreur n° " & Err & " dans 'CalculTotal' à la ligne " & Erl & " : " & Error
Exit Sub
End Sub

MessagePublié: 21 Déc 2010 à 21:19
par roubech
pourquoi pour la 2ème boucle tu instancies une collection, mais tu ne la parcours pas (comme je t'ai montré dans mon exemple), tu reparcours la vue en testant ta clé à chaque fois ?

MessagePublié: 27 Déc 2010 à 20:58
par edcj
Salut Roubech,
Excuses pour le retard, je n'ai pas consulté mes messages.
J'ai refait un test comme tu me l'as conseillé, mais le résultat n'est pas bon.
Ma clé est bonne, mais à la sortie du getalldocumentbykey, j'ai zéro documents, j'ai mis un msgbox après le while not suivant, mais çà ne rentre pas dans la boucle, tous mes documents sont réécrits avec zéro. Je pense que le pb vient du getalldocumentbykey.
Salutations

Set dc2 = view2.GetAllDocumentsByKey( cle, True )
' Parcourir les docs detail pour calculer le total
Set doc2 = dc2.GetFirstDocument()

While Not doc2 Is Nothing
' incrémenter le compteur
'Totalisation Heures
hr = doc2.GetItemValue("IENTime")(0)
total = total + hr
' passer au doc detail suivant
Set doc2 = view2.GetNextDocument(doc2)
Wend

MessagePublié: 27 Déc 2010 à 21:18
par edcj
Salut Roubech,
J'ai trouvé le pourquoi, j'avais changé la clé de ma vue entre temps, mais il y avait d'autres petites erreurs par rapport à ton code que j'ai corrigé, je mettrai la dernière version optimisée en ligne,
çà m'a permis de tester plusieurs solutions, merci, à bientôt

MessagePublié: 27 Déc 2010 à 21:37
par edcj
Bonjour à tous,

Voici la dernière version qui fonctionne avec Getalldocumentsbykey.
Merci de votre collaboration

Pour Roubech, peux tu me dire comment faire pour mettre le code en ligne comme tu l'as fait avec les couleurs (identique à la copie du code LS), çà sera plus visible pour tout le monde , merci

Cordialement

[syntax="LotusScript"]Sub Initialize

On Error Goto ErrorHandler

Dim s As New NotesSession
Dim db1 As NotesDatabase, db2 As NotesDatabase
Dim view1 As NotesView, view2 As NotesView
Dim dc2 As NotesDocumentCollection
Dim doc1 As NotesDocument, doc2 As NotesDocument
Dim cle As String, clelue As String
Dim total As Double,hr As Double
Dim server As String,bases As String
Dim vue1 As String, vue2 As String

'Initialisation Serveur
'----------------------------
server ="NON SERVEUR"

'init bases
'base1 par présence de l'agent dans une base sur le même serveur
'base1 = "iExtensions\IENhelpdesk.nsf" = Demande INTERVENTION
'Base2= "iExtensions\IENTime.nsf" = Base Temps
bases = "iExtensions\IENTime.nsf"

'Initialisation Vues
'------------------------
vue1= "(AllTickets)"
vue2= "(Intervention Par Ticket)"

'init champs recherchées pour comparer les clés
'------------------------------------------------------------------
rcle= "IENTicketDocumentUniqueID"

'Init des champs , cchamp calcul, champ mise à jour
'-----------------------------------------------------------------------
'Initialisation champ à cumuler
cumchamp= "IENTime"
'Initialisation champ à mettre à jour
majchamp="IENUserHelpSysNumber03Value"

' instancier la vue de la base courante
Set db1 = s.CurrentDatabase
Set view1 = db1.GetView(vue1)
If view1 Is Nothing Then
Msgbox "Erreur déclaration 1ère vue base en cours..."
Exit Sub
End If
' instancier la vue des docs detail dans la base 2
Set db2 = New NotesDatabase(server, bases )
If Not db2.IsOpen Then
Msgbox "Erreur déclaration serveur..."
Exit Sub
End If

Set view2 = db2.GetView(vue2 )
If view2 Is Nothing Then
Msgbox "Erreur déclaration 2ème vue 2ème base..."
Exit Sub
End If

' Parcourir les docs Base 1
Set doc1 = view1.GetFirstDocument()
While Not doc1 Is Nothing
' remettre le compteur à 0 quand on change de clé
total = 0
' Rechercher les docs detail associés
cle= doc1.GetItemValue(rcle)(0)

' Parcourir les docs detail base2 pour calculer le total
Set dc2 = view2.GetAllDocumentsByKey( cle, True )
Set doc2 = dc2.GetFirstDocument()
While Not doc2 Is Nothing
' incrémenter le compteur
'Totalisation Heures
hr = doc2.GetItemValue(cumchamp)(0)
total = total + hr
' passer au doc detail suivant base 2
Set doc2 = dc2.GetNextDocument(doc2)
Wend

' mettre à jour le doc de base 1
Set item= doc1.ReplaceItemValue(majchamp,total)
Call doc1.Save(True,True)
' passer au doc suivant de la base 1
Set doc1 = view1.GetNextDocument(doc1)
Wend

Exit Sub

ErrorHandler :
Msgbox "Erreur n° " & Err & " dans 'CalculTotal' à la ligne " & Erl & " : " & Error
Exit Sub
End Sub[/syntax]

MessagePublié: 28 Déc 2010 à 20:38
par roubech
tu sélectionnes le texte en question et tu choisit le language correspondant dans la liste de choix (au dessus de la zone de saisie de texte, pas en réponse rapide)

MessagePublié: 28 Déc 2010 à 23:17
par edcj
Je te remercie, mais j'y arrive toujours pas, (en faisant nouvelle réponse, j'ai juste vu çà: [syntax="language"]// code[/syntax], mais pas de liste). Ce n'est pas bien grave, par contre toujours concernant mon code, j'ai créé un sujet "erreur 13 mismatch, peux tu jeter un oeil stp. Cordialement

MessagePublié: 29 Déc 2010 à 21:03
par roubech
entre la liste de boutons et la zonne de texte