oui c'est la meme , et quand je fait f4 il ouvre les base quand je click dossier il mouvre bien les diferent champ de ma table et sa je le fait du le document resultant du merge
oui c'est la meme , et quand je fait f4 il ouvre les base quand je click dossier il mouvre bien les diferent champ de ma table et sa je le fait du le document resultant du merge
Dans TFM.DataBaseName tu vas mettre le nom de la source de donnée tel qu'il apparait sous OOo
et dans TFM.TableName le nom de la table tel que tu le vois sous OOo
normalement ca devrait marché !
Ceci dis pour tester si l'assossiation a bien marché fautr lancer un Publipostage
bon voila le code que je met ( le tient mis bout a bout car c'est de copier coller) tu me dirat peut etre que tu trouveras l'erreur :
model.ott contient juste les reference , nom , prenom et adresse , qui sont dans mon txt
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113 procedure clickbutton(sender); var OpenOffice :Variant; OpenDesktop :Variant; CoreReflection :Variant; Datacontext :Variant; document :Variant; oEnum :Variant; thisField :Variant; TFM : Variant; LoadParams : Variant; arguments : Variant; Doc1 :Ansistring; sSource:Ansistring; instance:Variant; Connection:Variant; DocumentSetting:Variant; OOoMailMerge:Variant; function CreatePropertyValue(nom,valeur:variant):variant ; var PropertyValue :variant; begin CoreReflection.forName('com.sun.star.beans.PropertyValue').createObject(PropertyValue); PropertyValue.Name := nom; PropertyValue.Value := valeur; result:=propertyvalue; end; begin try { Connection à Open Office ... et ouverture d'un nouveau document ... } OpenOffice := CreateOleObject('com.sun.star.ServiceManager'); OpenDesktop := OpenOffice.createInstance('com.sun.star.frame.Desktop'); CoreReflection := OpenOffice.createInstance('com.sun.star.reflection.CoreReflection'); LoadParams := VarArrayCreate([0, - 1], varVariant); { Ouvre un document vierge ... } Doc1 :=StringReplace('c:\temp\model.ott', '\', '/',[rfReplaceAll]); { Ouvre un document vierge ... } arguments := VarArrayCreate([0, 3], varVariant); arguments[0] := CreatePropertyValue( 'AsTemplate' , True ); arguments[1] := CreatePropertyValue( 'Hidden' , False ); arguments[2] := CreatePropertyValue( 'ReadOnly' , False ); arguments[3] := CreatePropertyValue( 'Password' , '' ); Document := OpenDesktop.LoadComponentFromURL( 'file:///'+ StringReplace('C:\temp\model.ott', '\', '/',[rfReplaceAll]),'_blank', 0,arguments); //VarArrayCreate([0, - 1], varVariant)); DocumentSetting := Document.createInstance('com.sun.star.text.DocumentSettings'); sSource := 'file:///'+ StringReplace('c:\temp\Dossier.Txt', '\', '/',[rfReplaceAll]); Datacontext:=OpenOffice.createInstance('com.sun.star.sdb.DatabaseContext'); // creation d'un tableau dynamique de propertyvalues qui définissent le format de la datasource arguments:= VarArrayCreate([0,7], varVariant); arguments[0]:= createPropertyValue('Extension','txt' ); arguments[1]:= createPropertyValue('CharSet','ISO-8859-15') ;//ou 'ISO646-FR1' arguments[2]:= createPropertyValue('FixedLength',true) ; arguments[3]:= createPropertyValue('HeaderLine',true) ; arguments[4]:= createPropertyValue('FieldDelimiter',';') ; arguments[5]:= createPropertyValue('StringDelimiter','"') ; arguments[6]:= createPropertyValue('DecimalDelimiter','.') ; arguments[7]:= createPropertyValue('ThousandDelimiter',',') ; //création de la datasource avec parametres instance:=Datacontext.createInstance; instance.URL:= 'sdbc:flat:'+ sSource; instance.Info:= arguments; instance.DatabaseDocument.storeAsUrl('file:///' + StringReplace('c:\temp\MySourceDossier1.odb', '\', '/',[rfReplaceAll]), VarArrayCreate([0, - 1], varVariant)); datacontext.registerObject('Dossier',instance); Connection:=instance.getconnection('',''); // DocumentSetting := Document.createInstance('com.sun.star.text.DocumentSettings'); { a Rajouté juste aprés l'ouverture du document ...} DocumentSetting.CurrentDatabaseDataSource := 'dossier'; DocumentSetting.CurrentDatabaseCommand := 'dossier'; DocumentSetting.CurrentDatabaseCommandType := 0; {Jusqu'ici tous fonctionne correctement !} //-------------- oEnum := Document.getTextFields.createEnumeration; While oEnum.hasMoreElements Do Begin thisField := oEnum.nextElement; If thisField.SupportsService('com.sun.star.text.TextField.Database') then Begin TFM := thisField.getTextFieldMaster; TFM.DataBaseName := 'dossier'; TFM.DataTableName := 'Dossier'; End; End; //------------------ OOoMailMerge := OpenOffice.createInstance('com.sun.star.text.MailMerge'); OOoMailMerge.ActiveConnection := Connection; OOoMailMerge.DataSourceName := 'Dossier'; OOoMailMerge.DocumentURL := 'file:///'+ doc1; OOoMailMerge.CommandType := 0; { Mon erreur (1) venais de la ... remplacer 1 par 0 ... } OOoMailMerge.Command := 'Dossier'; OOoMailMerge.OutPutType := 2; OOoMailMerge.OutPutURL := 'file:///c:/temp/'; OOoMailMerge.FileNamePrefix := 'Dossier.odt'; OOoMailMerge.FileNameFromColumn := False; OOoMailMerge.SaveAsSingleFile := True; //1 seul fichier ok OOoMailMerge.Execute(VarArrayCreate([0,-1],varVariant)); //C'est ici que l'erreur se manifeste finally OOoMailMerge:=Unassigned; DocumentSetting:=Unassigned; arguments:=Unassigned; CoreReflection:=Unassigned; OpenDesktop:=Unassigned; OpenOffice:=Unassigned; Document.Dispose; end; end;
merci de ton aide
Attention si je ne dis pas d'anerie OOo est assez sensible a la case !
(dossier,Dossier) par précaution écris de façon identique
Au passage éclair ma lanterne les champs nom , prenom et adresse sont bien des champs de fusion que tu utilisé auparavant sous word?
oui j'ai vue dans delphi partout j'ai bien Dossier .
en test je suis parti de mon model pour lancer le publipostage(juste en click sur l'icone sans rien rajouter ou retirer) a traver openoffice et la il me cree bien les different feuille, donc pour moi le model.ott doit etre bon? et si ta vue dans l'exemple j'ai cree le modele a traver open office (.ott) et pas un (.odt) word , donc la je bloque
Cette étape n'est utile que dans le cas ou tu converti ton modéle de Word vers OOo et ceux qu'une seul fois
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 oEnum := Document.getTextFields.createEnumeration; While oEnum.hasMoreElements Do Begin thisField := oEnum.nextElement; If thisField.SupportsService('com.sun.star.text.TextField.Database') then Begin TFM := thisField.getTextFieldMaster; TFM.DataBaseName := 'dossier'; TFM.DataTableName := 'Dossier'; End; End;
Si ton modéle sous OOo lorsque tu lance le publipostage fonctionne tu n'as pas besoin de la refaire a chaque fois
oui mais pourtant quand je met pas le code avec le model open office c'est blanc , et si je met mon model doc .dot il me met les <nom> <prenom> ... et pas les valeurs . mais je vait refaire le tour et je te tient au courant merci encore
bon je change de fusil d'epaule tampis pour les docs , je refairait mes modelle sous open office dans un premier tant (j'y retournerait quand je connaitrait + de chose sur openoffice). donc la j'ai un fichier text qui peut changer , j'ai un model.ott (modele open office) qui marche en utilisant dans open office. Il faut qu'a chaque fois je cree ma base ou la vide et la rerempli (car ficher text peut changer (le contenue pas la forme bien sur)) (a moin que lon peut aller lire direct dans .txt comme word) et je doit lancer mon publipostage par delphi donc le code de depart si j'ai bien compris serait :
et pourtant la par delphi j'ai tout a blanc ( je pense qu'il pert ma conection) a la base ou le nom est faux
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94 procedure clickbutton(sender); var OpenOffice :Variant; OpenDesktop :Variant; CoreReflection :Variant; Datacontext :Variant; document :Variant; LoadParams : Variant; arguments : Variant; Doc1 :Ansistring; sSource:Ansistring; instance:Variant; Connection:Variant; DocumentSetting:Variant; OOoMailMerge:Variant; function CreatePropertyValue(nom,valeur:variant):variant ; var PropertyValue :variant; begin CoreReflection.forName('com.sun.star.beans.PropertyValue').createObject(PropertyValue); PropertyValue.Name := nom; PropertyValue.Value := valeur; result:=propertyvalue; end; begin try { Connection à Open Office ... et ouverture d'un nouveau document ... } OpenOffice := CreateOleObject('com.sun.star.ServiceManager'); OpenDesktop := OpenOffice.createInstance ('com.sun.star.frame.Desktop'); CoreReflection := OpenOffice.createInstance('com.sun.star.reflection.CoreReflection'); LoadParams := VarArrayCreate([0, - 1], varVariant); { Ouvre un document vierge ... } Doc1 :=StringReplace('c:\temp\model.ott', '\', '/',[rfReplaceAll]); { Ouvre un document vierge ... } arguments := VarArrayCreate([0, 3], varVariant); arguments[0] := CreatePropertyValue( 'AsTemplate' , True ); arguments[1] := CreatePropertyValue( 'Hidden' , False ); arguments[2] := CreatePropertyValue( 'ReadOnly' , False ); arguments[3] := CreatePropertyValue( 'Password' , '' ); Document := OpenDesktop.LoadComponentFromURL( 'file:///'+ StringReplace('C:\temp\model.ott', '\', '/',[rfReplaceAll]),'_blank', 0,arguments); //VarArrayCreate([0, - 1], varVariant)); DocumentSetting := Document.createInstance('com.sun.star.text.DocumentSettings'); sSource := 'file:///'+ StringReplace('c:\temp\Dossier.Txt', '\', '/',[rfReplaceAll]); Datacontext:=OpenOffice.createInstance('com.sun.star.sdb.DatabaseContext'); // creation d'un tableau dynamique de propertyvalues qui définissent le format de la datasource arguments:= VarArrayCreate([0,7], varVariant); arguments[0]:= createPropertyValue('Extension','txt' ); arguments[1]:= createPropertyValue('CharSet','ISO-8859-15') ;//ou 'ISO646-FR1' arguments[2]:= createPropertyValue('FixedLength',true) ; arguments[3]:= createPropertyValue('HeaderLine',true) ; arguments[4]:= createPropertyValue('FieldDelimiter',';') ; arguments[5]:= createPropertyValue('StringDelimiter','"') ; arguments[6]:= createPropertyValue('DecimalDelimiter','.') ; arguments[7]:= createPropertyValue('ThousandDelimiter',',') ; //création de la datasource avec parametres instance:=Datacontext.createInstance; instance.URL:= 'sdbc:flat:'+ sSource; instance.Info:= arguments; instance.DatabaseDocument.storeAsUrl('file:///' + StringReplace('c:\temp\MySourceDossier1.odb', '\', '/',[rfReplaceAll]), VarArrayCreate([0, - 1], varVariant)); datacontext.registerObject('Dossier',instance); Connection:=instance.getconnection('',''); DocumentSetting := Document.createInstance('com.sun.star.text.DocumentSettings'); DocumentSetting.CurrentDatabaseDataSource := 'dossier'; DocumentSetting.CurrentDatabaseCommand := 'dossier'; DocumentSetting.CurrentDatabaseCommandType := 0; OOoMailMerge := OpenOffice.createInstance('com.sun.star.text.MailMerge'); OOoMailMerge.ActiveConnection := Connection; OOoMailMerge.DataSourceName := 'Dossier'; OOoMailMerge.DocumentURL := 'file:///'+ doc1; OOoMailMerge.CommandType := 0; OOoMailMerge.Command := 'Dossier'; OOoMailMerge.OutPutType := 2; OOoMailMerge.OutPutURL := 'file:///c:/temp/'; OOoMailMerge.FileNamePrefix := 'Dossier.odt'; OOoMailMerge.FileNameFromColumn := False; OOoMailMerge.SaveAsSingleFile := True; //1 seul fichier ok OOoMailMerge.Execute(VarArrayCreate([0,-1],varVariant)); finally OOoMailMerge:=Unassigned; DocumentSetting:=Unassigned; arguments:=Unassigned; CoreReflection:=Unassigned; OpenDesktop:=Unassigned; OpenOffice:=Unassigned; Document.Dispose; end; end;
Je vais essayer ce soir de te retrouver ca ca sera plus simple
Voir même au pire de recréer la fonction
J'essairai mais en ce moment j'ai que trés peu de temp hors boulot
je te re merci , essaye de faire pour le mieux ( mais c'est vrais que sa m'avancerait )
salut DragonHeart
a tu retrouver ton code svp , car la jessaye en vain mais rien n'y fait j'ai toujours les valeur en blanc
Please help
bonjour et oui je cherche
pour essayer de trouver d'ou vient le pb j'ai essaye de simplifier en metant directement ma connection dans le model.ott et j'essaye de lancer le publipostage , comme si je cliquait sur le bouton
la il me fait la meme chose les champ sont blanc , mais je pense que c'est a cause de la connection qui ne trouve pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 if VarIsEmpty(OpenOffice) then OpenOffice := CreateOleObject('com.sun.star.ServiceManager'); OpenDesktop := OpenOffice.createInstance('com.sun.star.frame.Desktop'); LoadParams := VarArrayCreate([0, -1], varVariant); NomFichier := StringReplace('C:\temp\model.ott', '\', '/', [rfReplaceAll, rfIgnoreCase]); Document := openDesktop.LoadComponentFromURL( 'file:///'+NomFichier, '_blank', 0, LoadParams); //doc ouvert OOoMailMerge := OpenOffice.createInstance('com.sun.star.text.MailMerge'); OOoMailMerge.DataSourceName := 'Dossier'; OOoMailMerge.DocumentURL := 'file:///'+ NomFichier; OOoMailMerge.CommandType := 0; OOoMailMerge.Command := 'Dossier'; OOoMailMerge.OutPutType := 2; OOoMailMerge.OutPutURL := 'file:///c:/temp/'; OOoMailMerge.FileNamePrefix := 'Dossier.odt'; OOoMailMerge.FileNameFromColumn:= false; OOoMailMerge.SaveAsSingleFile := True; //1 seul fichier OOoMailMerge.Execute(VarArrayCreate([0,-1],varVariant))
mais comment lui dire d'ouvrir la connection de ce document que j'ai ouvert
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2OOoMailMerge.ActiveConnection := Connection; // code manquand
merci
bon comme je ne trouvait pas , j'ai decompresser le fichier source fait mes modif et recompreser au moin sa marche , et en plus tres rappide
Bonjour,
Peut-tu nous dire ce que tu as fait ?
je souhaite faire exactement la même chose...
merci
ce que j'ai vue c'est qu'un fihier oppen ofice est en faite un zip de xml, donc j'utilise z-zip pour le deziper , et je met le resultat dans un dossier temporaire , j'e modifie le content.xml en parcourant le fichier et en allant remplacer dans le fichier met cote [NOM] , [PRENOM] que j'ai mis dans mon model et je rezip le repertoir temp en sont nom de fin et le publiopostage est fait
Je suppose que tu n'a jamais trouvé la solution à ton pb avec ta 1ère méthode ?
en tout cas merci pour ta réponse et bonne journée.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager