Newsgroup: it.comp.appl.access
Titolo: Aggiunta di un numero progressivo con query di accodamento

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
 
 

 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

 @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.



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


Carlo.... non basta Ordinare per DECRESCENTE ed usare la Funzione che ti ho esposto...?
 
Boh...
 
Saluti
@Alex