Capitolo 16. La Fatturazione

  

16.1  Le Tabelle del Sistema

 

Nei Capitoli precedenti abbiamo visto un sistema abbastanza completo per la gestione degli Articoli. Ora, come sviluppo del metodo, vogliamo affrontare il problema di gestire i sistemi relazionati “Madri/Figlie”,  cioè quei sistemi composti da una serie di Record  base, come ad esempio le testate di Ordini, le testate di Fatture, le schede di presenza di un Cliente in un albergo etc e, d’altro lato, da una serie di record associati, costituenti nell’esempio le voci degli Ordini, le voci delle Fatture, gli Extra di ciascun Cliente presente nell’albergo etc.

 

Verrà analizzato l’esempio didattico di un sistema di Fatturazione di Articoli var di un ipotetico Supermercato di Alimentari, cioe’ la creazione di Fatture, ciascuna corredata dalle sue voci relative ai vari Articoli fatturati.

 

Per gestire questi sistema occorrono le seguenti Tabelle fondamentali:

 

-        Tabella degli Articoli

-        Tabella dei Clienti a cui indirizzare le Fatture

-        Tabella delle Teste di Fattura

-        Tabella delle Voci  di Fattura

 

Nonche’ un certo numero di Tabelle secondarie che abbiamo in parte gia’ visto, i Produttori, i Tipi, etc.

 

Pur mantenendo questa trattazione a livello semplificato e didattico, dobbiamo introdurre almeno alcuni campi per tener conto delle aliquote IVA specifiche di ogni Articolo

 

Per fare questo si apra una nuova Cartella Esercizio_16, copiandola per esempio dalla Cartella Esercizio_11. Al solito, l’Esercizio svolto e’ presentato in Cartella Soluzione_16_ADO.

 

Interveniamo allora su MAGFILE.MDB/Tabella ARTFILE ed aggiungiamo:

 

Nome                     Tipo                        Dimensione

ALIVA                     Numerico                Precisione Doppia      Aliquota IVA

IVABASE                 Numerico               Precisione Doppia      Importo IVA unitario

COSBALORDO         Numerico                Precisione Doppia      Base lordo unitario

 

Naturalmente occorre aggiornare le Routines ARTBLANK, ARTTEXT rd ARTREPLA nel Modulo1 secondo i metodi gia’ studiati.

 

Vediamo ora le Tabelle ausiliarie:

 

a) Tabella dei Tipi di Articolo:

 

TIPFILE           Tipo         Dimensioni    

--------------------------------------------

TIPCODI         Carattere           3

TIPNOME        Carattere          30

FLIPRETE        Numero          Double   

 

b) Tabella delle Unita' di misura UNIFILE:

 

UNIFILE          Tipo        Dimensioni

-----------------------------------------

UNICODI        Carattere        3

UNINOTA        Carattere      30

FLIPRETE        Numero       Double    

 

 

16.2  Modifiche al Form Artsk1

 

Passiamo ora ad “ARTSK1” ed aggiungiamo qui due utili Subroutines. La prima si riferisce ad un nuovo bottone “PRIMO” che porta ad inizio Tabella “ARTFILE”. Eccone l’evento Click:

 

Private Sub cmdtop_Click()

artfresca

art11.MoveFirst

End Sub

 

C’è poi il bottone “ULTIMO” che porta alla fine Tabella:

 

Private Sub cmdbottom_Click()

artfresca

art11.MoveLast

End Sub

 

 

16.3  Modifiche al Form Artsk2

 

Nel “ARTSK2” aggiungiamo tre bottoni di Help:

 

-        Uno per richiamare il file delle Unità di Misura.

-        Uno per richiamare il File dei Tipi di Articolo.

-        Uno per scegliere una Aliquota IVA.

 

Per quest’ultimo bottone non è necessario un sistema completo come per “UNI” e per “TIP”, basta una List Box a discesa con i soli tre valori stabiliti dalla Legislazione Italiana, 4 %,  10 %  e 20 %.

 

La List Box viene inizializzato nel Form_Load di “ARTSK2” con le istruzioni:

 

Private Sub Form_Load()

                                                                                                                                                                                     

'help aliquote IVA

'---------------------------------------

lisiva.AddItem " 4.0"

lisiva.AddItem "10.0"

lisiva.AddItem "20.0"

 

End Sub

 

Alla List Box va assegnata la Proprietà Visible “False”. La Lista  viene resa visibile solo dai bottoni “CMDNEW” e “CMDEDIT”.

 

Gli altri Help presuppongono un sistema completo. Per esempio per la UNI si dovrà creare un:

 

                    UNISK1

                    UNISK2

                    UNIHLP1

 

Per questi Form su può copiare ed adattare il sistema “PRO” visto in precedenza.

 

Anche qui  si dovranno rispettare le condizioni di Nome per  i Form e per le TextBox e si potrà utilizzare l’Utility “MAKETEXT”  per le tre Subroutines:

 

                    UNITEXT

                    UNIREPLA

                    UNIBLANK

 

Si notino le Routines di chiamata di questi Help. Per esempio:

 

Private Sub cmdhlpum_Click()

 

flahlpuni = 1

Unihlp1.Show

Artsk2.Enabled = False

 

End Sub

 

Come gia’ spiegato, il Flag “FLAHLPUNI” (Global nel Modulo1) è utile nel caso che l’Help “UNIHLP1” venga chiamato da punti diversi del Progetto. Ogni volta apparirà sempre lo stesso “UNIHLP1” ma occorre un Flag per decidere poi le azioni dei “CMDTAKE” e “CMDABANDON”.  Ad es.:

 

Private Sub cmdtake_Click()

 

Select Case flahlpuni

Case 1

frmArtsk2.Enabled = True

frmArtsk2.txtum = uni21!UNIcodi

End Select

 

Unload frmUnihlp1

End Sub

 

Apportiamo infine una ultima modifica alla Routine “ARTCHECK”. Vogliami infatti controllare che il Codice del Tipo Articolo introdotto dall’Utente esista nella Tabella “TIPFILE”

 

'tipo esiste

'-------------------------------------------------

If Len(Trim(txttipo)) <> 0 Then

Selezione = "SELECT * from TIPFILE"
tip22.Open "" & Selezione & "", Cn, adOpenStatic, adLockOptimistic

kriterio = "TIPCODI= '" & txttipo.Text & "' "
tip22.Find kriterio
If Not tip22.EOF() Then
Fovsk3.txtTipnome = tip22!TIPNOME
tip22.Close
Else
Messag = "Tipo Articolo non esiste ! "
Tito = "Attenzione ! "
Rispo = MsgBox(Messag, 0, Tito)
flaart = False
tip22.Close
Exit Sub
End If 'eof
End If 'len

 

 

16.4 Le Routines di Calcolo

 

Nel “ARTSK2” sono presenti due nuove Subroutines di calcolo: ecco la prima:

  

Sub calcolabase()

 

'cosbanetto

'-------------------------------------------

frmArtsk2.txtcosbanetto = virformat(frmArtsk2.txtcosbanetto)

 

'ivabase

'-------------------------------------------

ziva = (virvalore(txtcosbanetto) * virvalore(txtaliva)) / 100

ziva = CLng(ziva * 100) / 100

frmArtsk2.txtivabase = virformat(ziva)

 

'cosbalordo

'-------------------------------------------

zcosbalordo = virvalore(txtcosbanetto) + virvalore(txtivabase)

zcosbalordo = CLng(zcosbalordo * 100) / 100

frmArtsk2.txtcosbalordo = virformat(zcosbalordo)

 

End Sub

 

La Routine “CALCOLABASE” serve a calcolare e a formattare i valori base di costo netto e costo lordo in dipendenza dell’aliquota IVA ed e’ richiamata dai Lost_Focus di “COSBANETTO” ed “ALIVA”.

 

Si notino i metodi di calcolo in particolare l’uso delle funzioni “VIRVALORE” e “VIRFORMAT” illustrate nei Capitoli precedenti. Si noti infine che, quando si fa un calcolo Netto/Lordo/IVA, occorre eliminare le approssimazioni dei millesimi e far comparire solo i centesimi.  A questo provvede l’uso della Funzione “CLNG” che converte un carattere ad Integer.

 

Ecco ora la seconda Subroutine, il Lost.Focus di “COSBALORDO”

  

Private Sub txtCOSBALORDO_LostFocus()

 

'txtCOSBALORDO

zaliva = virvalore(txtaliva)

zcosbalordo = virvalore(txtcosbalordo)

zcosbalordo = CInt(zcosbalordo * 100) / 100

txtcosbalordo = virformat(zcosbalordo)

 

'txtCOSBANETTO

zcosbanetto = virvalore(zcosbalordo) / (1 + zaliva / 100)

zcosbanetto = CInt(zcosbanetto * 100) / 100

txtcosbanetto = virformat(zcosbanetto)

 

'txtivabase

zivabase = virvalore(txtcosbalordo) - virvalore(txtcosbanetto)

zivabase = CInt(zivabase * 100) / 100

txtivabase = virformat(zivabase)

 

End Sub

 

Questa Routine calcola all’indietro il costo netto quando si impone un costo lordo.

 

16.5 Il sistema CLIFILE

 

Presentiamo ora la Tabella dei Clienti a cui inviare le Fatture:

 

CLIFILE           Tipo                 Dimensione   

-----------------------------------------------------

CLICODI          Numerico          Double   

CLINOME         Carattere            30

DATAGG          Data                    8

INDIR             Carattere            40

CAP                Carattere              5

CITTA             Carattere            25

PR                  Carattere             3

CODFIS           Carattere           16

PIVA               Carattere            11

TELEFO1          Carattere           20

TELEFO2          Carattere           20

NOTA              Carattere           20

FLIPRETE        Numerico            Double    

 

 I sistema CLIFILE si compone dei soliti Form:

 

                          CLISK1

                          CLISK2

                          CLIHLP1

 

I Form possono essere copiati da sistemi precedenti ed adattati. Ci limitiamo a presentane l’aspetto.  Ecco CLISK1:

 

 

 

 

 

Ed ecco il CLISK2

 

 

Il sistema CLI  è corredato dalle solite Routines di gestione che non commentiamo più. Anche qui con l’Utility MAKETEXT si possono preparare le tre Subroutines:

 

                             CLITEXT

                             CLIREPLA

                             CLIBLANK

 

Presentiamo solo la “CLIFRESCA”:

 

Sub clifresca()

 

'memorizza CLICODI Record

'------------------------------

zCLICODI = virvalore(Clisk2.txtClicodi.Text)

 

'riapre il recordset ADO

'------------------------

cli11.Close

cli11.Open "" & Selezione & "", Cn, adOpenStatic, adLockOptimistic

Set Clisk1.DataGrid1.DataSource = cli11

Clisk1.caricacolonne

 

'riposiziona

'----------------------

if not cli11.BOF then

kriterio = "CLICODI = " & zCLICODI & " "

cli11.Find kriterio

end If

 

End Sub

 

 

Fine del Capitolo 16. La Fatturazione