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 levoluzione 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 nellarticolo 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 dallesterno 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, progetFORMS_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 delloggetto 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 dellultima macro creata e facciamo click su Modifica. Si apre una finestra del tutto analoga allambiente 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 allinterno di Forms COMPUTER PROGRAMMING N. 98 - GENNAIO 2001 Prog. Oracle_97.pm6 79 21/12/00, 18.38 79 PROGRAMMING sultazione dellhelp ci dice che lunico parametro obbligatorio è FileName, mentre per tutti gli altri è possibile utilizzare il valore di default. Il codice PL/SQL per lapertura 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 lunico 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 lidentificativo 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 è lintero 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 desempio. È 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; delloggetto 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 dellinterfaccia verso lutente e dellinterazione 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 lelaborazione. 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 nellinvocazione 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. Nellesempio di prima è possibile utilizzare dei documenti dappoggio 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