66
UNIVERSITÀ DEGLI STUDI DI TRIESTE _______________________________________________ Facoltà di Ingegneria Corso di Laurea triennale in Ingegneria Informatica Dipartimento di Elettrotecnica, Elettronica e Informatica Tesi di Laurea Progetto e realizzazione di un sistema di controllo di processo per stampe in outsourcing Relatore Prof. BARTOLI ALBERTO Laureando BATTISTON LUCA __________________________________________________ Anno Accademico 2007/08

Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

Embed Size (px)

Citation preview

Page 1: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

UNIVERSITÀ DEGLI STUDI DI TRIESTE

_______________________________________________

Facoltà di Ingegneria

Corso di Laurea triennale in Ingegneria Informatica

Dipartimento di Elettrotecnica, Elettronica e Informatica

 

 

Tesi di Laurea

 Progetto e realizzazione di un sistema di controllo di processo per stampe in outsourcing

 

 

RelatoreProf. BARTOLI ALBERTO

Laureando

BATTISTON LUCA

 

 

__________________________________________________

Anno Accademico 2007/08

Page 2: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

Sommario

Il testo tratta la realizzazione di un applicativo software per la gestione delle stampe delle bollette per le aziende del gruppo Acegas-Aps che gestiscono clienti di vendita. In particolare si tratta delle aziende AcegasAps s.p.a., AcegasAps Service s.r.l. e EstEnergy s.p.a.

L’applicativo andrà a sostituire l’attuale processo di archiviazione e visualizzazione dati; sarà realizzato integrando diversi software open source disponibili sul mercato informatico. Tali software sono MySql database managment system, Statistical R e PHP supportato da Apache.

L’applicazione risultante avrà dei file XML di controllo come input del sistema inviati dai fornitori tramite posta elettronica, ne archivierà i dati significativi in un database, e renderà disponibile la visualizzazione dei dati tramite pagine web in codice PHP.

Il software sviluppato verrà adottato dall’azienda dopo l’aggiudicazione della gara di stampa e imbustamento bollette. Si prevede che il nuovo fornitore sia operativo ad inizio 2009.

Le fasi di ricerca e di test sono state effettuate interamente durante l’attività di stage presso AcegasAps nella sede in via Maestri del lavoro 8 di Trieste (TS) sotto la tutela dell’ing. Igor Bonat.

~ 2 ~

Page 3: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

Indice

Capitolo 1 – Introduzione…………………………………………………………4Paragrafo1.1 - Processi aziendali………………………………………..5Paragrafo 1.2 - Descrizione processo attuale……………….…………...9Paragrafo 1.3 - Descrizione nuovo processo.……………….………….10Paragrafo 1.4 – Sviluppo del processo.……………….…………..........12

Capitolo 2 - DBMS – MySql Server 4.1.12 …………………………………....13Paragrafo2.1 - Configurazione…………………………………..……..13Paragrafo2.2 - Realizzazione………...…………………………..……..14

Capitolo 3 – Statistical R …………………………………………...…………....19Paragrafo3.1 - Configurazione…………………………………..……..19Paragrafo3.2 - Presentazione file XML………….…………..…..……..19Paragrafo3.3 - Realizzazione………...…………………………..……..20

Capitolo 4 – PHP 5.2.5 ………………………………...………………………....24Paragrafo4.1 - Apache web server 2.2………………………………....24Paragrafo4.2 - Configurazione…………………………………..……..25Paragrafo4.3 - Realizzazione………...…………………………..……..25

Capitolo 5 – Prodotto finale………………………...…...……………………....32Paragrafo5.1 – Processi osservabili…….………………………..……..32Paragrafo5.2 – Indicatori…..………...…………………………..……..33Paragrafo5.3 – Controllo allarmi..…...…………………………..……..33Paragrafo5.4 – Conclusioni……..…...…………………………..……..34

Appendice – Listati………………...………………...…...……………………....35

~ 3 ~

Page 4: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

Capitolo 1 - Introduzione

Il gruppo AcegasAps è la principale azienda multiutility1 del Nord-Est e serve un bacino di utenza di circa mezzo milione di persone, includendo famiglie, condomini, piccole e medie imprese, grandi imprese, associazioni di categoria e la pubblica amministrazione. In particolare l’azienda opera nella gestione e distribuzione delle risorse idriche, dell’energia elettrica e del gas, nella raccolta e nel trattamento dei rifiuti e nei principali servizi municipali. Il gruppo lavora per garantire la qualità della vita dei propri utenti, impegnandosi concretamente in un costante dialogo con le molteplici realtà presenti nel territorio, al fine di soddisfare le diverse esigenze dei propri clienti, garantendo a tutti un’elevata qualità dei servizi.

I principali servizi erogati dal Gruppo AcegasAps

Ciclo idrico integrato AcegasAps

Energia elettrica produzione AcegasApsEnergia elettrica distribuzione AcegasAps

Energia elettrica vendita AcegasAps ServiceEstEnergy

Gas distribuzione AcegasApsGas vendita EstEnergy

Servizi ambientali AcegasApsNestAmbiente

Servizi funerari AcegasAps

Teleriscaldamento NestEnergiaIlluminazione pubblica AcegasAps

AcegasAps Service

Impianti semaforici AcegasApsRelining Sil

La fornitura di acqua, energia e gas, realizzata tramite tre società del gruppo, viene fatturata ai clienti tramite le bollette, il cui ciclo produttivo è gestito dalla Linea Fatturazione della Direzione Amministrazione e Finanza.Poiché la stampa ed il recapito delle bollette sono gestite in outsourcing si è reso necessario realizzare un sistema di controllo di processo per esaminare e garantire il completamento di tutte le attività.

1 Azienda multiutility: è un’azienda che offre più tipologie di servizi pubblici

~ 4 ~

Page 5: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

1.1 - Processi aziendali

All’interno del processo produttivo delle bollette esiste una fase molto identificata come processo di emissione bollette. Questo processo viene chiamato dagli addetti ai lavori, per ragioni storiche, “Puesta”.Il processo di emissione bollette, a livello macroscopico, prevede la programmazione mensile delle emissioni. Tale fase è stata predisposta in modo da permettere l’organizzazione dei fornitori esterni nella fase di outsourcing2 del processo.

Parametri di controllo di processo

Nome convenzionale: Puesta1Input: necessità di produrre i ricavi aziendali per i servizi a rete

Output: bollette inviate ai clienti

Indicatori: numero emissioni

Numero fatture emesse

Numero bollettini emessi

Osservabilità: numero esecuzioni del processo

Numero emissioni reali

Numero fatture emesse

Numero bollettini emessi

Workflow: Data comunicazione calendario

Numero esecuzioni processo previste

Numero esecuzioni processo effettuate

Numero emissioni reali effettuate

Numero fatture emesse

Numero bollettini emessi

Controllabilità: numero fatture/servizi emettibili

Periodicità: mensile

Tale processo ha un periodo di osservabilità mensile infatti il calendario è deciso mensilmente ed anche gli indicatori di uscita (numero fatture e numero bollettini) sono mensili.

2 Outsourcing: parola inglese traducibile letteralmente come "approvvigionamento esterno", è termine usato in economia per riferirsi genericamente alle pratiche adottate dalle imprese di esternalizzare alcune fasi del processo produttivo, cioè ricorrere ad altre imprese per il loro svolgimento.

~ 5 ~

Page 6: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

Mantenendoci a un livello macroscopico di analisi possiamo suddividere il processo in 3 fasi:

Calendario emissioni Emissioni Indicatori mensili

La prima fase calendario emissioni prevede la definizione sulla carta delle giornate di emissione e la comunicazione ai fornitori interni ed esterni interessati al processo produttivo.

La seconda fase emissioni costituisce l’insieme di tutte le emissioni.

La terza fase indicatori mensili prevede controlli, report, statistiche ed indicazioni numeriche per garantire l’osservabilità del processo ed autorizzare i pagamenti dei fornitori esterni coinvolti nel processo produttivo.

~ 6 ~

Page 7: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

Il servizio viene richiesto per 3 aziende distinte:

Acegas Aps Estenergy Acegas Service

Sarà quindi necessario per ognuna delle aziende tenere sottocontrollo lo status delle bollette: gli oggetti attorno ai quali ruota l’intero problema. Tali bollette per comodità in questa trattazione saranno chiamate “prodotti”. Con il termine prodotto viene indicato un insieme di bollette della stessa azienda, prodotte dallo stesso sistema informativo. Attualmente ne sono definiti ed utilizzati i seguenti:

Prodotto Tipo Sistema Servizio Azienda

BOLLELI Bolletta BluCRM Energia EstEnergy

BOLLBLU Bolletta BluCRM Gas EstEnergy

BOLLGA Bolletta SIST. CLI Gas EstEnergy

BOLLEE Bolletta OPEN Gas EstEnergy

FATTEE Fatture SAP - EstEnergy

BOLLTRS Bolletta OPEN Acqua AcegasAps

BOLLPD Bolletta SIST. CLI Acqua AcegasAps

BOLLTIA Bolletta SIST. CLI Tia AcegasAps

BOLLTLT Bolletta SIST. CLI Teletermo AcegasAps

FATTTRS Fatture SAP - AcegasAps

BOLLSRV Bolletta OPEN Energia AcegasAps Service

BOLLAAS Bolletta BluCRM Energia AcegasAps Service

FATTAAS Fatture SAP - AcegasAps Service

SOLLELI Solleciti BluCRM Energia EstEnergy

SOLLBLU Solleciti BluCRM Gas EstEnergy

SOLLGA Solleciti SIST. CLI Gas EstEnergy

SOLLEE Solleciti OPEN Gas EstEnergy

SOL_FAT_EE Solleciti SAP - EstEnergy

SOLLTRS Solleciti OPEN Acqua AcegasAps

SOLLPD Solleciti SIST. CLI Acqua AcegasAps

SOLLTIA Solleciti SIST. CLI Tia AcegasAps

SOLLTLT Solleciti SIST. CLI Teletermo AcegasAps

SOLL_FAT_ACE Solleciti SAP - AcegasAps

SOLLSRV Solleciti OPEN Energia AcegasAps Service

SOL_BOL_AAS Solleciti BluCRM Energia AcegasAps Service

~ 7 ~

Page 8: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

SOL_FAT_AAS Solleciti SAP - AcegasAps Service

AVVELI Raccomandate BluCRM Energia EstEnergy

AVVBLU Raccomandate BluCRM Gas EstEnergy

AVVGA Raccomandate SIST. CLI Gas EstEnergy

AVVEE Raccomandate OPEN Gas EstEnergy

AVV_FAT_EE Raccomandate SAP - EstEnergy

AVVTRS Raccomandate OPEN Acqua AcegasAps

AVVPD Raccomandate SIST. CLI Acqua AcegasAps

AVVTIA Raccomandate SIST. CLI Tia AcegasAps

AVVTLT Raccomandate SIST. CLI Teletermo AcegasAps

AVV_FAT_ACE Raccomandate SAP - AcegasAps

AVVSRV Raccomandate OPEN Energia AcegasAps Service

AVV_BOL_AAS Raccomandate BluCRM Energia AcegasAps Service

AVV_FAT_AAS Raccomandate SAP - AcegasAps Service

Per ogni singolo prodotto si rivela necessario seguire il suo sviluppo nell’arco del processo che porta allo smistamento delle bollette nei singoli recapiti. A questo fine il processo produttivo di stampa è stato suddiviso in sei distinti passi, che definiamo eventi; ognuno dei quali identifica con precisione lo stato attuale del prodotto.

Vediamoli nel dettaglio:

Emissione Le aziende proprietarie stilano i dati relativi al consumo.

Invio dati Le informazioni vengono inviate all’azienda del gruppo AcegasAps che ha il compito di stampare le bollette.

Ricezione dati

~ 8 ~

Page 9: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

I dati sono ricevuti dalla ditta esterna e pronti alla stampa. Questo evento implica che i dati ricevuti siano completi ed integri.

Inizio stampe È stato dato il via alla stampa delle bollette.

Trasposto al recapito Le bollette sono inviate alla zona di riferimento dalla quale poi saranno smistate singolarmente.

Inizio recapito Ogni bolletta raggiunge il recapito.

Una data limite, entro la quale il processo di stampa deve essere terminato, viene definita dall’azienda cliente. Risulta quindi fondamentale avere la possibilità di registrare ogni cambio di stato, e quindi ogni evento di ogni prodotto gestito, per avere la massima osservabilità sullo sviluppo del processo al fine di controllarlo e gestirlo in modo che rientri nei tempi stabiliti.

1.2 – Descrizione processo attuale

Fino ad oggi il processo produttivo di stampa è stato gestito manualmente. I fornitori comunicano con il gruppo AcegasAps tramite l’invio di mail scritte in modo descrittivo. Ogni evento viene scritto per esteso tramite posta elettronica, per essere letto ed esaminato da un personale addetto che ha il compito di registrare le modifiche in un foglio di lavoro Microsoft Excel3. Il documento è condiviso all’interno della rete locale dell’azienda.Questo procedimento ha numerosi svantaggi:

È molto dispendioso in termini di tempo. Ad ogni evento è necessario leggere per intero il messaggio di posta elettronica inviato dai fornitori, essendo –come detto- scritto per esteso e non in modo sintetico e organizzato. Successivamente dovrà, sempre manualmente, essere registrato in un foglio di lavoro.

È molto facile commettere errori. Tutto il procedimento è gestito da un personale che è portato ad avere sviste, o nella lettura ed interpretazione della mail, oppure nella relativa scrittura in Excel.

Non è di immediata consultazione per il personale meno esperto. Tutti i dati sono archiviati in un unico foglio Excel nella rete locale il quale non possiede particolari funzionalità di visualizzazione, non permettendo così un’agile ricerca a chi non è abituato a trattare tipi simili di file.

È più oneroso per l’azienda che necessita di un personale specifico per la gestione delle informazioni ricevute dai fornitori

Per questa serie di motivi il gruppo AcegasAps ha deciso di modificare questo processo realizzando un applicativo informatico per automatizzare al meglio ogni passo. Vedremo come è stato sviluppato il nuovo processo.

3 Microsoft Excel: è il foglio elettronico prodotto da Microsoft, dedicato alla produzione ed alla gestione dei fogli elettronici. È parte della suite di software di produttività personale Microsoft Office.

~ 9 ~

Page 10: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

1.3 - Descrizione del nuovo processo

Il software che verrà realizzato sarà adottato in pianta stabile all’interno dell’azienda dopo l’aggiudicazione della gara di stampa ed imbustamento bollette. L’appalto tutt’ora in vigore appartenente alla ditta Selecta scadrà con la fine del 2008; la nuova gara è stata vinta dall’azienda Compunet e si prevede che i nuovi fornitori siano operativi a partire già dal gennaio 2009. Nelle specifiche tecniche della nuova gara è stato richiesto l’inoltro delle mail in formato XML ad ogni nuovo evento. Quindi dal 2009 l’input del processo non saranno più, come in precedenza, dei testi scritti per esteso inviati tramite posta elettronica, ma dei file XML di cui discuteremo la struttura richiesta nel terzo capitolo. Per quanto riguarda l’analisi e la gestione dei nuovi file di input l’utente ha espressamente richiesto l’utilizzo del software Statistical R. R avrà il compito di leggere i file XML, analizzarli e per ognuno di essi recuperare i dati significativi e memorizzarli in una base dati; il database scelto è MySQL. Per ogni singolo file sarà creato in un’apposita tabella un record4. Non è possibile che un file generi più di un record in tabella, però è previsto -in caso di errore in invio dati- che un file non generi alcun record. In tale caso il software dovrà segnalare l’errore all’utente. I record che si andranno ad accumulare in tabella saranno, col tempo, ciclicamente, rimpiazzati da record più recenti, avendo perso significato.Per quanto riguarda la parte di visualizzazione dei dati, e quindi l’output del processo, si vuole che l’utente abbia massima semplicità e immediatezza nel capire e ricercare le informazioni richieste ed inoltre l’intero processo di stampa deve essere totalmente osservabile in ogni suo passo. A questo scopo è stato concordato di realizzare pagine di tipo Web in codice php. La scelta del Php è dovuta principalmente a due fattori:

Sui server aziendali è già installato il “web server” apache già integrato con i moduli necessari per la visualizzazione di codice php

Avendo scelto come base di dati MySQL il Php è forse il linguaggio che meglio si adatta alla comunicazione

È ulteriormente richiesta la possibilità, sempre dalla stessa interfaccia Php, di modificare, aggiungere o cancellare alcuni tipi di dati.Vediamo dunque come può essere schematizzato il processo che l’applicativo dovrà sviluppare

4 Record: in informatica il record è un oggetto di un database strutturato in dati che contiene un insieme di campi o elementi, ciascuno dei quali possiede nome e tipo propri. I record devono molto alle tradizionali schede cartacee delle biblioteche, da cui riprendono in gran parte la struttura.

~ 10 ~

Page 11: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

Lo scopo che ci prefiggiamo nella realizzazione dell’applicativo, quindi, sarà quello di far interagire al meglio diversi software public domain5 reperibili in rete per poi essere utilizzato, all’interno di una azienda che già è predisposta di sistemi informativi6. Sarà quindi necessario in ogni parte del progetto analizzare con particolare attenzione la struttura del codice che dovrà prestarsi nel migliore dei modi alla comunicazione con altri software. In alcuni casi il passo sarà facilitato dalla presenza di moduli aggiuntivi7 contenenti funzionalità specifiche al caso particolare, in altri casi dovremo essere noi a realizzare tali ponti.

Da questa prima analisi effettuata con l’utente abbiamo stilato una prima serie di requisiti fondamentali che ci prefiggiamo di realizzare:

L’applicativo dovrà essere in grado di leggere file XML ed analizzarli; tale operazione dovrà essere sviluppata utilizzando il softwere statistical R. I file XML sono archiviati in una definita directory del PC sul quale sarà eseguito il programma.

Dovrà archiviare i dati significativi in un database MySQL. Il personale amministrativo dovrà avere la possibilità di modificare, aggiungere, cancellare, visualizzare parte dei dati memorizzati.

I risultati saranno stampati su pagine Web in codice PHP, tenendo presente che il personale amministrativo dovrà avere massima osservabilità del processo.

Procedendo con lo sviluppo vedremo di scendere più nel dettaglio con la specifica di requisiti per ogni passo del programma.

Possiamo verificare quali sono i principali vantaggi che porterà all’azienda del gruppo AcegasAps il nuovo processo in relazione a quello che andrà a sostituire:

L’applicativo automaticamente analizzerà i file di input del processo archiviando in un database i dati significativi. Questo riduce sensibilmente i tempi necessari per tale operazione

Un software non può commettere errori di lettura o trascrizione di dati. Se alcuni dati saranno archiviati errati vorrà dire che l’errore era già nel file di XML quindi non di competenza dell’azienda. Inoltre nel caso in cui i file di input non fossero riconosciuti (per esempio data scritta non valida o malformata) l’errore sarà segnalato.

La pagina Web di visualizzazione dei dati sarà semplice ed intuitiva con possibilità di visualizzare solo parte dei dati. Ogni tipologia di utente sarà in grado di soddisfare le proprie richieste senza particolari problemi.

Non è richiesto un personale specifico. Le operazioni di utenza sono molto contenute in termini di tempo e molto facili da effettuare.

5 Public domain: l’espressione di/in pubblico dominio caratterizza in generale beni – e in particolare informazioni – che non entrano nella proprietà di alcun soggetto individuato. Dal punto di vista del diritto internazionale, il pubblico dominio è quell’insieme di opere di ingegno sulle quali nessuna persona o organizzazione ha un interesse proprietario.

6 Sistema informativo: è costituito dall’insieme delle informazioni utilizzate, prodotte e trasformate da un’azienda durante l’esecuzione dei processi aziendali, dalle modalità in cui esse sono gestite e dalle risorse coinvolte.

7 Modulo aggiuntivo: unità di sviluppo rilasciata dall’azienda sviluppatrice per ampliare uno specifico aspetto del software, assente nella versione base dello stesso.

~ 11 ~

Page 12: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

1.4 – Sviluppo del processo

Nostro compito sarà quello di analizzare i requisiti imposti dall’azienda e sviluppare, sulle piattaforme concordate, l’applicativo richiesto. Nel momento in cui i fornitori invieranno i primi file in formato XML il software sarà messo nella rete locale dell’azienda, ma questo passo è escluso dai nostri compiti; del personale a parte sarà incaricato di metterlo sui server. Il software sarà sviluppato interamente in ambiente di test non connesso alla rete locale. Tutti i software che saranno utilizzati per lo sviluppo dell’applicativo saranno installati e configurati a dovere nell’ambiente di test utilizzato; al fine di ottenere un ambiente il più verosimile possibile al futuro ambiente dove dovrà girare il programma sono state preferite versioni di software anche più datate, ma corrispondenti alle versioni installate attualmente sui server aziendali. Per fare un esempio la versione di MySQL installata e configurata è la 4.1.12 nonostante sia già stata rilasciata la versione 5.0. Tale accorgimento è stato attuato per limitare al minimo le possibili modifiche che dovranno essere eseguite dal personale che avrà a cura l’installazione dell’applicativo nella rete locale aziendale. Anche le fasi di verifica e test del prodotto saranno eseguite sul singolo terminale.Nei prossimi capitoli vedremo passo-passo come è stato preparato e configurato l’ambiente di test sul quale l’applicativo sarà sviluppato e le parti più interessanti di codice.Per i listati completi consultare l’appendice dedicata.

~ 12 ~

Page 13: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

Capitolo 2 - DBMS – MySql Server 4.1.12

Il DBMS (Database Management System) è un sistema software progettato per consentire la creazione e manipolazione efficiente di database, ovvero di collezioni di dati strutturati, solitamente da parte di più utenti.La teoria dei database, e dei DBMS, rappresenta da sempre uno dei filoni più solidi e importanti dell'informatica.Il DBMS è differente dal concetto generale di applicazione sui database in quanto è progettato per sistemi multi-utente; a tale scopo si appoggiano a kernel8 che supportano il multitasking9 e il collegamento in rete.Ogni utente del sistema, e quindi ogni utente che ha l’accesso ad una determinata area del file system del server, è anche utente di questo servizio.Tutti i suoi script che necessitano di database faranno affidamento a questo servizio fornendo le credenziali dell’utente che li ha generati e agendo relativamente ai propri privilegi.

2.1 - Configurazione

Gli aspetti legati alla configurazione base non sono molti ma è necessario mettere in atto le opportune procedure per installare e successivamente avviare il server.Non appena decompresso il file scaricato dal sito ufficiale, tramite prompt dos, abbiamo digitato la riga di comando

c:\mysql\bin\mysqld-nt –install

per creare un nuovo servizio sul server. Per avviarlo è sufficiente aprire tra gli “strumenti di amministrazione” di windows i “Servizi”. Scorrendo la lunga lista va ricercato il nome del servizio a noi utile: MySQL. Se al fianco della voce non compare la dicitura "Avviato", selezionare la voce "MySql" e quindi "Proprietà"; in tipo di avvio, selezionare "Automatico" in modo che all'avvio del sistema operativo anche MySQL si attivi automaticamente.

Per completare le operazioni si deve fornire a MySql la struttura su cui costruire poi le basi di dati. Si utilizza il comando:

mysql_install_db

seguito da nessuna opzione, mysql_install_db provvede a creare la base su cui poggeranno tutti i database. E’ possibile ora avviare il servizio. Una volta attivo, la prima cosa da fare è quella di impostare una password per l'utente root, ovvero l'utente che è in grado di compiere tutte le operazioni su MySql,

8 Kernel: nucleo di un sistema operativo. Si tratta di un software avente il compito di fornire ai processi in esecuzione sull'elaboratore un accesso sicuro e controllato all'hardware. Dato che possono esserne eseguiti simultaneamente più di uno, il kernel ha anche la responsabilità di assegnare una porzione di tempo-macchina e di accesso all'hardware a ciascun programma (multitasking)

9Multitasking: permette di eseguire più programmi contemporaneamente. Definiti 2 processi: A e B da eseguire contemporaneamente, il passaggio iterativo dal processo A al processo B (per permettere la loro contemporanea esecuzione) e viceversa viene definito "cambio di contesto" (context switch)

~ 13 ~

Page 14: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

compresa quella di fermare il server. MySql permette l'accesso ai dati contenuti nei database esclusivamente agli utenti autorizzati, per questo è importante creare da subito degli utenti che abbiano delle possibilità di azione limitate per evitare seri problemi di sicurezza.Appena installato, il primo accesso al servizio MySql, ha un utente "root" che può accedere senza inserire alcuna password è in grado di compiere qualsiasi azione sul server, quindi la prima cosa da fare è quella di assegnare una password all’utente "root" in modo da evitare che chiunque possa entrare e fare danni senza incontrare alcun blocco.MySql è un server e in quanto tale permette l'accesso a chiunque si trovi nella stessa rete. Questo significa che se il server è collegato a Internet, chiunque vi potrà accedere.La possibilità di effettuare delle operazioni su di esso sarà vincolata al fatto di avere un nome utente e una password di accesso.Iniziamo assegnando una password all'utente "root". La password va inserita tra virgolette:

mysqladmin -u root password "mia_password"

-u root indica a MySql che si vuole eseguire l’accesso con i privilegi dell’utente "root";-p indica che dovrà essere richiesta la password per eseguire l'operazione.Omettendo -p il server si rifiuta di compiere l'operazione.

D’ora in poi qualsiasi comando dato specificando -u root richiederà, prima di procedere alla sua esecuzione, l’inserimento della relativa password precedentemente scelta.Consideriamo per esempio che venga inoltrato il seguente comando che permette di esaminare i parametri di lavoro del server:

mysqladmin -u root -p status

Appena premuto invio verrà richiesta la password. Durante il suo inserimento non apparirà nulla, è una misura di sicurezza per evitare che qualcuno riesca a vedere quanto è lunga la password.

2.2 - Realizzazione

Per prima cosa stendiamo quelli che sono i requisiti che dovrà presentare il nostro database il quale prenderà il nome di Stampe.sql. È fondamentale stilare una lista delle caratteristiche principali del database per avere da subito una chiara idea sulla sua struttura. La codifica e la creazione in linguaggio SQL sarà l’ultimo passo.Vediamo i requisiti:

Si vuole memorizzare ogni azienda del gruppo Acegas-Aps che gestisce clienti di vendita.

Deve essere possibile modificare, cancellare o inserire nuove aziende

Si vogliono memorizzare i possibili eventi che caratterizzano il processo di stampa delle

bollette

Devono essere presenti tutti i prodotti delle aziende cliente. Ognuno di essi deve avere

riferimento alla azienda proprietaria e per ogni prodotto deve essere segnalata la data di

emissione tramite la quale saranno ricavate le scadenze e gli allarmi. Ogni volta che inizia

un nuovo processo si deve poter inserire una nuova data di emissione.

~ 14 ~

Page 15: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

Si deve poter tener traccia di ogni cambio di evento di ogni singolo prodotto. Per ogni

cambio di evento si vuole memorizzare la data che lo ha caratterizzato.

Il primo obiettivo che ci poniamo nella realizzazione del database è quello di arrivare alla progettazione di un valido modello concettuale che rappresenti la struttura base su cui realizzare “Stampe”. Il tipo di modello che abbiamo scelto per rappresentare il database sfrutta la tecnica Entity-Relationship, meglio noto come Modello E-R10. La sua principale caratteristica è di riuscire a presentare in maniera molto intuitiva una struttura grafica chiara e semplice. Tale modello basa la sua efficacia nell’individuare chiaramente, da subito, gli oggetti principali del database: chiamate entità11.

Azienda Bolletta Evento

Tali entità saranno in relazione tra loro. Tra bolletta e azienda possiamo evidenziare una relazione di “possesso”: un’azienda sarà proprietaria della determinata bolletta che gestisce.Tra le bolletta ed evento, invece, esiste una relazione che possiamo chiamare “stato attuale”.Vediamo quindi quelle che nel modello concettuale sono definite come relazioni12:

Possesso Stato attuale

Il modello E-R di base del database è:

10 Modello E-R: Nel contesto della progettazione dei database, il modello entity-relationship (anche detto modello entità-relazione, modello entità-associazione o modello E-R) è un modello per la rappresentazione concettuale dei dati ad un alto livello di astrazione. Viene spesso utilizzato nella prima fase della progettazione di una base di dati in cui è necessario tradurre le informazioni risultanti dall'analisi di un determinato dominio in uno schema concettuale. Il modello E-R si basa su un insieme di concetti molto vicini alla realtà di interesse.

11 Entità: Rappresentano classi di oggetti (fatti, cose, persone,...) che hanno proprietà comuni ed esistenza autonoma ai fini dell'applicazione di interesse. Un'occorrenza di un'entità è un oggetto della classe che l'entità rappresenta. Non si parla qui del valore che identifica l'oggetto ma l'oggetto stesso. Un'interessante conseguenza di questo fatto è che un'occorrenza di entità ha un'esistenza indipendente dalle proprietà a esso associate. In questo il modello E-R presenta una marcata differenza rispetto al modello relazionale nel quale non possiamo rappresentare un oggetto senza conoscere alcune sue proprietà.

12 Relazioni: Le associazioni (dette anche relazioni) rappresentano un legame tra due o più entità. Il numero di entità legate è indica il grado dell'associazione.

~ 15 ~

Page 16: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

A questo modello però manca l’informazione forse più importante del database. Ovvero la data di emissione della bolletta. Tale data sarà un attributo13 dell’entità bolletta. Vediamo quindi di scendere più nel dettaglio con il nostro modello concettuale aggiungendo i principali attributi.

Ora abbiamo un valido modello concettuale sul quale studiare la realizzazione di un modello logico14 che rappresenterà la struttura finale di “Stampe”.Sicuramente avremo bisogno di una tabella per l’archivio delle aziende e per l’archivio degli eventi; una tabella di collegamento che rappresenta la relazione stato attuale, cioè una tabella che tenga traccia di ogni cambio di stato di ogni singolo prodotto. Avremmo bisogno di una tabella per archiviare tutti i prodotti che saranno seguiti dall’azienda e infine una tabella che registri le date di emissione.Quindi possiamo rappresentare “Stampe” in questo modo:

13 Attributo: Un'entità è descritta usando una serie di attributi. Tutti gli oggetti della stessa classe entità hanno gli stessi attributi: questo è ciò che si intende quando si parla di oggetti simili. La scelta degli attributi riflette il livello di dettaglio con il quale vogliamo rappresentare le informazioni sulle entità. Per ogni attributo associato ad una classe entità, dobbiamo definire un dominio di possibili valori.

14 Modello logico: si tratta di uno schema codificato che rappresenta a livello logico, quindi con un livello di astrazione molto alto, un database.

~ 16 ~

Page 17: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

Vediamo nel dettaglio le cinque tabelle di cui si compone

Aziende NaÈ il codice univoco che identifica l‘azienda; è la chiave primaria dell’entità “azienda” DescrizioneÈ il nome dell’azienda e tutte le informazione di cui si necessita per identificarla

Prodotti NpÈ il codice univoco che identifica il prodotto; è la chiave primaria dell’entità “bolletta” DescrizioneÈ il nome utilizzato per identificare univocamente il prodotto bolletta NaÈ chiave esterna. Indica l’azienda di appartenenza di tale bolletta. Si riferisce alla tabella aziende.

Eventi

NeÈ il codice univoco che identifica l’evento; è la chiave primaria dell’entità “evento” DescrizioneÈ la descrizione che identifica lo stato rappresentato da tale evento

Calendario NcÈ il codice univoco che identifica la data; è la chiave primaria dell’entità “data” Data_emissioneRappresenta la data di riferimento di emissione delle bollette NpÈ chiave esterna. Indica il prodotto a cui si riferisce la data.

Coll NpRappresenta il prodotto, si riferisce alla tabella prodotto; è chiave primaria con Ne NeRappresenta l’evento, si riferisce alla tabella eventi; è chiave primaria con Np

~ 17 ~

Page 18: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

DataRappresenta la data in cui tale prodotto ha cambiato stato in quello indicato.

Coll è la tabella più importante e viva del database. Sarà quella di riferimento che verrà aggiornata dall’applicativo che stiamo realizzando. In questa tabella possiamo trovare per ogni prodotto lo stato attuale e la data in cui ha raggiunto ogni evento.

Realizzato il modello logico del database rimane solo la scrittura del codice SQL per la quale rimandiamo all’appendice dedicata ai listati.

~ 18 ~

Page 19: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

Capitolo 3 - Statistical R

R è un ambiente di sviluppo specifico per l'analisi statistica e grafica dei dati, con un linguaggio orientato ad oggetti.È un software libero in quanto viene distribuito con la licenza GNU GPL, ed è disponibile per diversi sistemi operativi.E’ stato originalmente creato da Ross Ihaka e Robert Zealand dell’università di Auckland, Nuova Zelanda, ed ora è sviluppato dalla R Development Core Team. R è considerabile come un’implementazione del linguaggio di programmazione S.Uno dei punti di forza di questo linguaggio consiste nella possibilità di estendere il programma tramite uno svariato numero di pacchetti scaricabili singolarmente con specifiche funzioni di determinati argomenti. Questi pacchetti sono organizzati all’interno di un sito chiamato CRAN15.

3.1 - Configurazione

Per quanto riguarda l’installazione è necessario semplicemente scaricare dal sito www.r-project.org l’eseguibile del software e installarlo nel proprio sistema. Nel nostro caso la versione in questione sarà la 2.6.0 rilasciata il 3 ottobre 2007.

Per quanto concerne, invece, la configurazione non c’è molto da dire. Sarà necessaria l’installazzione di due pacchetti. Nel nostro caso avremmo bisogno del pacchetto XML al fine di leggere i dati input di ingresso allo script e il pacchetto RODBC al fine di comunicare con il Database MS MySQL prescelto.

3.2 - Presentazione file XML

L’XML, acronimo di eXtensible Markup Language, è un metalinguaggio di markup16 creato e gestito dal World Wide Web Consortium17 (W3C). A differenza dell’HTML, l’XML non ha tag18 predefiniti. Di per sé non è altro che un insieme standard di regole sintattiche per modellare la struttura di documenti e dati.Una precisa struttura per i file XML di input al sistema sono stati definiti nelle specifiche per l’assegnazione dell’appalto di stampa e imbustamento delle bollette alla ditta Compunet.Tali file che saranno di questo tipo:

<?xml version="1.0"?>15 CRAN: è l’acronimo di Comprehensive R Archive Network ovvero un sistema per documentare e rendere disponibili i moduli aggiuntivi al softwarebR. È una rete di server FTP e di server web che offrono la versione aggiornata di R, assieme alla documentazione ed i moduli aggiuntivi.

16 Linguaggio di markup: il termine markup (o marcatura) deriva dall’ambiente tipografico dove si usava marcare con annotazioni le parti del testo che andavano evidenziate o corrette. In ambito informatico è stato ripreso in quanto il linguaggio XML è costituito da vere e proprie marcature.

17W3C: Nell’ottobre del 1994 Tim Barnes Lee fondò al MIT, in collaborazione con il CERN, questa la World Wide Web Consortium, con lo scopo di migliorare gli esistenti protocolli e linguaggi per il WWW e di aiutare il Web a sviluppare tutte le sue potenzialità

18Tag: elemento sintattico con cui si marcano porzioni di un documento nei linguaggi di markup.

~ 19 ~

Page 20: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

<LOG><PRODOTTO nome="BOLLSRV" /><STATO dataev="12/01/2008" oraev="11:11" evento="1" /></LOG>

Dove il nodo log rappresenta la radice del file, con due figli: prodotto e stato.Prodotto identifica la bolletta di cui si andrà a modificare lo stato.Il tag Stato invece va ad identificare quello che sarà il nuovo evento del prodotto. L’attributo evento coincide con l’id del nuovo stato, dataev e oraev evidenziano quando il prodotto ha iniziato la nuova fase del suo processo produttivo.Tutti i file che dovranno essere elaborati saranno posti di default nella cartella Programmi\R\R-2.6.0\library\XML\stampe del terminale da dove verranno eseguiti gli script.Ogni singolo file rappresenta il passaggio di un dato prodotto alla fase successiva nell’arco del processo aziendale. Sarà compito dell’applicativo andare nel database ad aggiornare il prodotto per ogni file, spedito dalle aziende, presente nella locazione specificata.

3. 3 - Realizzazione

Statistical R rappresenterà il primo gradino dell’applicazione; sarà responsabile di leggere i file XML di input. Quindi andiamo a definire cosa ci aspettiamo da R:

Dovrà leggere i file XML di ingresso al sistema.

Contare il numero di file presenti nella cartella Programmi\R\R-2.6.0\library\XML\stampe e

ripetere il procedimento tante volte quante sono gli XML.

Interpretare ogni singolo file e memorizzarne i dati significativi in un’array19

Inserire nel database stampe i dati ricavati dai file XML. Il software sarà richiamato ad

utilizzare una connessione ODBC20 con il DBMS MySQL.

La prima cosa da fare quindi è quella di aprire una connessione ODBC per permettere la comunicazione con MySQL. Per creare una connessione ODBC, relativamente a un sistema operativo Windows, è necessario aprire la directory relativa agli gli strumenti di amministrazione, situati nel pannello di controllo. Da qui “cliccare” su Origine dati (ODBC). Si aprirà una finestra dalla quale selezionare il tag DSN utente; tra le varie opzioni disponibili evidenziare MySQL_5 che identifica i driver MySQL ODBC 5.1 Driver. Scegliere aggiungi e scegliere ancora i driver richiesti per ultimare il processo. Questo è un passo fondamentale in quanto garantisce la creazione del “ponte” di collegamento tra le piattaforme R e MySQL. La massima gestione del canale appena creato sarà scopo del modulo aggiuntivo “RODBC” fornito direttamente dalla World Wide Web Consortium e integrato singolarmente nel software R.

19 Array: un array o vettore è una struttura dati complessa usata in molti linguaggi di programmazione e chiaramente ispirata alla nozione matematica di vettore.

20 ODBC: Open Database Connectivity è una API standard per la connessione ai DBMS. Tale API è indipendente dai linguaggi di programmazione, dai sistemi di database e dal sistema operativo.

~ 20 ~

Page 21: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

Script di lettura XML

L’obiettivo di questo primo passo è quello di realizzare uno script che sia in grado di leggere un singolo file posto nella cartella sopraindicata, stamparlo a video e memorizzare in un array i parametri che in seguito dovranno essere inseriti nel Database. Vediamo nel dettaglio le righe di codice più significative:

> library(XML)

Per prima cosa viene caricato il pacchetto XML. Il package è stato precedentemente installato nel sistema però deve essere caricato ad ogni esecuzione dello script

> filename <- system.file("stampe",”1.xml”,package="XML")

L’istruzione system.file con specificazione al package “XML” richiama il percorso di sistema Programmi\R\R-2.6.0\library\XML. Le variabili indicate nella funzione evidenziano livelli più interni.Così filename assumerà il valore:” Programmi\R\R-2.6.0\library\XML\1.xml”, percorso del primo file xml della cartella.

doc <- xmlTreeParse(filename)

Utilizzando il parser di R viene creata una variabile doc di tipo XML;

doc è ora una struttura riconosciuta da R che rappresenta il file.

valp <- xmlAttrs(file[["PRODOTTO"]])vals <- xmlAttrs(file[["STATO"]])

Gli attributi dei tag Prodotto e Stato vengono immagazzinati nelle variabili di tipo array “valp” e “vals”.Adesso questi dati sono pronti per essere inseriti nel database.

Script di Insert nel database da R

Dobbiamo concludere la scrittura dello script al fine di inserire tutti i dati dei file in Stampe. Per poter far questo avremo quindi bisogno di utilizzare un ciclo for21. Ogni volta che verrà lanciato lo script il programma andrà ad aggiornare nel database le informazioni presenti in ogni singolo file all’interno della cartella. Nel caso il file non sia stato modificato di recente il programma semplicemente sovrascriverà nel database gli stessi dati già presenti, senza intoppi.Questo quindi è quello che risulta essere lo script conclusivo.

> library(RODBC)

Viene caricato il pacchetto RODBC

con <- odbcConnect("MySQL_5", uid="root")

Viene creata la connessione tramite canale ODBC a MySQL. Tale passo è possibile avendo in precedenza realizzato un canale ODBC al DBMS.

> sqlQuery(con,"use stampe")

21 Ciclo for: nei linguaggi di programmazione, un ciclo for è una struttura di controllo iterativa che prevede la ripetizione di un comando per 0 o più volte (anche infinite) specificando generalmente il numero di iterazioni che si andranno a effettuare.

~ 21 ~

Page 22: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

Viene settato “Stampe” come database operativo.

> files <- list.files(directory)

Immagazzina nella variabile di tipo array “files” tutti gli XML contenuti nella cartella.

> for (j in 1:len) {

Len rappresenta il numero di file, quindi il numero di cicli necessari

+ filename <- system.file("stampe",files[j],package="XML")+ doc <- xmlTreeParse(filename)+ file <- xmlRoot(doc)+ valp <- xmlAttrs(file[["PRODOTTO"]])+ vals <- xmlAttrs(file[["STATO"]])

Ora abbiamo nei due array “valp” e “vals” tutti i dati necessari. Per realizzare l’insert avremo bisogno dei valori ne, np e della data

+ ne <- vals[3]

Il valore ne viena passato direttamente dal file XML

+ select <- paste("select np from prodotti where descrizione='",valp[1],"'", sep="")+ np <- sqlQuery(con,select)

Ricavamo il valore di np dalla tabella prodotti, di cui dal file XML ho il valore della colonna descrizione. Viene utilizzata la query SQL:

“select np from prodotti where descrizione='nome'

Dove al posto di ‘nome’ viene preso il valore dal file XML

+ sep <- unlist(strsplit(vals[1],"/"))+ data <- paste(sep[3],sep[2],sep[1],sep="")+ sep <- unlist(strsplit(vals[2],":"))+ data <- paste(data,sep[1],sep[2],"00",sep="")

Viene assemblata la stringa data al fine di ottenerla in formato Data/Ora compatibile a MySQL ovvero AAAAMMGGOOMMSS. In poche parole deve essere inserito prima l’anno in quattro cifre, poi il mese, il giorno, l’ora (24h) i minuti e infine i secondi imposti di default a “00” essendo un dato totalmente trascurabile

Adesso abbiamo tutti i valori necessari per l’insert

+ if (is.numeric(np) {

Viene effettuato un controllo su nc o np. E’ possibile che le select dalle quali sono stati ricavati avessero valore nullo come risultato. In questo caso l’insert non potrà essere portato a termine con successo.

+ insert <- paste("insert into coll(np,ne,data) values(",np,",",ne,",'",data,"')",sep="")+ sqlQuery(con,insert) } else {+ cat("Non ho potuto inserire i dati relativi a ",files[j]," perchè manca la corrispondenza del prodotto.\n") else

Vengono creati dei messaggi specifici in caso di errore –come detto- nell’operazione di insert al database. In questo caso sarà necessario contattare l’azienda cliente al fine di ottenere un nuovo file XML valido

+ }+ }>odbcClose(con)

~ 22 ~

Page 23: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

Viene chiusa la connessione ODBC

Per i listati completi degli script R utilizzati rimandiamo il lettore all’appendice.

~ 23 ~

Page 24: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

Capitolo 4 - PHP 5.2.5

IL PHP è un linguaggio di scripting interpretato, con licenza open source22; originariamente concepito per la realizzazione di pagine web dinamiche. Un Web Server che riceve una richiesta da un’ applicazione Browser23 rivolta ad uno script PHP, eseguirà il codice dello script richiesto (passandogli eventuali parametri contenuti nella richiesta). Al termine dell’esecuzione il Web Server24 risponderà al Browser con un documento in Html25 generato dallo script PHP.Attualmente questo linguaggio è utilizzato principalmente per sviluppare applicazioni web lato Server, ma può essere usato anche per scrivere script a linea di comando o applicazioni stand alone26 con interfaccia grafica, come nel nostro caso.Il suo nome è un acronimo ricorsivo che sta per PHP: Hypertext Preprocessor (PHP: processore di ipertesti).

4.1 – Apache web server 2.2

Al fine di permettere al terminale di interpretare le pagine web php abbiamo la necessità di installare un web server: Apache 2.2.Apache è il nome dato alla piattaforma server Web modulare più diffusa (ma anche al gruppo di lavoro open source che ha creato, sviluppato e aggiornato il software server). Apache è un software che realizza le funzioni di trasporto delle informazioni, di internetwork e di collegamento, ha il vantaggio di offrire anche funzioni di controllo per la sicurezza come quelli che compie il proxy.

L’installazione è molto semplice, è sufficiente scaricare dal sito ufficiale il file di installazione ed eseguirlo seguendo le istruzioni forniteci. Ci sarà chiesto di scegliere il nome della nostra macchina all’interno della rete, il dominio di riferimento, la mail dell’amministratore e la porta su cui il server starà in ascolto. Nel nostro caso, poichè tutto il sistema dovrà essere utilizzato in ambiente di test, nei primi due campi possiamo inserire "localhost" e nel terzo un'indirizzo e-mail qualsiasi. Nel quarto campo possiamo scegliere la porta di default (porta 80) od un'altra (da utilizzare soltanto se nella macchina sia già attivo un altro Webserver, ad esempio IIS o un'altra versione di Apache).

22

Open Source: particolare tipo di licenza legata ad un software per la quale il codice sorgente è lasciato alla disponibilità di eventuali sviluppatori, in modo che con la collaborazione il prodotto finale possa raggiungere una complessità maggiore di quanto potrebbe ottenere un singolo gruppo di programmazione.

23Browser: programma che consente agli utenti di visualizzare e interagire con testi, immagini e altre informazioni, tipicamente contenute in una pagina web. 24 Web server: Un server web è un programma, e per estensione il computer su cui è in esecuzione, che si occupa di fornire, su richiesta del browser, una pagina web (spesso scritta in HTML). Le informazioni inviate dal web server viaggiano in rete trasportate dal protocollo HTTP. L'insieme di server web dà vita al World Wide Web, uno dei servizi più utilizzati di Internet. Normalmente un server web risiede su sistemi dedicati ma può essere eseguito su computer ove risiedano altri server o che vengano utilizzati anche per altri scopi. Per esempio si può installare un web server su un normale personal computer allo scopo di provare il proprio sito web.

25 HTTP: (Hyper Text Transfer Protocol ) protocollo di trasferimento ipertestuale. Usato come principale sistema per la trasmissione di informazioni sul web

26 Stand alone: in informatica si dice di un oggetto capace di funzionare da solo, indipendentemente dalla presenza di altri oggetti con cui potrebbe comunque interagire. Detto di un programma, indica il fatto che tale programma possa funzionare senza che siano richiesti altri componenti.

~ 24 ~

Page 25: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

Per quanto riguarda la configurazione invece gli amministratori del server possono usare il file httpd.conf, che su sistemi windows è situato nella subdirectory conf della directory di installazione di apache. Questo file offre tutta la libertà che offre il server, quindi aggiungere moduli, estensioni, nuovi mime-type27 e altro ancora. Vedremo come aggiungere il modulo php nel prossimo paragrafo.

4.2 - Configurazione

La configurazione, per quanto riguarda il php, nell’ambiente di riferimento, si effettua tramite il file “php.ini” contenuto nella directory di riferimento. Per questo progetto sarà utilizzata la versione 5.2.5 di PHP reperibile e scaricabile gratuitamente al sito www.php.net.Per integrare il PHP 5 all’interno di apache sono state inserite le seguenti righe di codice

LoadModule php5_module “c:/php/php5apache2.dll”AddType application/x-httpd-php .phpPHPIniDir “C:/php”

al file httpd.conf nella cartella conf di apache. Tale notazione può essere eseguita utilizzando un qualsiasi editor di testo28. Ha lo scopo di caricare il modulo php all’interno del web server installato.Come ultima operazione abbiamo rinominato in php.ini il file php.ini-dist nella cartella C:\php. E’ infine necessario riavviare Apache al fine di rendere esecutive le modifiche apportate.

4.3 - Realizzazione

L’obiettivo di queste pagine php sarà quello di creare un’interfaccia user-friendly29 che si frapponga fra l’utente e il database MS MySQL. Tramite queste pagine saranno possibili operazioni alla tabella Eventi e alla tabella Calendario e operazioni di join30 al fine di visualizzare una tabella riassuntiva dei prodotti.Per quanto riguarda la prima tabella, le opzioni saranno di Visualizzazione dei dati in tabella, di Insert di nuovi eventi, di Update e cioè di modifica ad uno o più eventi in tabella e di Erase, ovvero sarà possibile eliminare dei record. Per quanto concerne la seconda tabella invece le opzioni disponibili saranno soltanto di Update a un record in tabella e di Visualizzazione ad essi.Le pagine avranno una sezione di login, per evitare accessi indesiderati che possano intaccare i dati nel nostro database. Il nome utente e password per l’acceso saranno salvati in una pagina chiamata “configurazione.inc”. Tale pagina sarà inclusa in ogni passo della progettazione e vi sarà fatto riferimento per verificare la validità della connessione a MySQL; saranno memorizzati il serverhost, il nome utente, la password e il database di riferimento. Al momento dell’apertura della pagina principale, quando sarà effettuata la connessione al DBMS MySQL, se i dati non saranno corretti la connessione non sarà portata a termine e verrà stampato a video un messaggio di errore.

27 Mime-Type: il Multipurpose Internet Mail Extension è uno standard di internet che definisce il formato delle e-mail.

28 Editor di testo: è un software per la gestione di testi in formato digitale. Si distingua de un elaboratore testi (Word) in quanto non gestisce la formattazione del documento o altre funzionalità grafiche avanzate.

29 User-friendly: l’usabilità è definita come l’efficacia, l’efficienza e la soddisfazione con le quali determinati utenti raggiungono determinati obiettivi in determinati contesti. In poche parole definisce il grado di facilità e soddisfazione con cui l’integrazione uomo-macchina si compie.

30 Join: in SQL per join si intende un’operazione che cmbina record di due tabelle di un database relazionale in un'unica tabella temporanea, solitamente chiamata joined-table

~ 25 ~

Page 26: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

Possiamo stilare sinteticamente una lista di quelli che sono i requisiti che vogliamo realizzare in PHP:

Si vuole che l’accesso alla pagina principale di gestione sia protetta da un username e una

password

Username e password dovranno essere memorizzati in una pagina php chiamata

configurazione.inc

L’applicazione deve avere massima usabilità

Dovrà creare una connessione al database “Stampe” di MySQL

Deve essere possibile inserire, cancellare, modificare eventi dalla tabella eventi

Deve essere possibile modificare la data di emissione per ogni singolo prodotto

Si vuole la possibilità di visualizzare le tabelle eventi e calendari

Deve essere visualizzabile una tabella generale dalla quale poter monitorare ogni singolo

cambio di evento di ogni singolo prodotto per ogni singola azienda

Main form

~ 26 ~

Page 27: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

Qui sopra possiamo vedere come si presenterà la pagina principale del form; da qui sarà possibile agire su tutti gli aspetti richiesti dai requisiti.Come si può vedere, la caratteristica che più è stata ricercata è la semplicità: la form appare chiara ed efficace, adatta a qualsiasi utenza, anche ai meno esperti dal punto di vista informatico. Viene così rispettato il più importante requisito posto dalla società.

Come detto questa pagina, come anche tutte le altre, avrà il compito di connettersi a MySQL come prima azione. Vediamo il codice necessario al fine di realizzare tale connessione

$db = @mysqli_connect($host, $user, $psw);if ($db == FALSE) die("Errore nella connessione a MySQL.<br> Verifica i dati in configurazione.inc");

in queste righe viene stabilita la connessione a MySQL.Nel caso in cui la connessione non sia portata a termine è previsto un messaggio di errore che consiglia di controllare i dati nella pagina “configurazione.inc”

mysqli_select_db($db,$dbname)or die("Errore nella connessione al database selezionato.<br> Verifica i dati in configurazione.inc");

qui sopra invece viene definita la connessione al database specifico, stampe nel nostro caso. Anche qui in caso di errore è previsto un messaggio di errore

~ 27 ~

Page 28: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

Per quanto riguarda invece il corpo della pagine è particolarmente interessante vedere la realizzazione dei menù a discesa i quali vanno a recuperare i dati direttamente dal database. Per questo esempio vediamo come è realizzato il menù a tendina relativo al prodotto da modificare nella tabella calendario

<form method="post" action="UCalendario.php">

Definisce la pagina di riferimento a cui inviare i dati del post

Seleziona il prodotto da modificare:

<select name="prodotto"><?php

Da qui in poi comincia il codice php

$select = "select * from prodotti";$result = mysqli_query($db, $select);$num = mysqli_num_rows($result);

La variabile “$num” assume un valore pari al numero di prodotti in tabella

for ($i=1;$i<=$num;$i++) {

Il ciclo for ripete l’operazione tante volte quanti sono i prodotti

$select = "select descrizione,np from prodotti where np=$i";

Viene selezionato ad uno ad uno ogni prodotto. L’id che identifica il prodotto viene incrementato ad ogni ciclo essendo la variabile contatore “$i”

$result = mysqli_query($db, $select);$row = mysqli_fetch_array($result);

echo"<option value=$row[np]>$row[descrizione]</option>";

Viene inserito tra i valori possibili del post il prodotto isolato dalla select}?>

Per il resto del codice PHP della pagina principale rimandiamo ai listati nell’appendice.

Modifica al database

~ 28 ~

Page 29: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

Qui sopra abbaimo un’esempio di una pagina di modifica al database.In questo esempio specifico si tratta di un’operazione di modifica a un record eventi.

Vediamo in dettaglio il passaggio più importanti del codice, ovvero la fase di modifica al record in tabella

$query = "update eventi set Descrizione='$_POST[new]' where Ne='$_POST[prodotto]'";mysqli_query($db, $query);

viene costruita la riga SQL per la modifica del record in tabella. Il vecchio dato da modificare e il nuovo vengono passati tramite php dalla pagina precedente grazie al metodo GET. Ipotizzando che il vecchio nome prodotto sia “Bolltr” e il nuovo nome desiderato sia “Bolltrs” la stringa SQL corretta per la modifica è:

“update eventi set Descrizione='Bolltr' where Ne='Bolltrs’”

echo "Questa è la nuova tabella Eventi<br>";

$result = mysqli_query($db, 'select * from eventi');while ($row = mysqli_fetch_array($result)) {

$id = $row[Ne];$nome = $row[Descrizione];echo "$id&nbsp;&nbsp;";

~ 29 ~

Page 30: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

echo "$nome&nbsp;&nbsp;";echo "<br>";}

Semplicemente è poi stampata a video quella che, a tutti gli effetti, è la nuova tabella; utile per verificare che le modifiche apportate siano quelle desiderate dall’utente.

Tabella riassuntiva

Qui sopra abbiamo la schermata che appare se dalla form principale andiamo a cliccare su “visualizza tabella riassuntiva”. Questa tabella sarà l’azione principale di monitoraggio del processo dei prodotti lungo tutto il suo sviluppo. Di ogni prodotto possiamo vedere la data precisa in cui ha cambiato evento. È possibile visualizzare tutti i prodotti seguendo un ordine cronologico dall’evento meno recente al più recente oppure, grazie al menù a tendina, selezionare un solo prodotto del quale avere la completa cronologia, dal momento in cui entra nel processo di stampa sino al presente.Per realizzare questa pagina abbiamo sfruttato una operazione di join al database. Vediamola più in dettaglio:

select prodotti.descrizione,aziende.descrizione,eventi.descrizione,coll.data from prodotti,aziende,eventi,coll where coll.np=prodotti.np and coll.ne=eventi.ne and prodotti.na=aziende.na

~ 30 ~

Page 31: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

vengono selezionate le colonne di descrizione, ovvero quelle contenenti il nome per esteso in caratteri delle entità, rispettivamente dalle tabelle prodotti, aziende ed eventi. Inoltre viene presa la colonna di data dalla tabella Coll. Vengono poi posti uguali gli id di ogni singola tabella per andare a sostituire –in poche parole- ai riferimenti numerici nella tabella Coll la descrizione a lettere, per rendere la tabella più leggibile.

Nel caso in cui dal menù a tendina della form fosse selezionato uno specifico prodotto da monitorare la query diventerebbe:

select prodotti.descrizione,aziende.descrizione,eventi.descrizione,coll.data from prodotti,aziende,eventi,coll where coll.np=prodotti.np and coll.ne=eventi.ne and prodotti.na=aziende.na and prodotti.descrizione=’$_POST[prodotto]'

Rispetto alla stringa precedente viene soltanto aggiunto:

“prodotti.descrizione=’$_POST[prodotto]'”

al fine di visualizzare solo i record che per nome prodotto hanno il corrispettivo passato col metodo GET dalla form.

~ 31 ~

Page 32: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

Capitolo 5 - Prodotto finale

5.1 - Processi osservabili

Qui sopra abbiamo uno schema riassuntivo del processo aziendale di stampa e recapito delle bollette. Da un database gestito dalle società esterne i dati sono inviati all’azienda e qui ha inizio il nostro processo che sarà per intero osservabile. Un processo è definito osservabile quando l’utente può tener traccia del suo sviluppo non solo nel momento iniziale e nel momento finale, ma anche durante la sua esecuzione. Tanto più un processo è osservabile nei suoi passi tanto più sarà preciso e proficuo il controllo su di esso. Nel nostro grafico illustrativo ho segnato gli eventi che saranno osservabili con un cerchio colorato. Si può notare che ogni singolo evento potrà essere monitorato nel dettaglio.L’output del sistema è una tabella di questo tipo:

Azienda Prodotto Data emissione Evento Data eventoAcegas Service Bollsrv 05/08/2008 Emissione 07/08/2008Acegas Service Bollsrv 05/08/2008 Invio dati 11/08/2008Acegas Service Bollsrv 05/08/2008 Ricezione 13/08/2008Acegas Service Bollsrv 05/08/2008 Inizio stampe 16/08/2008Acegas Service Bollsrv 05/08/2008 Trasporto 22/08/2008Acegas Service Bollsrv 05/08/2008 Inizio recapito 24/08/2008Acegasaps Bolltrs 03/08/2008 Emissione 06/08/2008Acegasaps Bolltrs 03/08/2008 Invio dati 10/08/2008Acegasaps Bolltrs 03/08/2008 Ricezione 12/08/2008Acegasaps Bolltrs 03/08/2008 Inizio stampe 16/08/2008Acegasaps Bolltrs 03/08/2008 Trasporto 25/08/2008Acegasaps Bolltrs 03/08/2008 Inizio recapito 28/08/2008EstEnergy Bollee 06/08/2008 Emissione 09/08/2008

~ 32 ~

Page 33: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

EstEnergy Bollee 06/08/2008 Invio dati 14/08/2008EstEnergy Bollee 06/08/2008 Ricezione 18/08/2008EstEnergy Bollee 06/08/2008 Inizio stampe 25/08/2008EstEnergy Bollee 06/08/2008 Trasporto 01/09/2008EstEnergy Bollee 06/08/2008 Inizio recapito 02/09/2008

L’utente avrà così a disposizione per ogni evento di ogni prodotto la data rispettiva. Potrà così osservare lo sviluppo del processo in ogni suo aspetto.

5.2 - Indicatori

Gli indicatori sono necessari al fine di aiutare l’utente nel seguire il processo e rispettare le scadenze che gli sono state fornite. Tutti gli indicatori temporali fanno riferimento alla data di emissione presente nella tabella calendario del database “Stampe”. Per ogni prodotto esisterà una ed una sola data di emissione.La data di riferimento, che d’ora in poi chiameremo scadenza, viene calcolata sommando 30 giorni alla data di emissione.Esistono due tipi di allarmi: il primo può essere definito “avvertimento”. Scatta nel momento in cui la data dell’ultimo evento, riferita ad un prodotto, è maggiore della scadenza sottratta di dieci giorni. La formula di riferimento sarà:

“data ultimo evento ≥ data scadenza – 10 giorni”

Quando l’espresione soprascritta risulta vera viene attivato l’allarme. Ciò non significa che il processo dovrà essere modificato, indica semplicemente che c’è un ritardo rispetto al consueto sviluppo del prodotto.

Il secondo tipo di allarme scatterà nel momento in cui la data avrà sorpassato la scadenza; quindi nel caso in cui

“data ultimo evento > data scadenza”

significa che il prodotto è andato oltre la data fissata. Il processo quindi deve essere terminato e sviluppato nuovamente dal principio con date e scadenze nuove.

5.3 - Controllo allarmi

La gestione e il controllo degli allarmi da parte del personale amministrativo rappresenta il vero obiettivo della nostra applicazione. L’addetto a tale servizio dovrà avere facilmente sotto controllo le date del processo produttivo di ogni prodotto gestito in azienda.L’allarme che viene preso in considerazione sarà il primo discusso nel paragrafo precedente, ovvero l’avvertimento che visualizza un ritardo nel processo produttivo, posto a dieci giorni prima della scadenza; definito dalla disequazione:

“data ultimo evento ≥ data scadenza – 10 giorni”

I prodotti che avranno sorpassato tale limite, identificati quindi come in ritardo sul processo, saranno evidenziati in tabella. Vediamone un esempio:

~ 33 ~

Page 34: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

Azienda Prodotto Data emissione Evento Data eventoAcegas Service Bollsrv 05/08/2008 Emissione 07/08/2008Acegas Service Bollsrv 05/08/2008 Invio dati 11/08/2008Acegas Service Bollsrv 05/08/2008 Ricezione 13/08/2008Acegas Service Bollsrv 05/08/2008 Inizio stampe 16/08/2008Acegas Service Bollsrv 05/08/2008 Trasporto 22/08/2008Acegas Service Bollsrv 05/08/2008 Inizio recapito 24/08/2008Acegasaps Bolltrs 03/08/2008 Emissione 06/08/2008Acegasaps Bolltrs 03/08/2008 Invio dati 10/08/2008Acegasaps Bolltrs 03/08/2008 Ricezione 12/08/2008Acegasaps Bolltrs 03/08/2008 Inizio stampe 16/08/2008Acegasaps Bolltrs 03/08/2008 Trasporto 25/08/2008Acegasaps Bolltrs 03/08/2008 Inizio recapito 28/08/2008EstEnergy Bollee 06/08/2008 Emissione 09/08/2008EstEnergy Bollee 06/08/2008 Invio dati 14/08/2008EstEnergy Bollee 06/08/2008 Ricezione 18/08/2008EstEnergy Bollee 06/08/2008 Inizio stampe 25/08/2008

Questa tabella è stata rilevata il 25/08/2008.

Salta subito all’occhio che il prodotto “Bolltrs” è entrato nel periodo di avvertimento. La sua data di emissione, infatti, è il 3 agosto e quindi, la data di scadenza del processo produttivo relativo alle bollette dell’azienda AcegasAps sarà il 3 settembre. Sottraendo dieci giorni alla data di scadenza verifichiamo che la data di riferimento per l’allarme è fissata al 24 agosto, sorpassata all’evento “trasporto”; il prodotto quindi è in ritardo e risulta evidenziato in rosso sulla tabella.

5.4 - Conclusioni

Il software realizzato è stato rilasciato all’azienda AcegasAps. Si prevede che possa essere adottato in pianta stabile a partire dall’inizio del 2009 quando il nuovo fornitore diventerà operativo e quindi renderà disponibili i file XML previsti per l’input dell’applicativo. Tale fornitore sarà Computas che andrà a sostituire la ditta Selecta essendosi recentemente aggiudicato la gara di stampa e imbustamento delle bollette.

~ 34 ~

Page 35: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

Appendice - Listati

Script Statistical R

R version 2.6.0 (2007-10-03)Copyright (C) 2007 The R Foundation for Statistical ComputingISBN 3-900051-07-0

R è un software libero ed è rilasciato SENZA ALCUNA GARANZIA.Siamo ben lieti se potrai redistribuirlo, ma sotto certe condizioni.Scrivi 'license()' o 'licence()' per dettagli su come distribuirlo.

R è un progetto di collaborazione con molti contributi esterni.Scrivi 'contributors()' per maggiori informazioni e 'citation()'per sapere come citare R o i pacchetti di R nelle pubblicazioni.

Scrivi 'demo()' per una dimostrazione, 'help()' per la guida in linea, o'help.start()' per l'help navigabile con browser HTML.Scrivi 'q()' per uscire da R.

> library(RODBC)Warning message:il pacchetto 'RODBC' è stato creato con R versione 2.6.2 > con <- odbcConnect("MySQL_5", uid="root")> sqlQuery(con,"use stampe")[1] "No Data"> library(XML)Warning message:il pacchetto 'XML' è stato creato con R versione 2.6.1 > directory <- system.file("prova_xml",package="XML")> files <- list.files(directory)> i <- 1> repeat {+ if (is.na(files[i])) {+ len <- i-1+ break+ }+ + i <- i+1+ }> len[1] 8

> for (j in 1:len) {+ filename <- system.file("prova_xml",files[j],package="XML")doc <- xmlTreeParse(filename)Errore: unexpected symbol in:"for (j in 1:len) {filename <- system.file("prova_xml",files[j],package="XML")doc"

~ 35 ~

Page 36: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

> for (j in 1:len) {+ filename <- system.file("prova_xml",files[j],package="XML")+ doc <- xmlTreeParse(filename)+ file <- xmlRoot(doc)+ valp <- xmlAttrs(file[["PRODOTTO"]])+ vals <- xmlAttrs(file[["STATO"]])+ ne <- vals[3]+ select <- paste("select np from prodotti where descrizione='",valp[1],"'", sep="")+ np <- sqlQuery(con,select)+ sep <- unlist(strsplit(valp[2],"/"))+ emissione_date <- paste(sep[3],sep[2],sep[1],sep="")+ select <- paste("select nc from calendario where emissione_date='",emissione_date,"'",sep="")+ nc <- sqlQuery(con,select)+ sep <- unlist(strsplit(vals[1],"/"))+ data <- paste(sep[3],sep[2],sep[1],sep="")+ sep <- unlist(strsplit(vals[2],":"))+ data <- paste(data,sep[1],sep[2],"00",sep="")+ if (is.numeric(np) & is.numeric(nc)) {+ insert <- paste("insert into coll(np,ne,data) values(",np,",",ne,",'",data,"')",sep="")+ sqlQuery(con,insert) } else {+ if (is.numeric(nc)) cat("Non ho potuto inserire i dati relativi a ",files[j]," perchè manca la corrispondenza del prodotto.\n") else+ cat("Non ho potuto inserire i dati relativi a ",files[j]," perchè manca la corrispondenza in calendario.\n")+ }+ }>

Codice SQL

create database stampe;

use stampe;

create table aziende (Na INT NOT NULL AUTO_INCREMENT PRIMARY KEY, Descrizione char(250));

create table eventi (Ne INT NOT NULL AUTO_INCREMENT PRIMARY KEY, Descrizione char(250));

create table prodotti (Np INT NOT NULL AUTO_INCREMENT PRIMARY KEY, Descrizione char(250), Na INT NOT NULL, Inizio_val date, Fine_val date, Foreign key(Na) references aziende(Na));

create table aziende_eventi (Na INT NOT NULL, Ne INT NOT NULL, Seq_intero INT, Primary key(Na, Ne), Foreign key(Na) references aziende(Na), Foreign key(Ne) references eventi(Ne));

create table calendario (Nc INT NOT NULL AUTO_INCREMENT PRIMARY KEY, Emissione_date date, Np INT, Foreign Key(Np) references prodotti(Np));

~ 36 ~

Page 37: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

create table log (Ne INT NOT NULL, Nc INT NOT NULL, Data datetime, Primary key(Ne,Nc), Foreign Key(Ne) references eventi(Ne), Foreign Key(Nc) references calendario(Nc));

Pagine PHP

Form Principale

<HTML><HEAD><TITLE>Main form</TITLE></HEAD><BODY>

<?PHP

include("configurazione.inc.php");

$db = @mysqli_connect($host, $user, $psw);if ($db == FALSE) die("Errore nella connessione a MySQL.<br> Verifica i dati in configurazione.inc");

mysqli_select_db($db,$dbname)or die("Errore nella connessione al database selezionato.<br> Verifica i dati in configurazione.inc");

?><b>Connesso con successo a MySQL</b><br><br><br>

<form method="post" action="Riassunto.php">

Seleziona il prodotto di cui visualizzare la cronologia:

<select name="prodotto"><?php$select = "select * from prodotti";$result = mysqli_query($db, $select);$num = mysqli_num_rows($result);for ($i=1;$i<=$num;$i++) {$select = "select descrizione,np from prodotti where np=$i";$result = mysqli_query($db, $select);$row = mysqli_fetch_array($result);echo"<option value=$row[np]>$row[descrizione]</option>";}?><option value="*">Tutti i prodotti</option>

</select><br><br>

<input type="submit" value="Visualizza tabella riassuntiva"></form><br><br><br>

~ 37 ~

Page 38: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

<i>Operazioni inerenti la tabella Eventi</i><br><br> <form method="post" action="SEvento.php"><input type="submit" value="Visualizza tabella Eventi"></form><br>

<form method="post" action="NEvento.php">Inserisci evento: <input name="nome" type="text"><br><input type="submit" value="Inserisci"><br><br><br></form>

<form method="post" action="DEvento.php">Cancella evento: <select name="evento">

<?php$select = "select * from eventi";$result = mysqli_query($db, $select);$num = mysqli_num_rows($result);for ($i=1;$i<=$num;$i++) {$select = "select descrizione,ne from eventi where ne=$i";$result = mysqli_query($db, $select);$row = mysqli_fetch_array($result);echo"<option value=$row[ne]>$row[descrizione]</option>";}?>

</select>

<br><input type="submit" value="Elimina"><br><br><br></form>

<form method="post" action="UEvento.php">Modifica evento: <select name="prodotto">

<?php$select = "select * from eventi";$result = mysqli_query($db, $select);$num = mysqli_num_rows($result);for ($i=1;$i<=$num;$i++) {$select = "select descrizione,ne from eventi where ne=$i";$result = mysqli_query($db, $select);$row = mysqli_fetch_array($result);echo"<option value=$row[ne]>$row[descrizione]</option>";}?>

~ 38 ~

Page 39: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

</select>in: <input name="new" type="text"><br><input type="submit" value="Modifica"><br><br><br></form><br><br>

<i>Operazioni inerenti la tabella Calendario</i>

<form method="post" action="SCalendario.php"><input type="submit" value="Visualizza tabella Calendario"></form><br>

<form method="post" action="UCalendario.php">

Seleziona il prodotto da modificare:

<select name="prodotto"><?php$select = "select * from prodotti";$result = mysqli_query($db, $select);$num = mysqli_num_rows($result);for ($i=1;$i<=$num;$i++) {$select = "select descrizione,np from prodotti where np=$i";$result = mysqli_query($db, $select);$row = mysqli_fetch_array($result);echo"<option value=$row[np]>$row[descrizione]</option>";}?>

</select>

<br><br>

Inserisci la nuova data: <select name="giorno"><?phpfor ($i=1;$i<=31;$i++)

if ($i<=9) echo"<option value=0$i>0$i</option>";

else echo"<option value=$i>$i</option>";?></select>

-

<select name="mese"><option value="01">Gennaio</option><option value="02">Febbraio</option><option value="03">Marzo</option><option value="04">Aprile</option>

~ 39 ~

Page 40: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

<option value="05">Maggio</option><option value="06">Giugno</option><option value="07">Luglio</option><option value="08">Agosto</option><option value="09">Settembre</option><option value="10">Ottobre</option><option value="11">Novembre</option><option value="12">Dicembre</option></select>

-

<select name="anno"><option value="2007">2007</option><option value="2008">2008</option><option value="2009">2009</option><option value="2010">2010</option></select><br>

<input type="submit" value="Modifica" />

</form>

</BODY></HTML>

Visualizza tabella eventi

<HTML><HEAD><TITLE>Nuovo evento</TITLE></HEAD><BODY>

<?PHP

include("configurazione.inc.php");

$db = @mysqli_connect($host, $user, $psw);if ($db == FALSE) die("Errore nella connessione a MySQL.<br> Verifica i dati in configurazione.inc");

mysqli_select_db($db,$dbname)or die("Errore nella connessione al database selezionato.<br> Verifica i dati in configurazione.inc");

echo "Questa è la tabella Eventi<br>";

$result = mysqli_query($db, 'select * from eventi');while ($row = mysqli_fetch_array($result)) {

$id = $row[Ne];

~ 40 ~

Page 41: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

$nome = $row[Descrizione];echo "$id&nbsp;&nbsp;";echo "$nome&nbsp;&nbsp;";echo "<br>";}

?>

<br><br><br><br><br><A HREF="http://localhost/formprincipale.php">INDIETRO</A>

</BODY></HTML>

Inserire evento

<HTML><HEAD><TITLE>Nuovo evento</TITLE></HEAD><BODY>

<?PHP

include("configurazione.inc.php");

$db = @mysqli_connect($host, $user, $psw);if ($db == FALSE) die("Errore nella connessione a MySQL.<br> Verifica i dati in configurazione.inc");

mysqli_select_db($db,$dbname)or die("Errore nella connessione al database selezionato.<br> Verifica i dati in configurazione.inc");

$query = "insert into eventi(Descrizione) values('$_POST[nome]')";mysqli_query($db, $query);

$id_ins = mysqli_insert_id($db);$select = mysqli_query($db, 'select * from eventi');$id_ok = mysqli_num_rows($select);$query = "update eventi set ne=$id_ok where ne=$id_ins";mysqli_query($db, $query);

echo "Questa è la nuova tabella Eventi<br>";

$result = mysqli_query($db, 'select * from eventi');while ($row = mysqli_fetch_array($result)) {

$id = $row[Ne];$nome = $row[Descrizione];echo "$id&nbsp;&nbsp;";echo "$nome&nbsp;&nbsp;";echo "<br>";}

~ 41 ~

Page 42: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

echo "<br>";echo "<br>";echo "<br>";

echo "L'id dell'ultimo inserito è $id_ok";

?>

<br><br><br><br><br><A HREF="http://localhost/formprincipale.php">INDIETRO</A>

</BODY></HTML>

Cancellare evento

<HTML><HEAD><TITLE>Nuovo evento</TITLE></HEAD><BODY>

<?PHP

include("configurazione.inc.php");

$db = @mysqli_connect($host, $user, $psw);if ($db == FALSE) die("Errore nella connessione a MySQL.<br> Verifica i dati in configurazione.inc");

mysqli_select_db($db,$dbname)or die("Errore nella connessione al database selezionato.<br> Verifica i dati in configurazione.inc");

$query = "delete from eventi where Ne='$_POST[evento]'";mysqli_query($db, $query);

$select = mysqli_query($db, 'select * from eventi');$tot = mysqli_num_rows($select);

if ($tot<>($_POST[evento]-1)) {$start = $_POST[evento]+1;$stop = $tot+1;for($i=$start;$i<=$stop;$i++) {

$j = $i-1;$query = "update eventi set ne=$j where ne=$i";mysqli_query($db, $query);

}}

echo "Questa è la nuova tabella Eventi<br>";

~ 42 ~

Page 43: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

$result = mysqli_query($db, 'select * from eventi');while ($row = mysqli_fetch_array($result)) {

$id = $row[Ne];$nome = $row[Descrizione];echo "$id&nbsp;&nbsp;";echo "$nome&nbsp;&nbsp;";echo "<br>";}

echo "<br>";echo "<br>";echo "<br>";

$num = mysqli_affected_rows($db);echo "Sono rimasti $num dataset";

?>

<br><br><br><br><br><A HREF="http://localhost/formprincipale.php">INDIETRO</A>

</BODY></HTML>

Modificare evento

<HTML><HEAD><TITLE>Nuovo evento</TITLE></HEAD><BODY>

<?PHP

include("configurazione.inc.php");

$db = @mysqli_connect($host, $user, $psw);if ($db == FALSE) die("Errore nella connessione a MySQL.<br> Verifica i dati in configurazione.inc");

mysqli_select_db($db,$dbname)or die("Errore nella connessione al database selezionato.<br> Verifica i dati in configurazione.inc");

$query = "update eventi set Descrizione='$_POST[new]' where Ne='$_POST[prodotto]'";mysqli_query($db, $query);

echo "Questa è la nuova tabella Eventi<br>";

$result = mysqli_query($db, 'select * from eventi');while ($row = mysqli_fetch_array($result)) {

~ 43 ~

Page 44: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

$id = $row[Ne];$nome = $row[Descrizione];echo "$id&nbsp;&nbsp;";echo "$nome&nbsp;&nbsp;";echo "<br>";}

echo "<br>";echo "<br>";echo "<br>";

$num = mysqli_affected_rows($db);echo "Ci sono $num dataset";

?>

<br><br><br><br><br><A HREF="http://localhost/formprincipale.php">INDIETRO</A>

</BODY></HTML>

Visualizza tabella calendario

<HTML><HEAD><TITLE>Nuovo evento</TITLE></HEAD><BODY>

<?PHP

include("configurazione.inc.php");

$db = @mysqli_connect($host, $user, $psw);if ($db == FALSE) die("Errore nella connessione a MySQL.<br> Verifica i dati in configurazione.inc");

mysqli_select_db($db,$dbname)or die("Errore nella connessione al database selezionato.<br> Verifica i dati in configurazione.inc");

echo "Questa è la tabella Calendario<br>";

$result = mysqli_query($db, 'select descrizione,Emissione_date from prodotti,calendario where calendario.np=prodotti.np');while ($row = mysqli_fetch_array($result)) {

$prodotto = $row[descrizione];$data = $row[Emissione_date];echo "$prodotto&nbsp;&nbsp;";echo "$data&nbsp;&nbsp;";echo "<br>";}

~ 44 ~

Page 45: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

?>

<br><br><br><br><br><A HREF="http://localhost/formprincipale.php">INDIETRO</A>

</BODY></HTML>

Modificare calendario

<HTML><HEAD><TITLE>Nuovo evento</TITLE></HEAD><BODY>

<?PHP

include("configurazione.inc.php");

$db = @mysqli_connect($host, $user, $psw);if ($db == FALSE) die("Errore nella connessione a MySQL.<br> Verifica i dati in configurazione.inc");

mysqli_select_db($db,$dbname)or die("Errore nella connessione al database selezionato.<br> Verifica i dati in configurazione.inc");

$test1 = (($_POST[anno]<>2008) and (($_POST[mese]=="02") and (($_POST[giorno]=="31") or ($_POST[giorno]=="30") or ($_POST[giorno]=="29"))));$test2 = (($_POST[anno]==2008) and (($_POST[mese]=="02") and (($_POST[giorno]=="31") or ($_POST[giorno]=="30"))));$test3 = ((($_POST[mese]=="04") or ($_POST[mese]=="06") or ($_POST[mese]=="09") or ($_POST[mese]=="11")) and ($_POST[giorno]=="31"));

if ($test1 or $test2 or $test3) {echo "La data inserita non è valida";echo "<br>";echo "<br>";echo "<br>";}

else {

$query = "update calendario set Emissione_date='$_POST[anno]$_POST[mese]$_POST[giorno]' where Np='$_POST[prodotto]'";mysqli_query($db, $query);

echo "Questa è la nuova tabella Calendario<br><br>";

$result = mysqli_query($db, 'select * from calendario');

~ 45 ~

Page 46: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

while ($row = mysqli_fetch_array($result)) {$id = $row[Nc];$nome = $row[Emissione_date];$prodotto = $row[Np];echo "$id&nbsp;&nbsp;";echo "$nome&nbsp;&nbsp;";echo "$prodotto&nbsp;&nbsp;";echo "<br>";}

echo "<br>";echo "<br>";echo "<br>";

$num = mysqli_affected_rows($db);echo "Ci sono $num dataset";

}

?>

<br><br><br><br><br><A HREF="http://localhost/formprincipale.php">INDIETRO</A>

</BODY></HTML>

Visualizza tabella riassuntiva

<HTML><HEAD><TITLE>Nuovo evento</TITLE></HEAD><BODY>

<?PHP

include("configurazione.inc.php");

$db = @mysqli_connect($host, $user, $psw);if ($db == FALSE) die("Errore nella connessione a MySQL.<br> Verifica i dati in configurazione.inc");

mysqli_select_db($db,$dbname)or die("Errore nella connessione al database selezionato.<br> Verifica i dati in configurazione.inc");

echo "Questa è la tabella riassuntiva<br><br>";

if ($_POST[prodotto] == '*') {

$result = mysqli_query($db, 'select prodotti.descrizione,aziende.descrizione,eventi.descrizione,coll.data from

~ 46 ~

Page 47: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

prodotti,aziende,eventi,coll where coll.np=prodotti.np and coll.ne=eventi.ne and prodotti.na=aziende.na');while ($row = mysqli_fetch_array($result)) {

$azienda = $row[aziende.descrizione];$prodotto = $row[prodotti.descrizione];$evento = $row[eventi.descrizione];$data = $row[data];echo "$azienda&nbsp;&nbsp;";echo "$prodotto&nbsp;&nbsp;";echo "$evento&nbsp;&nbsp;";echo "$data&nbsp;&nbsp;";echo "<br>";}

}

else {

$query = "select prodotti.descrizione,aziende.descrizione,eventi.descrizione,coll.data from prodotti,aziende,eventi,coll where coll.np=prodotti.np and coll.ne=eventi.ne and prodotti.na=aziende.na and prodotti.descrizione='$_POST[prodotto]'";$result = mysqli_query($db, $query);while ($row = mysqli_fetch_array($result)) {

$azienda = $row[aziende.descrizione];$prodotto = $row[prodotti.descrizione];$evento = $row[eventi.descrizione];$data = $row[data];echo "$azienda&nbsp;&nbsp;";echo "$prodotto&nbsp;&nbsp;";echo "$evento&nbsp;&nbsp;";echo "$data&nbsp;&nbsp;";echo "<br>";}

}?>

<br><br><br><br><br><A HREF="http://localhost/formprincipale.php">INDIETRO</A>

</BODY></HTML>

~ 47 ~

Page 48: Progetto e realizzazione di un sistema di controllo per stampe in outsourcing

Bibliografia:

Fonti Cartacee:

- Php e MySQL - Guida Completa / Simon Stobart e Mike Vassileiou, Apogeo- Apache : la guida / Ben Laurie e Peter Laurie, Apogeo- MySQL 5 : guida completa / Michael Kofler, Apogeo- R News : trimestrale pubblicato dalla R Development Core Team

Fonti Multimediali:

- http://www.wikipedia.org/ (fonte definizioni e approfondimenti)- http://www.html.it/- http://cran.r-project.org

~ 48 ~