Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Aggiunta di un numero progressivo con query di accodamento

215 views
Skip to first unread message

Carlo POTS

unread,
May 14, 2019, 6:13:41 PM5/14/19
to
Le sto provando tutte ma non ci riesco.

Ho una tabella da cui attivo una query di accodamento per alimentare
un'altra tabella; fin qui tutto bene.

Il problema e' che nella tabella di destinazione ho un campo "Prog"
(Progressivo) dove dovrei inserire un numero di progressivo automaticamente.

Ho provato anche con INSERT INTO tabella SELECT ... Count(ID) + 1 as
PROG ma niente

Se l'avessi avuto dalla tabella principale, non avrei problemi, ma devo
fare in modo da inserirlo io con la stessa query di accodamento.

Ho provato ad usare la funzione Count() ma non riesco ad impostarlo in
modo che mi calcoli un Prog=Prog+1

In verità vorrei evitare di aumentare la tabella principale di un campo
e modificare tutte le maschere; se c'è un modo utile per agevolarmi la
questione ne sono molto grato.


---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus

@Alex

unread,
May 15, 2019, 6:51:58 AM5/15/19
to
Il giorno mercoledì 15 maggio 2019 00:13:41 UTC+2, Carlo POTS ha scritto:
> Le sto provando tutte ma non ci riesco.
>
> Ho una tabella da cui attivo una query di accodamento per alimentare
> un'altra tabella; fin qui tutto bene.
>
> Il problema e' che nella tabella di destinazione ho un campo "Prog"
> (Progressivo) dove dovrei inserire un numero di progressivo automaticamente.
>
> Ho provato anche con INSERT INTO tabella SELECT ... Count(ID) + 1 as
> PROG ma niente
>
> Se l'avessi avuto dalla tabella principale, non avrei problemi, ma devo
> fare in modo da inserirlo io con la stessa query di accodamento.
>
> Ho provato ad usare la funzione Count() ma non riesco ad impostarlo in
> modo che mi calcoli un Prog=Prog+1
>
> In verità vorrei evitare di aumentare la tabella principale di un campo
> e modificare tutte le maschere; se c'è un modo utile per agevolarmi la
> questione ne sono molto grato.

Per fare queste cose io di solito scrivo un campo Calcolato valorizzato da 1 Funzione che ha il compito di Leggere il MAX(Progr) alla prima chiamata, poi di incrementarlo...

Es da mettere in un Modulo:
Option Compare Database
Option Explicit


Private vValue As Variant

Public Function fIncrementa(Optional SetStart) As long
If not IsMissing(SetStart) Then
vValue = SetStart
Exit Function
End If
vValue = vValue +1
End Function

Ovviamente devi impostare il valore di partenza... e lo si fa così:

Quindi:
Call fIncrementa(Dmax("TuoCampo","TuaTabella"))
sSQL="INSERT INTO ..... SELECT fIncrementa() As TuoCampoProgressivo, ...."
DbEngine(0)(0).Execute sSQL,dbFailOnerror

Dovrebbe andare... fai qualche prova.

@Alex

Carlo POTS

unread,
May 15, 2019, 9:51:29 PM5/15/19
to
Il 15/05/2019 12:51, @Alex ha scritto:

> Per fare queste cose io di solito scrivo un campo Calcolato valorizzato da 1 Funzione che ha il compito di Leggere il MAX(Progr) alla prima chiamata, poi di incrementarlo...
>
> Es da mettere in un Modulo:
> Option Compare Database
> Option Explicit
>
>
> Private vValue As Variant
>
> Public Function fIncrementa(Optional SetStart) As long
> If not IsMissing(SetStart) Then
> vValue = SetStart
> Exit Function
> End If
> vValue = vValue +1
> End Function
>
> Ovviamente devi impostare il valore di partenza... e lo si fa così:
>
> Quindi:
> Call fIncrementa(Dmax("TuoCampo","TuaTabella"))
> sSQL="INSERT INTO ..... SELECT fIncrementa() As TuoCampoProgressivo, ...."
> DbEngine(0)(0).Execute sSQL,dbFailOnerror
>
> Dovrebbe andare... fai qualche prova.
>
> @Alex

Perdona Alex, ma mi sono dimenticato che il numero progressivo va
incrementato secondo un prezzo di un prodotto che ... decrementa.
In pratica, andrebbe così:
n° Prezzo
1 3,5
2 2,5
3 1,5
4 1,0
5 0,5

per cui applicando la ricerca del massimo valore (Dmax) mi è
controproducente, anche in virtu' del fatto che questa tabella deve
contenere diversi dati che hanno un indice differente (Data fattura in
yyymmdd, num fattura e nome dell'articolo), ma hanno dei progressivi che
comunque si ripetono sempre.

Anyway, seppure lo vedo come una mastur.....ne mentale (e forse e'
proprio cosi'), ho risolto in un modo che secondo me e' formalmente
contorto pero' funzionante:
eseguo dapprima la query di accodamento in modo con il campo del valore
del prezzo decrescente (ovviamente il campo del numero progressivo
rimane vuoto...), dopodiche' apro un recordset e mi ricavo una query che
ha per parametro di ricerca l'indice della fattura (yyyymmdd_NNNN); una
volta che si posiziona sul primo record, imposto Prog=1 e faccio
eseguire una query di aggiornamento inserendo Prog nel campo del
progressivo; scorro il recordset eseguendo un Prog=Prog+1 fino a che il
loop non si esaurisce.

Ho fatto diverse prove e nonostante quello che (a mio avviso e')
l'orrore, mi funziona una meraviglia.

Carlo POTS

unread,
May 15, 2019, 10:05:28 PM5/15/19
to
In pratica questo e' il codice che ho digitato:

Dim Q_Fatt as String ' Query di ricerca della fattura
Dim Q_Agg as String ' Query di aggiornamento del progressivo
Dim RegCon as String ' Indice della Fattura (ripreso da una tabella
principale a cui la tabella dove andiamo ad operare è legata con
relazione 1 a molti)

Dim rsclass as DAO.Recordset
Dim NClass as Integer ' numero del progressivo
Dim Fat as string ' Indice del record

(Ovviamente queste variabili considera che stanno ad inizio di subroutine)

RegCon=Me.NumFattura

Q_Fatt = "SELECT IDCLASSIFICA, PROG, IDFATTURA"
Q_Fatt = Q_Fatt & " FROM tblDettaglioFattura"
Q_Fatt = Q_Fatt & " WHERE (tblDettaglioFattura.IDFATTURA)='" & RegCon & "'"

Set rsclass = CurrentDb.OpenRecordset(Q_Fatt)
NClass = 1
rsclass.MoveFirst
Do While Not rsclass.EOF

Fat = rsclass.Fields("IDCLASSIFICA")
Q_Agg = "UPDATE FTVE_CLASS"
Q_Agg = Q_Prog & " SET PROG=" & NClass
Q_Agg=Q_agg & " WHERE (tblDettaglioFattura.IDCLASSIFICA)='" & FAT & "'"
CurrentDb.Execute Q_Agg, dbfailonerror
rsclass.MoveNext
NClass = NClass + 1
Loop

---
Una volta che il Loop si esaurisce, il risultato e' completo e
regolarmente ordinato dal prezzo piu' alto al piu' basso

@Alex

unread,
May 16, 2019, 1:45:26 AM5/16/19
to
Carlo.... non basta Ordinare per DECRESCENTE ed usare la Funzione che ti ho esposto...?

Boh...

Saluti
@Alex

0 new messages