OpenOffice.Org MySQL PHP Corso breve su automazione d'ufficio
L'obiettivo di questa dimostrazione è la creazione di una connessione ad una sorgente dati e l'automazione della stessa con un foglio di calcolo generico. In particolare creeremo una semplice fattura in cui inseriremo in automatico i dati anagrafici dei clienti, precedentemente salvati in un database gestito da MySQL. Nel contempo utilizzeremo le funzioni dell'autopilota per la creazione dei formulari necessari all'inserimento dei dati.
La gestione di database relazionali presuppone la conoscenza di alcuni concetti fondamentali. In particolare è necessario conoscere il sistema di gestione del database medesimo (avvio del server, creazione database, tabelle, gestione utenti e permessi). In MySQL la gestione dei predetti parametri nonché la creazione di database, tabelle e quant'altro necessario, può essere effettuata direttamente da linea di comando ( a mezzo delle utility e dei comandi presenti nel server stesso), oppure avvalendosi di comode interfacce grafiche (MySQLCC, PhpMyAdmin, Webmin). Una volta creato il database e forniti gli opportuni permessi sarà possibile accedervi da OpenOffice. Tramite OpenOffice sarà peraltro possibile aggiungere tabelle, modificarne di preesistenti, creare formulari per l'inserimento dei dati e quant'altro.
La creazione di un database potrà essere fatta da riga di comando: digitando mysql nella consolle si otterrà (a patto di avere il server MySQL attivo!) il prompt di mysql:
Avendo i permessi necessari creare un database sarà semplice, basterà digitare: mysql> CREATE Fatture; Il comando mysql> USE Fatture ci permetterà di operare all'interno del nostro nuovo database per creare le tabelle sarà sufficiente dare i seguenti comandi: mysql> CREATE TABLE clienti ( ->cf_iva VARCHAR(16) NOT NULL, ->codice MEDIUMINT (10) DEFAULT '0' NOT NULL AUTO_INCREMENT, ->PRIMARY KEY (codice), ->UNIQUE codice (codice) ->); In questo modo creeremo due campi: cf_iva che non può essere nullo codice autoincrementale (e quindi unico) che è anche chiave primaria.
Analogamente per la tabella indirizzi andremo a digitare: mysql>create table indirizzi ( ->codice INT(11) DEFAULT '0' NOT NULL, ->rag_sociale TEXT, ->indirizzo TEXT, ->cap INT(5), ->citta TEXT, ->cf_iva VARCHAR(16) NOT NULL, ->telefono TEXT ->PRIMARY KEY (codice) ->);
Differentemente si potranno utilizzare le utility grafiche come phpmyadmin...
o Webmin...
per settare i permessi dei database...
o addirittura dei singoli campi
od ancora con MySQLCC...
Una volta creata la nostra base dati e settati i permessi corretti si potrà finalmente connettere. Sarà sufficiente selezionare il menù Tools-Data Source (Strumenti-Sorgente Dati)
Il passo successivo sarà la creazione della nuova sorgente dati cliccando sull'omonimo bottone...inserire il nome della nuova sorgente e dati e selezionare il driver di connessione desiderato nella casella combinata...e passare alla seconda schermata (nel ns. caso MySQL)
per selezionare il database sarà sufficiente cliccare sul bottone a fianco della casella Data Source URL e comparirà una maschera di selezione delle basi dati disponibili per il ns. driver...
le tabelle verranno caricate in maniera automatica...
oppure modificare le tabelle esistenti...
ma anche... crearne di nuove...
come pure... creare e modificare Query e Link...
una volta creata si potrà accedere alla nostra nuova sorgente dati semplicemente cliccando sull'icona corrispondente nella barra degli strumenti...
Tramite la funzione autopilota possiamo creare sia dei formulari per l'inserimento dei dati che dei report per la stampa degli stessi (eventulamente provenienti da apposite query).
sarà sufficiente selezionare i campi di interesse...
... ed inoltre l'aspetto e gli stili...
il nuovo formulario verrà salvato in un file esterno e posizionato nei link...
analogamente potrà essere fatto per i report...
la creazione del nostro foglio di lavoro non presenta particolari difficoltà...
possiamo quindi passare alla programmazione vera e propria creando la nuova macro... dal menù Tools-Macros-Macro passeremo alla relativa finestra...
una volta inserito il nome della nuova macro si potrà passare alla programmazione...cliccando su Edit...
entreremo quindi nel modulo di editing delle macro...
analizziamo quindi i passi necessari... Sub Ricerca rem define variables dim DatabaseContext As object dim DataSource As Object dim Connection As Object dim InteractionHandler As Object dim Statement As Object dim ID As String dim ResultSet As Object dim S As String dim RisRG As String dim RisIN As String dim RisCAP As String dim RisCA As String dim RisPI As String Dim Doc As Object Dim Sheet As Object Dim Cell As Object rem --------------------------------- Nella prima porzione vengono definite le variabili utilizzate di seguito.
rem ----------------------------------------------------------rem get access to the document rem global definition of variables questa è una funzione DatabaseContext = createunoservice("com.sun.star.sdb.databasecontext") DataSource = DatabaseContext.getByName("Fatture") questo è un service If Not DataSource.IsPasswordRequired Then Connection = DataSource.GetConnection("","") Else InteractionHandler = createunoservice("com.sun.star.sdb.interactionhandler") Connection = datasource.connectwithcompletion(interactionhandler) End If Questa è la fase cruciale che perfeziona la connessione alla sorgente dati (Fatture) senza immissione di user e password o differentemente.
UNO è una interfaccia di programmazione object oriented con cui OpenOffice controlla le parti della suite. Per usare UNO in OO Basic bisogna associare ad ogni oggetto una variabile. Questa dichiarazione è fatta a mezzo della istruzione Dim. dim DatabaseContext As Object La variabile oggetto deve poi essere inizializzata per poter essere usata. Questo può essere fatto tramite la funzione createunoservice: DatabaseContext = createunoservice("com.sun.star.sdb.databasecontext") Il com.sun.star.sdb.databasecontext assomiglia ad un object type ; nella terminologia UNO è in realtà chiamato service. L'oggetto DatabaseContext è definito un riferimento ad un object che supporta il com.sun.star.sdb.databasecontext service. Come la struttura di un object in VBA è definito dalla classe a cui appartiene, in OpenOffice Basic la struttura è definita attraverso il servizio che supporta. Un VBA object è sempre assegnato precisamente ad una singola classe. Un OpenOffice Basic object può, tuttavia, supportare molti servizi.
ID = InputBox("Digita il Codice Cliente: ", "Codice Cliente") Statement = Connection.createStatement() S = "SELECT `clienti`.`codice`, `indirizzi`.`rag_sociale`, `indirizzi`.`indirizzo`, `indirizzi`.`cap`, `indirizzi`.`citta`, `clienti`.`cf_iva`, `indirizzi`.`telefono` FROM `indirizzi` `indirizzi`, `clienti` `clienti` WHERE ( `indirizzi`.`codice` = `clienti`.`codice` ) AND ( ( `clienti`.`codice` =" & ID &") )" ResultSet = Statement.executeQuery(S) Raccogliamo il risultato di una InputBox nella variabile ID che successivamente utilizziamo nella query. Infine eseguiamo la query stessa e consolidiamo il risultato nella variabile ResultSet.
If Not IsNull(ResultSet) Then While ResultSet.next RisRG = ResultSet.getString(2) RisIN = ResultSet.getString(3) RisCAP= ResultSet.getString(4) RisCA = ResultSet.getString(5) RisPI = ResultSet.getString(6) Wend End If Vengono quindi salvati i risultati della query nelle rispettive variabili.
Doc = StarDesktop.CurrentComponent Sheet = Doc.Sheets(0) Cell = Sheet.getCellByPosition(4, 8) Cell.String = UCase(RisRg) Cell = Sheet.getCellByPosition(4, 9) Cell.String = UCase(RisIN) Cell = Sheet.getCellByPosition(4, 10) Cell.String = RisCAP Cell = Sheet.getCellByPosition(5, 10) Cell.String = UCase(RisCA) Cell = Sheet.getCellByPosition(4, 11) Cell.String = "P.IVA: " & RisPI End Sub ed infine, dopo aver selezionato il documento, inseriamo i risultati della query nelle rispettive posizioni.
il posizionamento dei dati nelle celle segue la seguente facile codifica...
La macro così creata può essere collegata ad un bottone, ad una combinazione di tasti, alla toolbar, ai tasti funzione...
ed alla fine ecco il risultato...
be... un sacco di cose: migliorare la macro...ovviamente. Si potrebbe inserire una Dialog Box dotata di combo box elencante i codici dei clienti e raffigurante le rispettive anagrafiche, richiedere l'imponibile e l'esistenza o meno della ritenuta d'acconto... Si potrebbero infine salvare in un database i dati inseriti. To Do
ed ora... PHP!