Un ultimo esempio… si potrebbe utilizzare la funzione sopra riportata per crearsi una tabella di output.
la traccia può essere la seguente, implementando il codice con una funzione che crea la tabella TblOrdiniGroup che conterrà i raggruppamenti per date sovrapposte per numero ordine:
Esempio
' GET DATE RANGE OVERLAP
Sub MyGetRangeOverLap()
' initialize variables
Dim intOrdineSave As Integer
Dim dateStartSave As Date
Dim dateEndSave As Date
Dim stringNomeSave As String
Dim stringCognomeSave As String
' reset output table
MyCreateTableOutput "Reset"
' set first record
Dim isFirstOverlap As Boolean
isFirstOverlap = True
' open recordset
Dim rs As DAO.Recordset
Set rs = DBEngine(0)(0).OpenRecordset("SELECT TblOrdini.* FROM TblOrdini ORDER BY NrOrdine, DateStart, DateEnd")
'read recordset
Do While Not rs.EOF
' check first record
If isFirstOverlap Then
' save first record
stringNomeSave = rs.Fields("Nome").Value
stringCognomeSave = rs.Fields("Cognome").Value
intOrdineSave = rs.Fields("NrOrdine").Value
dateStartSave = rs.Fields("DateStart").Value
dateEndSave = rs.Fields("DateEnd").Value
isFirstOverlap = False
ElseIf rs.Fields("NrOrdine").Value = intOrdineSave And rs.Fields("DateStart").Value <= dateEndSave Then
' update end date if overlaps date
If rs.Fields("DateEnd").Value > dateEndSave Then
dateEndSave = rs.Fields("DateEnd").Value
End If
Else
' save overlapping range date
MyCreateTableOutput "Save", stringNomeSave, stringCognomeSave, intOrdineSave, dateStartSave, dateEndSave
' save new record
stringNomeSave = rs.Fields("Nome").Value
stringCognomeSave = rs.Fields("Cognome").Value
intOrdineSave = rs.Fields("NrOrdine").Value
dateStartSave = rs.Fields("DateStart").Value
dateEndSave = rs.Fields("DateEnd").Value
End If
' move next
rs.MoveNext
Loop
' save last overlapping range date
MyCreateTableOutput "Save", stringNomeSave, stringCognomeSave, intOrdineSave, dateStartSave, dateEndSave
' close recordset
rs.Close
Set rs = Nothing
End Sub
' RESET OR SAVE - OUTPUT TABLE
Sub MyCreateTableOutput(parmTypeMode As String, Optional parmNome As String, Optional parmCognome As String, Optional parmNrOrdine As Integer, Optional parmDateStart As Date, Optional parmDateEnd As Date)
' initialize name table
Dim stringOutputTableName As String
Dim stringCopyTableName As String
' set output table name
stringOutputTableName = "TblOrdiniGroup"
' set structure copy table name
stringCopyTableName = "TblOrdini"
' initialize output table
If parmTypeMode = "Reset" Then
' if exist delete
On Error Resume Next
DoCmd.DeleteObject acTable, stringOutputTableName
On Error GoTo 0
' create output new table only structure
DoCmd.TransferDatabase acExport, "Microsoft Access", CurrentDb.Name, acTable, stringCopyTableName, stringOutputTableName, True
End If
' check if insert new records
If parmTypeMode = "Save" Then
' insert new records
DBEngine(0)(0).Execute "INSERT INTO " & stringOutputTableName & " (Nome, Cognome, NrOrdine, DateStart, DateEnd) " & _
"VALUES (" & _
"'" & parmNome & "', " & _
"'" & parmCognome & "', " & _
parmNrOrdine & ", " & _
"#" & parmDateStart & "#, " & _
"#" & parmDateEnd & "#);"
End If
End Sub
viene richiamata la Sub MyCreateTableOutput() che provvederà a rigenerare una nuova tabella di ouput TblOrdiniGroup
e in essa aggiungerà i records di raggruppamento
Se per esempio si ha una tabella di questo tipo
Si otterrà una tabella di output in questo modo, dove vengono riepilogati i raggruppamenti per date sovrapposte
Come nell'esempio precedente sarà sufficiente eseguire la Sub MyGetRangeOverLap() che nel dettaglio in questo caso eseguirà le azioni:
- elimina e ricrea con la sola struttura una tabella di output TblOrdiniGroup (possono essere utilizzate tecniche diverse)
- legge la tabella TblOrdini e per rottura di livello determina gli ordini dalla data alla data che si sovrappongono
- salva i records così raggruppati nella tabella di output TblOrdiniGroup
Durante il ciclo di lettura si possono calcolare, accumulare e salvare altre informazioni come per esempio le ore totale lavorate per ogni range di date ecc.ecc.
N.B.
Ovviamente una soluzione di questo tipo in multi utenza deve essere personalizzata per evitare che il lavoro di un client vada ad inficiare il lavoro di un altro.
Se ti fa comodo può essere una traccia, un idea.