Condividi:        

[Access] Form: aggiornamento automatico valore da query

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

[Access] Form: aggiornamento automatico valore da query

Postdi Stadtbahn » 27/08/09 11:14

Ciao a tutti, ho un problema con Access a cui non riesco a venire a capo.

Ho un database con le due seguenti tabelle:
1) Registro_ordinanze, con i campi seguenti:
ID (Contatore)
VIA (Testo)
Cod_via (Numerico)
Ordinanza (Numerico)
2) Codici, con i campi seguenti:
Cod_new (Numerico), collegato con Cod_via di Registro_ordinanze
Toponimo (Testo)
Ogni toponimo corrisponde a uno e un solo cod_new numerico nella tabella codici. A cod_via di registro_ordinanze corrispondono più valori di ordinanza. Ho creato un form per l'inserimento di nuove ordinanze; l'utente sceglie la via da una casella combinata e una casella di testo visualizza automaticamente il numero di cod_via corrispondente (questo sono riuscito a farlo, riporto il codice di seguito).

Codice: Seleziona tutto
Private Sub MascVia_AfterUpdate()
Dim rstCodici As New ADODB.Recordset
rstCodici.Open "codici", CurrentProject.Connection, adOpenForwardOnly
Do Until rstCodici.EOF
    If rstCodici!Toponimo = MascVia Then
        TestoCodVia = rstCodici!Cod_new
        Exit Sub
    Else
        rstCodici.MoveNext
    End If
Loop
rstCodici.Close
Set rstCodici = Nothing
End Sub


Ora il problema: vorrei inserire un'altra casella di testo che visualizzi il nuovo numero di ordinanza, che deve essere ovviamente maggiorato di uno rispetto al valore più alto corrispondente al cod_via. Esempio: se seleziono cod_via=253 e ad essa corrisponde MaxOrdinanza=4, il nuovo valore da attribuire dovrà essere MaxOrdinanza+1.
Ho provato a inserire nel codice il riferimento ad una query all'uopo predisposta (Max_ordinanza), la riporto:

Codice: Seleziona tutto
SELECT codici.Cod_new, codici.Tipo, codici.Toponimo, Max(Registro_ordinanze.Ordinanza) AS MaxDiOrdinanza
FROM Registro_ordinanze RIGHT JOIN codici ON Registro_ordinanze.Cod_Via = codici.Cod_new
GROUP BY codici.Cod_new, codici.Tipo, codici.Toponimo;


ma non ha sortito l'effetto desiderato.
In sostanza ho provato a inserire nel codice sopra riportato il riferimento al valore della query per scrivere nella casella di testo NumOrd il nuovo numero di ordinanza.

Codice: Seleziona tutto
Private Sub MascVia_AfterUpdate()
Dim rstCodici As New ADODB.Recordset
Dim rstOrd As New ADODB.Recordset

rstCodici.Open "codici", CurrentProject.Connection, adOpenForwardOnly
rstOrd.Open "Max_ordinanza", CurrentProject.Connection, adOpenForwardOnly

Do Until rstCodici.EOF
    If rstCodici!Toponimo = MascVia Then
        TestoCodVia = rstCodici!Cod_new
        NumOrd = rstOrd!MaxDiOrdinanza + 1
        Exit Sub
    Else
        rstCodici.MoveNext
    End If
Loop
rstCodici.Close
rstOrd.Close
Set rstCodici = Nothing
Set rstOrd = Nothing

End Sub

Come posso fare per risolvere il problema?
Grazie per l'aiuto!
Stadtbahn
Utente Junior
 
Post: 20
Iscritto il: 05/08/09 15:18

Sponsor
 

Re: [Access] Form: aggiornamento automatico valore da query

Postdi Stadtbahn » 27/08/09 11:39

Aggiornamento: sono riuscito a far scrivere il numero di ordinanza, ma è il massimo assoluto e non il massimo relativo rispetto al cod_via.

Codice: Seleziona tutto
Private Sub MascVia_AfterUpdate()
Dim rstCodici As New ADODB.Recordset
Dim rstOrd As New ADODB.Recordset

rstCodici.Open "codici", CurrentProject.Connection, adOpenForwardOnly

Do Until rstCodici.EOF
    If rstCodici!Toponimo = MascVia Then
        TestoCodVia = rstCodici!Cod_new
        Me.NumOrd = (DMax("MaxDiOrdinanza", "Max_ordinanza")) + 1
        Exit Sub
    Else
        rstCodici.MoveNext
    End If
Loop
rstCodici.Close
Set rstCodici = Nothing

End Sub
Stadtbahn
Utente Junior
 
Post: 20
Iscritto il: 05/08/09 15:18

Re: [Access] Form: aggiornamento automatico valore da query

Postdi archimede » 27/08/09 13:26

Stadtbahn ha scritto:l'utente sceglie la via da una casella combinata e una casella di testo visualizza automaticamente il numero di cod_via corrispondente (questo sono riuscito a farlo, riporto il codice di seguito).
Ma non sarebbe più semplice ed efficiente visualizzare il Cod_new (se proprio ti serve questa informazione) insieme alla Via (che immagino equivalga al Toponimo) direttamente nella casella combinata?
Stadtbahn ha scritto:vorrei inserire un'altra casella di testo che visualizzi il nuovo numero di ordinanza, che deve essere ovviamente maggiorato di uno rispetto al valore più alto corrispondente al cod_via.
Perché? A cosa ti serve un numero di ordinanza progressivo memorizzato nel database? Suppongo che l'utente non possa modificarlo, quindi a che pro registrarlo nel db?

Alessandro
archimede
Moderatore
 
Post: 2851
Iscritto il: 07/11/02 12:41
Località: Genova

Re: [Access] Form: aggiornamento automatico valore da query

Postdi Stadtbahn » 27/08/09 13:32

Mi serve visualizzare nel form le due informazioni separatamente, e non ho saputo trovare niente di meglio. Si potrebbe forse rendere il processo più snello, ma in questo momento non è la priorità.

Il numero progressivo non può essere modificato dall'utente, ma deve essere salvato, insieme alle altre informazioni inserite nel form, nella tabella registro_ordinanze, che cresce nel tempo.
Stadtbahn
Utente Junior
 
Post: 20
Iscritto il: 05/08/09 15:18

Re: [Access] Form: aggiornamento automatico valore da query

Postdi archimede » 27/08/09 14:04

Stadtbahn ha scritto:deve essere salvato, insieme alle altre informazioni inserite nel form, nella tabella registro_ordinanze, che cresce nel tempo.
La domanda era perché salvarlo quando puoi calcolarlo dinamicamente quando serve, ma lasciamo stare (spero che la tua non sia un'applicazione multi utente).

Per trovare l'ultima ordinanza di un un determinato cod_via la query è:
Codice: Seleziona tutto
SELECT Max(Ordinanza) FROM Registro_ordinanze WHERE cod_via = x
dove al posto di x dovrai mettere il cod_via desiderato.

HTH.

Alessandro
archimede
Moderatore
 
Post: 2851
Iscritto il: 07/11/02 12:41
Località: Genova

Re: [Access] Form: aggiornamento automatico valore da query

Postdi Stadtbahn » 27/08/09 14:14

L'applicazione non è multiutente, è un semplice tool che dovrebbe servire solo per rendere automatico e opaco all'utente la determinazione del numero_ordinanza. Tra l'altro, non sono assolutamente esperto di programmazione VBA Access, anzi, ma questo mi sa che s'era capito. :oops: :D

Ma come posso inserire la query che mi suggerisci all'interno della routine che sto usando nel form? Abbi pazienza...
Stadtbahn
Utente Junior
 
Post: 20
Iscritto il: 05/08/09 15:18

Re: [Access] Form: aggiornamento automatico valore da query

Postdi archimede » 27/08/09 14:45

Più o meno (vado a memoria):
Codice: Seleziona tutto
Private Sub MascVia_AfterUpdate()
Dim UltimOrdinanza as Long
UltimOrdinanza = CurrentDb.OpenRecordset("SELECT Max(Ordinanza) FROM Registro_ordinanze WHERE cod_via=" & Me.MascVia).Collect(0)
End Sub
HTH.

Alessandro
archimede
Moderatore
 
Post: 2851
Iscritto il: 07/11/02 12:41
Località: Genova

Re: [Access] Form: aggiornamento automatico valore da query

Postdi Stadtbahn » 27/08/09 15:41

Non c'è verso. :-?
Fino al loop va tutto a meraviglia.
Uscito dal loop, mi aspetterei che la casella di testo del form chiamata NumOrd si popolasse col valore UltimaOrdinanza calcolato come suggerito. Ho provato anche a piazzare un bel msgbox per vedere se lo calcola e che valore gli dà, ma niente. Se ne frega proprio. :o Lo ignora.
Non so proprio che pesci prendere.

Codice: Seleziona tutto
Private Sub MascVia_AfterUpdate()
Dim rstCodici As New ADODB.Recordset
Dim UltimOrdinanza As Long

rstCodici.Open "codici", CurrentProject.Connection, adOpenForwardOnly

Do Until rstCodici.EOF
    If rstCodici!Toponimo = MascVia Then
        TestoCodVia = rstCodici!Cod_new
         Exit Sub
    Else
        rstCodici.MoveNext
    End If
Loop

UltimOrdinanza = CurrentDb.OpenRecordset("SELECT Max(Ordinanza) FROM Registro_ordinanze WHERE cod_via=" & Me.MascVia).Collect(0)
MsgBox (UltimOrdinanza)
Me.NumOrd = UltimOrdinanza

rstCodici.Close
Set rstCodici = Nothing

End Sub
Stadtbahn
Utente Junior
 
Post: 20
Iscritto il: 05/08/09 15:18

Re: [Access] Form: aggiornamento automatico valore da query

Postdi archimede » 27/08/09 15:46

Stadtbahn ha scritto:Uscito dal loop, mi aspetterei che
Se esci con Exit Sub mi sa che c'è poco da aspettarsi...

Alessandro
archimede
Moderatore
 
Post: 2851
Iscritto il: 07/11/02 12:41
Località: Genova

Re: [Access] Form: aggiornamento automatico valore da query

Postdi Stadtbahn » 27/08/09 15:56

E hai ragione anche tu! :D
Ad ogni modo ho provato a isolare la procedura creando una sub separata che funziona cliccando nella casella di testo dove dovrebbe comparire il valore desiderato.

Codice: Seleziona tutto
Private Sub NumOrd_Click()
Dim UltimOrdinanza As Long
UltimOrdinanza = CurrentDb.OpenRecordset("SELECT Max(Ordinanza) FROM Registro_ordinanze WHERE via=" & Me.MascVia).Collect(0)
MsgBox (UltimOrdinanza)
Me.NumOrd = UltimOrdinanza
End Sub


Così emerge l'errore (prima non ce ne si accorgeva per l'exit sub...).
Il debug dice, in corrispondenza del calcolo di UltimOrdinanza: Errore 3061. Parametri insufficienti. previsto 1.
Tra l'altro, Collect non risulta nell'elenco metodi né ho trovato riscontri nell'help.
Stadtbahn
Utente Junior
 
Post: 20
Iscritto il: 05/08/09 15:18

Re: [Access] Form: aggiornamento automatico valore da query

Postdi archimede » 27/08/09 18:07

Il codice da me postato fa riferimento al campo MascVia della tua form (se ho indovinato): che valore contiene quel controllo quando clicchi su NumOrd?

Inoltre perché hai modificato cod_via in via?

Alessandro
archimede
Moderatore
 
Post: 2851
Iscritto il: 07/11/02 12:41
Località: Genova

Re: [Access] Form: aggiornamento automatico valore da query

Postdi Stadtbahn » 28/08/09 08:55

Avevi indovinato. ;)
Cliccando su NumOrd ottengo Errore 3061. Parametri insufficienti. previsto 1.
Ho modificato cod_via in via perché in MascVia visualizzo il nome (toponimo) della via e non il codice.
Immagine
Questa è la struttura del form.
All'apertura si inserisce la data (il progressivo viene attribuito in automatico, è un ID contatore). Si sceglie la via da un menu a tendina e in automatico viene visualizzato il codice via nella casella di testo Codice via. Con l'attuale struttura del codice (ho assegnato alla casella di testo Numero ordinanza, alias NumOrd, l'evento click descritto nei post precedenti), ottengo l'errore 3061.
Stadtbahn
Utente Junior
 
Post: 20
Iscritto il: 05/08/09 15:18

Re: [Access] Form: aggiornamento automatico valore da query

Postdi archimede » 28/08/09 09:36

Quello che vedi nella casella combinata non necessariamente corrisponde al valore del controllo (oserei dire quasi mai): in altre parole, com'è definita la combo esattamente?

Tra l'altro (noto solo ora) se nella tua tabella Registro_ordinanze i campi VIA e cod_via rappresentano la stessa informazione, hai un dato inutilmente duplicato (cioè un problema di disegno fisico / logico delle tue tabelle); altrimenti, non ho capito come funziona il tutto.

Alessandro
archimede
Moderatore
 
Post: 2851
Iscritto il: 07/11/02 12:41
Località: Genova

Re: [Access] Form: aggiornamento automatico valore da query

Postdi Stadtbahn » 28/08/09 10:15

VIA è il toponimo (Verdi, Dante, ecc.)
cod_via è un codice numerico associato al toponimo (relazione 1 a 1).
La combo (in realtà una casella di testo) è definita come segue:

Immagine

(è la casella designata con la stringa di testo "Numero ordinanza:")

All'evento click è associato il codice seguente, nel frattempo l'ho cambiato leggermente. Ho creato una tabella (ord_group) che contiene, per ogni cod_via/toponimo, il numero massimo di ordinanza. Potrei creare un campo nella tabella codici e aggiornarlo di volta in volta, ma si può fare poi. Così facendo funziona, nel senso che viene visualizzato il numero di ordinanza corretto. A questo punto dovrei fare in modo che il risultato della compilazione del form porti all'effettivo aggiornamento della tabella registro_ordinanze, che rispetto a tutti gli altri dati funziona correttamente, tranne che appunto per cod_via e numero di ordinanza.
L'altro problema che dovrei risolvere è l'inserimento nella parte di codice corrispondente all'avvio della maschera dell'esecuzione della query di creazione tabella per aggiornare il campo numero_ordinanza. Intuisco che se inserissi un campo nella tabella codici col numero più alto di ordinanza, potrei di volta in volta aggiornare solo quello e rendere il processo più snello. È corretto?

Codice: Seleziona tutto
Private Sub NumOrd_Click()
Dim rstOrd As New ADODB.Recordset
rstOrd.Open "ord_group", CurrentProject.Connection, adOpenForwardOnly
Do Until rstOrd.EOF
    If MascVia = rstOrd!toponimo Then
        NumOrd = rstOrd!MaxDiOrdinanza + 1
        Exit Sub
    Else
        rstOrd.MoveNext
    End If
Loop
End Sub
Stadtbahn
Utente Junior
 
Post: 20
Iscritto il: 05/08/09 15:18

Re: [Access] Form: aggiornamento automatico valore da query

Postdi archimede » 28/08/09 10:44

Stadtbahn ha scritto:VIA è il toponimo (Verdi, Dante, ecc.)
cod_via è un codice numerico associato al toponimo (relazione 1 a 1).
Ergo sono la stessa informazione: rimuovi il campo VIA dalla tabella.
Stadtbahn ha scritto:La combo (in realtà una casella di testo)
No, la combo è la casella combinata MascVia.
Stadtbahn ha scritto:Ho creato una tabella (ord_group) che contiene, per ogni cod_via/toponimo, il numero massimo di ordinanza.
Cioè aggiungiamo complessità invece di ridurla?
Stadtbahn ha scritto:dovrei fare in modo che il risultato della compilazione del form porti all'effettivo aggiornamento della tabella registro_ordinanze
Il modo più semplice è avere dei controlli bound, se li fai unbound dovrai scrivere del codice.
Stadtbahn ha scritto:L'altro problema che dovrei risolvere è l'inserimento nella parte di codice corrispondente all'avvio della maschera dell'esecuzione della query di creazione tabella per aggiornare il campo numero_ordinanza. Intuisco che se inserissi un campo nella tabella codici col numero più alto di ordinanza, potrei di volta in volta aggiornare solo quello e rendere il processo più snello. È corretto?
Secondo me ti stai complicando la vita in maniera incredibile per fare una cosa che con Access puoi smarcare in maniera automatica o quasi.

Fai due tabelle:

Registro_ordinanze
ID (Contatore)
Cod_via (Numerico - Foreign key a Cod_via di Codici)
Ordinanza (Numerico)
Altri eventuali (non citati nel tuo primo post)

Codici
Cod_via (Numerico)
Toponimo (Testo)

Esegui il wizard per creare una form per inserire i campi:

1) Casella combinata bound a cod_via
2) Casella di testo (read only) bound a Ordinanza
3) Altri eventuali (non citati nel tuo primo post)

Nell'After_Update di cod_via metti il codice che ti ho dato x calcolare il contenuto della casella di testo (opportunamente modificato per rispecchiare le modifiche qui esposte).

HTH.

Alessandro
archimede
Moderatore
 
Post: 2851
Iscritto il: 07/11/02 12:41
Località: Genova

Re: [Access] Form: aggiornamento automatico valore da query

Postdi archimede » 28/08/09 10:47

Per la precisione:

Registro_ordinanze
ID (Contatore - Primary key)
Cod_via (Numerico - Foreign key a Cod_via di Codici)
Ordinanza (Numerico)
Altri eventuali (non citati nel tuo primo post)

Codici
Cod_via (Contatore - Primary key)
Toponimo (Testo)

Alessandro
archimede
Moderatore
 
Post: 2851
Iscritto il: 07/11/02 12:41
Località: Genova

Re: [Access] Form: aggiornamento automatico valore da query

Postdi archimede » 28/08/09 10:58

Altra cosa, probabilmente è più corretto calcolare l'ultima ordinanza con un count piuttosto che con max:
Codice: Seleziona tutto
UltimOrdinanza = CurrentDb.OpenRecordset("SELECT Count(*) FROM Registro_ordinanze WHERE cod_via=" & Me.MascVia).Collect(0)
Alessandro
archimede
Moderatore
 
Post: 2851
Iscritto il: 07/11/02 12:41
Località: Genova

Re: [Access] Form: aggiornamento automatico valore da query

Postdi archimede » 28/08/09 11:03

archimede ha scritto:Altra cosa, probabilmente è più corretto calcolare l'ultima ordinanza con un count piuttosto che con max
... a meno che tu non preveda la possibilità di cancellare delle Ordinanze. :oops:

Alessandro
archimede
Moderatore
 
Post: 2851
Iscritto il: 07/11/02 12:41
Località: Genova

Re: [Access] Form: aggiornamento automatico valore da query

Postdi Stadtbahn » 28/08/09 11:55

Sospettavo che mi stavo un po' complicando la vita. ;)
Bene, ho semplificato il tutto ma con una piccola variante: l'utente per prima cosa deve scegliere la via in formato testuale da un menu a tendina, ergo
Immagine
ho inserito la casella combinata Toponimo che permette di scegliere la via e ho associato all'after update l'evento riportato nel codice seguente:
Codice: Seleziona tutto
Private Sub MascVia_AfterUpdate()
Dim UltimOrdinanza As Long
UltimOrdinanza = CurrentDb.OpenRecordset("SELECT Max(Ordinanza) FROM Registro_ordinanze WHERE VIA=" & Me.MascVia).Collect(0)
Ordinanza = UltimOrdinanza + 1
End Sub

All'esecuzione della maschera, scelta la via, il codice si interrompe col solito Errore 3061. Parametri insufficienti. Previsto 2. :roll:
Stadtbahn
Utente Junior
 
Post: 20
Iscritto il: 05/08/09 15:18

Re: [Access] Form: aggiornamento automatico valore da query

Postdi Stadtbahn » 28/08/09 11:56

Ho letto solo ora gli aggiornamenti. ;)
Non prevedo di cancellare ordinanze, se ne aggiungono soltanto.
Nel pomeriggio ci riprovo. ;)
Stadtbahn
Utente Junior
 
Post: 20
Iscritto il: 05/08/09 15:18

Prossimo

Torna a Applicazioni Office Windows


Topic correlati a "[Access] Form: aggiornamento automatico valore da query":

BTp Valore
Autore: MarioLombardi
Forum: Forum off-topic
Risposte: 2

Chi c’è in linea

Visitano il forum: Nessuno e 95 ospiti