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

Oracle Discussion :

extraire une partie d'un document rtf


Sujet :

Oracle

  1. #1
    yac
    yac est déconnecté
    Membre à l'essai
    Inscrit en
    Avril 2002
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 31
    Points : 17
    Points
    17
    Par défaut extraire une partie d'un document rtf
    bonjour,

    voila mon environnement est comme suit :
    devsuite 10g (904019)
    oas 10g (9042)
    database 9207

    j'ai un document type qui est une lettre qu'on doit envoyer à chacun de nos client.
    ce document est constitué de 2 parties:
    partie a : date du jour, nom du client
    partie b : lette elle même


    Je voudrais construire de facon dynamique un fichier contenant autant de pages que de client et chaque page devra avoir :
    - partie a : info du client concerné
    - partie b: lettre (prototype)

    pour ce faire, j'ai delimite ma partie de la lettre (section répetetive avec des crochet).

    et la pour chaque client :
    - j'inserer son nom
    - j'insere la partie répetetive (prototype) de ma lettre template
    - j'insere un saut de page


    tout les client sont dans le même fichier output , on les separent avec un saut de page.


    voici mon code, mais ca me donne toujour en output un document vide :

    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
    DECLARE
    		-- directory for template document
    		c_template_dir VARCHAR2(300) := 'D:\RTM\AVIS_RETARD\TEMPLATE';
    		-- template document name
    		c_template_doc VARCHAR2(300) := 'LETTRE_RETARD.rtf';
    		-- directory for output
    		c_output_dir VARCHAR2(300) := 'D:\RTM\AVIS_RETARD\A_FAXER';
     
      -- FichierIntrouvable    EXCEPTION;
      -- PRAGMA exception_init ( FichierIntrouvable, -302000 );-
     
     		outFileName VARCHAR2(200);
    		Load_File text_io.file_type;
    		Out_file text_io.file_type;
    		Str VARCHAR2(32767) := Null;
    		counter NUMBER :=0;
    		--INDICE NUMBER;
    	  ligne_en_cours VARCHAR2(32767) := Null;
    		lettre_repetitive long;
     
     
    BEGIN
    -- source file
    	Load_File := text_io.fopen( c_template_dir ||'\'||c_template_doc,'r' );
    	outFileName := 'LOT_DATEJOUR'||'.rtf';
    	Out_file := text_io.fopen(c_output_dir||'\'||outFileName,'w' );
     
    -- se positionner apres le début de la section
    --RÉCUPERER LE DOCUMENT À REPÉTER POUR CHAQUE NOTAIRE
      text_io.get_line( Load_File, ligne_en_cours);
     
    		while ligne_en_cours <> '[['
    		loop
    	    text_io.get_line( Load_File, ligne_en_cours);
        end loop;
     
    	  text_io.get_line( Load_File, ligne_en_cours);
    		while ligne_en_cours <>  ']]'
    		loop
    		  text_io.get_line( Load_File, ligne_en_cours);
    		  lettre_repetitive := ligne_en_cours;
                                      text_io.put_line( Out_file, lettre_repetitive );
    	  end loop;
     
        --inserer le saut de page
      text_io.get_line( Load_File, STR);
      Str := REPLACE( Str, '[sautpage]', '\par \page');
    text_io.put_line( Out_file, Str );
     
    /*		 
     
    EXCEPTION WHEN NO_DATA_FOUND THEN
    		text_io.fclose( Load_File );
    		text_io.fclose( Out_file );
    END;

    et voici mon template (lettre prototype) :
    date du jour
    info client

    ---
    [[
    Bonjour,

    cette lettre est pour vous informer que vous êtes en retard pour la période en cours.

    Merci pour mettre à jour votre dossier.

    salutations
    ]]
    [sautpage]


    merci pour votre aide et toute suggestion est la bienvenue

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Insère dans une table ou affiche ce que tu récupères dans ligne_en_cours, voit où ça pase pas.

  3. #3
    yac
    yac est déconnecté
    Membre à l'essai
    Inscrit en
    Avril 2002
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 31
    Points : 17
    Points
    17
    Par défaut extraire une partie d'un document rtf
    Bonjour,

    j'ai fait des trace et je vois bien les lignes de mon document mais mon output est tjrs vide


    merci

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    J'ai vu que tu ne fermais pas tes fichiers IN et OUT
    Avant le EXCEPTION, fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    text_io.fclose( Load_File ); 
          text_io.fclose( Out_file );

  5. #5
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Pb de boucle :
    [[
    Bonjour,

    cette lettre est pour vous informer que vous êtes en retard pour la période en cours.

    Merci pour mettre à jour votre dossier.

    salutations
    ]]
    [sautpage]
    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
    text_io.get_line( Load_File, ligne_en_cours); 
    //1: ligne_en_cours contient '[['
        WHILE ligne_en_cours <> '[[' 
        LOOP 
    		// ON n'y passe pas.
           text_io.get_line( Load_File, ligne_en_cours); 
    	END LOOP; 
     
         text_io.get_line( Load_File, ligne_en_cours); 
        // 2: ligne_en_cours contient 'Bonjour,'
     
        WHILE ligne_en_cours <>  ']]' 
        LOOP 
            text_io.get_line( Load_File, ligne_en_cours); 
        // 2: ligne_en_cours contient ' ' : Attention si c'est vide, le prochain test du WHILE (<>) ne va pas marcher.
     
            lettre_repetitive := ligne_en_cours; 
            text_io.put_line( Out_file, lettre_repetitive ); 
         END LOOP;
    Je pense que ton fichier vide peut aussi venir de là.

  6. #6
    yac
    yac est déconnecté
    Membre à l'essai
    Inscrit en
    Avril 2002
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 31
    Points : 17
    Points
    17
    Par défaut manipulation d'un fichier rtf
    j'ai modifié mon code comme suit mais ca le output est tjrs vide.

    comment surpasser les lignes vides ?

    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
    DECLARE 
          -- directory for template document 
          c_template_dir VARCHAR2(300) := 'D:\RTM\AVIS_RETARD\TEMPLATE'; 
          -- template document name 
          c_template_doc VARCHAR2(300) := 'LETTRE_RETARD.rtf'; 
          -- directory for output 
          c_output_dir VARCHAR2(300) := 'D:\RTM\AVIS_RETARD\A_FAXER'; 
     
      -- FichierIntrouvable    EXCEPTION; 
      -- PRAGMA exception_init ( FichierIntrouvable, -302000 );- 
     
           outFileName VARCHAR2(200); 
          Load_File text_io.file_type; 
          Out_file text_io.file_type; 
          Str VARCHAR2(32767) := Null;
          ind_debsec varchar2(20) := '[['; 
          ind_finsec varchar2(20) := ']]'; 
          debsec number;
          finsec number;
          --counter NUMBER :=0; 
     
    BEGIN 
    -- source file 
       Load_File := text_io.fopen( c_template_dir ||'\'||c_template_doc,'r' ); 
       outFileName := 'LOT_DATEJOUR'||'.rtf'; 
       Out_file := text_io.fopen(c_output_dir||'\'||outFileName,'w' ); 
     
     
       text_io.get_line( Load_File, Str ); 
       debsec := instr(Str, ind_debsec, 1,1);
     
       while (debsec=0)
        loop
        	 text_io.get_line( Load_File, Str ); 
           debsec := instr(Str, ind_debsec, 1,1);
        end loop;
     
     
        text_io.get_line( Load_File, Str ); 
        finsec := instr(Str, ind_finsec, 1,1);
     
       while (finsec=0)
        loop
        	 text_io.get_line( Load_File, Str ); 
        	 text_io.put_line( Out_file, Str ); 
           finsec := instr(Str, ind_finsec, 1,1);
        end loop;
     
     
     
       /*WHILE ( TRUE ) 
       LOOP 
         text_io.get_line( Load_File, Str ); 
     
    --[finpage] c'est là que je veut inserer mon saut de page 
         Str := REPLACE( Str, '[FAX]', '\par \page');
         text_io.put_line( Out_file, Str ); 
         --counter := counter +1; 
       END LOOP; */
     
    EXCEPTION WHEN NO_DATA_FOUND THEN 
          text_io.fclose( Load_File ); 
          text_io.fclose( Out_file ); 
    END;

    merci.

  7. #7
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    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
    Load_File := text_io.fopen( c_template_dir ||'\'||c_template_doc,'r' ); 
    outFileName := 'LOT_DATEJOUR'||'.rtf'; 
    Out_file := text_io.fopen(c_output_dir||'\'||outFileName,'w' ); 
     
    v_part NUMBER := 0;
     
    IF TEXT_IO.IS_OPEN(Load_file )
    AND TEXT_IO.IS_OPEN(Out_file )
    THEN
    	WHILE (TRUE) LOOP
    	BEGIN
    		TEXT_IO.GET_LINE(Load_file, v_ligne);
     
    		IF v_part = 2 AND v_ligne = '[sautpage]'
    		THEN
    			TEXT_IO.PUT_LINE(Out_file, '\par \page'); 
    		END IF;
     
    		// Corps de [[ ]]
    		IF v_part = 1 AND NVL(v_ligne, 'X') <> ']]'
    		THEN
    			TEXT_IO.PUT_LINE(Out_file, v_ligne); 					
    		END IF;
     
    		// Ligne [[
    		IF v_part = 0 AND v_ligne == '[['
    		THEN
    			v_part := 1;	
    		END IF;
     
    		// ligne ]]
    		IF v_part = 1 AND v_ligne == ']]'
    		THEN
    			v_part := 2;	
    		END IF;
     
    	EXCEPTION
    	WHEN OTHERS THEN EXIT;
    	END;		
     
     
    	END LOOP;
    text_io.fclose(Load_file);		
    text_io.fclose(Out_file);		
    END IF;
    Si ça marche pas, reprend le code, met tout en commentaire et insère juste 1 ligne à la main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Out_file := text_io.fopen(c_output_dir||'\'||outFileName,'w' ); 
    IF TEXT_IO.IS_OPEN(Out_file )
    THEN
    TEXT_IO.PUT_LINE(Out_file, 'Hello World'); 		
    text_io.fclose(Out_file);		
    END IF;

  8. #8
    yac
    yac est déconnecté
    Membre à l'essai
    Inscrit en
    Avril 2002
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 31
    Points : 17
    Points
    17
    Par défaut
    ca ne marche pas mais le 2eme code marche (1 seul ligne 'hello world')


    merci

  9. #9
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Dois y avoir un problème dans les if..then..end if. doit pas y passer...

  10. #10
    yac
    yac est déconnecté
    Membre à l'essai
    Inscrit en
    Avril 2002
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 31
    Points : 17
    Points
    17
    Par défaut
    j'ai le output
    mais je me retrouve avec le docuemt en entier (pas juste la partie que je veut.

    • le 06.01.2006
      exemple de lettre
      [[
      Bonjour,

      cette lettre est pour vous informer que vous êtes en retard pour la période en cours.

      Merci pour mettre à jour votre dossier.

      salutations
      ]]
      merci



    je fais des trace pour le contenu de chaque ligne apres le TEXT_IO.GET_LINE(Load_file, v_ligne); et voici ce que j'ai, c'est pas la ligne originale :

    • exemple de lettre\par
      \pard\lang1036\f1\fs22 [[\par
      \pard\sb100\sa100\lang3084\f0\fs24 Bonjour, \line\line cette lettre est pour vous informer que vous \'eates en retard pour la p\'e9riode en cours. \line\line Merci pour mettre \'e0 jour votre dossier. \line\line salutations \line\f1\fs22 ]]\f0\fs24\par
      merci\line\par
      \pard\f2\fs20\par
      }

      {\rtf1\ansi\ansicpg1252\deff0\deflang3084\deflangfe3084\deftab708{\fonttbl{\f0\froman\fcharset0 Times New Roman;}{\f1\fswiss\fprq2\fcharset0 Arial;}{\f2\fswiss\fcharset0 Arial;}}
      {\*\generator Msftedit 5.41.15.1507;}\viewkind4\uc1\pard\sb100\sa100\f0\fs24 le 06.01.2006\par

    [/list]

    merci pour tous

  11. #11
    yac
    yac est déconnecté
    Membre à l'essai
    Inscrit en
    Avril 2002
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 31
    Points : 17
    Points
    17
    Par défaut manipulation d'un fichier rtf
    ca ne marche toujours pas

    voici mon document template modifié :

    • le 06.01.2006
      exemple de lettre
      |debsec|
      Bonjour,

      cette lettre est pour vous informer que vous êtes en retard pour la période en cours.

      Merci pour mettre à jour votre dossier.

      salutations
      |finsec|
      merci
      |sautpage|



    et voici mon output qui :
    1 - insere tout le document
    2- le debsec est en double


    le 06.01.2006
    exemple de lettre
    |debsec|
    |debsec|
    Bonjour,

    cette lettre est pour vous informer que vous êtes en retard pour la période en cours.

    Merci pour mettre à jour votre dossier.

    salutations
    |finsec|
    merci
    |sautpage|
    et voici mon code, je n'arrive pas à trouver ou est le bug ?

    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
     
    DECLARE 
          -- directory for template document 
          c_template_dir VARCHAR2(300) := 'D:\RTM\AVIS_RETARD\TEMPLATE'; 
          -- template document name 
          c_template_doc VARCHAR2(300) := 'TEMPLATE_TEST.rtf'; 
              --  c_template_doc VARCHAR2(300) := 'lettre_retard.rtf'; 
          -- directory for output 
          c_output_dir VARCHAR2(300) := 'D:\RTM\AVIS_RETARD\A_FAXER'; 
     
     
           outFileName VARCHAR2(200); 
          Load_File text_io.file_type; 
          Out_file text_io.file_type; 
          ind_debsec varchar2(20) := '|debsec|'; 
          ind_finsec varchar2(20) := '|finsec|'; 
          ind_sautpage varchar2(20) := '|sautpage|'; 
          debsec number;
          finsec number;
          sautpage number;
         v_part NUMBER := 0;  
         v_ligne VARCHAR2(32767) := Null;
     
    BEGIN 
     
      Load_File := text_io.fopen( c_template_dir ||'\'||c_template_doc,'r' ); 
      outFileName := 'LOT_DATEJOUR'||'.rtf'; 
      Out_file := text_io.fopen(c_output_dir||'\'||outFileName,'w' ); 
     
    IF TEXT_IO.IS_OPEN(Load_file ) 
    AND TEXT_IO.IS_OPEN(Out_file ) 
    THEN 
       WHILE (TRUE) LOOP 
          TEXT_IO.GET_LINE(Load_file, v_ligne); 
     
        debsec := instr(nvl(v_ligne, 'X'), ind_debsec, 1,1);
        finsec := instr(nvl(v_ligne, 'X'), ind_finsec, 1,1);
        sautpage := instr(nvl(v_ligne, 'X'), ind_sautpage, 1,1);
     
            IF v_part = 0 AND debsec <> 0 
         THEN 
            v_part := 1;    
         END IF; 
     
         IF v_part = 1 AND finsec <> 0
         THEN 
            v_part := 2;    
         END IF;
     
         IF v_part = 1 AND finsec = 0
         THEN 
            TEXT_IO.PUT_LINE(Out_file, v_ligne);                 
         END IF; 
     
         IF v_part = 2 AND v_ligne = '|sautpage|' 
         THEN 
            TEXT_IO.PUT_LINE(Out_file, '\par \page'); 
         END IF; 
     
     
       TEXT_IO.PUT_LINE(Out_file, v_ligne);
         END LOOP; 
      text_io.fclose(Load_file);       
      text_io.fclose(Out_file);    
     
     END IF;
     
    end;

    toute aide est precieuse

    merci pour tous

  12. #12
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    IF v_part = 0 AND debsec <> 0 THEN v_part := 1; END IF;

    IF v_part = 1 AND finsec <> 0 THEN v_part := 2; END IF;

    IF v_part = 1 AND finsec = 0 THEN
    TEXT_IO.PUT_LINE(Out_file, v_ligne);
    END IF;

    IF v_part = 2 AND v_ligne = '|sautpage|'
    THEN
    TEXT_IO.PUT_LINE(Out_file, '\par \page');
    END IF;
    Ben oui, c'est normal..
    Faut suivre pas à pas ton prog :
    Quand tu arrives à ta ligne |debsec|, ton premier IF va mettre v_part := 1;, mais le prog continue et va passer dans le 3ème IF (v_part = 1 AND finsec = 0).
    Donc il va insérer la ligne debsec au lieu de ne rien faire.

    Inverse juste les 2 premiers IF et les 2 derniers

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 36
    Points : 43
    Points
    43
    Par défaut
    au lieu d'utiliser IF THEN ENDIF il n'existe pas ELSEIF qui serait quand même plus approprié et qui reglere le pb? Enfin je crois

Discussions similaires

  1. Afficher une partie d'un document word
    Par joeln3 dans le forum ASP
    Réponses: 9
    Dernier message: 25/08/2006, 12h17
  2. Réponses: 7
    Dernier message: 18/07/2006, 14h56
  3. Réponses: 2
    Dernier message: 21/05/2006, 19h31
  4. extraire une partie d'image d'une image source
    Par Zen_Fou dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/01/2006, 11h20
  5. [XSLT]Transformer une partie d'un document
    Par Floyd dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 02/10/2005, 14h03

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