Webutil OLE container

Oracle Forms web

Remplacer l'ancienne fonctionnalité C/S (OLE Container) avec la librairie Webutil

English version

Article lu   fois.

L'auteur

Profil ProSite personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

1. Présentation

Les versions Web d'Oracle Forms ne supportent plus les objets de type OLE Container

Ce tutoriel présente une solution de contournement en utilisant les fonctions de la librairie Webutil et permettre les actions suivantes:

  • Enregistrer un fichier présent sur le poste local dans la base de données
  • Extraire le fichier de la base pour l'éditer sur le poste local
  • Ré-enregistrer le fichier modifié en base
  • Lancer depuis Forms le correcteur orthographique de MS Word


Cet outil a été testé avec les configurations suivantes:

  • Forms 9i (9.0.2 et 9.0.4) et Database 9i
  • Forms 10g (10.1.2) et Database 10g

Si vous utilisez toujours une ancienne version, n'oubliez-pas que vous pouvez télécharger gratuitement (pour une utilisation non commerciale) une version plus récente sur OTN.

2. Enregistrer en base un fichier présent sur le poste local

2.1. Sélectionner un fichier sur le poste local avec la fonction WEBUTIL_FILE.FILE_OPEN_DIALOG

 
Sélectionnez

  FUNCTION WEBUTIL_FILE.FILE_OPEN_DIALOG
  (
        directory_name,
        file_name,
        file_filter,
        title
  ) return VARCHAR2;

directory_name représente le nom du répertoire de début de recherche (Laisser vide pour démarrer depuis la racine)
file_name Représente le nom du fichier
file_filter contient la liste des types de fichiers à afficher (ex. '|All files|*.*|' ou '|Word Files|*.doc|Excel Files|*.xls|')
title représente le titre de la boite de dialogue

2.2. Enregistrer le fichier local dans la base de données avec la fonction WEBUTIL_FILE_TRANSFER.CLIENT_TO_DB

 
Sélectionnez

FUNCTION Webutil_File_Transfer.Client_To_DB
( 
   clientFile       in VARCHAR2, 
   tableName        in VARCHAR2, 
   columnName       in VARCHAR2,
   whereClause      in VARCHAR2,
   asynchronous     in BOOLEAN default FALSE,
   callbackTrigger  in VARCHAR2 default NULL
) return BOOLEAN;

clientFile représente le nom (chemin complet) du fichier à ouvrir
tableName indique le nom de la table de réception
columnName indique le nom d'une colonne de type BLOB de réception du fichier
whereClause indique la clause Where permettant d'identifier une ligne unique dans la table
asynchronous permet à Forms de redessiner l'écran avant la fin du processus
callbackTrigger indique le nom d'un déclencheur nommé (de niveau module) qui sera appelé au retour de la fonction

Exemple

Vous voulez enregistrer le fichier c:\docs\doc.xls dans la colonne DOC de la table DOCUMENTS dont la clé DOC_ID = 10

 
Sélectionnez

Declare
   LB$Result  BOOLEAN ;
Begin
LB$Result := Webutil_File_Transfer.Client_To_DB
( 
   ‘c:\docs\doc.xls', 
   ‘DOCUMENTS', 
   ‘DOC',
   ‘DOC_ID = 10'
    ) ;
End ;

La fonction Client_To_DB exécute un ordre UPDATE, ce qui implique que la ligne doit être créée préalablement dans la table.

3. Extraire un fichier de la base pour l'éditer sur le poste local

3.1. Extraire un fichier sur le poste local avec la fonction WEBUTIL_FILE_TRANSFER.DB_TO_CLIENT

 
Sélectionnez

FUNCTION DB_To_Client
 ( 
   clientFile       in VARCHAR2, 
   tableName        in VARCHAR2, 
   columnName       in VARCHAR2,
   whereClause      in VARCHAR2
) return BOOLEAN;

clientFile spécifie le nom du fichier local
tableName indique le nom de la table
columnName indique le nom de la colonne BLOB contenant le fichier
whereClause spécifie la clause Where qui identifie une ligne dans la table

3.2. Editer le document en local avec la fonction WEBUTIL_HOST.BLOCKING

 
Sélectionnez

FUNCTION  Blocking(cmd in VARCHAR2) return PROCESS_ID;

Exemple:

 
Sélectionnez

Declare
   LC$Cmd     Varchar2(256) ;
   Ret        WEBUTIL_HOST.PROCESS_ID ;
   LN$Result  Pls_Integer ;
   LC$FicName Varchar2(128) := Name_In( ‘BLOB_TABLE.DOC_NAME' ) ;
Begin
   LC$Cmd := 'cmd /c start "" /WAIT "' || LC$FicName || '"' ;
   Ret := WEBUTIL_HOST.blocking( LC$Cmd ) ;
   LN$Result := WEBUTIL_HOST.Get_return_Code( Ret ) ;
End ;

Notez le mot clé /WAIT qui permet d'attendre le retour de la fonction avant de rendre la main

3.3. Ré-enregistrer le fichier local dans la base de données avec la fonction WEBUTIL_FILE_TRANSFER.CLIENT_TO_DB

Voir la section 2.2

3.4. Supprimer la copie temporaire locale avec la fonction WEBUTIL_FILE.DELETE_FILE

 
Sélectionnez

Declare
   LB$Ok  Boolean ;
Begin   
   LB$Ok := WEBUTIL_FILE.DELETE_FILE( 'c:\temp\doc.xls' ) ;
End ;

4. Appeler le correcteur orthographique de MS Word depuis un item de la forme

Le code suivant permet d'appeler le correcteur orthographique de MS Word à partir d'un item de la forme

 
Sélectionnez

PROCEDURE CheckSpell
      (
            PC$Item in Varchar2
      ) IS
  -------------------------------------------
  --  Call the MSWord CheckSpell function  --
  -------------------------------------------
      MyApplication client_ole2.OBJ_TYPE;
      MyDocuments   client_ole2.OBJ_TYPE;
      MyDocument    client_ole2.OBJ_TYPE;
      MySelection   client_ole2.OBJ_TYPE;
      args          client_ole2.LIST_TYPE;

Begin

      MyApplication:=client_ole2.CREATE_OBJ('Word.Application');
      client_ole2.SET_PROPERTY(MyApplication, 'Visible', 0);
      MyDocuments:=client_ole2.GET_OBJ_PROPERTY(MyApplication, 'Documents');
      MyDocument := CLIENT_OLE2.INVOKE_OBJ(MyDocuments,'add');

      Myselection := CLIENT_OLE2.GET_OBJ_PROPERTY(Myapplication,'Selection');

      client_ole2.SET_PROPERTY(Myselection,'Text',Name_in(PC$item));
      client_ole2.INVOKE(MyDocument,'CheckSpelling');

      MySelection:=client_ole2.GET_OBJ_PROPERTY(MyApplication, 'Selection');
      client_ole2.INVOKE(mYSelection,'WholeStory');
      client_ole2.INVOKE(MYSelection,'Copy');

      COPY( CLIENT_OLE2.GET_CHAR_PROPERTY(Myapplication,'Selection'), PC$Item ) ;

      args := CLIENT_OLE2.CREATE_ARGLIST;
      client_ole2.ADD_ARG(args,0);
      client_ole2.INVOKE(MyDocument,'Close',args);
      client_ole2.DESTROY_ARGLIST(args);
      client_ole2.INVOKE(MyApplication,'Quit');

      client_ole2.RELEASE_OBJ(MySelection);
      client_ole2.RELEASE_OBJ(MyDocument);
      client_ole2.RELEASE_OBJ(MyDocuments);
      client_ole2.RELEASE_OBJ(MyApplication);

      copy(Substr(Replace(Name_in(PC$Item),CHR(13),CHR(10)),1,Length(Name_in(PC$Item))-1), PC$item );

Exception
      When others then
            Null ;
End;

Cette procédure peut être appelée depuis l'item en cours avec le code suivant:

 
Sélectionnez

CheckSpell( :system.cursor_item ) ;

5. Ecran de test

L'écran de test WEBUTIL_DOCS.fmb fourni avec le tutoriel permet de mettre en oeuvre toutes ces fonctionalités.

Télécharger l'écran WEBUTIL_DOCS.fmb

Image non disponible


Cliquer le bouton Select a local file... pour sélectionner un fichier du poste local

Image non disponible


Cliquer le bouton Store local doc to database pour enregistrer le fichier en base.

Image non disponible


Le nom du fichier enregistré en base apparait dans la liste des documents.

Image non disponible


Pour éditer le fichier, double-cliquer sur le nom ou cliquer le bouton Edit and save

Image non disponible



Lancer le correcteur orthographique

Image non disponible


Cliquer le bouton Start the Word checkspelling

Image non disponible


Cet écran est basé sur la table : BIN_DOCS que vous devez créer avec le script suivant:

 
Sélectionnez

CREATE TABLE BIN_DOCS 
 ( 
   DOC_ID  NUMBER(5) PRIMARY KEY, 
   NAME    VARCHAR2(128 BYTE), 
   DOC     BLOB 
 )
/

6. Conclusion

Cet exemple basique peut être le point de départ d'une version plus élaborée de gestion documentaire.

En ajoutant quelques colonnes à la table des documents, il devient facile de mettre en oeuvre un mécanisme de type check-in/check-out.

Chaque utilisateur pouvant visualiser simultanément tous les documents, mais un seul pouvant y apporter des modifications.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Copyright © 2005 SheikYerbouti. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.