Università degli studi di Modena

e Reggio Emilia

 

Facoltà di Ingegneria

 

Corso di Laurea in Ingegneria Informatica

 

 

 

 

 

 

 

 

 

Software per la Gestione

delle Attività di Aziende di

Piccole-Medie Dimensioni

 

 

 

 

 

 

 

Relatore                                                                                                 Tesi di Laurea di

Prof. Michele Colajanni                                                                         Massimo Romoli

 

 

 

 

 

 


Anno Accademico 2001-2002


INDICE

 

INTRODUZIONE

 

DEFINIZIONI

 

Capitolo 1 Clienti                                                                                     6

 

1.1.  Gestione Clienti

1.2.  Liste Moduli Presenti/Assenti

1.3.  Liste Contratti Assistenza

1.4.  Gestione Note

 

Capitolo 2 Chiamate                                                                                16

 

2.1. Gestione Chiamate

2.2. Selezione Chiamate

2.3. Consultazione Chiamate

 

Capitolo 3 Rapportini                                                                              21

                 

                  3.1. Gestione rapportini

                  3.2. Selezione rapportino

 

Capitolo 4 Commesse                                                                              25

 

                  4.1. Gestione Commesse

                  4.2. Selezione Commesse

 

Capitolo 5 Planning                                                                                 29

 

                        5.1. Gestione Planning

                        5.2. Consultazione Planning

 

    Capitolo 6 Documentazione del SoftWare                                                34

 

6.1. Strumenti Utilizzati

            6.1.1. Ambiente di sviluppo

            6.1.2. Programmazione Object-Oriented

            6.1.3. Gestione dati

6.2. Oggetti e Comandi

6.3. Il codice sviluppato più significativo

 

Conclusioni

 


Introduzione

 

EsseDueSoft è una Software House composta da una decina di dipendenti che sviluppa gestionali per piccole-medie imprese.

Grazie ad una continua espansione, oggi è nata l’esigenza di sviluppare un gestionale che razionalizzi le attività quotidiane d’azienda, quindi è stato analizzato e sviluppato WinLavori, un applicativo visuale che gestisce: Clienti, Chiamate, Rapportini, Commesse e Planning giornaliero dei dipendenti.

La gestione dei Clienti oltre alla normale catalogazione dei dati generali, comprende anche la gestione dei moduli relativi al gestionale acquistato ed il controllo della situazione dei contratti d’assistenza.

La gestione delle Chiamate permette di archiviare tutte le richieste fatte da un cliente o da un dipendente.

L’operatore telefonico, ad esempio, potrà inserire una richiesta fatta da un cliente, che potrà essere un intervento su un PC o una modifica al programma; in sostanza le chiamate rappresentano i lavori che prossimamente ogni dipendente dovrà sostenere.

Questa gestione risulta molto utile, considerando che spesso i tecnici sono fuori sede e non è possibile comunicargli la richiesta in tempo reale; grazie alle chiamate, al rientro, il tecnico sarà in grado di verificare le richieste e pianificare direttamente i prossimi impegni.

Attraverso i Rapportini sarà possibile memorizzare tutti i lavori che ogni dipendente ha realizzato, quindi con questa gestione ogni dipendente potrà inserire tutte le attività svolte nella giornata e le ore dedicate ad esse.

Dai Rapportini sarà possibile risalire alle ore impiegate per evadere una determinata Chiamata; i Rapportini rappresentano la fotografia di tutto quello che è stato fatto, quotidianamente, dai dipendenti dell’ azienda.

Per Commesse si intendono impegni che vengono commissionati dai Clienti all’azienda, sono in sostanza delle Chiamate più corpose, quindi impegni che richiedono una stima del tempo previsto per assolverli ed una valutazione dell’importo da proporre al Cliente.

Il Planning è un’agenda di quello che i dipendenti sono impegnati a fare oggi o nei prossimi giorni, quindi attraverso una consultazione veloce, per ogni dipendente, sarà possibile sapere dove è e che cosa sta facendo oggi o dove sarà e che cosa dovrà fare prossimamente; il Planning illustra tutto quello che i dipendenti sono e saranno impegnati a fare.

Winlavori  è stato sviluppato attraverso DB2k un’ evoluzione di Visual Dbase della Borland, un ambiente orientato agli Oggetti e ai Database; è nato quindi un applicativo con un’ interfaccia utente a schede intuitivo e semplice da usare.

L’obbiettivo del progetto è quello di ottimizzare e snellire il lavoro in EsseDueSoft;  a fronte di questo le funzionalità del progetto, sono state analizzate assieme ai singoli dipendenti, per soddisfarne le diverse esigenze e razionalizzarne i modi e i tempi di lavoro.


Definizioni

Vengono riportate alcune definizioni e chiarimenti di eventuali termini presenti nella stesura del testo, che possono risultare poco chiari o di difficile interpretazione.

BOOK: Oggetto utilizzato spesso all’interno di schede per visualizzare dati, ha la caratteristica di poter disporre di diverse pagine per separare i dati in base alle varie funzionalità.

BUG: Errore di progettazione che porta a malfunzionamenti.

CAMPO: Oggetto che contiene un dato.

CHECKBOX: Oggetto usato per confermare delle selezioni.

CODICE: Istruzioni che formano un programma.

COMANDO: Oggetto che esegue una determinata funzione.

EDITOR: Oggetto che contiene testi, in genere descrizioni di Campi.

GESTIONALE: Programma che gestisce Basi di Dati.

GRIGLIA: Oggetto utilizzato per visualizzare delle liste di dati.

MODULO: Parte di un gestionale che svolge determinate funzioni, in genere sono personalizzazioni di clienti.

NAVIGATE: Comando che permette di spostarsi all’interno di una griglia o di una scheda

PANNELLO: Oggetto utilizzato all’interno di schede per visualizzare dati legati a un determinato argomento.

SCHEDA: Oggetto che viene utilizzato per contenere altri oggetti utili, in genere, alla gestione di una particolare voce di menù.

UTENTE: Persona che utilizza il gestionale.

 

 



 

Capitolo 1

 

 

Clienti

 

Un’azienda è rappresentata dai suoi clienti e in questo capitolo verrà illustrato come WinLavori gestisce tutti i dati che caratterizzano un cliente.

Nella prima parte del capitolo verrà spiegato come è possibile attraverso una scheda inserire, modificare ed eliminare un cliente, gestire il suo contratto d’assistenza o i moduli relativi al gestionale acquistato.

Verrà illustrato come è possibile avere una lista dei clienti che hanno un determinato modulo di un gestionale o avere una lista dei clienti che non hanno quello stesso modulo, tutto avendo la possibilità di ordinare l’elenco per cliente o per modulo.

Attraverso una scheda sarà sempre chiara la situazione generale dei contratti di assistenza, quindi sapere quanti clienti sono in contratto per un determinato gestionale e quando questo scadrà o sapere quanti clienti sono fuori contratto o sono insoluti.

Infine in questo capitolo verrà descritta la gestione delle note, quindi la possibilità di inserire, modificare o eliminare una nota riferita ad un particolare modulo di un determinato gestionale.

 


1.1 Gestione Clienti

 

 

           

 

Come si può vedere dalla figura questa scheda è composta da: un Pannello sopra, da un Book sotto e dei Comandi tra i due.

Nel Pannello sono raccolti i dati principali del cliente, quindi il codice, la ragione sociale ed il gestionale acquistato; il codice permetterà al cliente di risultare unico all’interno di WinLavori, anche se dovesse esserci un altro cliente con ragione sociale uguale.

Attraverso i comandi saranno possibili tutte le operazioni all’interno della scheda, come spostarsi da un cliente ad un altro o modificarne i dati.

Nel Book sotto sono raccolti tutti i dati relativi al cliente: dati generali, moduli acquistati, situazione contratto, Pc aziendali, stampanti aziendali, Rapportini, dati programma, altre sedi aziendali e Commesse .

Come si può vedere attraverso questa scheda è possibile avere, in tempi ottimali, una fotografia molto chiara e completa della situazione del cliente.


Inserimento Cliente

 

 

 

 

 


 

 

Una delle operazioni sicuramente più importanti che l’utente potrà fare, è l’inserimento di un nuovo cliente; questa operazione sarà permessa attraverso il comando Aggiungi,  indicato dalla freccia nella figura sopra.

Al click sul comando la scheda verrà inizializzata e commuterà dallo stato di consultazione allo stato di inserimento; l’utente avrà la possibilità di inserire tutti i dati compilando gli appositi campi, il cliente sarà reso univoco da un codice che il programma gli attribuisce al momento dell’inizializzazione.

Il codice cliente è l’unico dato non gestibile dall’utente, la sua integrità rappresenta un fatto fondamentale nella gestione dei dati.

Una particolare funzione legata ai campi delle schede permette di posizionarsi automaticamente sul campo successivo, una volta confermato il dato inserito attraverso il tasto invio.

Alla conferma dei dati, funzioni di controllo, vigileranno sulla loro correttezza; ad esempio non sarà possibile inserire un carattere in un campo numerico e viceversa.

Una volta inseriti e controllati i dati, l’utente ha la possibilità di annullare l’inserimento o di confermarlo.

La conferma avviene attraverso il comando Salva e l’annullamento al click del comando Abbandona.

Con il primo, il cliente sarà salvato in tabella e l’utente avrà la possibilità di consultarlo o modificarlo in un secondo tempo, mentre con il secondo l’operazione in corso verrà abbandonata e con lei anche il cliente che si stava inserendo.

 

 

 
Modifica Cliente 

 

 

 

 


 

 

 

 

Una volta inserito un cliente sarà sempre possibile modificare o eliminare i suoi dati, tranne come detto il codice che rappresenta la garanzia di univocità del cliente.

L’ aggiornamento dei dati avviene attraverso il click su comando Modifica indicato dalla figura sopra, questo comando porta la scheda cliente in fase di modifica rendendo tutti i campi editabili.

Una volta modificati i dati, come in precedenza, sarà possibile confermare la modifica o annullarla attraverso i comandi Salva e Abbandona; confermando i dati si salverà la situazione attuale, quindi anche le modifiche apportate, mentre con abbandona si annulleranno le variazioni e si salveranno i dati precedenti alle modifiche.

Tutte queste operazioni saranno controllate da particolari funzioni che vigileranno sulla correttezza dei dati inseriti. 

 

Eliminazione Cliente

 

 

 

 

 

 

L’eliminazione del cliente è sicuramente una delle operazioni più delicate, infatti una volta eliminati i dati saranno persi per sempre.

Prima di procedere è bene controllare bene se effettivamente si è posizionati sul cliente che si vuole rimuovere, quindi l’utente potrà eliminare il cliente con un click su comando Elimina indicato in figura contraddistinto da un cestino.

A questo punto comparirà un messaggio che chiederà una conferma, questa è l’ultima occasione per rinunciare all’operazione, in caso contrario il cliente e i dati a lui relativi saranno rimossi e non più recuperabili.

 

 

 

Ricerca Cliente 

 

Questa scheda ha la possibilità di posizionarsi su un determinato cliente essenzialmente in due modi: sequenziale e diretto.
Il modo sequenziale permette all’utente di scorrere i clienti in base ad un ordine dato dal codice tramite il comando Navigate, mentre il modo diretto permette di arrivare al cliente voluto in modo immediato, quindi senza scorrerli tutti.

 

 


 

Se si è a conoscenza del codice è possibile attraverso l’apposito campo richiamare il cliente col tasto Invio, altrimenti sarà possibile richiamarlo grazie al comando Ricerca indicato dalla freccia in figura; la selezione del cliente è permessa solo in fase di consultazione della scheda.

Il posizionamento diretto è possibile attraverso una ricerca alfabetica o una ricerca libera.

La ricerca alfabetica avviene tramite il comando rappresentato da una lente di ingrandimento o attraverso il tasto tastiera F2, mentre la ricerca libera verrà eseguita dal comando rappresentato da una torcia o dal tasto F3.

Con la prima viene azionata la scheda per la ricerca alfabetica (Figura sotto).

Inserendo il testo nel campo di ricerca, verranno caricati in griglia tutti i clienti che hanno la descrizione che inizia col testo digitato; la ricerca può essere fatta per descrizione, codice, località, cap o partita iva.

Nell’esempio sotto, è stata fatta una ricerca alfabetica per ragione sociale, dei clienti che iniziano per CER; a questo punto se il cliente cercato è quello selezionato in griglia, col comando Ok sarà caricato nella scheda dalla quale è partita la ricerca.

 

 

 

 

 

 

La ricerca libera è molto simile a quella alfabetica, con l’eccezione che la ricerca del testo inserito non avviene solo sulla parte iniziale della ragione sociale, ma sull’intero testo che compone la descrizione del cliente.

A questo punto se si lanciasse una ricerca libera con il testo “CER”, in lista saranno caricati tutti i clienti trovati attraverso la ricerca alfabetica, più quelli che contengono all’interno della propria ragione sociale la stringa “CER”.   


Stampa Cliente

 

 

 


 

 

Attraverso il click sul comando Stampa, contraddistinto da un’ icona stampante, viene attivata una piccola scheda menù per le stampe del cliente. 

La scheda prevede diverse stampe a secondo delle reali esigenze dell’utente: Scheda Cliente, Scheda Moduli, Scheda Pc, Scheda Stampanti.

La scheda cliente è in sostanza la fotografia della situazione attuale del cliente, quindi tutto quello che compare nella scheda.

La scheda moduli, scheda Pc e scheda stampanti sono rispettivamente la stampa dei moduli acquistati, dei pc e delle stampanti del cliente.

Attraverso una CheckBox è possibile attivare la scelta multipla, quindi selezionando più schede, col tasto Ctrl, si potrà eseguire in serie più stampe; col comando Ok verranno lanciate le stampe selezionate, mentre con Annulla si abbandonerà l’operazione e si ritornerà alla scheda clienti.

 

 


1.2 Liste moduli Presenti/Assenti

 

 

La scheda Moduli Presenti/Assenti seleziona in una griglia o in una stampa, la situazione generale di uno o più moduli, quindi selezionando un modulo, è possibile sapere da chi è stato acquistato o da chi no.

Nell’esempio sopra è stata fatta la selezione per vedere i clienti che hanno acquistato il modulo A_CONTRATTO, quindi è risultato che i clienti che rispondono ai codici 5,172, 204 e 362 hanno attualmente in uso questo modulo.

Nel  pannello in alto sono raccolti i dati di selezione: programma, codice cliente, moduli presenti, moduli assenti e ordine.

La selezione è possibile farla su un solo gestionale alla volta, visto che ogni modulo appartiene ad un unico gestionale, ma su uno o più clienti; in lista si potranno visualizzare i moduli presenti, i moduli assenti o tutti e due, sempre ordinati in base al criterio scelto.

In questa scheda i comandi sotto il pannello, come si vede dalla figura sopra, sono : Navigate, Stampa, Esegui ed Esci. Navigate permette all’utente si muoversi all’interno della griglia, stampa esegue la riproduzione su carta dei dati in griglia, esegui lancia la selezione e con esci si chiude la scheda.

 1.3 Liste Contratti Assistenza

 

 

La scheda Liste contratti d’assistenza permette di visualizzare in griglia la situazione dei contratti di assistenza in base alle esigenze dell’utente.

Nell’esempio sopra l’utente ha elaborato una lista che considera i contratti di assistenza di tutti i clienti, di tutti i programmi, senza considerare la data di scadenza, quindi in griglia abbiamo tutti i contratti inseriti in WinLavori.

Nel Pannello, in alto, sono raggruppati i dati per la selezione: cliente, data fine contratto, in contratto, insoluti, programma.

Il campo contratto permette di filtrare solo  i clienti in contratto o non, come anche il campo insoluti, mentre il campo programma  seleziona solo i contratti relativi al gestionale considerato.

I comandi sono gli stessi visti nel paragrafo precedente: navigate, stampa, esegui e esci. Navigate permette all’utente si muoversi all’interno della griglia, Stampa esegue la riproduzione su carta dei dati in griglia, Esegui lancia la selezione e con Esci si chiude la scheda.


1.4 Gestione Note

 

Gestione note è una scheda di inserimento, attraverso la quale è possibile inserire, modificare ed eliminare una nota.

Una nota è un’appunto su un modulo, quindi una breve descrizione di quello che fa e di quello che comporta, ogni nota è identificata da un numero che la rende unica.

Oltre all’inserimento è possibile anche una consultazione delle note, grazie alla griglia in basso alla scheda, i dati per la selezione sono come sempre in alto all’interno del pannello; è possibile filtrare le note in base al programma, al numero, alla data ed al cliente, la lista sarà sempre ordinata secondo i criteri prescelti.

I comandi oltre ai consueti Navigate, Stampa, Esegui ed Esci comprendono anche aggiungi, modifica, salva, abbandona ed elimina per le normali operazioni di aggiornamento.

Dalla griglia si osserva il campo Numero che identifica la nota, il campo Tipo che indica il programma a cui fa riferimento, la data di inserimento e la descrizione.


 

Capitolo 2

 

 

Chiamate

 

 

Le Chiamate rappresentano le richieste di intervento fatte dal cliente o da un dipendente, in questo capitolo verrà illustrata come avviene la loro gestione da parte di WinLavori.

 

Le chiamate sono molto utili ai tecnici che essendo spesso fuori sede non possono essere al corrente delle richieste fatte, a loro, nella giornata; quindi al rientro avranno una situazione reale ed immediata, dei loro prossimi impegni.

 

Attraverso le chiamate ogni dipendente potrà impostare il proprio piano di lavoro dei giorni seguenti; quindi le chiamate saranno caratterizzate dal cliente, dal motivo, dall’operatore che l’ ha inserita e dal dipendente a cui è riferita.

 

Nella prima parte del capitolo verrà descritta la scheda di inserimento, con la quale è possibile anche la consultazione e la modifica di una chiamata.

 

Nella seconda parte ci si occupa della scheda di consultazione, dove è possibile, attraverso una scheda di selezione, filtrare solo le chiamate desiderate; una volta filtrate possono anche essere modificate o eliminate.

 

La scheda di consultazione permette anche l’inserimento di una chiamata nei rapportini o nel planning, infatti spesso i rapportini sono ore di lavoro fatte per evadere una chiamata o una voce di planning sono ore che verranno fatte per evadere una chiamata.

 

 

 

 

 

 


2.1        Gestione Chiamate

 

 

 

 

Questa scheda consente la consultazione, l’inserimento e la modifica.

I comandi nella parte alta della scheda rappresentano le varie funzioni legate alla scheda chiamate.

Il comando Navigate permette di spostarsi tra una chiamata ed un’altra e quindi la consultazione dei dati, come il numero che la identifica, la data di inserimento, il cliente e tutti quelli che si possono osservare nella figura sopra.

Attraverso il comando Aggiungi, contraddistinto da un più, è possibile l’inserimento; dal programma viene assegnato un numero alla chiamata che la identificherà, mentre il resto dei campi vengono inizializzati.

Naturalmente sulla correttezza dei dati inseriti vigileranno delle funzioni di controllo che impediranno all’utente di inserire dei dati non coerenti.

Con il comando Richiama, rappresentato da una freccia, si potrà richiamare una chiamata inserita in precedenza ed aggiornarne i dati.

L’operazione di inserimento e modifica verranno salvate attraverso il comando Conferma, in basso alla scheda; se i dati inseriti sono corretti comparirà, come si vede anche dalla figura, una finestra di messaggio che convaliderà l’inserimento. 

 

 

2.2        Selezione Chiamate  

 

 

 

 

Il problema più frequente che nasce una volta inserita una chiamata, è ritrovarla all’interno delle migliaia inserite precedentemente; questa scheda consente attraverso una selezione dettagliata, di filtrare le chiamate in base: alla data, al cliente, al comune del cliente, al destinatario, al tipo di chiamata, alla priorità, al numero, alla commessa, all’evasione e alla situazione contratto cliente.

La selezione più usata è sicuramente il destinatario e l’evasione, attraverso questa l’utente è in grado di verificare velocemente le chiamate già evase e quelle ancora da evadere, quindi controllare se gli impegni previsti sono stati tutti assolti o se invece per qualche motivo sono ancora da adempiere.

Il comando Esegui, in fondo alla scheda, lancerà la selezione in base ai dati inseriti dall’utente; verrà visualizzata a questo punto, la scheda di Consultazione che verrà trattata nel paragrafo successivo.


2.3        Consultazione Chiamate

 

 

 

 

Questa è la scheda risultato di una selezione fatta nella scheda Selezione; in questo caso sono state considerate le chiamate inevase, degli ultimi mesi, del destinatario CR.

Attraverso il comando Navigate, è possibile spostarsi all’interno della lista, quindi selezionare una determinata chiamata e consultarne i dati nei campi a destra e la descrizione nell’ Editor sotto.

Una volta selezionata la chiamata, si può evadere velocemente con il comando Evadi, contraddistinto da un segno di spunta blu; questo comando caricherà nel campo Data di evasione la data odierna e la chiamata risulterà evasa, alle successive selezioni.

Il comando Modifica, caratterizzato da una mano che scrive, lancerà la scheda di Inserimento, vista precedentemente, in modalità modifica; a questo punto sarà possibile variare tutti i dati, tranne naturalmente il numero chiamata rigorosamente gestito dal programma.

I comandi col segno più, rappresentano i collegamenti con Planning e Rapportini.

Attraverso il primo, foglio bianco, è possibile usare una chiamata per creare una riga di Planning, questa operazione sarà segnalata dal campo della griglia Plann, in questo modo all’utente è sempre chiaro se la chiamata è già stata inserita nel piano di lavoro o no.

Il comando Rapportini, foglio a righe, crea un rapportino partendo dai dati in comune con la chiamata, quindi il destinatario, il cliente, la commessa e la descrizione; naturalmente una volta caricati i dati sono sempre aggiornabili dall’utente.

I comandi Elimina,Stampa ed Esci completano le funzionalità possibili all’interno di questa scheda.

Il primo elimina una chiamata, essendo questa un’operazione molto delicata sarà condizionata da una conferma finale.

Il secondo lancia una stampa della chiamata o della lista in griglia, il terzo è il comando attraverso il quale si chiude la scheda. 


 

Capitolo 3

 

 

      Rapportini

 

I Rapportini rispecchiano il lavoro fatto dai dipendenti dell’azienda, in questo capitolo viene illustrata come avviene la loro gestione.

 

Attraverso i Rapportini è possibile ricostruire la giornata lavorativa di ogni dipendente, quindi che lavori sono stati affrontati, quante ore sono state utilizzate per assolverli, che cliente ha chiesto l’intervento.

 

Dai Rapportini è possibile risalire alle ore impiegate per l’evasione di una chiamata o di una commessa, rendersi conto di quante ore di ferie sono state fatte in un mese o in un anno, sapere le ore di straordinario sostenute, in breve tutto quello che riguarda la vita lavorativa.  

 

Nella prima parte del capitolo verrà descritta la possibilità di selezionare i Rapportini attraverso un filtro, costituito dai campi compilati dall’utente. 

 

Nella seconda parte verranno descritte le varie funzioni legate alla scheda Rapportini come l’inserimento, la modifica e l’eliminazione; inoltre verranno illustrate anche le varie funzioni di collegamento con chiamate e planning.

 


3.1 Gestione Rapportino

 

 

Le operazioni principali che caratterizzano la gestione dei Rapportini sono: inserimento, modifica ed eliminazione.

Il comando Aggiungi, come si può vedere dalla figura sopra, porta la scheda in stato di inserimento e permette di creare un nuovo Rapportino; a questo punto il programma ha assegnato il numero di identificazione e inizializzato i campi Data, Chiamata, Tipo, Operatore, Ore, Commessa, Cliente e Note.

Il comando Modifica, rappresentato da una mano che scrive, porta la scheda in uno stato di variazione dei dati inseriti in precedenza.

L’eliminazione di una Rapportino è permessa dal comando Elimina, rappresentato da un cestino; ogni cancellazione, essendo un’operazione definitiva, è vincolata da un messaggio di conferma.

Il numero Rapportino è gestito da programma, mentre tutti gli altri campi sono inseriti dall’utente; ai campi Tipo, Operatore, Commessa e Cliente sono associate delle ricerche alfabetiche che consentono un inserimento automatico.

Attraverso i comandi Chiamate e Planning è possibile riempire campi della scheda con dati già inseriti precedentemente, infatti spesso un Rapportino è riferito a una Chiamata o una riga di Planning.

Una volta inseriti i dati è possibile tramite gli appositi comandi, Salvare o Abbandonare le modifiche; l’operazione di salvataggio è vincolata a delle apposite funzioni che vigilano sulla correttezza dei dati inseriti.

Completano le funzioni possibili nella scheda Rapportini i comandi Copia e Stampa: con il primo si crea una copia di un Rapportino inserito in precedenza, mentre col secondo è possibile stampare una scheda dettagliata, una lista dettagliata o una lista sintetica dei rapportini selezionati.

 

 

Come si può vedere dalla figura sopra, la tipologia della stampa è selezionabile da una lista e viene eseguita tramite il comando Ok.

La lista sintetica riporterà su carta un elenco dei rapportini attualmente in griglia; questa lista è composta dai dati principali che caratterizzano i rapportini.

La Scheda Rapportino stampa tutti i dati riferiti al rapportino attualmente selezionato in griglia.

La Lista Dettagliata è la stampa di tutti i dati riferiti a tutti i rapportini selezionati, in sostanza è una stampa della Scheda Rapportino di tutte le righe della griglia.

 


3.2 Selezione Rapportino

 

 

La selezione dei Rapportini è importante per filtrare solo i dati desiderati ed avere velocemente una fotografia chiara della combinazione voluta; una volta filtrati, ad esempio, i dati riferiti ad un Operatore in un determinato giorno, sarà possibile selezionare la riga per andarla a modificare o eliminare.

Nella parte alta della scheda, come da figura, è presente un Pannello che raggruppa tutti i campi utili alla selezione che permetterà di filtrare i Rapportini desiderati: Operatore, Data, Tipo, Cliente e Commessa.

Nell’esempio sopra, sono stati selezionati tutti i Rapportino riferiti all’Operatore RM inseriti dopo il 20/02/2003 e prima del 31/12/03.

Nella parte in basso della scheda sono presenti dei campi di decodifica e dei campi di totali; i primi descrivono il Cliente e la Commessa, mentre i secondi riepilogano il totale dei giorni in griglia, il totale ore dei giorni in griglia e il totale ore del giorno della riga attualmente selezionata.

 


 

Capitolo 4

 

 

      Commesse

 

Per Commesse si intendono impegni che vengono commissionati dai Clienti all’azienda, sono in sostanza delle Chiamate più voluminose, quindi lavori che richiedono un’ analisi del tempo previsto per assolverli ed una valutazione dell’importo da proporre al Cliente.

 

Le Commesse permettono all’utente di confrontare il tempo previsto e le ore effettivamente spese per terminarle; questo confronto avverrà automaticamente, visto che all’inserimento di ogni rapportino, verrà aggiornato da programma, il campo che determina le ore impiegate all’evasione della commessa.

Nella prima parte del capitolo verranno descritte le varie funzioni legate alla scheda Commesse come l’inserimento, la modifica ed l’eliminazione.

Nella seconda parte verrà descritta la possibilità di selezionare le Commesse tramite un filtro, costituito dai campi compilati dall’utente.


4.1. Gestione Commesse

 

 

Le operazioni principali che caratterizzano la gestione delle Commesse, come nelle precedenti schede, sono: inserimento, modifica ed eliminazione.

La funzione di inserimento avverrà grazie al comando Aggiungi, come si può vedere dalla figura sopra, porta la scheda in stato di inserimento e permette di creare una nuova Commessa; a questo punto il programma ha assegnato in numero di identificazione e inizializzato i campi Data di inserimento, Cliente, Operatore, Data inizio, Data Fine, Ore previste, Ore lavorate, Priorità e Note.

Il comando Modifica, rappresentato da una mano che scrive, porta la scheda in uno stato di variazione dei dati inseriti in precedenza.

L’eliminazione di una Commessa è permessa dal comando Elimina, rappresentato da un cestino; ogni cancellazione, essendo un’operazione definitiva, è vincolata da un messaggio di conferma. Questa operazione è consentita se la scheda è in fase di consultazione.

Il numero Commessa è gestito da programma, mentre tutti gli altri campi sono inseriti dall’utente; ai campi Cliente e Tipo sono associate delle ricerche alfabetiche che consentono un inserimento automatico.

Una volta inseriti i dati è possibile tramite gli appositi comandi, Salvare o Abbandonare le modifiche; l’operazione di salvataggio è vincolata a delle apposite funzioni che vigilano sulla correttezza dei dati inseriti.

Il comando Stampa completa le operazioni possibili all’interno della scheda Commesse; questo comando lancerà la stampa della Commessa attualmente selezionata in griglia.

Nell’esempio sopra vediamo una scheda in stato di modifica, il destinatario RM ha chiuso la commessa Prova il 21/02/03, iniziata il 17/02/03, e si può notare che ha lavorato cinque ore in meno del previsto.

Il campo Ore lavorate viene incrementato automaticamente da programma ogni volta che si inserisce un Rapportino riferito alla Commessa; questa funzionalità permette all’utente di aprire la scheda e controllare immediatamente la differenza tra le ore programmate e quelle effettivamente lavorate. 


4.2 Selezione Commesse

 

 

Attraverso la selezione delle Commesse è possibile filtrare solo i dati desiderati ed avere velocemente una fotografia chiara della combinazione voluta; la selezione viene lanciata dal comando Esegui che carica in griglia le commesse trovate.

Una volta ottenuta la lista, sarà possibile selezionare dalla griglia la riga tramite il comando Navigate ed andarla a modificare,eliminare o stampare.

Nella parte alta della scheda, come vediamo dalla figura sopra, è presente un Pannello che raggruppa tutti i campi utili alla selezione che permetterà di filtrare le Commesse desiderate: Data, Cliente, Commessa, Operatore, Evasione e Priorità.

Nell’esempio sopra, sono state selezionate tutte le Commesse riferite all’Operatore RM e al Cliente 576, inserite dopo il 31/08/2002 e prima del 31/12/03.

Nella parte bassa della scheda è presente un campo di decodifica che descrive il Cliente, e dei campi di totali che indicano le ore previste,spese e inevase della Commessa al momento selezionata in griglia.


 

Capitolo 5

 

 

      Planning

 

Il Planning è un’ agenda che illustra gli impegni dei dipendenti; in sostanza è il piano di lavoro dell’azienda.

 

Grazie al Planning ogni dipendente è sempre al corrente degli interventi che deve sostenere o di cosa un suo collega è impegnato a fare in un preciso momento della giornata.

 

Nella prima parte del capitolo verranno affrontate le principali funzioni legate alla scheda come l’inserimento, la modifica e l’eliminazione e la possibilità di selezionare le righe di Planning attraverso un filtro, costituito dai campi compilati dall’utente. 

Nella seconda parte verrà illustrata la scheda di consultazione del Planning che attraverso un Editor rende una fotografia completa e intuitiva del piano di lavoro dell’azienda. 


5.1. Gestione Planning

 

 

Nella parte alta della scheda è presente il Pannello per i campi di selezione che permetteranno all’utente di selezionare le righe di Planning, in base alla Data e al Destinatario; la selezione sarà lanciata dal comando Esegui che filtrerà le righe desiderate e le caricherà in griglia.

Nell’esempio sopra vediamo la scheda in stato di modifica, si sta variando una riga di Planning del destinatario RM, riferita alla chiamata 999 e al cliente 576, del periodo che va dalle 14,30 alle 18,30 del 27/02/03; se la riga verrà salvata, vorrà dire che RM dalle 14,30 alle 18,30 del 27/02/03 è impegnato nel controllo di una stampante dal cliente 576 ed è uscito con la propria macchina.

Sotto il Pannello di selezione si possono notare i comandi che rappresentano le funzioni possibili all’interno della scheda: Navigate, Aggiungi, Modifica, Salva, Abbandona, Elimina, Copia, Rapportino, Stampa e Planning.

Navigate permette di muoversi in lista  e selezionare la riga da considerare per le prossime modifiche o per una semplice consultazione.

L’inserimento di una riga di Planning è possibile grazie al comando Aggiungi; come nelle schede precedenti tutti i campi sono aggiornabili, tranne il numero di identificazione gestito da programma.

Una volta inserita la riga, è possibile variarla tramite il comando Modifica ed eliminarla con il comando Elimina; l’eliminazione come tutte le operazioni definitive sarà vincolata da un messaggio di conferma.

Dallo stato di inserimento o modifica si passa allo stato di consultazione con i comandi Salva o Abbandona; il primo dopo aver controllato la correttezza dei dati fa il salvataggio delle modifiche, mentre il secondo annulla le modifiche e riporta la situazione allo stato iniziale.

Il comando Copia crea una riga di Planning identica a quella al momento selezionata in griglia e porta la scheda in stato di modifica, a questo punto si possono modificare i dati e salvare, o abbandonare l’operazione e ritornare alla situazione iniziale.

Il comando Rapportini consente di creare automaticamente un Rapportino usando i dati in comune con la riga di Planning selezionata in griglia, come il destinatario, il cliente e le ore lavorate; questo comando aprirà la scheda Rapportini in stato di modifica, quindi i dati saranno variabili dall’utente prima di un eventuale salvataggio.

Il comando Stampa consente di riportare su carta una scheda dettagliata della riga selezionata in griglia o una lista sintetica delle righe filtrate dalla selezione.

Completa la serie di funzioni il comando Planning; questa funzione verrà trattata nel paragrafo successivo, in sostanza è una consultazione veloce e chiara del piano di lavoro giornaliero.

 

 


5.2. Consultazione Planning

 

 

Dopo aver trattato nel paragrafo precedente la Gestione delle righe di Planning, vediamo ora come è possibile, tramite la scheda Consulta Planning, avere in modo  chiaro ed immediato il piano di lavoro del giorno desiderato.

Grazie a questa scheda tutti i dipendenti saranno in grado si sapere sempre quello che i propri colleghi sono impegnati a fare in un preciso momento, o saranno impegnati a fare domani o nei prossimi giorni.

E’ molto utile, ad esempio, quando viene richiesto l’intervento, da parte di un cliente, di un dipendente che in quel momento è fuori sede; a questo punto, grazie ad una consultazione del Planning, sarà possibile informare il cliente della disponibilità o meno del dipendente.

Nella scheda sopra vediamo che è stato preso in considerazione il giorno 27/02/03, ma grazie ai due comandi, rappresentati da una freccia, è possibile consultare tutte le date inserite dalla scheda precedente; per consultare il piano di lavoro di un giorno è possibile anche inserire semplicemente una data  nell’apposito campo e confermare con invio.

Nella scheda di consultazione vediamo che il Planning dei dipendenti è suddiviso da una doppia riga che ne indica i nomi.

Ogni riga inizia con due parentesi che racchiudono lo stato: Da fare, Da Finire, Rimandata e Evasa.

Dopo lo stato viene visualizzato l’orario in cui il dipendente è impegnato, se è stato previsto l’uso di una macchina, il cliente, la descrizione dell’intervento e, se presente, la chiamata di riferimento.

Dall’esempio sopra possiamo notare che il dipendente RM la mattina del 27/02/03 sarà in sede e sarà impegnato in programmazione, mentre dalle 14,30 alle 18,30 uscirà con la propria macchina ed andrà dal cliente 576 per un controllo di una stampante, in riferimento alla chiamata 999.


 

Capitolo 6

 

 

      Documentazione del SoftWare

 

In questo capitolo verrà illustrata la parte software del progetto, quindi gli strumenti  attraverso i quali è stato possibile sviluppare il progetto.

La prima parte del capitolo descrive l’ambiente di sviluppo, quindi lo strumento attraverso il quale è stato sviluppato il codice che caratterizza il progetto; per codice si intende l’insieme di istruzioni che compongono il gestionale.

Sempre nel primo paragrafo viene anche affrontata la gestione dei dati, quindi l’interfaccia con il programma e il formato degli archivi.

Successivamente verrà presentata la programmazione Object-Oriented, sulla quale si basa l’ambiente di sviluppo usato per la progettazione di WinLavori.

Nella terza parte vengono illustrati gli Oggetti e i Comandi principali utilizzati all’interno di WinLavori, quindi quei componenti messi a disposizione dall’ambiente di sviluppo o progettati appositamente per il progetto che svolgono determinate funzioni base, come l’inserimento o l’eliminazione di una riga in una griglia.

Infine vengono riportate parti del codice più significativo che caratterizzano gli Oggetti, i Comandi e di conseguenza l’intero gestionale.

 

 


6.1.1. Ambiente di Sviluppo

 

 

Il progetto è stato sviluppato attraverso DB2k un’ evoluzione di Visual Dbase della Borland, un ambiente orientato agli Oggetti e ai Database.

DB2k è un ambiente di sviluppo (RAD) per la creazione di potenti applicazioni database client/server.

Le funzioni più importanti sono un insieme di strumenti interattivi estremamente flessibili per l’amministrazione del database e un modello evoluto di programmazione orientato agli oggetti.

Questo ambiente include il motore di database Borland Database Engine (BDE), che consente di connettersi in modo semplice alle tabelle Dbase e fornisce il supporto nativo per Paradox, Access, FoxPro ed in generale, il supporto per qualsiasi sorgente dati supportata da ODBC.

La particolarità più interessante di questo ambiente, come per tutti gli ambienti ad oggetti, è la semplicità e la rapidità con la quale è possibile sviluppare gestionali anche complessi, senza sacrificare l’affidabilità e le prestazioni del progetto; questo è permesso dalla possibilità di sfruttare Oggetti o Classi limitando al massimo le righe di codice.

 


 

 

 

La figura sopra rappresenta il book del centro di controllo di Dbase, attraverso questo il programmatore può controllare progetti, schede, report, programmi, tabelle, sql, moduli,  immagini e tutto quello che è legato all’ambiente di sviluppo.

Nell’esempio vediamo la pagina schede; in questa pagina sono raccolte tutte le schede che sono state descritte nei capitoli precedenti.

Col doppio Click su SenzaNome viene creata una scheda che il programmatore andrà a sviluppare secondo le proprie esigenze.

Come visto in precedenza le schede sono molto simili tra di loro, si può notare che spesso hanno molti comandi in comune come i Aggiungi, Modifica, Navigate; Dbase permette di progettare delle Classi, quindi delle schede basi, che raccolgono tutte le funzioni in comune a schede di un certo tipo.

A questo punto quando si crea una nuova scheda, invece di partire da una scheda vuota, è possibile partire da una Classe e quindi evitare di sviluppare tutto quello che è già stato fatto in precedenza per un’altra scheda dello stesso tipo.

In questo modo spesso, invece di sviluppare interamente una scheda, basta personalizzarla secondo le proprie esigenze, quindi risparmiare tutto il tempo impiegato precedentemente nella progettazione della Classe; in teoria è possibile creare delle schede senza scrivere una riga di codice.

Una Classe può essere una scheda, come visto sopra, ma può essere anche un qualsiasi altro Oggetto o Comando; in sostanza una Classe non è altro che un componente, caratterizzato da proprietà, metodi ed eventi,  che svolge delle funzioni base e quindi riutilizzabile spesso all’interno di un progetto.

Una Classe può essere confusa con un programma o una procedura; una classe non è codice eseguibile, ma un modello di un determinato componente.

Come si può capire, lo studio e la corretta progettazione delle Classi è fondamentale, lavorare bene in questa fase, vuol dire ottenere il massimo dall’ambiente di sviluppo in termini di tempi e prestazioni; per intenderci, una sbagliata progettazione delle Classi sarebbe come costruire una casa usando mattoni difettosi o inadeguati.

Le Classi e gli Oggetti sono alla base della programmazione Object-Oriented che verrà illustrata nel paragrafo successivo.


6.1.2. Programmazione Object-Oriented

 

Muoversi nella programmazione Object-Oriented, é spesso difficile anche per programmatori esperti.

Prima di OO, imparare un nuovo linguaggio, consisteva soltanto nell'impadronirsi della nuova sintassi; OO richiede molto più, un maggiore sforzo nel modo di immaginare i programmi ed il relativo codice.

Il processo di apprendimento non é dei più semplici, ma i benefici sono talmente enormi, da compensare il tempo impiegato ad imparare questa nuova metodologia di programmazione.

Visual dBase ha una delle più semplici, ed allo stesso tempo più eleganti implementazioni, di OO; è la piattaforma giusta, per il  primo progetto Object-Oriented.

 

Che cosa è Object-Oriented

OO è una metodologia di programmazione, che fa uso di Oggetti. Gli oggetti si possono definire come delle entità, che sono caratterizzati da determinati attributi (proprietà) e determinati comportamenti (metodi).

Quali differenze con le architetture di programmazione precedenti ?

Le architetture precedenti usavano metodi procedurali, i programmi cominciavano dal punto "A", andavano al punto "B" e ritornavano al punto "A".

L'interfaccia utente, era basata, su una struttura a menu gerarchico; l'utente utilizzava il programma, tramite menu innestati e tornava indietro, utilizzando il tasto <ESC> o qualche altro tasto, predefinito dal programma.

In OO, gli oggetti, sono eseguiti, creati, attivati ed il controllo e nelle mani dell'utente finale, non esiste un modo obbligato per muoversi nel programma.

Ciascun oggetto, ha la propria vita indipendente da tutti gli altri oggetti.

 


Perchè Object-Oriented

Il beneficio principale, che OO offre al programmatore, è la possibilità di riutilizzare gli oggetti.

Se ben progettati, gli oggetti possono essere riutilizzati, in qualsiasi programma senza adattamenti; gli oggetti non richiedono dichiarazione di variabili, chiamate a procedure, ecc.

Teoricamente, si potrebbe scrivere interi programmi, con poco o addirittura nessun codice; basterebbe combinare gli oggetti insieme a poche proprietà e avere già una applicazione eseguibile.

All’Utente, i programmi sviluppati con OOP, danno diverse possibilità.

Ciascun utente, può personalizzare il programma per adattarlo al proprio ambiente di lavoro, tramite la selezione degli oggetti, in funzione del proprio compito e delle proprie abitudini, e non secondo uno schema rigido condizionato da un menu gerarchico.

 

Concetti Object-Oriented

La programmazione OO, è basata su una manciata di concetti chiave, indispensabili per arrivare ad una corretta progettazione di classi ed oggetti effettivamente riutilizzabili.

Incapsulare

Non si può intervenire sul controllo degli oggetti da parte dell’ utente. Non è possibile  sapere quanti oggetti, di quale genere, l’ utente visualizzerà sullo schermo in un dato momento.

Il migliore modo per assicurare che tutto lavorerà insieme, malgrado le scelte dell'utente, è garantire che ogni oggetto sarà indipendente;  ciascun oggetto, deve contenere tutti i suoi dati e le sue procedure, ed essere completamente isolato da ogni altro oggetto.

Un oggetto non si deve sovrapporre ad un altro sia fisicamente che contettualmente, spesso, infatti, gli oggetti usano dati che possono confondersi  dando vita a dei malfunzionamenti.

Può succedere, ad esempio, che una procedura di un oggetto vada in esecuzione con i dati di un altro oggetto.

Quando si parla di dati non ci si riferisce al database, ma ai dati memorizzati nelle proprietà dell’oggetto; è importante isolare questi dati.

 

L’incapsulamento non è altro che la procedura di isolamento che permette all’oggetto di essere indipendente. 

Ereditarietà

Gli oggetti, hanno la capacità di ereditare attributi (proprietà) e comportamenti (metodi), da altri oggetti.

Questo è un aspetto delicato, dal punto di vista del riutilizzo; per riutilizzo si intende, la capacità di modificare un oggetto in una specifica applicazione, senza doverlo riscrivere.

Si supponga, per esempio, di creare un oggetto Automobile; esso possiede alcune proprietà (come i pneumatici, il motore ecc) ed alcuni comportamenti (partenza,frena, fai il pieno ecc) che possono essere ereditabili.

Infatti, usando OO, è possibile creare un nuovo oggetto, chiamato Elicottero derivato da  Automobile. Il nuovo oggetto Elicottero, possiede tutte le proprietà ed i comportamenti di Automobile, con in più alcune proprietà (rotore) ed alcuni comportamenti (decolla) specifici, ovviamente ad un elicottero.

Si dice che Elicottero ha ereditato le proprietà (pneumatici, motore) ed i comportamenti (parti,arresta) da Automobile.

Tramite l'eredità, la produttività viene enormemente migliorata; usando OO, non è necessario reinventare la ruota.

Polimorfismo

Gli oggetti, possono modificare i comportamenti e le proprietà che hanno ereditato.

L'oggetto figlio, può ridefinire i comportamenti Parti e Arresta di Automobile, più opportunamente per Elicottero, cambiando questi comportamenti in Decolla e Atterra.

Il Polimorfismo che letteralmente significa, forme multiple, migliora il riutilizzo degli oggetti.

Non si deve scartare a priori, che l'oggetto Automobile possa essere genitore per l'oggetto Elicottero, solo perché le proprietà Parti e Arresta di Automobile non descrivono accuratamente il comportamento di Elicottero.

 


6.1.2. Gestione Dati

 

 

 

La gestione dei dati è sicuramente il fondamento della progettazione di un software gestionale.

Assieme a Dbase viene distribuito il motore di database Borland Database Engine (BDE), che consente di connettersi in modo molto semplice alle tabelle Dbase e fornisce il supporto nativo per Paradox, Access, FoxPro e supporta i formati di Server Database più diffusi come Oracle, Sql Server, Interbase ed in generale qualsiasi sorgente dati supportata da ODBC.

Per la memorizzazione dei dati del progetto sono state utilizzate le tabelle standard di Dbase (.DBF), quindi il motore BDE non si connetterà ad un vero Database, ma ad una directory che conterrà tutte le tabelle DBF.

Queste tabelle non permettono di sfruttare tecniche come Transazioni, Trigger o Stored Procedures, ma garantiscono comunque una buona affidabilità e buone prestazioni; inoltre non comportano ulteriori spese, per l’acquisto di licenze, da parte del cliente.

L’ interazione coi dati non è implementata interamente in un DBMS (DataBase Management Systems), quindi le prestazioni di un buon gestionale Client/Server saranno vincolate a caratteristiche hardware, come una attenta manutenzione della rete, alle dimensioni delle tabelle e al numero di utenti.

 


6.2. Oggetti e Comandi

 

Oggetto Scheda

 

 

Oggetto che viene utilizzato per contenere altri oggetti utili, in genere, alla gestione di una particolare voce di menù; in sostanza è l’oggetto base su cui verranno progettate tutte le schede.

 

Oggetto Pannello

 

 

Questo Oggetto viene usato per accorpare campi utili ad un’unica funzione.

 

Oggetto Book

Oggetto utilizzato spesso all’interno di schede per visualizzare dati, ha la caratteristica di poter disporre di diverse pagine per separare i dati in base alle varie funzionalità.

 

Oggetto Griglia

Oggetto attraverso il quale vengono visualizzate delle liste di dati.

 

Comando Aggiungi

     *    

In genere il comando Aggiungi viene utilizzato per inserire nuove righe in griglia e quindi in tabella, porta la scheda dallo stato di consultazione allo stato di inserimento.

 

 

Comando Navigate

         

Navigate permette di scorrere la selezione della riga in griglia o comunque di scorrere i dati all’interno della lista.

 

Comando Modifica

     *

Questo comando porta la scheda dallo stato di consultazione a quello di Modifica, quindi permette la variazione dei dati già inseriti in precedenza.

 

Comando Salva

     *    

Attraverso questo comando vengono salvati i dati inseriti e la scheda viene riportata allo stato di consultazione.

 

Comando Abbandona

         

Abbandona riporta la scheda allo stato di consultazione, annullando tutte le modifiche fatte ai dati.

 

Comando Elimina

     *    

Tramite Elimina è possibile eliminare dati, nel caso di una scheda con griglia verrà eliminata la riga attualmente selezionata; questa operazione è possibile farla solo in fase di consultazione.

 

 

Comando Copia

         

Copia porta la scheda in stato di modifica e crea una copia della riga attualmente selezionata in griglia.

 

Comando Stampa

     *    

Attraverso questo comando è possibile stampare i dati opportunamente selezionati, questa operazione è possibile farla solo in stato di consultazione.

 

Comando Esegui

         

Esegui è il comando che in ogni scheda lancia il filtro dei dati e carica la griglia, in genere esegue sempre una funzione caratteristica della scheda.

 

Comando Esci

         

Tramite questo comando è possibile uscire dalla scheda, l’uscita è consentita solo in fase di consultazione; quindi prima di uscire è necessario abbandonare o salvare i dati.

 

 

 

 

 


6.3. Codice Sviluppato più significativo

 

Il codice è sviluppato all’interno di ogni scheda, questo è strutturato in funzioni associate ad eventi, come può essere l’apertura di una scheda o il click su un comando.

Queste funzioni possono essere di uso interno alla scheda o di uso generale.

Se di uso interno sono visibili e quindi utilizzabili solo all’interno della scheda, mentre quelle di uso generale sono contenute in una classe S2Funzio.CC e quindi utilizzabili da qualsiasi scheda del progetto; di seguito verranno riportate alcune delle principali funzioni utilizzate nel progetto.

 

La funzione Cod2dati

Questa funzione è usata per ottenere dei dati da una tabella, passando come parametri nome e indice tabella, questa provvederà a restituire il dato richiesto; è una funzione ad uso generale, quindi contenuta in S2Funzio.CC

*------------------------------------------------------------------------------

FUNCTION COD2DATI (cFile,cIndex,xChiave,bVar,lFound,cFilter)

*------------------------------------------------------------------------------

* se trova xChiave in cFile tramite cIndex (se c'è) valuta bVar e restituisce .T.

* altrimenti non valuta bVar (o lo valuta se lfound=true) e restituisce .F.

* è possibile applicare un filtro (cfilter)

*------------------------------------------------------------------------------

 

LOCAL qArchivio,rArchivio,nI,lRet,lTrovato

 

lRet = false

 

PRIVATE cTemp

 

// controllo che apertura vada a buon fine altrimenti restituisco false

try

   d = new S2DB()

   d.active       := true

 

   qArchivio = new Query()

   qArchivio.sql = "select * from " + cFile + ".dbf"

   qArchivio.database = d

   qArchivio.active = true

   rArchivio = qArchivio.rowset

   cTemp = cFilter

   IF TYPE("cTemp") = "C"

      rArchivio.filter = cFilter

   ENDIF

 

   cTemp = cIndex

   IF TYPE("cTemp") = "C"

      rArchivio.indexname = cIndex

      lTrovato = rArchivio.FindKey(xChiave)

   ELSE

      lTrovato = rArchivio.ApplyLocate(xChiave)

   ENDIF

catch (Exception e)

   MsgBox( cFile + chr(10) + e.message,"Attenzione!",16 )

   return false

endtry

 

IF lTrovato

   lRet = true

ENDIF

 

cTemp = bVar

IF TYPE("cTemp") = "CB"

   IF lFound .OR. lTrovato

      for nI=1 to rArchivio.Fields.size

         cTemp = rArchivio.Fields[nI].fieldname

         &cTemp = rArchivio.Fields[nI].value

         if not ltrovato

            do case

            case rArchivio.Fields[nI].type = "C"

               &cTemp = space(rArchivio.Fields[nI].length)

            case rArchivio.Fields[nI].type = "N"

               &cTemp = 0

            case rArchivio.Fields[nI].type = "D"

               &cTemp = ctod("")

            endcase

         endif

      next

      release cTemp

 

      bVar()

   ENDIF

ENDIF

 

// chiudo e rilascio la query temporanea...

rArchivio.abandon(); qArchivio.active = false;rele obje qArchivio

 

RETURN lRet


La funzione Controllo

 

Questa è una funzione ad uso interno, quindi è contenuta all’interno della scheda ;

attraverso Controllo è verificata la correttezza dei dati inseriti.

 

*------------------------------------------------------------------------------

FUNCTION CONTROLLO

*------------------------------------------------------------------------------

     local cdesc,ccli,cdest,ccomm,cmotivo1,cmotivo2,cmotivo3,cmotivo4,cmotivo5,cmotivo6,cmotivo7

       

      cdesc=""

 

      do case

     

      CASE this.name = "FLD_OPERATORE"

        

            if not empty(this.value)

               if not cod2dati("OPERATOR","OPERATOR",LEFT(_app.kazi,2)+transform(this.value,"!!"),{; cDesc = nome})

                  this.validerrormsg = "L'operatore inserito non esiste !!!"

                  return false

               else

                  form.fld_descoper.value = cdesc

               endif

             else

               form.fld_descoper.value=""

             endif

          

      CASE this.name = "FLD_CLIENTE"

           if not empty(this.value)

              if not cod2dati("ANACLI","ANACLI",LEFT(_app.kazi,2)+"C"+str(this.value,5),{; cDesc = RAGSOC})

                  this.validerrormsg = "Il cliente inserito non esiste !!!"

                  return false

              else

                  form.fld_desccli.value=cdesc

              endif

            else

              form.fld_desccli.value=""  

            endif

 

      CASE this.name = "FLD_TIPORAPP"

 

           if not empty(this.value)

              if not cod2dati("OPERAZIO","OPERAZIO",LEFT(_app.kazi,2)+transform(this.value,"!!"),{; cDesc = nome}) 

                  this.validerrormsg = "Il Tipo di Rapportino inserito non esiste !!!"

                  return false

              else

                  form.fld_destipo.value = cdesc  

              endif

           else

              form.fld_destipo.value=""

           endif

   

      CASE this.name = "FLD_DACOMM"

           if not empty(this.value)

               if not cod2dati("COMMES","COMMES",LEFT(_app.kazi,2)+str(this.value,5),{; cDesc = note}) 

                  this.validerrormsg = "La commessa inserita non esiste !!!"

                  return false

               else

                  form.fld_desdacom.value = cdesc

               endif

           else

               form.fld_desdacom.value=""

           endif

     

      CASE this.name = "FLD_ACOMMESSA"

            if not empty(this.value)

                  if not cod2dati("COMMES","COMMES",LEFT(_app.kazi,2)+str(this.value,5),{; cDesc = note}) 

                     this.validerrormsg = "La commessa inserita non esiste !!!"

                     return false

                  else

                     form.fld_descom.value = cdesc

                  endif

              else

                  form.fld_descom.value=""

              endif

    

       CASE this.name = "FLD_CLI"

 

            if not empty(this.value)

              if not cod2dati("ANACLI","ANACLI",LEFT(_app.kazi,2)+"C"+str(this.value,5),{; cDesc = RAGSOC})

                  this.validerrormsg = "Il cliente inserito non esiste !!!"

                  return false

              else

                  form.book1.fld_desclidet.value=cdesc

              endif

            else

              form.book1.fld_desclidet.value=""

            endif

   

        CASE this.name = "FLD_COMMESSA"

              if not empty(this.value)

                  if not cod2dati("COMMES","COMMES",LEFT(_app.kazi,2)+str(this.value,5),{; cDesc = note}) 

                     this.validerrormsg = "La commessa inserita non esiste !!!"

                     return false

                  else

                     form.book1.fld_descomdet.value = cdesc

                  endif

              else

                  form.book1.fld_descomdet.value=""

              endif

   

        CASE this.name = "FLD_OPER"

             if not empty(this.value)

               if not cod2dati("OPERATOR","OPERATOR",LEFT(_app.kazi,2)+transform(this.value,"!!"),{; cDesc = nome})

                  this.validerrormsg = "L'operatore inserito non esiste !!!"

                  return false

               else

                  form.book1.fld_desoperdet.value = cdesc

               endif

             else

               form.book1.fld_desoperdet.value=""

             endif

      

        CASE this.name = "FLD_DATA"

 

             form.ultimadata=this.value

             

        CASE this.name = "FLD_NCHIAM"

 

             if not empty(this.value)

                  cmotivo1=""

                  cmotivo2=""

                  cmotivo3=""

                  cmotivo4=""

                  cmotivo5=""

                  cmotivo6=""

                  cmotivo7=""

                  ccli=0

                  cdest=0

                  ccomm=0

                  if not cod2dati("CHIAMATE","CHIAMNUM",str(this.value,5),{; cmotivo1 = motivo1; cmotivo2 = motivo2; cmotivo3 = motivo3; cmotivo4 = motivo4; cmotivo5 = motivo5; cmotivo6 = motivo6; cmotivo7 = motivo7; ccli=codcli; cdest=coddest1; ccomm=commessa})

                     this.validerrormsg = "La chiamata non esiste !!!"

                     return false

                  else

                     if (form.rowset.state=2) or (form.rowset.state=3)

                        if not empty(cdest)     

                           form.book1.fld_oper.value=cdest

                           cdesc=""

                           cod2dati("OPERATOR","OPERATOR",LEFT(_app.kazi,2)+form.book1.fld_oper.value,{; cDesc = nome})

                           form.BOOK1.fld_desoperdet.value=cdesc

                        endif

                        if not empty(ccli)

                           form.book1.fld_cli.value=ccli

                           cdesc=""

                           cod2dati("ANACLI","ANACLI",LEFT(_app.kazi,2)+"C"+str(form.book1.fld_cli.value,5),{; cDesc = RAGSOC})

                           form.BOOK1.fld_desclidet.value=cdesc

                        endif

                        if not empty(ccomm)

                           form.book1.fld_commessa.value=ccomm

                           cdesc=""

                           cod2dati("COMMES","COMMES",LEFT(_app.kazi,2)+str(form.book1.fld_commessa.value,5),{; cDesc = note})

                           form.book1.fld_descomdet.value=cdesc

                        endif

                        form.book1.s2custeditor1.value = cmotivo1+cmotivo2+cmotivo3+cmotivo4+cmotivo5+cmotivo6+cmotivo7  

                     endif

                     form.book1.edit_chiam.value = cmotivo1+cmotivo2+cmotivo3+cmotivo4+cmotivo5+cmotivo6+cmotivo7                            

                  endif

              else

                  form.book1.edit_chiam.value=""

              endif

        

      endcase

 

    return true


La funzione Ricerca

 

Ricerca è una funzione ad uso interno, quindi è contenuta all’interno della scheda; tramite questa funzione è possibile eseguire tutte le ricerche, alfabetiche e libere, all’interno della scheda.

 

*------------------------------------------------------------------------------

   FUNCTION RICERCA ( cTipoRicerca )

*------------------------------------------------------------------------------

   local cdesc  

      local l

      private form; form = _app.oForm

      private cCod_Ritorno  // privata per il Type()

      local cCampo

      cCampo = form.cCampoAttivo

   

    if cCampo $ "FLD_CLIENTE-BOOK1.FLD_CLI"

       

         if cTipoRicerca = "A"

            l = new CliforRaForm()

         elseif cTipoRicerca = "L"

            l = new CliforRlForm()

         else

            return

         endif

         l.cClifor = "C"

 

      elseif cCampo $ "FLD_OPERATORE-BOOK1.FLD_OPER"

         l = new NewTabForm()

         l.text = "Tabella Operatori"

         l.TabSql = 'select CODICE,NOME,CODICE from "OPERATOR" '+;

                    'where codazi="'+left(_app.kazi,2)+'" '

         l.TabInd = 'OPERATOR'

         l.NomeForm = "Operat"

 

      elseif cCampo $ "FLD_TIPORAPP-BOOK1.FLD_TIPO"

         l = new NewTabForm()

         l.text = "Tabella Tipo Rapportini"

         l.TabSql = 'select CODICE,NOME,CODICE from "OPERAZIO" '+;

                    'where codazi="'+left(_app.kazi,2)+'" '

         l.TabInd = 'OPERAZIO'

         l.NomeForm = "OPERAZ"

 

      elseif cCampo $ "FLD_DACOMM-FLD_ACOMM-BOOK1.FLD_COMMESSA-FLD_ACOMMESSA"

         l = new NewTabForm()

         l.text = "Tabella Tipo Commesse"

         l.TabSql = 'select NRCOM,NOTE,NRCOM from "COMMES" '+;

                    'where codazi="'+left(_app.kazi,2)+'" '

         l.TabInd = 'COMMES'

         l.NomeForm = ""

      else

         return

      endif

 

      l.mdi = false

      l.menufile = ''

 

      l.cCod_Ritorno = null

      l.readmodal()

        

      cCod_Ritorno = l.cCod_Ritorno

 

      if not empty(l)

         l.release(); l = null

      endif

 

      // passo a una variabile privata per macro

      cTemp = cCampo

 

      cstringa = "form."+cTemp+".setfocus()"

      &cstringa

      cdesc=""               

      if cCod_Ritorno # null

        

         If cCampo == "FLD_OPERATORE"

            form.FLD_OPERATORE.value = cCod_Ritorno

            //class::Descrizione(form.FLD_OPERATORE,form.fld_descoper)

            form.FLD_OPERATORE.keyboard( chr(13) )

         elseif ccampo="BOOK1.FLD_OPER"

            form.book1.FLD_OPER.value = cCod_Ritorno

            cod2dati("OPERATOR","OPERATOR",LEFT(_app.kazi,2)+cCod_Ritorno,{; cDesc = nome})

            form.book1.fld_desoperdet.value = cdesc

            //class::Descrizione(form.BOOK1.FLD_OPER,form.book1.fld_desoperdet)

            form.book1.FLD_OPER.keyboard( chr(13) )

         elseif cCampo == "FLD_TIPORAPP"

            form.FLD_TIPORAPP.value = cCod_Ritorno

            //class::Descrizione(form.fld_TIPORAPP,form.FLD_DESTIPO)

            form.FLD_TIPORAPP.keyboard( chr(13) )

         elseif ccampo="BOOK1.FLD_TIPO"

            form.book1.FLD_tipo.value = cCod_Ritorno

            cod2dati("OPERAZIO","OPERAZIO",LEFT(_app.kazi,2)+cCod_Ritorno,{; cDesc = nome})

            form.book1.fld_destipdet.value = cdesc

            //class::Descrizione(form.book1.fld_TIPO,form.book1.FLD_DESTIPdet)

            form.book1.FLD_tipo.keyboard( chr(13) )

         elseif cCampo == "FLD_DACOMM"

            form.FLD_DACOMM.value = cCod_Ritorno

            form.FLD_DACOMM.keyboard( chr(13) )

        elseif cCampo = "FLD_ACOMMESSA"

            form.FLD_ACOMMESSA.value = cCod_Ritorno

            cod2dati("COMMES","COMMES",LEFT(_app.kazi,2)+str(cCod_Ritorno,5),{; cDesc = note}) 

            form.fld_descom.value = cdesc

            form.FLD_ACOMMESSA.keyboard( chr(13) )

        elseif ccampo = "BOOK1.FLD_COMMESSA"

            form.book1.FLD_COMMESSA.value = cCod_Ritorno

            cod2dati("COMMES","COMMES",LEFT(_app.kazi,2)+str(cCod_Ritorno,5),{; cDesc = note}) 

            form.book1.fld_descomdet.value = cdesc

            form.book1.FLD_commessa.keyboard( chr(13) )

        elseif ccampo= "BOOK1.FLD_CLI"

            form.book1.FLD_cli.value = val(substr(cCod_Ritorno,4,5))

            cod2dati("ANACLI","ANACLI",cCod_Ritorno,{; cDesc = RAGSOC})

            form.book1.fld_desclidet.value=cdesc

            form.book1.FLD_cli.keyboard( chr(13) )

        elseIF CCAMPO=="FLD_CLIENTE"

            form.FLD_CLIENTE.value =val(substr(cCod_Ritorno,4,5))

            form.FLD_CLIENTE.keyboard( chr(13) )

        endif

 

    endif

 

  return


 
 
Conclusioni

 

 

 

Da qualche mese WinLavori è usato  quotidianamente in EsseDueSoft e rappresenta un aiuto fondamentale nell’ ottimizzazione dei modi e dei tempi di lavoro.

Le caratteristiche più importanti del progetto sono sicuramente la funzionalità e la semplicità d’uso, che permettono anche ad utenti non esperti, di muoversi all’interno del programma senza particolari difficoltà.

La funzionalità è derivata da un’analisi fatta assieme ai singoli dipendenti, che ha permesso di capirne le diverse esigenze. E’ nato così, un gestionale molto funzionale e soprattutto orientato ai bisogni dei singoli utenti.

Grazie ad un ambiente visuale, molto intuitivo, composto da  schede, comandi ed immagini, WinLavori fa della facilità d’uso sicuramente una delle sue peculiarità più importanti.

L’ interazione coi dati non è implementata interamente in un DBMS (DataBase Management Systems), quindi le prestazioni sono vincolate ad una attenta manutenzione della rete, alle dimensioni delle tabelle e al numero di utenti.

Per ovviare a queste riserve, prossimamente è in programma una migrazione dei dati dalle tabelle standard di Dbase (.DBF) ad un Server di database, per garantire buone prestazioni anche con un elevato numero di utenti.