Tabella di appoggio o query con Function?

di il
1 risposte

Tabella di appoggio o query con Function?

Ho una tabella Direzioni con i seguenti campi:
IDDirezione (PK)
Anno
IDBand (FK)(rappresenta una Banda o Orchestra...alla quale ogni Anno viene associato un Direttore)
IDDirettore (FK)
Fonte
Indice
Manifesto
Pieghevole
Foto

A livello di questa tabella ho la necessità di strutturarla così perchè per ogni Anno la combinazione valori dei campi da Fonte a Foto può essere diversa (anche a parità di valori IDBand e IDDirettore).

Ho creato 2 query DirezionixCittàBand e DirezionixDirettore per elencare rispettivamente in ordine alfabetico ogni CittàBand Anno per Anno con il corrispondente Direttore (viceversa ogni Direttore Anno per Anno con la corrispondente CittàBand).
Queste 2 query mi elencano tutti i record Anno per Anno e, non fosse altro che devo tracciare anche i campi da Fonte a Foto, funzionano.

Tuttavia nel gergo musicale, quando si vogliono elencare le Direzioni di ogni CittàBand, solitamente si preferisce mostrare:
Periodo | CittàBand | Direttore
dove nel campo Periodo puoi trovare scritto per esempio 1990 - 1998.

Attualmente sono riuscito sfruttando una tabella di appoggio DirezioniPeriodi con i campi:
IDDP (PK)
Periodo
Band (quando dico Band o CittàBand significano la stessa cosa)
Direttore

e con questo codice 

Private Sub CompilaDirezioniPeriodi_Click()
DoCmd.RunSQL "DELETE * FROM DirezioniPeriodi"
Dim MyDB As DAO.Database
Dim rsDxCB As DAO.Recordset, rsDP As DAO.Recordset
Dim strBand1 As String, strBand2 As String, strDirettore1 As String, strDirettore2 As String
Dim intAnno1 As Integer, intAnno2 As Integer, I As Byte
Set MyDB = CurrentDb
Set rsDxCB = MyDB.OpenRecordset("DirezionixCittàBand", dbOpenDynaset)
Set rsDP = MyDB.OpenRecordset("DirezioniPeriodi", dbOpenDynaset)
rsDxCB.MoveFirst
Do Until rsDxCB.EOF
   intAnno1 = rsDxCB!Anno
   strBand1 = rsDxCB!Band
   strDirettore1 = rsDxCB!Direttore
A:
   rsDxCB.MoveNext
   I = I + 1
   intAnno2 = rsDxCB!Anno 'su questa riga al termine dell'elaborazione si ferma e mostra Errore
   strBand2 = rsDxCB!Band
   strDirettore2 = rsDxCB!Direttore
   If (intAnno2 = intAnno1 + I) And (strBand2 = strBand1) And (strDirettore2 = strDirettore1) Then
       GoTo A
       Else
       rsDxCB.MovePrevious
       rsDP.AddNew
       If rsDxCB!Anno = intAnno1 Then
           rsDP!Periodo = intAnno1
           Else
           rsDP!Periodo = intAnno1 & " - " & rsDxCB!Anno
       End If
       rsDP!Band = rsDxCB!Band
       rsDP!Direttore = rsDxCB!Direttore
       rsDP.Update
   End If
I = 0
rsDxCB.MoveNext
Loop
rsDP.Close
rsDxCB.Close
MyDB.Close
End Sub

riesco a mostrare la lista completa come desidero che sia (tranne vedi Domanda 2).

Domande:

1) Piuttosto che usare una tabella appoggio, sarebbe meglio sfruttare una query con una o più Function di riferimento? Se sì...mi perdo nei limiti delle mie conoscenze: chiedo lumi.

2) Il codice che ho mostrato si ferma sulla riga che ho indicato, con Errore di run-time 3021, Nessun record corrente. Immagino che abbia terminato di scorrere il recordset, si trovi su RecordNuovo e non sa cosa fare. Il codice non considera l'ultimo record. Non riesco a migliorare questo aspetto.

1 Risposte

  • Re: Tabella di appoggio o query con Function?

    Nel frattempo ho risolto il problema 2) così

    Private Sub CompilaDirezioniPeriodi_Click()
    DoCmd.RunSQL "DELETE * FROM DirezioniPeriodi"
    Dim MyDB As DAO.Database
    Dim rsDxCB As DAO.Recordset, rsDP As DAO.Recordset
    Dim strBand1 As String, strBand2 As String, strDirettore1 As String, strDirettore2 As String
    Dim intAnno1 As Integer, intAnno2 As Integer, I As Byte
    Set MyDB = CurrentDb
    Set rsDxCB = MyDB.OpenRecordset("DirezionixCittàBand", dbOpenDynaset)
    Set rsDP = MyDB.OpenRecordset("DirezioniPeriodi", dbOpenDynaset)
    rsDxCB.MoveFirst
    Do Until rsDxCB.EOF
       intAnno1 = rsDxCB!Anno
       strBand1 = rsDxCB!Band
       strDirettore1 = rsDxCB!Direttore
    A:
       rsDxCB.MoveNext
       If rsDxCB.EOF = True Then GoTo B:
       I = I + 1
       intAnno2 = rsDxCB!Anno
       strBand2 = rsDxCB!Band
       strDirettore2 = rsDxCB!Direttore
       If (intAnno2 = intAnno1 + I) And (strBand2 = strBand1) And (strDirettore2 = strDirettore1) Then
           GoTo A
           Else
    B:
           rsDxCB.MovePrevious
           rsDP.AddNew
           If rsDxCB!Anno = intAnno1 Then
               rsDP!Periodo = intAnno1
               Else
               rsDP!Periodo = intAnno1 & " - " & rsDxCB!Anno
           End If
           rsDP!Band = rsDxCB!Band
           rsDP!Direttore = rsDxCB!Direttore
           rsDP.Update
       End If
    I = 0
    rsDxCB.MoveNext
    Loop

    Continuo a chiedermi se tutto ciò possa essere risolto con query con Function(s).

Devi accedere o registrarti per scrivere nel forum
1 risposte