Numero Ordine progressivo da riazzerare

di il
15 risposte

Numero Ordine progressivo da riazzerare

Buongiorno,
ho una textbox su maschera che contiene il numero progressivo di registrazione degli Ordini che vengono inseriti in un formato a 6 cifre di cui le prima due rappresentano l'anno (es: 220001) e non è l'ID dell'ordine
All'apertura della maschera il valore predefinito della textbox viene aggiornato con questa espressione inserita nelle proprietà del campo.
=Nz(DMax("NumeroORDCL";"ORDCLtestate"))+1

E ovviamente funziona, ma non ho considerato che quando cambia l'anno non devo aggiungere 1 al numero precedente ma ripartire dal numero 1 con l'anno nuovo (es 230001).

Suggerimenti?
Grazie

15 Risposte

  • Re: Numero Ordine progressivo da riazzerare

    Non funziona quindi...!
    Devi fare in modo che il DMAX abbia un criterio... ovvero deve applicare il MAX solo ai codici con l'anno(le prime 2 cifre) che servono, e se il risultato fosse NULL, anno nuovo, con NZ restituisci 1 che formatti in modo adeguato(4 cifre).

    Prova a giocare con la funzione DMAX in finestra immediata(se non ho sbagliato le parentesi):
    ?NZ(VAL(Right(DMAX("[NumeroORDCL]","Val(Left$([NumeroORDCL],2)=22"))),1)+1
    Io per queste cose, scrivo sempre una Funzione Public che è facilmente debuggabile in modo chiaro... non stile Excel con 3 righe di confusione...
  • Re: Numero Ordine progressivo da riazzerare

    Una funzione public di che tipo?
    una funzione dove guardo l'anno dalla data e compongo il nr ?
    Intendi una cosa così?
    Mh...in effetti visto che mi serve in più maschere (ordini, offerte, DDT, fatture, ordini del giorno.. ) sarebbe meglio.
  • Re: Numero Ordine progressivo da riazzerare

    Scusa Alex, sto ragionando sulla funzione di cui parlavi ma mi incarto.

    Supponiamo che nell'anno 2021 io abbia come ultimo nr. il 210142. NROrdine= 210142

    caso 1) registro documento con data 31/12/2021
    - Creo una variabile 'Anno' con l'anno in due cifre dalla data. Anno=21
    - Creo una variabile 'UltimoNr con le prime due cifre del numero più alto della tabella. UltimoNr=21
    Essendo Anno=UltimoNr aggiungo 1. NROrdine = 210143
    E questo va bene in corso di anno.

    caso 2) registro documento con data 01/01/2022
    Essendo Anno <>UltimoNr devo creare NROrdine 220001

    caso 3) registro dopo aver creato il 220001 un documento con data 31/12/2021 che quindi deve diventare NROrdine 210144
    qui mi incarto... perché il numero più alto ora è 220001

    Mi sto complicando troppo la vita?

    grazie
  • Re: Numero Ordine progressivo da riazzerare

    Nel DMax devi chiaramente mettere il filtro... l'hai messo?
    posta quello che hai fatto
  • Re: Numero Ordine progressivo da riazzerare

    Non avevo ancora fatto nulla..
    intendi così?
    Anno = Right(Year(Me.DataOrdine), 2)
    UltimoNr = Nz(DMax("NumeroORDCL", "Tb420_ORDCLtestate", Left("NumeroORDCL", 2) = Anno))

    Mi esce UltimoNr=0
  • Re: Numero Ordine progressivo da riazzerare

    Crodino ha scritto:


    Non avevo ancora fatto nulla..
    intendi così?
    Anno = Right(Year(Me.DataOrdine), 2)
    UltimoNr = Nz(DMax("NumeroORDCL", "Tb420_ORDCLtestate", Left("NumeroORDCL", 2) = Anno))

    Mi esce UltimoNr=0
    Secondo te quella sintassi è corretta...?
    La funzione LEFT non è di aggregazione e non sa nemmeno cosa sia [NumeroORDCL]...
    Devi inserirla in stringa in modo che sia soggetta a risoluzione IMPLICITA.
    
    UltimoNr = Nz(DMax("NumeroORDCL", "Tb420_ORDCLtestate", "Left([NumeroORDCL]; 2) = " & Anno))
    Riesci a comprendere la Differenza tra le 2 cose...?
  • Re: Numero Ordine progressivo da riazzerare

    Si riesco, era un errore cretino in effetti.
    però anche correggendo mi dà errore di sintassi nell'espressione "Left([NumeroORDCL]; 2) = " & Anno))
  • Re: Numero Ordine progressivo da riazzerare

    Verifica il PUNTOVIRGOLA non avendolo provato magari va la VIRGOLA.
  • Re: Numero Ordine progressivo da riazzerare

    Funziona!! Grazie mille a tutti.
    Quando ho pronta tutta la funzione poi se mai la metto che può essere utile ad altri.
  • Re: Numero Ordine progressivo da riazzerare

    Giusto un siggerimento ulteriore...
    
    Anno = Right(Year(Me.DataOrdine), 2)
    Magari meglio così:
    
    Dim sAnno As String
    sAnno=Format(Me.DataOrdine,"yy")
    ed ovviamente anche nel criterio:
    
    "Format([NumeroORDCL],'YY') = " & sAnno))
  • Re: Numero Ordine progressivo da riazzerare

    Ah ok, il concetto è che è meglio se diventa una stringa di testo?
    Perché io avevo dichiarato la variabile Anno come integer
  • Re: Numero Ordine progressivo da riazzerare

    Tu l'hai dichiarato come numero ma di fatto poi quando lo concateni con una stringa diventa una stringa, viene effettuato il CASTING del Type, quindi risparmia il sistema che trova il dato già coerente.
    Inoltre, come dovresti vedere con FORMAT chiami solo 1 Funzione e non 2 (Year e Left).
  • Re: Numero Ordine progressivo da riazzerare

    Ho un altro problema, spostando il codice in una function in modo da renderla generica passo così i valori:

    Nella sub chiamante
    txtNumeroORDCL = NumeroProgressivo(Me.DataOrdine, "NumeroORDCL", "Tb420_ORDCLtestate")
    In un modulo generico
    Public Function NumeroProgressivo(DATA As Date, Numero As String, Tabella As String) As Integer
    Dim Anno As String
    Dim UltimoNr As Long
    
    Anno = Format(DATA, "yy")
    '[b]UltimoNr = Nz(DMax(Numero, Tabella, "Left([Numero], 2) = " & Anno))
    UltimoNr = Nz(DMax(Numero, Tabella, "(Format[Numero], 'yy') = " & Anno))[/b]
    
    If UltimoNr = 0 Then
        NumeroProgressivo = Anno & "0001"
    Else
        NumeroProgressivo = UltimoNr + 1
    End If
    End Function
    In pratica NumeroORDCL è la colonna dove deve cercare il Dmax e con la chiamata viene passata come stringa, però quando poi viene inserito lo stesso valore nel criterio (in entrambi i modi scriva il criterio) mi restituisce errore credo perché in quanto stringa ha le virgolette..

    Premetto che le funzioni non sono proprio il mio forte, non ho mai capito benissimo se passo e restituisco i valori correttamente.
  • Re: Numero Ordine progressivo da riazzerare

    Commetti l'errore di non distinguere una variabile dal nome oggetto, e, come hai scritto tu la funzione viene usato il riferimento alla variabile in un posto mentre il nome variabile quando lo racchiudi tra virgolette.
    Questa la versione giusta:
    
    UltimoNr = Nz(DMax(Numero, Tabella, "(Format[" & Numero & "], 'yy') = " & Anno))[/b]
    
    Ora però ti chiedo di ragionare sulla reale necessità di passare tutti quei parametri...
    L'unico parametro necessario veramente è DataOrdine perché il NomeCampo è la Tabella sono sempre fissi, dubito tu abbia altre tabelle che generano una PK con quella logica...!

    Serve essere sempre ESSENZIALI e devi imparare a fare DEBUG altrimenti non fai 1 passo in autonomia e ti fermi per cose estremamente banali.
Devi accedere o registrarti per scrivere nel forum
15 risposte