Numero Ordine progressivo da riazzerare

di Anonimizzato30597 il
15 risposte
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

  • 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...
  • 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.
  • 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
  • Nel DMax devi chiaramente mettere il filtro... l'hai messo?
    posta quello che hai fatto
  • 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
  • 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...?
  • Si riesco, era un errore cretino in effetti.
    però anche correggendo mi dà errore di sintassi nell'espressione "Left([NumeroORDCL]; 2) = " & Anno))
  • Verifica il PUNTOVIRGOLA non avendolo provato magari va la VIRGOLA.
  • Funziona!! Grazie mille a tutti.
    Quando ho pronta tutta la funzione poi se mai la metto che può essere utile ad altri.
  • 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))
  • Ah ok, il concetto è che è meglio se diventa una stringa di testo?
    Perché io avevo dichiarato la variabile Anno come integer
  • 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).
  • 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.
  • 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