IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

Problème avec le publipostage


Sujet :

API, COM et SDKs Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Par défaut Problème avec le publipostage
    Bonjour,

    Je n'arrive pas à faire de publipostage avec delphi voici l'erreur :

    com.sun.star.sdbc.sqlexecption:.
    Voici le code avez vous une idée du problème

    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
     
    procedure Publipostage;
    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('D:\Publipostage.doc', '\', '/',[rfReplaceAll]);
          sSource := 'file:///'+ StringReplace('D:\Dossier.Txt', '\', '/',[rfReplaceAll]);
     
          Document := OpenDesktop.LoadComponentFromURL( 'file:///'+Doc1 ,'_blank',0,LoadParams  );
          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('D:\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  := 'MySourceDossier1.odb';
          DocumentSetting.CurrentDatabaseCommand     := 'Dossier';
          DocumentSetting.CurrentDatabaseCommandType := 0;
          {Jusqu'ici tous fonctionne correctement !}
     
          OOoMailMerge := OpenOffice.createInstance('com.sun.star.text.MailMerge');
          OOoMailMerge.ActiveConnection   := Connection;
          OOoMailMerge.DataSourceName     := 'MySourceDossier1.odb';
          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:///D:/';
          OOoMailMerge.FileNamePrefix     := 'Dossier.odt';
          OOoMailMerge.FileNameFromColumn := False;
          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;
      end;
    Ps la base de données et la table dossier est bien créer

    merci de votre aide.
    Qays

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Par défaut
    Resalut

    Le problème est presque réglé, presque car, je n'ai plus l'erreur mais la fusion ne se fait pas,

    voila ce que j'ai changé
    avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      OOoMailMerge.DataSourceName     := 'MySourceDossier1.odb';
          OOoMailMerge.DocumentURL        := 'file:///'+ Doc1;
    après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      OOoMailMerge.DataSourceName     := dossier';// le nom de la table
          OOoMailMerge.DocumentURL        := 'file:///'+ Doc1;
    Merci de votre aide

  3. #3
    Membre expérimenté
    Profil pro
    DEV
    Inscrit en
    Août 2006
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DEV

    Informations forums :
    Inscription : Août 2006
    Messages : 182
    Par défaut
    Salut,

    Tien ce code ressemble trés fortement a un code que j'avais poster sur un forum d'aide sur OOo du temp ou j'avais des soucis avec OOo et le publipostage ^^

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Par défaut
    tu as toutafait raison j'ai developpé un objet de connexion à openoffice et il me manquait le publipostage, et j'ai trouvé ton code, mais je n'arrive pas à faire la fusion j'ai même posé la question sur le forum openOffice,
    http://www.forum-openoffice.org/forum/ftopic6809.html


    ps: j'espèreque cela ne te déange pas je j'ai pris ton code.

    si tu a une idée du propblème je suis préneur

    cordialement
    Qays.

  5. #5
    Membre expérimenté
    Profil pro
    DEV
    Inscrit en
    Août 2006
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DEV

    Informations forums :
    Inscription : Août 2006
    Messages : 182
    Par défaut
    Ton probléme vien que tes champs de ton document word ne sont pas associé avec ta source de donnée sous OOo
    En effet openoffice perd les liens des champs de fusion d'un document word !
    Il faut réassocié tes champs avec les champs de la source de donnée ...
    Pour cela tu utilises bien la meme source de donnée sous word que sous openoffice? Sinon la réassociation risque de ne pas marché


    Voici mon code 'démo' pour tester tous ca ... celui que tu as utilisé et qui marche !

    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
     
          { 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');
          { Ouvre un document vierge ... }
              dPropertyValue    := VarArrayCreate([0, 3], varVariant);
        dPropertyValue[0] := CreatePropertyValue( 'AsTemplate' , True );
        dPropertyValue[1] := CreatePropertyValue( 'Hidden' , False );
        dPropertyValue[2] := CreatePropertyValue( 'ReadOnly' , False );
        dPropertyValue[3] := CreatePropertyValue( 'Password' , '' );
          Document := OpenDesktop.LoadComponentFromURL( 'file:///'+ StringReplace('C:\Export\DDT3GR.Bib', '\', '/',[rfReplaceAll]),'_blank',
          0,dPropertyValue);  //VarArrayCreate([0, - 1], varVariant));
          DocumentSetting := Document.createInstance('com.sun.star.text.DocumentSettings');
          sSource := 'file:///'+ StringReplace('C:\Export\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:\Export\OOoDB\MySourceDossier0.odb', '\', '/',[rfReplaceAll]),  VarArrayCreate([0, - 1], varVariant));
          datacontext.registerObject('Dossier',instance);
          Connection:=instance.getconnection('','');
          DocumentSetting.CurrentDatabaseDataSource  := 'Dossier';
          DocumentSetting.CurrentDatabaseCommand     := 'Dossier';
          DocumentSetting.CurrentDatabaseCommandType := 0;
          { Cas d'un ancier modéle Word que l'onconverti en OOo ... }
          { Cette partie la réassocie les champs de fusion avec la Source de donnée }
          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;
         Document.StoreAsURL('file:///c:/export/DDT3GR.Odt', VarArrayCreate([0, -1], varVariant)); { Convertie notre modéle WOrd en Doc ... }
         Document.Dispose;

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Par défaut
    merci je vais essayer de suite et te tiens au courant
    merci

Discussions similaires

  1. Problème de Multi Publipostage avec Access
    Par amne26 dans le forum IHM
    Réponses: 4
    Dernier message: 27/03/2009, 17h58
  2. Problème avec un Publipostage
    Par aptagud dans le forum Word
    Réponses: 2
    Dernier message: 31/10/2008, 17h17
  3. Problème avec Publipostage
    Par k-eisti dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 20/06/2007, 09h01
  4. Réponses: 3
    Dernier message: 12/09/2006, 05h54
  5. Problèmes avec publipostage
    Par DiabloZizi dans le forum Excel
    Réponses: 4
    Dernier message: 09/03/2006, 16h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo