Webutil OLE container

SheikYerbouti

Oracle Forms web

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

English version ♪

- Titre : Webutil OLE container

- Auteur : SheikYerbouti

- Parution : 1 octobre 2005

- Licence : 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.

Sommaire

- 1. Présentation

- 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

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

- 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

- 3-2. Editer le document en local avec la fonction WEBUTIL_HOST.BLOCKING

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

- 3-4. Supprimer la copie temporaire locale avec la fonction WEBUTIL_FILE.DELETE_FILE

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

- 5. Ecran de test

- 6. Conclusion

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

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

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

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

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

FUNCTION  Blocking(cmd in VARCHAR2) return PROCESS_ID;

Exemple

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

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

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 :

CheckSpell( :system.cursor_item ) ;

5 - Ecran de test

L'écran de test WEBUTIL_DOCS.fmb fourni avec le tutoriel permet de mettre en œuvre toutes ces fonctionnalités.

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

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

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

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

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

Lancer le correcteur orthographique

Cliquer le bouton Start the Word checkspelling

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

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 œuvre 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.