[VB] - Récupération de données dans. LOTUS NOTES [Résolu]

Messages postés
26764
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 novembre 2019
- - Dernière réponse : jordane45
Messages postés
26764
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 novembre 2019
- 19 juin 2012 à 07:41
Bonjour,

Bien que je ne sois pas en train de développer proprement dit en VB, le langage s'en rapproche énormément ( je travail sous AUTOIT ).
Enfin bon.. Le souci n'est pas là...

Je cherche à récupérer un tableau contenu dans un document Lotus notes.
Lorsque ce tableau fait une taille supérieur à 205 cellules, mon script ne parvient pas à tout récupérer...

Pour info, Lotus génère automatiquement de nouveaux champs "Body" lorsque la taille du premier devient trop importante...Je pense que mon souci se situe ici !

Voici ce que contient mon document :
NB champs Body : 2
TYPE : 1  (?RICHTEXT)
'Dans ce champ BOdy :
NB $RTELEM_TYPE_TABLE: 1  ( 1 seul tableau)
NB $RTELEM_TYPE_TABLECELL: 414 
Nb Lignes = 69
Nb Colonnes = 6
Nb Cells = 414


Je peux récupérer l'intégralité de mon champ body en faisant un
Item.Values ou encore en utilisant
NotesRichTextItem.GetFormattedText
NotesRichTextItem.GetUnformattedText

mais malheuresement je peux pas récupérer la mise en forme (tableau) ce qui rend mes données inexploitables !

J'ai également essayé de supprimé le premier item Body pour passé au second.. mais lotus les supprime tous !


voici une partie de mon code :
Func RecupValCELL(ByRef $rtnavTable)
$msg = ""
$cellCounter = $cellCounter + 1

;    REM $up range and navigator for cell

$rtRangeCell.SetBegin($rtnavTable)
$rtRangeCell.SetEnd($rtnavTable)
$rtnavCell = $rtRangeCell.Navigator

;    REM Find paragraphs in cell
$rtnavCell.FindFirstElement($RTELEM_TYPE_TEXTPARAGRAPH)
$rtRangePara.SetBegin($rtnavCell)
$msg = $msg & $rtRangePara.TextParagraph & Chr(10)

While $rtnavCell.FindNextElement($RTELEM_TYPE_TEXTPARAGRAPH)
  $rtRangePara.SetBegin($rtnavCell)
  $msg = $msg & $rtRangePara.TextParagraph & Chr(10)
wend

Return $msg

EndFunc


Func LectTable(byRef $body)

$rtnav = $Body.CreateNavigator

;Nombre d'éléments dans mon Body.
$NbTables = GetCount($rtnav,$RTELEM_TYPE_TABLE)
ConsoleWrite("NB $RTELEM_TYPE_TABLE: " &  $NbTables & @CRLF)
$NBCells = GetCount($rtnav,$RTELEM_TYPE_TABLECELL)
ConsoleWrite("NB $RTELEM_TYPE_TABLECELL: " &  $NBCells & @CRLF)
$NBparag = GetCount($rtnav,$RTELEM_TYPE_TEXTPARAGRAPH)
ConsoleWrite("NB $RTELEM_TYPE_TEXTPARAGRAPH: " &  $NBparag & @CRLF)


;$rtnav = $body.CreateNavigator
If Not $rtnav.FindFirstElement($RTELEM_TYPE_TABLE) Then
ConsoleWrite( "Body item does not contain a table" & @CRLF)
Exit
EndIf

;  $up range and navigator for table
$rtRangeTable = $body.CreateRange
    $rtRangeTable.SetBegin($rtnav)
    $rtRangeTable.SetEnd($rtnav)
$rtnavTable = $rtRangeTable.Navigator
;  Find cells in table
$rtRangeCell = $body.CreateRange
$rtRangePara = $body.CreateRange
$cellCounter = 0

$rtt=$rtnav.GetElement
$nblignes=$rtt.RowCount
$nbCol=$rtt.ColumnCount
ConsoleWrite("Nb Lignes = " & $nblignes & @CRLF)
ConsoleWrite("Nb Colonnes = " & $nbCol & @CRLF)
ConsoleWrite("Nb Cells = " & ($nblignes*$nbCol) & @CRLF)

If $Nbcells >205 Then
MsgBox(4096,"Multiples BODY Items..","Ce document contient plusieurs éléments Body" & @CRLF & "Attention à ne pas enregistrer ce document une fois cette macro lancée..")
EndIf

ReDim $Tab[$nblignes+1][$nbCol+1]
;$Tab[1][1]=$rtrange.TextParagraph
$Tab[0][0]=$nblignes

;Première cellule :
$rtnavTable.FindFirstElement($RTELEM_TYPE_TABLECELL)
$TXT=""
$TXT=RecupValCELL($rtnavTable)
ConsoleWrite("Premiere Cellule :" & $TXT  & @CRLF & " -------------- " & @CRLF)
$Tab[$L][$Z] = $TXT
$TXT=""
;Cellules suivantes
While $rtnavTable.FindNextElement($RTELEM_TYPE_TABLECELL)
If $Z=$nbCol Then
$Z=0
$L=$L+1
EndIf
$Z=$Z+1
$C=$C+1
$TXT=RecupValCELL($rtnavTable)
ConsoleWrite("Cellule N° :" & $C & "  | Ligne : " & $L & " | COl : " & $Z & " -->> " & $TXT  & @CRLF )
ConsoleWrite( " -------------------------------------------------------------------------- " & @CRLF)
$Tab[$L][$Z] = $TXT
$TXT=""
WEnd
Return $Tab
EndFunc






Je me demande si le souci ne se trouverait pas dans la définition de ma plage :
$rtRangeCell.SetBegin($rtnavTable)
$rtRangeCell.SetEnd($rtnavTable)

Mais comment modifier mon .Setend pour qu'il aille jusqu'au bout ?

Cordialement,
Jordane,
______________________________________________________
Règles du forum à lire avant de poster une question : ICI
Afficher la suite 

5 réponses

Meilleure réponse
Messages postés
26764
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 novembre 2019
317
3
Merci
Bonjour,

Donc après plusieurs recherches, et en croisant différents scripts trouvés ça et là sur le net .. ( dont plusieurs sur le site d'IBM), j'ai fini par trouver la solution.

Bien que ce script soit écrit pour Autoit, vous pouvez facilement le "convertir" en VB.

A titre d'info, voici le script en question.
#region Includes
#include<file.au3>
#include
#include<./LotusNotes_UDF.au3>
#Include <Excel.au3>
#Endregion Includes

#region Variables
;Variable Tableau pour stocker les données..
Global $Tab[1][1]
;Variables pour NOTES
Global $RTELEM_TYPE_TABLE = 1
Global $RTELEM_TYPE_TABLECELL = 7
Global $RTELEM_TYPE_TEXTPARAGRAPH = 4
Global $RTELEM_TYPE_SECTION = 6
Dim $oSession
Dim $document
Dim $rtitem
Dim $rtnavTable
Dim $rtrangeCell
Dim $rtnavCell
Dim $rtnavflag
Dim $rtt
Dim $rtnav
Dim $rtrangePara
Dim $cellCounter
#endregion

;----------------------------------------
;Connexion à NOTES
;----------------------------------------
$oSession=CnxNotes()

;----------------------------------------
;Connexion à la base
;----------------------------------------
$DB=DarabaseCnx($oSession)
$Ws=ObjWSpace()

; Initialisation document
$uidoc=$Ws.CurrentDocument
$odoc = $uidoc.Document
$rtitem=$odoc.GetFirstItem("Body")

;Accède à la première Table
$rtnav = $rtitem.CreateNavigator
$rtnav.FindFirstElement($RTELEM_TYPE_TABLE)
$rtt = $rtnav.GetElement

;Initialisation du Navigator et des plages
$rtnavTable = $rtitem.CreateNavigator
$rtrangeCell = $rtitem.CreateRange
$rtrangePara = $rtitem.CreateRange

;Première Cellule
$rtnavTable.FindFirstElement($RTELEM_TYPE_TABLECELL)
$rtRangeCell.SetBegin($rtnavTable)
$rtRangeCell.SetEnd($rtnavTable)
$rtnavCell = $rtRangeCell.Navigator

;Nb Lignes / Colonnes dans le tableau
$nblignes = $rtt.RowCount
$Nbcol = $rtt.ColumnCount
; Redimensionnement de l'Array
ReDim $Tab[$nblignes+1][$Nbcol + 1 ]
$Tab[0][0]=$nblignes
$Tab[0][1]=$Nbcol

; On parcour les différentes cellules
For $i = 1 To $nblignes ; Boucle Lignes
For $j = 1 To $Nbcol ; Boucle Colonnes
;--------------------------------------------------
TrayTip("Progression..",$I & " / " & $nblignes & @CRLF & $J & " / " & $Nbcol & @CRLF ,100)
;--------------------------------------------------
$celltext = ""
$cellCounter = $cellCounter + 1
;--------------------------------------------------
;' Premier paragraphe dans la cellule
$rtnavCell.FindFirstElement($RTELEM_TYPE_TEXTPARAGRAPH)
$rtRangePara.SetBegin($rtnavCell)
$rtRangePara.SetEnd($rtnavCell)
$celltext = $celltext & $rtRangePara.TextParagraph & @CRLF
;Récup de chaque paragraphe dans la cellule
While $rtnavCell.FindNextElement($RTELEM_TYPE_TEXTPARAGRAPH)
$rtRangePara.SetBegin($rtnavCell)
$rtRangePara.SetEnd($rtnavCell)
$celltext = $celltext & $rtRangePara.TextParagraph & @CRLF
wend

ConsoleWrite( @CRLF & ">> ------- Cell " & $cellCounter & " - " & $i & " - " & $j & @CRLF & $celltext & @CRLF & ">-----------------------------<"  & @CRLF)

;Next Cellule
$rtnavTable.FindNextElement($RTELEM_TYPE_TABLECELL)
$rtrangeCell.SetBegin($rtnavTable)
$rtnavCell = $rtrangeCell.Navigator
;--------------------------------------------------
$Tab[$I][$J] = $celltext
Next
Next

;Affichage du résultat..
_ArrayDisplay($Tab)




Encore merci a ceux qui ont bien voulu cherché à m'aider.

Bonne journée


Cordialement,
Jordane,
______________________________________________________
Règles du forum à lire avant de poster une question : ICI

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 219 internautes nous ont dit merci ce mois-ci

Commenter la réponse de jordane45
Messages postés
115
Date d'inscription
dimanche 6 avril 2003
Statut
Membre
Dernière intervention
29 juin 2012
0
Merci
bonjour
Je peux récupérer l'intégralité de mon champ body
est ce que c'est ce que tu veux recuperer (total des data)
et qui correspond a
[u]Nb Lignes = 69
Nb Colonnes = 6
Commenter la réponse de mjpmjp
Messages postés
115
Date d'inscription
dimanche 6 avril 2003
Statut
Membre
Dernière intervention
29 juin 2012
0
Merci
bonjour
+++MESSAGE INCOMPLET+++
bon je reprends

bonjour
Je peux récupérer l'intégralité de mon champ body
est ce que c'est ce que tu veux recuperer (total des data)
et qui correspond a
[u]Nb Lignes = 69
Nb Colonnes = 6
Nb Cells = 414/u

peut tu reconstituer le tableau 69*6=414 ?

a tu vu la structure des data (dans .txt...)?
y a t il un separateur ("," ";"...)?

@+JP
Commenter la réponse de mjpmjp
0
Merci
Bonjour,

M'est avis que tu aurais peut-être plus de chance en allant à la source.
Commenter la réponse de Utilisateur anonyme
Messages postés
26764
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 novembre 2019
317
0
Merci
Bonjour...
bon en faite j'ai fini par réussir...
je posterai la réponse demain et je clôturerai le sujet

Cordialement,
Jordane,
______________________________________________________
Règles du forum à lire avant de poster une question : ICI
Commenter la réponse de jordane45