Numerazione sequenziale che si azzera ogni anno

di Titosque il
8 risposte

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

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

  • 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.

  • 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. 

  • 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!

  • 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
  • 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)

  • 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!

  • 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