Numerazione sequenziale che si azzera ogni anno

di il
8 risposte

Numerazione sequenziale che si azzera ogni anno

Buonasera,

Sto creando un data base per registrare e monitorare le offerte per le gare che escono dall'ufficio. 

Per il momento ho messo un campo con numerazione automatica ID_Gara all'interno della tabella ATTIVITA per dargli una codifica univoca.

Quello che vorrei fare è realizzare un campo che mi restituisca la codifica del tipo 2023_0001, 2023_0002, etc.

Avevo pensato intanto di creare un campo calcolato Codice_Gara che mi conti il numero di attività presenti all'interno della tabella ATTIVITA il cui anno di registrazione della gara (campo data/ora Data_Ricezione) sia il medesimo del record che sto visualizzando e che il campo con numerazione automatica  ID_Gara sia inferiore a quello del record che sto visualizzando.

Nel campo calcolato Codice_Gara ho messo il seguente codice ma mi da errore:

=DCount("*", "ATTIVITA", "Year(Data_Ricezione)=" & Year(Data_Ricezione) & " AND ID_Gara < " & ID_Gara)

Ho provato anche questa versione ma continua a darmi eerrore:

=DCount("*", "ATTIVITA", "Year([Data_Ricezione])=" & Year([Data_Ricezione]) & " AND [ID_Gara] < " & [ID_Gara])

Cosa sbaglio?

8 Risposte

  • Re: Numerazione sequenziale che si azzera ogni anno

    Imposta Year(Data_Ricezione) come campo calcolato e inseriscila nella Dcount. Poi non capisco perché [ID_Gara] < ID_Gara.

  • Re: Numerazione sequenziale che si azzera ogni anno

    A parte che questo argomento è un tormentone…. Se ne parla da sempre almeno 10 volte l'anno…!

    Perché hai messo ID_GARA come condizione….?

    Se vuoi progressivo annuo basta contare quanti sono nell'anno ed aggiungere 1.

  • Re: Numerazione sequenziale che si azzera ogni anno

    Intanto che errore ti da?

    Non capisco cosa vuoi fare: creare un id o un campo calcolato?

    Se calcolato unisci il campo anno come testo “AAAA” con il numero che non ho capito da dove lo prendi.

    21/11/2023 - Titosque ha scritto:


    Avevo pensato intanto di creare un campo calcolato Codice_Gara che mi conti il numero di attività presenti all'interno della tabella ATTIVITA il cui anno di registrazione della gara (campo data/ora Data_Ricezione) sia il medesimo del record che sto visualizzando e che il campo con numerazione automatica  ID_Gara sia inferiore a quello del record che sto visualizzando.

    Questo scioglilingua non riesco a capirlo.

    Un campo composto da codice_gara che non so se si tratta di un CIG o un codice tuo interno.

    Penso interno visto che deve contare le “attività” (suppongo i record) per anno.

    La parte “che sia il medesimo del record che sto visualizzando…” non la capisco. 

  • Re: Numerazione sequenziale che si azzera ogni anno

    Ciao a tutti e grazie per le risposte!

    Cerco di essere più chiaro e motivare il mio codice ^^'

    cerco di spiegarmi meglio. Al momento ogni record del mio DB ha un codice identificativo univoco automatico crescente che è l'ID_Gara. Quello che vorrei fare è creare un codice identificativo, chiamiamolo codice di protocollo forse è meglio, che possa utilizzare nella documentazione che viene creata associata a quella gara. Non vorrei però usare l'ID_Gara perchè a lungo andare diventerebbe un numero piuttosto lungo e non mi piace. Quello che volevo fare era unire l'anno e il numero di gare registrate in quel medesimo anno. Al momento però mi sono bloccato con la formula che mi potesse restituire il numero di gare registrate nell'anno. 

    =DCount("*", "ATTIVITA", "Year(Data_Ricezione)=" & Year(Data_Ricezione) & " AND ID_Gara < " & ID_Gara)

    Dalla formula che ho scritto mi aspetto che il DCount mi restituisca il numero di elementi presenti nella tabella ATTIVITA il cui anno del campo Data_Ricezione sia uguale all'anno che ho registrato per il nuovo record e il cui numero univoco ID_Gara sia minore di quello che è stato registrato per il nuovo record (questo per evitare che conti se stesso ed i record che saranno registrati in una fase successiva.

    Per intenderci mi aspetto una cosa del genere

    Tabella ATTIVITA
    ID_GaraData_RicezioneAnnoCodice_GaraProtocollo
    101/02/2022202212022_0001
    205/03/2022202222022_0002
    312/12/2022202232022_0003
    405/05/2023202312023_0001
    505/09/2023202322023_0002

    21/11/2023 - @Alex ha scritto:


    A parte che questo argomento è un tormentone…. Se ne parla da sempre almeno 10 volte l'anno…!

    Perché hai messo ID_GARA come condizione….?

    Se vuoi progressivo annuo basta contare quanti sono nell'anno ed aggiungere 1.

    Ciao Alex,

    Lo so che è un tormentone e mi sono letto anche i post precedenti ma non ci ho capito molto perchè ognuno usava un approccio diverso, quindi ho deciso di approcciare la questione in maniera autonoma, scopiazzando di qua e di là. Se me ne sai indicare uno in cui è chiaro il da farsi e funziona te ne sarei grato! :) 

    Grazie in anticipo per il supporto!

  • Re: Numerazione sequenziale che si azzera ogni anno

    Intanto se si copia, cosa legittima, si deve capire bene e tu non hai capito che NON devi mettere ID_GARA nella condizione.

    Ribadiusco che non devi usarlo non solo non serve a nulla ma come già detto è ERRATO contettualmente, il fatto che ID_GARA sia un progressivo incrementale, già rende una cavolata inserirlo come criterio è ovvi che un NUOVO ID sia maggiore dei precedenti non credi… e siccome non rinumeri i precedenti serve essere logici ragionando, quindi quando ne aggiungi 1, sicuramente ID_GARA incrementa, ma a te questonon importa, interessa solamente quanti Records ci sono inb quell'anno ed effettuare [+1].

    Quindi scrivi una FUnzione che passando l'Anno restituisce il progressivo:

    Function fProtocolNum(pAnno as Integer) as String
    	Dim lNum	As Long
    	Dim sPr		as string
    	lNum=NZ(DCOUNT("*","ATTIVITA","Year([Data_Ricezione])=" & pAnno),0)+1
    	sPr=cstr(pAnno) & "_" & cstr(lNum)
    	fProtocolNum=sPr
    End Function

    Ora nell'evento che ritieni adeguato, io penso sia AfterUpdate del controllo [Data_Ricezione], andrai a mettere:

    Private Sub Data_Ricezione_AfterUpdate()
    	Me!Protocollo.Value=fProtocolNum(Year(Me!Data_Ricezione))
    End Function
  • Re: Numerazione sequenziale che si azzera ogni anno

    Ma è un numero da mettere in fase di inserimento?

    Select count(anno) as totali from attivita where anno=[parametro]

    Parametro=2003

    Ottieni il nr di record con anno 2023

    Gara=totali+1

    Protocollo =[parametro]+totali

    Totali lo formatti con n zeri iniziali.

    Errata corrige: protocollo=[parametro]+gara (formattato)

  • Re: Numerazione sequenziale che si azzera ogni anno

    Buongiorno a tutti,

    alla fine ho colto il suggerimento di inserire l'evento su aggiornamento della Data_Ricezione con il seguente codice:

    Private Sub Data_Ricezione_AfterUpdate()
    Dim L As Long

    L = DCount("*", "ATTIVITA", "Year(Data_Ricezione)=" & Year(Data_Ricezione) & "AND Not IsNull (ID_Gara_Anno) AND ID_Gara <>" & ID_Gara)
    L = L + 1

    ID_Gara_Anno = Year(Data_Ricezione) & "-" & Format(L, "0000")
      
    End Sub

    Così funziona! Adesso dovrei scrivere una query per far aggiornare tutti i campi del DB in una sola volta e non farlo uno alla volta. Ma magari se ho difficoltà apro una nuova domanda.

    Grazie a tutti per la collaborazione!

  • Re: Numerazione sequenziale che si azzera ogni anno

    Se tu avessi seguito più attentamente il mio suggerimento… senza abbreviare… la funzione poteva essere richiamata da una query di aggiornamento… chissà se l'avevo fatto a caso…?

    Ultima volta, continui a mettere condizioni INUTILI nella query ma dal tempo che te lo dico… si vede che non ne comprendi proprio ul se so tecnico di quello che stai facendo.

Devi accedere o registrarti per scrivere nel forum
8 risposte