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.