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

Résolu
jordane45 Messages postés 38151 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 2 mai 2024 - 18 juin 2012 à 07:49
jordane45 Messages postés 38151 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 2 mai 2024 - 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

5 réponses

jordane45 Messages postés 38151 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 2 mai 2024 344
19 juin 2012 à 07:41
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
3
mjpmjp Messages postés 115 Date d'inscription dimanche 6 avril 2003 Statut Membre Dernière intervention 29 juin 2012
18 juin 2012 à 11:41
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
0
mjpmjp Messages postés 115 Date d'inscription dimanche 6 avril 2003 Statut Membre Dernière intervention 29 juin 2012
18 juin 2012 à 11:45
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
0
Utilisateur anonyme
18 juin 2012 à 17:51
Bonjour,

M'est avis que tu aurais peut-être plus de chance en allant à la source.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jordane45 Messages postés 38151 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 2 mai 2024 344
18 juin 2012 à 20:18
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
0
Rejoignez-nous