Nella formattazione dell'ultima parte del campo seguente mi trovo quindi in
difficolt� nell'indicare l'anno:
=Format("A") & Format("/") &
Format([DETTAGLI_FATTURE_ACQUISTO_PROTOCOLLO];"0000") & Format("/") &
Format(Right(Year(Now());2))
Sempre che secondo voi, trovando questa soluzione, io riesca a soddisfare la
mia esigenza di avere il campo "PROTOCOLLO" che si incrementi in base
all'anno, ovvero:
nella form [AVVIO DATA] inserisco 01/02/2011
il protocollo della fattura registrata sar� 0025/11, quella dopo
0026/11.....
se invece nella form [AVVIO DATA] inserisco 31/12/2010, il protocollo della
fattura registrata dovrebbe seguire l'incremento dell'anno 2010 e quindi
avere 0285/10, 0286/10....etc...
Io ho provato con right(year(form![AVVIO DATA]![DATA]);2) ma nulla.... dove
sbaglio?
Grazie.
Giorgia
Te l'avro' spiegato 2'433'455'544'322 volte :D
Per cui incremento e con questa siamo a 2'433'455'544'323....
se questi dati 0285/10, 0286/10, ecc... sono in una tabella, puoi fare
una query in cui separi i campi:
Cmp1 = int(left(TuoCampo;4))
Cmp2 = int(right(TuoCampo;2))
li raggruppi e per il Cmp1 metti MAX
In questo modo avrai per ogni anno il numero massimo di documento
registrato...
a questo punto per ogni inserimento potrai andarti a leggere a volo
questa query da recordset filtrandola per anno e recuperare il numero
massimo registrato... a sto punto verra' da se che il numero da
registrare nuovo sara' quello recuperato + 1...
chiaro? ;)
Ehy ciao Prof! ;-)
uhm...posso dire "chiarino"?
nel senso che l'anno dove e come lo recupero? pensavo dalla form [AVVIO
DATA]....ma non riesco....
Giorgia
Giorgia
___
Ciao Giorgia, non usare now ma data fattura, altrimenti se ad inizio anno
scrive le ultime dell'anno precedente, ti scatta il contatore..
inoltre no nha molto senso Format("A") & Format("/") , format ti permette di
appunto formattare cioč mostrare una data o un numero in un certo modo
FORMAT(1,"000") esce "001"
Format(date, "ggg g.mmm.aaaa") esce mar "01.feb.2011"
nel tuo caso basta ="A/"
MA
no... non lo puoi dire, ma se togli "H" ed "I", ti do il permesso di
dirlo :D
> nel senso che l'anno dove e come lo recupero? pensavo dalla form [AVVIO
> DATA]....ma non riesco....
ma come da dove lo recuperi?...
Se hai un Form di inserimento, avrai anche il campo in cui indichi
l'anno della registrazione del documento no? mi pare ovvio... e allora
è da lì che lo prendi... poi con il metodo che ti ho indicato fai cio'
che ti serve
ho capito male?
> Giorgia
no... non lo puoi dire, ma se togli "H" ed "I", ti do il permesso di
dirlo :D
> nel senso che l'anno dove e come lo recupero? pensavo dalla form [AVVIO
> DATA]....ma non riesco....
ma come da dove lo recuperi?...
Se hai un Form di inserimento, avrai anche il campo in cui indichi
l'anno della registrazione del documento no? mi pare ovvio... e allora
� da l� che lo prendi... poi con il metodo che ti ho indicato fai cio'
che ti serve
ho capito male?
> Giorgia
Figurati se hai capito male prof!! sono io che sono una chiavica!!
Query creata, ma dato che per avere un unico scadenzario avevo creato un
campo con valore predef.
=Format("A") & Format("/") &
Format([DETTAGLI_FATTURE_ACQUISTO_PROTOCOLLO];"0000") & Format("/") &
Format(Right(Year(Now());2))
(nella form di inserimento delle fatture di vendita avr�
=Format("V")......etc....)
come mi devo comportare? Elimino i valori predefiniti dai campi delle form e
uso il recordset?
a proposito......un aiutino per la stringa del recordset?:-))
Ma poi � la soluzione migliore? In fondo, un campo non numerico mi crea dei
problemi per le relazioni.....e infatti avevo anche il campo PROTOCOLLO con
valore predefinito =Nz(DMax("[PROTOCOLLO]";"[FATTURE ACQUISTO]");0)+1
(idem per FATTURE VENDITE)....
Giorgia
...a parte il fatto che fai un po' un uso ad capocchiam del
"Format" :D
se proprio devi, si scrive cosi' :
="A/" & Format([DETTAGLI_FATTURE_ACQUISTO_PROTOCOLLO];"0000") & "/" &
Format(Now();"yy")
io userei recordset come ti dicevo :
Aiutino :
Dim db As Database
Dim rs As DAO.Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT * FROM TuaTabella Where TuoiCampi =
Qualcosa")
ecc...
PS la soluzione miglioere e' quella che piu' facilmente risolve il
problema.
Giorgia
se ti crei quella query, potrai usare il Dlookup("TuoCampo";"TuaQuery")
+1
Allora, ci dovrei quasi essere....
Il mio problema ora č: la query č questa
SELECT Max(Int(Left([PROTOCOLLO],4))) AS NUMERO, Int(Right([REGISTRAZIONE
IVA],2)) AS ANNO
FROM [FATTURE VENDITA]
GROUP BY Int(Right([REGISTRAZIONE IVA],2));
ma io la data REGISTRAZIONE IVA la inserisco in un secondo momento, quando
registro la fattura e piů precisamente
Private Sub DATA_FATTURA_BeforeUpdate(Cancel As Integer)
If IsNull([REGISTRAZIONE IVA]) Then
[REGISTRAZIONE IVA] = [DATA FATTURA]
End If
End Sub
ed effettuando il seguente controllo
Private Sub REGISTRAZIONE_IVA_LostFocus()
If Month([REGISTRAZIONE IVA]) <> Month(Forms![AVVIO DATA]!DATA) Or
Year([REGISTRAZIONE IVA]) <> Year(Forms![AVVIO DATA]!DATA) Then MsgBox "Data
fuori periodo IVA"
End Sub
L'unica cosa che potrebbe far funzionare correttamente l'incremento del
protocollo, sarebbe quella (a mio modestissimo avviso), di fare riferimento
alla DATA della maschera AVVIO DATA che č una maschera non associata che si
apre all'avvio del db e che si puň controllare da un pulsante presente sulla
form NUOVA FATTURA VENDITA.
Ho provato a indicare
Private Sub Form_Open(Cancel As Integer)
DoCmd.GoToRecord acForm, Me.Name, acNewRec
Me.REGISTRAZIONE_IVA = Form![AVVIO DATA]![DATA]
Me.PROTOCOLLO = DLookup("[NUMERO]", "[QueryPROTOCOLLOVENDITE]") + 1
End Sub
ma la form AVVIO DATA non viene riconosciuta...che problema ci puň essere?
Grazie.
Giorgia
scusate l'intasamento.
Giorgia
Giorgia
Guardati il mio demo "FATTURE" su Accessgroup... in quell'esempio c'e'
il numero incrementale rispetto alla data...
;)
Guardati il mio demo "FATTURE" su Accessgroup... in quell'esempio c'e'
il numero incrementale rispetto alla data...
;)
L'ho guardato e ti ringrazio, ma la tua struttura mi sembra troppo diversa
dalla mia e non vorrei pasticciare ulteriormente nel stravolgere tutto.
Ci dovrei quasi essere, ma non mi funziona un piccolo tassello.
Dunque,
form NUOVA_FATTURA_VENDITA
cmp PROTOCOLLO =DLookUp("[NUMERO]";"[QueryPROTOCOLLOVENDITE]")+1
cmp REGISTRAZIONE_IVA=[Maschere]![AVVIO DATA]![DATA]
e la query in questione nel dettaglio �
SELECT Max(((Int(Left([PROTOCOLLO],4))))) AS NUMERO,
Int(Right([REGISTRAZIONE IVA],2)) AS ANNO
FROM [FATTURE VENDITA]
GROUP BY Int(Right([REGISTRAZIONE IVA],2));
mi controllo la data di REGISTRAZIONE_IVA tramite la form pop up AVVIO DATA,
che si apre su Apertura della form NUOVA_FATTURA_VENDITA
ed � qui che sorgono i problemi:
1- se vario la data, il cmp REGISTRAZIONE_IVA non viene aggiornato anche se
ho provato a indicare un requery su chiusura della pop up
2- attualmente, non ho dati inseriti per l'anno 2010, ma se faccio una
prova, variando la data REGISTRAZIONE_IVA, il cmp PROTOCOLLO continua a
seguire la numerazione dell'anno 2011, anche se nella query di cui sopra �
evidente che per l'anno 2010 non ci siano record
Sbaglio sicuramente, qualcuno inorridir� sicuramente....ma potreste
aiutarmi?
Grazie
Riepiloghiamo, altrimenti facciamo solo casino :
1) Tabella (Es. tbl_FATTURE) in cui hai tra l'altro "cmp_DATA" e
"cmp_Numero" (i nomi li ho inventati)
2) Sulla tabella tbl_FATTURE, crei una qry_NUM_MAX_ANNO del tipo :
SELECT Max(tbl_FATTURE.cmp_NUMERO) AS NUMERO, Year([cmp_DATA]) AS ANNO
FROM tbl_FATTURE
GROUP BY Year([cmp_DATA]);
In questo modo avrai a livello DB sempre a disposizione per ogni
singolo anno, il numero massimo raggiunto in archivio.
3) All'inserimento del nuovo documento, metterai una data (*), e
andrai ad interrogare la query filtrata sulla data (*) che hai
inserito. Per farlo ti basterà un semplice
nz(dlookup("NUMERO";"qry_NUM_MAX_ANNO";"ANNO=" & TuoCampoData);0)
Es. Crea una maschera (Maschera1)
Inserisci 2 campi
cmp_1
cmp_2
Su "aggiorna" di cmp_1 metti questo codice
me.cmp_2 = Nz(DLookup("NUMERO", "qry_NUM_MAX_ANNO", "ANNO='" &
Me.cmp_1 & "'")) + 1
ora metti l'anno in cmp_1 e premi invio... vedrai che lui andra' a
leggere i valori relativi al NUMERO massimo relativamente all'anno
indicato e ti aggiungera' 1, ovvero ti dara' il numero del nuovo
documento...
piu' di cosi' non riesco a spiegartelo.
SELECT Max(tbl_FATTURE.cmp_NUMERO) AS NUMERO, Year([cmp_DATA]) AS ANNO
FROM tbl_FATTURE
GROUP BY Year([cmp_DATA]);
In questo modo avrai a livello DB sempre a disposizione per ogni
singolo anno, il numero massimo raggiunto in archivio.
3) All'inserimento del nuovo documento, metterai una data (*), e
andrai ad interrogare la query filtrata sulla data (*) che hai
inserito. Per farlo ti basterŕ un semplice
nz(dlookup("NUMERO";"qry_NUM_MAX_ANNO";"ANNO=" & TuoCampoData);0)
Es. Crea una maschera (Maschera1)
Inserisci 2 campi
cmp_1
cmp_2
Su "aggiorna" di cmp_1 metti questo codice
me.cmp_2 = Nz(DLookup("NUMERO", "qry_NUM_MAX_ANNO", "ANNO='" &
Me.cmp_1 & "'")) + 1
ora metti l'anno in cmp_1 e premi invio... vedrai che lui andra' a
leggere i valori relativi al NUMERO massimo relativamente all'anno
indicato e ti aggiungera' 1, ovvero ti dara' il numero del nuovo
documento...
piu' di cosi' non riesco a spiegartelo.
Tu sei un ottimo prof nulla da dire, sono io che sicuramente vado in panne
in fretta...
la query era ok, il dlookup era da rivedere ma ora l'ho impostato cosě senza
ottenere l'aggiornamento sperato sul PROTOCOLLO.....
Private Sub REGISTRAZIONE_IVA_AfterUpdate()
Me.PROTOCOLLO = Nz(DLookup("PROTOCOLLO", "QueryPROTOCOLLOVENDITE", "ANNO='"
& Year(Me.REGISTRAZIONE_IVA & "'"))) + 1
End Sub
mi sono permessa di modificare con Year, perchč mi sembra che debba
prelevare l'anno dalla data REGISTRAZIONE_IVA....
che ne pensi?
Giorgia
hai provato ad implementare l'esempio che ti ho scritto?... se lo fai,
vedrai che capirai molte cose dell'argomento.
> la query era ok, il dlookup era da rivedere ma ora l'ho impostato così senza
> ottenere l'aggiornamento sperato sul PROTOCOLLO.....
>
> Private Sub REGISTRAZIONE_IVA_AfterUpdate()
> Me.PROTOCOLLO = Nz(DLookup("PROTOCOLLO", "QueryPROTOCOLLOVENDITE", "ANNO='"
> & Year(Me.REGISTRAZIONE_IVA & "'"))) + 1
> End Sub
ma in Me.REGISTRAZIONE_IVA che c'è?...
a livello tabella che dati supporta e dentro cosa ci registri?
e soprattutto, PROTOCOLLO che scaturisce da QueryPROTOCOLLOVENDITE che
ci trovi registrato dentro?
(se è numerico all'apertura della query il contenuto è allineato a
sinistra, se è testo a destra)
> mi sono permessa di modificare con Year, perchè mi sembra che debba
> prelevare l'anno dalla data REGISTRAZIONE_IVA....
> che ne pensi?
dipende da cosa mi dici delle cose che ti ho chiesto su.
hai provato ad implementare l'esempio che ti ho scritto?... se lo fai,
vedrai che capirai molte cose dell'argomento.
> la query era ok, il dlookup era da rivedere ma ora l'ho impostato cosě
> senza
> ottenere l'aggiornamento sperato sul PROTOCOLLO.....
>
> Private Sub REGISTRAZIONE_IVA_AfterUpdate()
> Me.PROTOCOLLO = Nz(DLookup("PROTOCOLLO", "QueryPROTOCOLLOVENDITE",
> "ANNO='"
> & Year(Me.REGISTRAZIONE_IVA & "'"))) + 1
> End Sub
ma in Me.REGISTRAZIONE_IVA che c'č?...
a livello tabella che dati supporta e dentro cosa ci registri?
c'č la data che dovrebbe fare da riferimento per sapere se la fattura sta
per essere registrata in ritardo e infatti effetto questo controllo
Private Sub REGISTRAZIONE_IVA_LostFocus()
If Month([REGISTRAZIONE IVA]) <> Month(Forms![AVVIO DATA]!DATA) Or
Year([REGISTRAZIONE IVA]) <> Year(Forms![AVVIO DATA]!DATA) Then MsgBox "Data
fuori periodo IVA"
End Sub
e soprattutto, PROTOCOLLO che scaturisce da QueryPROTOCOLLOVENDITE che
ci trovi registrato dentro?
(se č numerico all'apertura della query il contenuto č allineato a
sinistra, se č testo a destra)
io nella tabella l'ho impostato come numerico ma nella query č allineato a
dx....io sono certa che sia un campo numerico
> mi sono permessa di modificare con Year, perchč mi sembra che debba
si scusa, ho invertito io... e' corretto, destra = num, sinistra = txt
se apri la query che hai preparato, ti fa vedere per ogni anno il
numero max documento raggiunto?
Sì la query funziona perfettamente, nella maschera il protocollo rimane
sempre a 0
inviami sto cavolo di DB epurato di cio' che non mi serve... mo' devo
capire! :D