Newsgroup: it.comp.appl.access
Titolo: Lunghezza di percorsi sovrapposti

Ciao, volevo proporvi questo problema:
ho una tabella nella quale, tra gli altri, sono presenti due campi numerici:
"Da" e "A".
In questa tabella sono registrati i dati realtivi agli errori riscontrati
nelle saldature e, nei campi "Da" e "A" sono riportati l'inizio e la fine
del tratto difettoso, a partire da uno zero fissato.
La differenza tra "A" e "Da" restituisce, ovviamente, la lunghezza del
tratto.
Sommando questi tratti (in base all'ID della saldatura) si ottiene, quindi,
la lunghezza totale del difetto per ogni saldatura.
Il problema nasce dal fatto che i controlli sono effettuati a diverse
profondità e con metodi diversi, per cui può capitare che nello stesso
tratto o in una parte di esso, si riscontrino più difetti e, sommando le
lunghezze, si ottenga un tratto da riparare più lungo di quello reale.
Provo a chiarire meglio con un esempio:
1) Da=10   A= 90   L=80
2) Da= 160 A=200 L=40
3) Da= 150 A=180 L=30
i primi due difetti sono stati riscontrati con un metodo, il terzo con un
altro.
Se sommo le tre lunghezze ottengo 80 + 40 +30 = 150 mm
Ma il tratto effettivamente difettoso è pari a 130 mm. in quanto parte del
terzo tratto è già presente nel secondo.
E' possibile, secondo voi, trovare un algoritmo che calcoli la lunghezza
effettiva?
Grazie,
Salvatore

 ha scritto nel messaggio
news:c1nvgb$er3$1...@lacerta.tiscalinet.it...

Se la tabella che contiene i dati si chiama Tabella1 ed ha una struttura
simile a questa:
ID                Contatore e chiave primaria
IdSaldatura   Numerico
Da                Numerico
A                  Numerico
In un modulo del tuo database registra queste due funzioni pubbliche:
Public Function FunDA(ID As Long, _
Saldatura As Variant, Da As Double, _
A As Double) As Double
Dim rs As DAO.Recordset
Dim DepDA As Double
Dim DepA As Double
DepDA = 0
DepA = 0
Set rs = CurrentDb().OpenRecordset("SELECT " & _
"ID, IdSaldatura, Da, A FROM Tabella1 " & _
"ORDER BY IdSaldatura, Da, A;")
rs.MoveFirst
Do Until rs.EOF
    If rs!IdSaldatura = Saldatura Then
        If rs!ID = ID Then
            If rs!Da > DepA Then
                DepDA = rs!Da
            Else
                If rs!A > DepA Then
                    DepDA = DepA + 1
                Else
                    DepDA = 0
                End If
            End If
            Exit Do
        Else
            If DepA < rs!A Then
                DepA = rs!A
            End If
        End If
    End If
    rs.MoveNext
Loop
FunDA = DepDA
Set rs = Nothing
End Function
Public Function FunA(ID As Long, _
Saldatura As Variant, A As Double) As Double
Dim rs As DAO.Recordset
Dim DepA As Double
DepA = 0
Set rs = CurrentDb().OpenRecordset("SELECT " & _
"ID, IdSaldatura, Da, A FROM Tabella1 " & _
"ORDER BY IdSaldatura, Da, A;")
rs.MoveFirst
Do Until rs.EOF
    If rs!IdSaldatura = Saldatura Then
        If rs!ID = ID Then
            If rs!A > DepA Then
                DepA = rs!A
            Else
                If rs!A > DepA Then
                    DepA = DepA + 1
                Else
                    DepA = 0
                End If
            End If
            Exit Do
        Else
            If DepA < rs!A Then
                DepA = rs!A
            End If
        End If
    End If
    rs.MoveNext
Loop
FunA = DepA
Set rs = Nothing
End Function
La query che ti restituirà il totale lunghezza di ogni IDSaldatura dovrebbe
avere il seguente codice SQL:
SELECT Pippo.IdSaldatura, Sum(Pippo.Diff) AS LunghezzaTotale
FROM [SELECT ID, IdSaldatura, Da, A, FunDa(ID, IdSaldatura, Da, A) AS
Inizio, FunA(ID, IdSaldatura ,A) AS Fine, IIf(Inizio=0, 0, Fine - Inizio+1)
AS Diff FROM Tabella1 ORDER BY IdSaldatura, Da, A;]. AS Pippo
GROUP BY Pippo.IdSaldatura;
Facci sapere se funziona.
-- 
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------

 ha scritto nel messaggio
news:W6p0c.38977$Kc3.1...@twister2.libero.it...

Che funzionasse non c'erano dubbi!
Ho solo dovuto usare una query di creazione tabella prima di fare le somme,
perchè i tempi di calcolo (anche solo con 633 record) diventavano lunghi.
Grazie mille
Ciao
Salvatore

 ha scritto nel messaggio
news:6ZD0c.43175$FJ6.1...@twister1.libero.it...

I tempi si sono praticamente azzerati, la query viene eseguita
istantaneamente, almeno con i 600 record di cui sopra..
C'č solo un piccolo problema dovuto all'aggiunta di 1 nella formula finale.
Infatti, prova a vedere cosa succede se i valori sono questi:
idsaldatura 618 da=0 a=250
idsaldatura 618 da=630 a=740
idsaldatura 702 da=100 a=160
idsaldatura 1362 da=0 a=6280
idsaldatura 1362 da=60 a=260
il risultato sarŕ:
idsaldatura 618 L=361
idsaldatura 702 L=61
idsaldatura 1362 L=6280
cioč, le prime due sono piů lunghe di 1 mm, la terza č esatta. (Ammettendo
che il tratto sia quello compreso tra i due valori, quindi escludendo il
valore iniziale)
Se, invece, dalla formula finale elimino l'aggiunta di 1 ottengo:
idsaldatura 618 L=360
idsaldatura 702 L=60
idsaldatura 1362 L=6279
cioč il viceversa di prima.
Ciao e grazie
Salvatore

 Salvatore


 ha scritto nel messaggio
news:5TY0c.42422$Kc3.1...@twister2.libero.it...

Perfetto!
Grazie mille
Salvatore