Newsgroup: it.comp.appl.access
Titolo: Trovare il numero piu' grande

Buonasera a tutti
Da una tabella impostata in questo modo:
numeri
7
8
3
3
4
intervallo
3
2
5
4
intervallo
8
2
6
5
intervallo
Come si potrebbe trovare il numero piu' grande di ogni intervallo.
Grazie!

Una tabella come quella che esponi non ha alcun senso in un Database...!
Quello che tu definisci "Intervallo", nonha una connotazione tecnica, ovvero non costituisce un argomento di definizione di INSIEME.
Nella tua logica, è Intervallo tutto quello che è compreso tra Intervallo-Intervallo Successivo... ma Access non ha la tua logica, è un Database Relazionale... e non è nemmeno EXCEL...
 
Per definire GRUPPI si utilizza appunto un Campo che assume un valore Univoco nell'intervallo ed assolve al compito di definizione di Gruppo...!
 
Es:
Intervallo  Valore
1           7
1           3
1           5
1           18
2           1
2           5
2           3
3           6
3           2
3           9
 
Come vedi hai 3 Intervalli, ed ognuno ha dei numeri... in questo caso ho che il valore di Intervallo mi consente di RAGGRUPPARE mentre opero un MAX sul valore.
Si ottiene con una Query Raggruppata.
 
Quindi quello che chiedi lo fai in Excel a mano... ma non con un DB.
 
@Alex


Grazie della risposta
 
Come vedi hai 3 Intervalli, ed ognuno ha dei numeri...
Ma eventualmente con access come si potrebbero attribuire questi numeri per avere questi intervalli.
Grazie!




intervallo cosè? proprio la scritta "intervallo" o una riga vuota?
non credo ci siano soluzioni se non tramite codice
 
ovvero scorrere l'intera tabella e confrontare il valore corrente con il 
valore più alto letto fino a quel momento e azzerare i valori ad ogni 
"intervallo" previo salvataggio del risultato dove ti fa più comodo 
(altra tabella, file, video)
 
ciao
BFS
 
 
 
 
 
 
---
Questa email è stata esaminata alla ricerca di virus da AVG.
http://www.avg.com
 
 


Grazie BFS
 
La scritta "intervallo" definisce l'intervallo.
Il salvataggio sempre in una tabella.
 
Dato che in genere utilizzo Query e le Macro.
mi potresti dare un suggerimento pratico di come potrei impostare la routine per  
ottenere il procedimento che mi dicevi.
Grazie!


se la tabella si chiama "tuaTabella", popolata con i dati del tuo esempio
se il campo si chiama "numeri"
 
ho creato una form con un pulsante
sul click ho scritto
 
Private Sub Comando0_Click()
Dim gruppo As Integer
Dim max As Double
 
Dim db As Database
Set db = CurrentDb
Dim tabella As Recordset
Set tabella = db.OpenRecordset("tuatabella")
gruppo = 1
max = 0
While Not tabella.EOF
     If tabella.Fields("numeri") = "Intervallo" Then
         Debug.Print "gruppo " & gruppo & " max : " & max
         max = 0
         gruppo = gruppo + 1
         Else
         If max < CDbl(tabella.Fields("numeri")) Then
                 max = CDbl(tabella.Fields("numeri"))
 
         End If
     End If
     tabella.MoveNext
Wend
 
End Sub
 
 
risultato debug
 
 
gruppo 1 max : 8
gruppo 2 max : 5
gruppo 3 max : 8
 
 
ciao
BFS
 
 
 
 
 
 


ndr
 
do per scontato che l'ultima riga della tabella sia sempre "intervallo"
altrimenti il codice va aggiustato o ti perdi il max dell'ultimo gruppo
 
ciao

Grazie BFS
Volevo precisare meglio l'impostazione della tabella: 
numeri    inter          aggiornare
7 
8 
3 
3 
4 
4       intervallo 
3 
2 
5 
4 
5      intervallo 
8 
2 
6 
5 
3      intervallo 
 
la parola "intervallo" si trova nel campo della tabella chiamato inter.
Riportare il numero piu' grande di ogni intervallo aggiornando un terzo campo "aggiornare" all'altezza della parola intervallo scritta nel campo vicino.
Grazie!


ok
 
allora il codice diventa:
 
Dim max As Double
 
Dim db As Database
Set db = CurrentDb
Dim tabella As Recordset
Set tabella = db.OpenRecordset("tuatabella")
 
max = 0
While Not tabella.EOF
     If tabella.Fields("inter") = "Intervallo" Then
         tabella.Edit
         tabella.Fields("aggiornare") = max
         tabella.Update
         max = 0
 
         Else
         If max < tabella.Fields("numeri") Then
                 max = tabella.Fields("numeri")
 
         End If
     End If
     tabella.MoveNext
Wend
 
 
La tabella prima dell'esecuzione del codice:
https://ibb.co/dYXJff
 
 
dopo del codice:
https://ibb.co/nAumY0
 
 
giusto?



Grazie BFS il codice funziona 
solo che quando il numero piu' grande dell'intervallo si trova nello stesso rigo  dove c'e'la dicitura intervallo la funzione non lo prende in considerazione come in questo esempio:
numeri	inter	aggiornare
7		
8		
3		
3		
7		
4	intervallo	8
3		
5		
2		
4		
5	intervallo	5
5		
8		
2		
6		
10	intervallo	8
Nel terzo intervallo il numero piu' grande e'10.
Come si puo' risolvere in questi casi?
Grazie!


sorry hai ragione...semplice, così:
 
Dim max As Double
 
Dim db As Database
Set db = CurrentDb
Dim tabella As Recordset
Set tabella = db.OpenRecordset("tuatabella")
 
max = 0
While Not tabella.EOF
     If max < tabella.Fields("numeri") Then
                 max = tabella.Fields("numeri")
 
     End If
     If tabella.Fields("inter") = "Intervallo" Then
         tabella.Edit
         tabella.Fields("aggiornare") = max
         tabella.Update
         max = 0
 
     End If
     tabella.MoveNext
Wend
 


Grazie!BFS
La routine ha risolto il problema
La soluzione che mi hai dato tramite codice era l'unica strada.


ottimo
ciao


Ciao BFS
Ho dimenticato di chiederti un ultima cosa come si poteva utilizzare lo stesso processo con una tabella del genere:
CAP	inter	aggiornare
20017		
20019		
20019		
20011		
20019	intervallo	
20014		
20015		
20015		
20017		
20020		
20015	intervallo	
20020		
20024		
20022		
20024	intervallo
Questa volta mettere nel campo aggiornare sempre sullo stesso rigo di intervallo il cap che si presenta piu' volte nell'intervallo.
Grazie!

Basta definirlo Chiave univoca duplicati NON AMMESSI, perché è normale sia così... i  questo caso e gestire l'errore...
 
@Alex


sempre se ho capito bene...
la prima cosa che mi viene in mente è una variante del algoritmo 
counting sort, ma sono cotto magari qualcosa di meglio esiste
 
in pratica ti crei un array da 0 a 99999
ogni volta che leggi un cap aumenti di uno il  relativo indice dell'array
 
una volta arrivato al primo intervallo, scansioni l'array per cercare il 
l'indice con il valore + alto e lo scrivi nel campo
 
resetti l'array per il successivo intervallo
 
 
 
ciao BFS
 
 
 
 
 
 
 
 
 


in pratica qualcosa del genere...credo che l'efficenza sia da bocciatura 
all'esame di informatica ma non mi viene in mente di meglio ora
 
Dim cap(99999) As Integer
Dim i As Double
For i = 1 To 99999
     cap(i) = 0
Next i
Dim max As Double
Dim capMax As String
Dim db As Database
Set db = CurrentDb
Dim tabella As Recordset
Set tabella = db.OpenRecordset("tuatabella")
 
max = 0
 
While Not tabella.EOF
     cap(tabella.Fields("cap")) = cap(tabella.Fields("cap")) + 1
     If tabella.Fields("inter") = "Intervallo" Then
         For i = 1 To 99999
            If cap(i) > max Then
                 max = cap(i)
                 capMax = i
            End If
         Next i
 
         tabella.Edit
         tabella.Fields("aggiornare") = capMax
         tabella.Update
         For i = 1 To 99999
             cap(i) = 0
         Next i


 Dim cap(99999) As Integer
 
meglio
 
Dim cap(99999) As double


Sicuro che Double sia giusto...? Servono decimali precisione doppia..?
Non basta long...?
@Alex

Ma perché non usare il codice di edit che hai già scritto... come dicevo definendo la PK ottieni errore e su errore scrivi nell'altro campo è fai update... 1 riga di codice ed un solo ciclo gia esistente... 
 
Eventualmente invece dell'ARRAY usa una collection che consente la ricerca dell'item per Key...  risulta meno ingombrante che un array di 100000 elementi...
 
Boh... 
@Alex


Ciao BFS 
Complimenti! La routine funziona benissimo.
Grazie ancora per la disponibilita'


ciao
 
non ho capito la soluzione tramite errore su PK
se non ho capito male lui vuoi scrivere il cap che ha il maggiore numero 
di occorrenze in un intervallo e possono esserci cap diversi ripetuti
da qualche parte quindi dovrai scrivere per ogni cap quante occorrenze 
ha...o mi sfugge qualcosa?
 
BFS


Probabilmente ho frainteso... avevo capito volesse inserire il cap in un 3° campo quando questo fosse già esistente...
 
@Alex

 @Alex
 
Ciao BFS
Mi sono accorto che i cap con lo zero davanti, una volta aggiornato  il campo aggiorna,perdono lo zero es.  00040 diventa 40 00128 diventa 128 09100 diventa 9100 etc. Come si puo' eliminare il problema?
Grazie!


sostituisci con questo
 
    tabella.Fields("aggiornare") = Format(capMax, "00000")
 
ciao



Ciao BFS
Anche con il Format(capMax, "00000")spariscono i zeri.


mi sa che il campo "aggiornamento" non è di tipo testo allora
forse lo hai di tipo numerico?
 
ciao


Si il campo è numerico.


devi convertirlo a testo altrimenti è ovvio che ti tolga gli zeri non 
significativi davanti
 
ciao


Ok! Grazie BFS