Newsgroup: it.comp.appl.access
Titolo: problema numerazione univoca

Sto sviluppando, con access xp,  un piccolo db per gestire la mia
fatturazione.
Grazie anche a precedenti dritte ora il tutto funge ma...ho ancora un'ultimo
nodo da sbrogliare.Mi spiego meglio.
E' risaputo che il numero della fattura rappresenta un dato univoco che la
individua e che si "riazzera" all'inizio di ogni anno perchiò potra esistere
una sola fattura n.1 nel 2002 ma dovrà poter esistere anche una fattura n.1
per il 2003 e via dicendo.Ho temporanenamente aggirato il problema
calcolandomi con una query il prossimo numero disponibile per cui quando
inserisco una nuova fattura il campo "numero" viene automaticamente riempito
da access estraendolo dalla query.
Il problema è che cosi non tengo conto dell'anno solare!
Cioè questo "metodo" funziona finquando a partire dal primo gennaio 2003
quando dovro inserir una nuova fattura n.1!Come posso fare?

 ha scritto nel messaggio
news:AqKg9.11697$eG6.2...@twister1.libero.it...

Non solo sul sito comune c'è la soluzione, ma se ne è parlato tantissimo in
un thread questa settimana
Antonio


ahh....il sito comune...e chi ci pensava!Non ho avuto modo (tempo) di
guardar i vecchi thread e me ne scuso ma ora sto lavorando fuori casa cosi
dispongo di un pc solo nel weekend e al solito la fretta mi fa far un po
casino!Ora do uno sguardo...spero di tirar fuori qualcosa!
Ciao e buona domenica!Ale :-)

 ha scritto nel messaggio
news:AqKg9.11697$eG6.2...@twister1.libero.it...

Potresti risolvere il problema come segue:
1) Crei una tabella LOG contenente duecampi PROGRESSIVO impostato a zero,
ANNO_IN_CORSO impostato a 2002
2) crea la funzine PROGRESSIVO_ORDINE
3) Chiama la funzione PROGRESSIVO_ORDINE e otterrai la prima volta 1/2002
4) Crea la funzione AGGIORNA_PROGRESSIVO_ORDINE per aggiornare nel LOG
quando l'operazione è confermata
5)Crea una procedura INZIO che verrà attivata tutte le volte che parte
l'applicazione se la data del sistema è maggiore dell'ANNO_IN_CORSO presente
nel  LOG allora dovrai aggiorbnare il PROGRESSIVO della tabella LOG a zero
ciao
*****************************************************************
Function PROGRESSIVO_ORDINE() As String
On Error GoTo ERR_PROGRESSIVO_ORDINE
Dim LOG As Recordset, DATA
Set LOG = CurrentDb.OpenRecordset("LOG", DB_OPEN_DYNASET)
    LOG.MoveFirst
    LOG.Edit
    DATA = Year(Date)
    PROGRESSIVO_ORDINE = (LOG![PROGRESSIVO] + 1) & "/" & DATA
    LOG.Close
 Exit Function
ERR_PROGRESSIVO_ORDINE:
 MsgBox "PROGRESSIVO_ORDINE:  " & ERR & ": " & Error
End Function

 3) Chiama la funzione PROGRESSIVO_ORDINE e otterrai la prima volta 1/2002
Da qui in poi mi son perso!Son alle prime armi + o - e non conosco bene
VBscript.Ad occhio o capito ma mi interesserebbe capir un po meglio i
passaggi se puoi mi guidi un po di +?
Grazie cmq, Ale


Credo di aver trovato sul sito la soluzione che mi hai indicato:
"Numerazione crescente per fatture ed altro."
Ho scaricato il file "GeneraContatore.zip" e ho importato nel mio db la
mascera "incriminata" ma a quanto pare il codice generato va incollato nel
campo "valore predefinito" di un campo testo.Io ho definito il mio campo
"numero fattura" come numerico e vi ho sopra anche delle relazioni quindi
non mi va.
Sbaglio?

 ha scritto nel messaggio
news:5DOg9.14632$my3.2...@twister2.libero.it...

Quel codice che ti genera il numero, quello con le dmax isnull format ecc,
lo puoi anche mettere dentro qualche procedura evento in modo da assegnare
da codice il valore quando ti pare a te
Antonio

 ANNO_IN_CORSO impostato a 2002
uhm.... che necessita'  c'e' di questa tabella log?
basterebbe ricercare sulla tabella fatture una cosa del genere
"select max(nfat) from tab where right(nfat,2) = year(date())"
fermo restando che e' preferibile, credo, impostare il numero fattura
come aapppp
e quindi
"select max(nfat) from tab where left(nfat,2) = year(date())"
nel caso ritorni null si forza 1
questa e' una funzione buona per "quasi" tutte le stagioni
**************************************
Public Function AutoNum(NomeTab As String, field As String, Optional
bool As Boolean, Optional j As Integer) As String
'Contatore:restituisce il max del valore del campo passato + 1
Dim rstInt As Recordset
Dim i As Integer
Dim DimStr As Integer
If IsMissing(bool) Then bool = True
If IsMissing(j) Then j = 4
If bool = False Then
Set rstInt = CurrentDb.OpenRecordset("SELECT MAX(Right(" & field & "," &
j & ")) as ValMax From " & NomeTab & " Where Left(" & field & ",2)=" &
Right(Year(Date), 2) & ";")
AutoNum = Nz(rstInt.Fields("ValMax").Value, 0) + 1
DimStr = Len(AutoNum)
If DimStr < j Then
For i = 1 To j - DimStr
    AutoNum = "0" & AutoNum
Next i
End If
AutoNum = Right(Year(Date), 2) & AutoNum
Else
Set rstInt = CurrentDb.OpenRecordset("SELECT MAX(" & field & ") as
ValMax From " & NomeTab & ";") 
AutoNum = Nz(rstInt.Fields("ValMax").Value, 0) + 1
DimStr = Len(AutoNum)
If DimStr < j Then
For i = 1 To j - DimStr
    AutoNum = "0" & AutoNum
Next i
End If
End If
End Function
**************************************
Riceve i parametri 
Nometab = Nome della tabella su cui si vuole operare
field = nome del campo su cui si vole operare
bool (opzionale default = true) = se true esiste solo il progressivo
altrimenti c'e' l'anno a destra (2 caratteri)
j = lunghezza del progressivo (opzionale default = 4)
ritorna una stringa
come si usa
x = autonum("Fatture","ProgFatture",false,8)
in x 0000000102 (prima fattura del 2002)
x = autonum("Fatture","ProgFatture")
in x 0001  (primo progressivo)
(con un altro paio di parametri potrebbe fare "quasi" il caffe')
[Cut]
--
a.cara