Newsgroup: it.comp.appl.access
Titolo: Query: espressione

Un cordiale saluto a tutti.
A97 - Situazione: Tabella1 con 25 campi (N1; N2; ecc. fino a N25), dovrei 
creare dei gruppi in questo modo:
Da una seconda tabella (in relazione con la prima) ho dei valori per 
calcolare i gruppi: es.: se in un record della seconda tabella ci sono i 
valori 4; 3; 2 - che sono in tre campi diversi (GR1; GR2; GR3) vorrei 
ottenere da N1 a N4 (cioè il primo e l'ultimo dei primi 4); da N5 a N6 (il 
primo e l'ultimo del secondo gruppo) e da N7 a N8 (il primo e l'ultimo del 
terzo gruppo).
Quale potrebbe essere l'espressione da mettere nei campi di una eventuale 
query ?
Ringrazio in anticipo chiunque vorrà aiutarmi
Gabriele 

 query ?
Un po' difficile da seguire. Ti do un suggerimento, per ragionare. Con 
l'istruzione IIF, potresti costruirti delle sottoespressioni. Altrimenti, 
facci un esempio delle tabelle.
-- 
Jonathan Canova
infoCHIOCCIOLAaladinoinformatica.com
www.aladinoinformatica.com
 


Mi rendo conto che è anche un po' difficile spiegare bene.
Un esempio potrebbe essere:
Tabella1
Campi: N1 N2 N3 N4 N5 N6 N7 N8 N9 N10 N11 ecc. fino a N25
Valori:  7    8    9   10   11  12  13  14  15  16    17
Tabella 2 (in relazione con Tabella1)
Campi: GR1 GR2 GR3 GR4
Valori   3       2        1     4
Vorrei creare dei campi calcolati in una query che, partendo dai valori 
indicati nei campi GR1, GR2, GR3 e GR4, restituiscano come risultato quanto 
segue:
Campo1: 7-9 (sarebbe il primo e l'ultimo del gruppo dei primi 3. Il segno 
"-" l'ho messo per dividere i due numeri)
Campo2: 10-11
Campo3: 12-12
Campo4: 13-16
Ringrazio di nuovo chiunque vorrà darmi una dritta
Cordiali saluti a tutti
Gabriele 

 primo e l'ultimo del terzo gruppo).
Quando dici che le due tabelle sono in relazione immagino ci sia un campo
(non citato) che fa da link: chiamerò questo campo ID (per entrambe le
tabelle).
La soluzione che propongo restituisce un unico campo di testo con i totali
dei quattro gruppi: se hai bisogno di quattro campi diversi credo potrai
facilmente adattarla alle tue esigenze. Inoltre, per semplicità, mi sono
limitato a 9 campi: penserai tu ad apportare le modifiche del caso.
Crea questa funzione in un modulo (attenzione ad eventuali a capo
indesiderati):
Function SommaGruppi(P_ID, P_G1, P_G2, P_G3, P_G4)
    Dim dbs As Database, rst As DAO.Recordset
    Dim myValues(9) As Long, myTotals(4) As Long, i As Byte
    SommaGruppi = Null
    Set dbs = CurrentDb
    Set rst = dbs.OpenRecordset("SELECT * FROM Tabella1 WHERE ID=" & P_ID)
    If Not rst.EOF Then
        myValues(1) = rst!n1
        myValues(2) = rst!n2
        myValues(3) = rst!n3
        myValues(4) = rst!n4
        myValues(5) = rst!n5
        myValues(6) = rst!n6
        myValues(7) = rst!n7
        myValues(8) = rst!n8
        myValues(9) = rst!n9
        myTotals(1) = 0
        myTotals(2) = 0
        myTotals(3) = 0
        myTotals(4) = 0
        For i = 1 To P_G1
            myTotals(1) = myTotals(1) + myValues(i)
        Next
        For i = i To i + P_G2 - 1
            myTotals(2) = myTotals(2) + myValues(i)
        Next
        For i = i To i + P_G3 - 1
            myTotals(3) = myTotals(3) + myValues(i)
        Next
        For i = i To i + P_G4 - 1
            myTotals(4) = myTotals(4) + myValues(i)
        Next
        For i = 1 To 4
            SommaGruppi = SommaGruppi & "Totale Gruppo" & i & ": " &
myTotals(i) & " "
        Next
    End If
End Function
Quindi fai una query di questo tipo:
SELECT ID, SommaGruppi(ID, GR1, GR2, GR3, GR4) AS Totali FROM Tabella2;
HTH.
Alessandro

 ha scritto nel messaggio 
news:d8sdmg$bl6$1...@newsread.albacom.net...

Innanzitutto ringrazio per l'interessamento e la risposta.
Purtroppo, nonostante innumerevoli tentativi, non sono riuscito a farla 
funzionare (sicuramente a causa della mia scarsissima conoscenza del 
linguaggio Vb)
Non vorrei comunque che la mia illustrazione iniziale non fosse stata chiara 
(nel testo della funzione ho visto la parole somma). In effetti quello che 
vorrei ottenere non è proprio una somma.
Provo ad illustrare un esempio che probabilmente rende meglio l'idea:
Tabella1 (Campo che fa da link con Tabella2 si chiama: CodNum)
Campi: N1 N2 N3 N4 N5 N6 N7 N8 N9 N10 N11 ecc. fino a N25
Valori:  7    8    9   10   11  12  13  14  15  16    17
Tabella 2 (campo che fa da link con Tabella1 si chiama FCodNum)
Campi: GR1 GR2 GR3 GR4
Valori   3       2        1     4
Vorrei creare dei campi calcolati  in una query (uno per ogni gruppo) che, 
partendo dai valori
indicati nei campi GR1, GR2, GR3 e GR4, restituiscano come risultato quanto
segue:
Campo1: 7-9 (sarebbe il primo e l'ultimo del gruppo dei primi 3. Il segno 
"-" l'ho messo per dividere i due numeri)
Campo2: 10-11
Campo3: 12-12
Campo4: 13-16
Ringrazio di nuovo per la pazienza e per la collaborazione.


 ha scritto nel messaggio
news:StFse.37122$75.20...@news4.tin.it...

Se Tabella1 ha una struttura simile a questa:
IDTab1                Contatore e chiave primaria
CodNum              Numerico
N1                       Numerico
N2                       Numerico
N3                       Numerico
...
...
N25                    Numerico
Se Tabella2 ha una struttura simile a questa:
IDTab2                Contatore e chiave primaria
FCodNum            Numerico
GR1                     Numerico
GR2                     Numerico
GR3                     Numerico
GR4                     Numerico
Memorizza in in un modulo del databse questa funzione:
Public Function EstraiNumeri(Codice As Integer, _
Primo As Integer, Ultimo As Integer) As Variant
Dim rst As DAO.Recordset
EstraiNumeri = Null
If Primo < 1 Or Primo > 25 Then Exit Function
If Ultimo < 1 Or Ultimo > 25 Then Exit Function
Set rst = CurrentDb().OpenRecordset("Tabella1", dbOpenDynaset)
rst.FindFirst "CodNum =" & Codice
If rst.NoMatch Then Exit Function
EstraiNumeri = rst("N" & Trim(Primo)) & _
" - " & rst("N" & Trim(Ultimo))
Set rst = Nothing
End Function
e per visualizzare il risultato da te voluto esegui una query che abbia il
seguente codice SQL:
SELECT Tabella2.FCodNum, EstraiNumeri([FCodNum],1,[GR1]) AS Campo1,
EstraiNumeri([FCodNum],[GR1]+1,[GR1]+[GR2]) AS Campo2,
EstraiNumeri([FCodNum],[GR1]+[GR2]+1,[GR1]+[GR2]+[GR3]) AS Campo3,
EstraiNumeri([FCodNum],[GR1]+[GR2]+[GR3]+1,[GR1]+[GR2]+[GR3]+[GR4]) AS
Campo4
FROM Tabella2;
Se invece i campi CodNum e FCodNum fossero di tipo Testo, modifica la
funzione EstraiNumeri ne modo seguente:
Public Function EstraiNumeri(Codice As String, _
Primo As Integer, Ultimo As Integer) As Variant
Dim rst As DAO.Recordset
EstraiNumeri = Null
If Primo < 1 Or Primo > 25 Then Exit Function
If Ultimo < 1 Or Ultimo > 25 Then Exit Function
Set rst = CurrentDb().OpenRecordset("Tabella1", dbOpenDynaset)
rst.FindFirst "CodNum ='" & Codice & "'"
If rst.NoMatch Then Exit Function
EstraiNumeri = rst("N" & Trim(Primo)) & _
" - " & rst("N" & Trim(Ultimo))
Set rst = Nothing
End Function
Le due funzioni di cui sopra fanno riferimento alla libreria Microsoft DAO
quindi, se usi una versione di Access successiva ad Access 97, aggiungi tale
libreria ai riferimenti del tuo database.
-- 
Roberto
-----------------------------------------------------
il Sito Comune di it.comp.appl.access
http://www.sitocomune.com
----------------------------------------------------

 effetti quello che vorrei ottenere non č proprio una somma.
Sě, avevo frainteso. Prova cosě:
Function SommaGruppi(P_ID, P_G1, P_G2, P_G3, P_G4)
    Dim dbs As Database, rst As DAO.Recordset, myValues(25) As Long,
myTotals(4) As String, i As Byte
    SommaGruppi = Null
    Set dbs = CurrentDb
    Set rst = dbs.OpenRecordset("SELECT * FROM Tabella1 WHERE CodNum=" &
P_ID)
    If Not rst.EOF Then
        myValues(1) = rst!n1
        myValues(2) = rst!n2
        myValues(3) = rst!n3
        myValues(4) = rst!n4
        myValues(5) = rst!n5
        myValues(6) = rst!n6
        myValues(7) = rst!n7
        myValues(8) = rst!n8
        myValues(9) = rst!n9
        '
        ' Qui aggiungi gli altri 16 valori copiando la riga precedente
        '
        myTotals(1) = myValues(1) & "-" & myValues(P_G1)
        myTotals(2) = myValues(P_G1 + 1) & "-" & myValues(P_G1 + P_G2)
        myTotals(3) = myValues(P_G1 + P_G2 + 1) & "-" & myValues(P_G1 + P_G2
+ P_G3)
        myTotals(4) = myValues(P_G1 + P_G2 + P_G3 + 1) & "-" & myValues(P_G1
+ P_G2 + P_G3 + P_G4)
        For i = 1 To 4
            SommaGruppi = SommaGruppi & "Campo" & i & ": " & myTotals(i) & "
"
        Next
    End If
End Function
E la query diventa:
SELECT FCodNum, GR1, GR2, GR3, GR4, SommaGruppi(FCodNum, GR1, GR2, GR3, GR4)
