Condividi:        

Access: Gestione di più intervalli di date

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: Gestione di più intervalli di date

Postdi c.pagliuso@hotmail.it » 06/02/13 16:24

Salve,
sto formulando un database con Access che deve gestire diversi sottoperiodi definiti dall'utente (data inizio e data fine) nell'ambito di un periodo che ha una sua data inizio ed una sua data fine.
Esempio:
Periodo: (inizio) 01/01/2013 - (fine) 31/12/2018
sottoperiodo1: i 01/02/2013 - f 31/03/2013
sottoperiodo2: i 01/08/2013 - f 01/09/2013
sottoperiodo3: i 01/12/2013 - f 31/01/2014
sottoperiodo4: i 01/01/2016 - f 31/12/2018
.....
sottperiodo n: .....

Ho una query di accodamento che deve scrivere i records che abbiano il campo data (ricavata tramite Dateadd) SOLO se compresa in uno dei sottoperiodi.
Per il momento la query che ho realizzato tiene conto solo del periodo.
--------
INSERT INTO tblCalendario ( ID_Immobile, ID_Commessa, ID_Precedente, Datai, ID_Elemento, Cod_Elemento, ID_Censimento, AbbreviazioneFreq, Frequenza, Intervallo, [Note], Start, Scheda, Impiego, x, Stato, ID_Precedenteimp, inc, Interventi )
SELECT tblCalendario.ID_Immobile, tblCalendario.ID_Commessa, tblCalendario.IDCalendario, DateAdd("m",[Intervallo]*[inc],[Start]) AS Data, tblCalendario.ID_Elemento, tblCalendario.Cod_Elemento, tblCalendario.ID_Censimento, tblCalendario.AbbreviazioneFreq, tblCalendario.Frequenza, tblCalendario.Intervallo, tblCalendario.Note, tblCalendario.Start, tblCalendario.Scheda, tblCalendario.Impiego, tblCalendario.x, tblCalendario.Stato, tblCalendario.ID_Precedenteimp, [inc]+1 AS Incremento, tblCalendario.Interventi
FROM tblCommessa INNER JOIN tblCalendario ON tblCommessa.IDCommessa = tblCalendario.ID_Commessa
WHERE (((tblCalendario.ID_Immobile)=[Maschere]![frmHome]![Foglio1]![ID_Imm]) AND ((tblCalendario.IDCalendario) Not In (SELECT tblCalendario.[ID_Precedente] FROM tblCalendario)) AND ((DateAdd("m",[Intervallo]*[inc],[Start]))<=[Fine]));
--------

Grazie.
c.pagliuso@hotmail.it
Utente Junior
 
Post: 13
Iscritto il: 04/12/12 14:01

Sponsor
 

Postdi archimede » 06/02/13 17:34

Qual è la domanda?

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

Re: Access: Gestione di più intervalli di date

Postdi c.pagliuso@hotmail.it » 07/02/13 10:52

La data, nella query di accodamento, DEVE tener conto anche dei sottoperiodi (che sono relazionati ad una seconda tabella); e non solo del perido come fa adesso.
Quindi dovrebbe scrivere records che abbiano la data SOLO se compresa nel sottoperiodo.
Come deve modificare la query, per tener conto anche dei sottoperiodi ?
Grazie.
c.pagliuso@hotmail.it
Utente Junior
 
Post: 13
Iscritto il: 04/12/12 14:01

Postdi archimede » 07/02/13 13:45

Non è facile, per chi non conosce ciò che stai facendo, capire la logica della tua query.

Se stai ancora cercando di fare questo, credo che tu debba usare del codice VBA: fare tutto solo in SQL mi pare arduo.

In pratica, devi costruirti i vari records da inserire uno alla volta in VBA e fare delle INSERT singole. Le logiche di dove iniziare e quando fermarsi vanno quindi implementate in VBA, non in SQL.

HTH.

Alessandro

PS: in alternativa potresti provare a descrivere in dettaglio cosa devi fare, dimenticando quanto tecnicamente hai fatto finora, solo descrivendo in italiano i requisiti da soddisfare; forse strutturando il db diversamente si riesce a semplificare le cose.
archimede
Moderatore
 
Post: 2851
Iscritto il: 07/11/02 12:41
Località: Genova

Re: Access: Gestione di più intervalli di date

Postdi c.pagliuso@hotmail.it » 07/02/13 15:26

Cerco di spiegarmi meglio; ecco cosa deve fare il database, ho 4 tabelle :

1.Elementi: ID, Descrizione, Incremento
2.Periodi: ID, ID_Elemento, Start, Stop
3.Sottoperiodi: ID, ID_Elemento, Inizio, Fine
4.Calendario: ID, ID_Elemento, Data

La tabella periodi contiene, per ogni elemento, una data di start ed una di stop (uno-uno).
Analogamente la tabella sottoperiodi contiene, per ogni elemento, un certo numero di intervalli di date (uno-molti).
La query di accodamento che sto cercando di realizzare deve scrivere records nella tabella calendario riportando l'id dell'elemento ed una data definita mediante la funzione Dateadd.
Detta funzione incrementa dalla data di start fino a quando non si raggiunga la data di stop periodo (1°criterio).
Il 2° criterio invece è quello di verificare se la data (derivante dalla funzione Dateadd) è presente in uno degli n sottoperiodi, e quindi scrivere, altrimenti no.

Sono in difficoltà con la query, non riesco a farle tener conto degli n sottoperiodi di ogni elemento.
Mi potete fare un esempio di macro, che io poi adatterò?

Grazie
c.pagliuso@hotmail.it
Utente Junior
 
Post: 13
Iscritto il: 04/12/12 14:01

Postdi archimede » 07/02/13 23:14

Fai una form con un bottone e sull'evento click del bottone metti questo:
Codice: Seleziona tutto
Private Sub Comando0_Click()

Dim strSQL As String
Dim newStart As Date
Dim checkPeriodo As Long

Set DB = CurrentDb

strSQL = "SELECT E.Incremento, P.* " & _
          " FROM Elementi E, Periodi P" & _
         " WHERE E.ID = p.ID_Elemento"

Set rs1 = DB.OpenRecordset(strSQL)

rs1.MoveFirst

Do While rs1.EOF = False

    newStart = DateValue(DateAdd("m", rs1.Incremento, rs1.start))

    Do While newStart <= rs1.Stop

        checkPeriodo = DCount("ID", "Sottoperiodi", "ID_Elemento = " & rs1.ID_Elemento & " AND #" & Format(newStart, "MM/dd/yyyy") & "# BETWEEN DateValue(Inizio) AND DateValue(Fine)")

        If checkPeriodo > 0 Then

            strSQL = "INSERT INTO Calendario" & _
                           " (ID_Elemento, Data)" & _
                    " VALUES (" & rs1.ID_Elemento & ", #" & Format(newStart, "MM/dd/yyyy") & "#)"

            DB.Execute strSQL

        End If

        newStart = DateValue(DateAdd("m", rs1.Incremento, newStart))

    Loop

    rs1.MoveNext

Loop

Set rs1 = Nothing

End Sub
Il codice è stato testato molto superficialmente, per cui fai un bel backup dei dati prima di usarlo. In ogni caso dovrebbe bastarti come spunto per completare il tutto.

Naturalmente mi sono basato sui nomi di tabelle e campi da te riportati nell'ultimo messaggio. Se questi non corrispondono alla realtà, beh peggio per te: dovrai modificare il codice di conseguenza. ;)

HTH.

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

Re:

Postdi c.pagliuso@hotmail.it » 08/02/13 16:27

archimede ha scritto:Fai una form con un bottone e sull'evento click del bottone metti questo:
Codice: Seleziona tutto
Private Sub Comando0_Click()

Dim strSQL As String
Dim newStart As Date
Dim checkPeriodo As Long

Set DB = CurrentDb

strSQL = "SELECT E.Incremento, P.* " & _
          " FROM Elementi E, Periodi P" & _
         " WHERE E.ID = p.ID_Elemento"

Set rs1 = DB.OpenRecordset(strSQL)

rs1.MoveFirst

Do While rs1.EOF = False

    newStart = DateValue(DateAdd("m", rs1.Incremento, rs1.start))

    Do While newStart <= rs1.Stop

        checkPeriodo = DCount("ID", "Sottoperiodi", "ID_Elemento = " & rs1.ID_Elemento & " AND #" & Format(newStart, "MM/dd/yyyy") & "# BETWEEN DateValue(Inizio) AND DateValue(Fine)")

        If checkPeriodo > 0 Then

            strSQL = "INSERT INTO Calendario" & _
                           " (ID_Elemento, Data)" & _
                    " VALUES (" & rs1.ID_Elemento & ", #" & Format(newStart, "MM/dd/yyyy") & "#)"

            DB.Execute strSQL

        End If

        newStart = DateValue(DateAdd("m", rs1.Incremento, newStart))

    Loop

    rs1.MoveNext

Loop

Set rs1 = Nothing

End Sub
Il codice è stato testato molto superficialmente, per cui fai un bel backup dei dati prima di usarlo. In ogni caso dovrebbe bastarti come spunto per completare il tutto.

Naturalmente mi sono basato sui nomi di tabelle e campi da te riportati nell'ultimo messaggio. Se questi non corrispondono alla realtà, beh peggio per te: dovrai modificare il codice di conseguenza. ;)

HTH.

Alessandro



Grazie mille!! Funziona.. :lol:
Adesso sto in fase di personalizzazione, non credo di incotrare problemi...
Ciao
c.pagliuso@hotmail.it
Utente Junior
 
Post: 13
Iscritto il: 04/12/12 14:01


Torna a Applicazioni Office Windows


Topic correlati a "Access: Gestione di più intervalli di date":


Chi c’è in linea

Visitano il forum: Ricky0185 e 46 ospiti