Oracle Forms e Word allegramente insieme

Transcript

Oracle Forms e Word allegramente insieme
Talvolta può essere impossibile raggiungere i risultati richiesti
nel layout delle stampe utilizzando Oracle Reports. Vediamo
com’è possibile utilizzare Microsoft Word da Oracle Forms
per realizzare i documenti graficamente più complessi
di Massimo Ruocchio
Oracle Forms e Word
allegramente insieme
C
chi utilizza il PL/SQL, un
on l’evoluzione e la
package si compone di
diffusione dei word
Gli oggetti necesprocessor e delle
una parte pubblica, detta
sari ad eseguire le
stampanti laser, si è
package specification, e di
operazioni di modififatta sempre più elevata la
una parte privata, detta
soglia della qualità del
package body. Nella specifica descritte nell’articolo
layout di stampa richiecation si includono le dista per i documenti prochiarazioni delle variabidotti dai sistemi informali, delle funzioni e delle
tici. Reports, lo strumento di repor- ma Forms utilizzeremo il package procedure che devono essere utilizting principale fornito da Oracle, ha OLE2. La Figura 1 mostra le proce- zabili dall’esterno del package, menottime potenzialità di formattazione dure e le funzioni che compongono tre nel body si inseriscono le variabidelle stampe. Il tool permette di va- il package OLE2. Le funzioni sono li, procedure e funzioni accessibili
riare font, colori e stili di scrittura caratterizzate dalla presenza della pa- solo da altre procedure del package,
anche a runtime, dimostrandosi più rola chiave return. Le componenti di nonché il codice delle procedure e
che sufficiente per la maggior parte OLE2 possono essere sommariamen- funzioni definite nella specification.
te raggruppate in quattro insiemi che La prima funzione da aggiungere al
delle stampe da produrre.
Talvolta, però, Reports può non es- consentono le seguenti attività:
nostro package word97 deve essere
sere sufficiente per ottenere la qualiin grado di aprire una nuova sessiogestire una lista di parametri;
tà richiesta. Nel seguito è descritta
ne Word. Ecco il codice da inserire
creare un oggetto;
la tecnica che consente di utilizzare
nella specification:
impostare e leggere le proprietà
Microsoft Word per creare i docudi un oggetto;
menti da stampare, in modo da po/* Creazione di un oggetto Application */
invocare un metodo di un oggetto.
ter sfruttare tutte le potenzialità di
function apri_sessione return OLE2.OBJ_TYPE;
formattazione del diffusissimo word
In più in OLE2 sono definiti due
processor. Tutto ciò che è descritto
Ed ecco il codice da inserire nel
in questo articolo fa riferimento alla datatype molto utili: OBJ_TYPE e body:
versione 1.3.2 di Oracle Developer/ LIST_TYPE.
/* Creazione di un oggetto Application */
2000 (Forms 4.5, Reports 2.5) ed alla
LA LIBRERIA PL/SQL
function apri_sessione return OLE2.OBJ_TYPE is
versione 97 di Microsoft Word.
Il primo passo da compiere per Applicazione OLE2.OBJ_TYPE;
gestire documenti Word da Forms è
IL BUILT-IN PACKAGE OLE2
begin
In Oracle Forms sono disponibili la creazione di una libreria PL/SQL
Applicazione := ole2.create_obj
numerosi built-in package, aggregati che trasformi, mediante OLE2, i co(‘Word.Application’);
di procedure, funzioni e tipi di dati mandi VBA che ci serviranno in semole2.set_property
realizzati da Oracle e messi a dispo- plici procedure PL/SQL. La libre(Applicazione, ‘Visible’, 1);
sizione degli sviluppatori. Per gesti- ria realizzata sarà poi referenziata in
return(Applicazione);
re Microsoft Word da un program- tutte le form in cui si dovesse preend;
sentare la necessità di gestire documenti WORD. Creata una nuova liNella specification abbiamo solo defibreria
nel
nodo
“Libraries”
di
Form
nito
come bisogna utilizzare la funMassimo Ruocchio è certificato Oracle AppliDesigner, assegniamole il nome zione apri_sessione, nel body abbiamo:
cation Developer e si occupa di analisi, proget“FORMS_WORD” e creiamo in essa
tazione e sviluppo di applicazioni software utiun package di nome “word 97” come
dichiarato una variabile Applicalizzando Oracle Designer e Developer. Può esmostra la Figura 2. Come è noto a
sere contattato a [email protected]
zione utilizzando il tipo OBJ_
78
Prog. Oracle_97.pm6
CP
ON-LINE
COMPUTER PROGRAMMING N. 98 - GENNAIO 2001
78
21/12/00, 18.38
PROGRAMMING
TYPE fornito dalla OLE2;
creato un oggetto Word.Application
utilizzando la funzione CREATE_
OBJ della OLE2, ed assegnato il
suo identificativo alla variabile Applicazione;
impostato ad 1 la proprietà Visible dell’oggetto Word.Application
mediante la procedura set_property della OLE2;
restituito al programma chiamante
il contenuto della variabile Applicazione.
Le istruzioni corrispondenti in
VBA sono:
Dim Applicazione As Word.Application
Applicazione.Visible = True
La maggiore complessità del codice scritto per primo è dovuta al fatto
che il PL/SQL non è un linguaggio
ad oggetti, ma un linguaggio di terza generazione. Lo stesso tipo di dati
OBJ_TYPE non definisce un oggetto ma una variabile scalare idonea a
conservare un identificativo di un
oggetto. Nel seguito si utilizzerà il
termine “oggetto” anche per le variabili di tipo OBJ_TYPE, sebbene
non si tratti di oggetti.
SE NON SI È ESPERTI DI VBA…
Una volta aperta la sessione Word,
bisogna stabilire quali sono i comandi che possono essere utili ed aggiungere al package word97 le procedure o funzioni necessarie per realizzarli. Se non si è esperti di VBA,
il modo più semplice per scrivere il
codice da utilizzare per realizzare
una data attività nella sessione Word
è il seguente: si registra una macro
di Word con le azioni desiderate, si
legge il codice VBA prodotto automaticamente da Word e si effettua la
traduzione in PL/SQL.
Immaginiamo ad esempio di volere, come prima attività, aprire il file
già esistente C:\pippo.doc. In Word,
dal menù Strumenti scegliamo Macro/Registra nuova macro, facciamo click su OK e ci troviamo in modalità
di registrazione macro.
A questo punto apriamo il file
C:\pippo.doc e terminiamo la registrazione della macro facendo click
su “Interrompi registrazione”. Per
leggere il codice VBA scegliamo, dal
menù Strumenti, Macro/Macro, selezioniamo il nome dell’ultima macro
creata e facciamo click su Modifica.
Si apre una finestra del tutto analoga all’ambiente standard di sviluppo
Listato 1 - Sostituire testo nel documento
Procedure ModSost (a in varchar2, b in varchar2,
Applicazione
Selezione
IN
ole2.obj_type) Is
ole2.obj_type;
arglist
ole2.list_type;
Find
ole2.obj_type;
begin
Selezione := OLE2.GET_OBJ_PROPERTY (Applicazione, ‘Selection’);
Ole2.Invoke(Selezione, ‘WholeStory’);
arglist := ole2.create_arglist;
ole2.add_arg (arglist, a); —testo cercato
ole2.add_arg (arglist, 0); —maiusc/minusc : FALSE
ole2.add_arg (arglist, 0); —parole intere : FALSE
ole2.add_arg (arglist, 0); —caratteri jolly : FALSE
ole2.add_arg (arglist, 0); —SOUNDSLIKE : FALSE
ole2.add_arg (arglist, 0); —ALLWORDFORMS : FALSE
ole2.add_arg (arglist, 0); —forward : FALSE
ole2.add_arg (arglist, 1); —fine docum : WDFINDCONTINUE
ole2.add_arg (arglist, 0); —format : FALSE
ole2.add_arg (arglist, b); —testo sostitutivo
ole2.add_arg (arglist, 2); —tipo sostituzione
: WDREPLACEALL
Find:=ole2.get_obj_property(Selezione, ‘Find’);
ole2.invoke(Find, ‘Execute’, arglist);
ole2.destroy_arglist (arglist);
end;
Procedure filesaveas (filename in varchar2,
documento in OLE2.OBJ_TYPE) is
arglist ole2.list_type;
begin
arglist := ole2.create_arglist;
ole2.add_arg (arglist, filename);
ole2.invoke (documento, ‘SaveAs’, arglist);
ole2.destroy_arglist (arglist);
end;
Figura 1 - La parte pubblica del built-in package OLE2, come viene visualizzata all’interno di Forms
COMPUTER PROGRAMMING N. 98 - GENNAIO 2001
Prog. Oracle_97.pm6
79
21/12/00, 18.38
79
PROGRAMMING
sultazione dell’help ci dice che l’unico parametro obbligatorio è FileName, mentre per tutti gli altri è possibile utilizzare il valore di default. Il
codice PL/SQL per l’apertura di un
file esistente è dunque:
function FileOpen (Applicazione in
OLE2.OBJ_TYPE, nomefile in varchar2)
return OLE2.OBJ_TYPE is
arglist ole2.list_type;
Documenti OLE2.OBJ_TYPE;
documento OLE2.OBJ_TYPE;
begin
Documenti := OLE2.GET_OBJ_PROPERTY
(Applicazione, ‘Documents’);
arglist := ole2.create_arglist;
ole2.add_arg (arglist, nomefile);
documento := OLE2.INVOKE_OBJ
(Documenti, ‘Open’, arglist);
ole2.destroy_arglist (arglist);
return(documento);
end;
Figura 2 - Creazione della libreria FORMS_WORD e del package word97
Visual Basic e sulla destra leggiamo
il codice:
WritePasswordDocument:=””,
WritePasswordTemplate:=””,
Format:=wdOpenFormatAuto
Sub NomeMacro()
End Sub
‘
‘ NomeMacro Macro
‘ Macro registrata il dd/mm/yy da XXXYYY
‘
Documents.Open FileName:=”C:\PIPPO.DOC”,
ConfirmConversions:=False,
ReadOnly:= False,
AddToRecentFiles:=False,
PasswordDocument:=””,
PasswordTemplate:= “”,
Revert:=False,
Leggendo il codice VBA si desume
che, per aprire un documento esistente, bisogna utilizzare il metodo
Open della collezione Documents passando una serie di parametri. Utilizzando un manuale oppure un Help
on-line di VBA è possibile conoscere
tutti i parametri dei metodi, i valori
di default e le costanti predefinite.
Nel nostro caso, una rapida con-
Figura 3 - La form fornita come esempio
80
Prog. Oracle_97.pm6
Abbiamo dichiarato tre variabili:
Arglist è la lista di parametri da passare al metodo Open, Documenti è la
collezione Documents, Documento è
il documento che andiamo ad aprire. La prima istruzione Identifica con
la variabile Documenti la collezione
Applicazione.Documents. Successivamente viene creata una lista di parametri e le viene aggiunto l’unico parametro di cui abbiamo bisogno. La
quarta istruzione invoca il metodo
Open della collezione Documenti con
i parametri specificati in Arglist. Infine si distrugge la lista di parametri
e si restituisce l’identificativo del documento aperto. Con la tecnica esposta è possibile inviare a Word tutte
le istruzioni VBA di cui si ha bisogno; in questo articolo ci limiteremo
ad aggiungere al nostro package una
procedura per sostituire testo nel
documento ed una per salvare il documento. Vediamo il codice nel Listato 1. Nella procedura ModSost si
sono eseguiti i seguenti passi: si definisce un oggetto Selezione di tipo
Selection, poi si indica che la selezione effettuata è l’intero documento
(Wholestory), successivamente si crea
una lista di parametri includente tutto ciò che serve per effettuare una
ricerca di testo ed una sostituzione
in Word, si crea un oggetto di tipo
Find (che significa richiamare la maschera Trova/Sostituisci di Word impostandone i parametri), si effettua
la ricerca/sostituzione ed infine si distrugge la lista di parametri.
La procedura filesaveas, molto più
semplice, invoca il metodo SaveAs
COMPUTER PROGRAMMING N. 98 - GENNAIO 2001
80
21/12/00, 18.39
PROGRAMMING
rire le variabili di sostituzione <<codcli>>, <<descli>>, <<indcli>>
e <<comcli>> che rappresentano i
quattro dati del cliente che abbiamo
deciso di gestire. Il codice da inserire nel trigger WHEN-BUTTONPRESSED del pulsante è nel Listato
2. La Figura 3 mostra il runtime della form d’esempio.
È possibile scaricare la form, la libreria, il file di creazione della tabella FW_CLIENTI ed una letteratipo dal sito ftp di Infomedia e dal
floppy allegato alla rivista.
Listato 2 - Il trigger WHEN-BUTTON-PRESSED
declare
Applicazione
OLE2.OBJ_TYPE;
Documento
OLE2.OBJ_TYPE;
d_Descrizione
FW_CLIENTI.DESCRIZIONE%TYPE;
d_Indirizzo
FW_CLIENTI.INDIRIZZO%TYPE;
d_Comune
FW_CLIENTI.COMUNE%TYPE;
Begin
/* recupero i dati del cliente dal DB */
Select Descrizione, Indirizzo, Comune
into d_descrizione, d_indirizzo, d_comune
from FW_CLIENTI
where codice = :codice;
/* Apro Word */
LIMITI DI QUESTA TECNICA
Applicazione := word97.apri_sessione;
/* Apro il documento */
Documento
:= word97.FileOpen(Applicazione, :lettera);
/* Effettuo le sostituzioni */
word97.modsost(‘<<codcli>>’,to_char(:codice),Applicazione);
word97.modsost(‘<<indcli>>’,d_Indirizzo,Applicazione);
word97.modsost(‘<<comcli>>’,d_comune,Applicazione);
word97.modsost(‘<<descli>>’,d_descrizione,Applicazione);
/* Salvo con nome */
word97.filesaveas(:destinazione, documento);
End;
dell’oggetto Documento passandogli
come parametro il nuovo nome da
attribuire al file.
A questo punto abbiamo una libreria che ci consente di aprire una
sessione Word, aprire un documento esistente, effettuare una sostituzione di testo nel documento e salvarlo
con un altro nome, tanto è sufficiente per un semplice esempio. Vediamo come utilizzare da Forms la libreria FORMS_WORD.
UTILIZZO DELLA LIBRERIA
FORMS_WORD DA FORMS
Il programma forms si dovrà occupare dell’interfaccia verso l’utente e
dell’interazione con il database.
La prima attività da compiere è referenziare nella form la libreria
FORMS_WORD nel nodo “Attached
Libraries”. Ricordiamoci di rimuovere il path della libreria, in modo
da poterla installare in qualunque
cartella senza problemi (dopo avere
correttamente valorizzato la chiave
FORMS45_PATH nel registro di
configurazione di Windows).
Per richiamare le funzioni che ab-
INFOMEDIA
biamo realizzato da una procedura
di una form si utilizza la notazione
word97.nome_funzione, quindi non è
necessario specificare il nome della
libreria FORMS_WORD nel codice,
ma è necessario specificare il nome
del package. Il nostro scopo è il seguente: realizzare una form che legga dal database i dati relativi ad un
cliente, apra una lettera-tipo realizzata con Word, sostituisca a dei parametri generici i dati del cliente
scelto e salvi la lettera creata.
Creiamo nella nostra form un blocco con tre campi ed un pulsante. I
tre campi servono per indicare il codice del cliente desiderato, il percorso completo della lettera-tipo ed
il percorso completo della lettera da
creare. Il pulsante attiva l’elaborazione. La tabella FW_CLIENTI ha
la seguente struttura:
CODICE
DESCRIZIONE
INDIRIZZO
COMUNE
CONCLUSIONI
NUMBER(10)
VARCHAR2(50)
VARCHAR2(50)
VARCHAR2(50)
Nella lettera-tipo è necessario inse-
CONSIGLIA
Oracle Forms Developers’ Handbook, 0130307548 JG, Lulushi, PTR,
Oracle Developer Forms Techniques, 0672318466 JG, Lakshman, SAMS,
Subito disponibili!!!
Per ordinare la tua copia vedi pag. 91
£ 192.000
£ 112.000
Il limite più evidente della tecnica
esposta consiste nei tipi di dato che
possono essere passati nell’invocazione dei metodi. La procedura
add_arg, infatti, gestisce solo parametri di tipo number o char. Alcuni metodi, invece, richiedono come parametri degli oggetti. Un esempio è
dato dalla gestione delle voci di glossario. Sia per creare una nuova voce
di glossario che per inserirla in un
documento, è necessario utilizzare la
collezione NormalTemplate.AutoText
Entries (invocando i metodi Add per
creare una nuova voce, Insert per inserire una voce in un documento); in
entrambi i casi è necessario specificare la porzione di testo interessata mediante un oggetto di tipo Range.
Questo limite non consente di utilizzare tutti i metodi messi a disposizione dal VBA, ma è solitamente aggirabile. Nell’esempio di prima è possibile utilizzare dei documenti d’appoggio al posto del glossario per conservare porzioni di testo.
Altro limite di questa tecnica è la
dipendenza dalle versioni di Word,
tutto ciò che è stato esposto in questo articolo non vale più se applicato a Word7 dove la sintassi delle macro era molto diversa. Potrebbero
dunque esserci problemi con le altre versioni di Word.
La tecnica esposta in questo articolo consente di gestire Microsoft
Word da Oracle Forms. È possibile
fare molto di più di quanto abbiamo
visto. I vantaggi sostanzialmente sono
due: le enormi potenzialità nella formattazione dei documenti di Word
e la libertà di modificare in ogni
momento i documenti word che si
utilizzano come template senza inficiare il funzionamento dei programmi, a meno che non siano modificate le variabili di sostituzione.
COMPUTER PROGRAMMING N. 98 - GENNAIO 2001
Prog. Oracle_97.pm6
81
21/12/00, 18.39
81