Query di raggruppamento con diversi intervalli di date

di il
31 risposte

31 Risposte - Pagina 2

  • Re: Query di raggruppamento con diversi intervalli di date

    Salve a tutti….

    sono curioso… in JET SQL non saprei scriverlo, ma in T-SQL affronterei il problema sulla base delle data islands… ad esempio tipo https://www.red-gate.com/simple-talk/databases/sql-server/t-sql-programming-sql-server/introduction-to-gaps-and-islands-analysis/

    ma con Access…. ripeto, ora sono curioso di vedere come fate :D

    salutoni romagnoli
    – 
    Andrea

  • Re: Query di raggruppamento con diversi intervalli di date

    10/04/2024 - asql ha scritto:


    Salve a tutti….

    sono curioso… in JET SQL non saprei scriverlo, ma in T-SQL affronterei il problema sulla base delle data islands… ad esempio tipo https://www.red-gate.com/simple-talk/databases/sql-server/t-sql-programming-sql-server/introduction-to-gaps-and-islands-analysis/

    ma con Access…. ripeto, ora sono curioso di vedere come fate :D

    salutoni romagnoli
    – 
    Andrea

    Non credo c'entri molto…

    Non hai 1/1….3/1…..20/1…..3/2…. Ecc…

    Hai N da … a …. Così organizzati

    Mario 3/1…………………..30/1

    Mario.                15/1…………….3/2

    Mario.            10/1………………………………10/2

    Mi trovi la lacuna?

  • Re: Query di raggruppamento con diversi intervalli di date

    Ah, li ho messi in un ipotetico asse temporale.

  • Re: Query di raggruppamento con diversi intervalli di date

    10/04/2024 - sihsandrea ha scritto:


    Chiedi da a ma dai dati inseriti nin ha senso

    Ha un senso invece. Immagina che delle lavorazioni che fanno capo ad un ordine1 non riescano a concludersi del tutto in un arco temporale continuo poiché dei materiali nel frattempo si sono esauriti e pertanto occorre riprendere le lavorazioni in un periodo successivo. In tal caso si verificherebe uno scenario come quello ipotizzato. In tal caso la soluzione avanzata da Franco credo che non possa applicarsi.

  • Re: Query di raggruppamento con diversi intervalli di date

    09/04/2024 - Antony73 ha scritto:


    Scusa Andrea, ma non capisco per quale motivo l'intervallo data si debba estendere fino al 18/05.

    Oggi ti sei dato la risposta da solo…

    Prima ti ho scritto:

    non so a cosa serve il dato ma rischi di avere valori errati.

    se si tratta di calcolo giorni lavorativi risulterebbe un periodo da retribuire dal 10/3 al 18/5 piuttosto che dal 10/3 al 17/3 + dal 14/4 al 10/5

    Ma oltre alla retribuzione si intendevano ore di lavoro da imputare come.costo all'ordine.

    Pensa se va via la luce e un macchinario è fermo… pensa semanca la materia prima… pensa se l'operaio è in malattia… pensa….

    L'esperienza mi ha fatto intuire che c'entrava il costo della commessa (non lo chiamerei ordine).

    Devi fare una sommatoria dei periodi di lavoro.

    L'ordine ha un inizio lavori, uno stato di avanzamento che potrebbe prevedere lavorazioni presso terzi e una data presunta di fine lavori.

    Ogni volta che avanzano i lavori carichi la distinta base di avanzamento con l'elenco materie prime se utilizzate, la quantità prodotta se disponibile, le ore di lavoro.

    A questo punto non ti serve da a  ma la sommatoria delle ore lavorate, il costo della materia prima ecc…

    Se si tratta di commesse omogenee prendi in considerazione l'uso di lotti o matricole. Chiamare sempre ordine 1 non ha senso.

  • Re: Query di raggruppamento con diversi intervalli di date

    10/04/2024 - sihsandrea ha scritto:


    Se si tratta di commesse omogenee prendi in considerazione l'uso di lotti o matricole. Chiamare sempre ordine 1 non ha senso.

    Si ma le regole molto spesso le fanno gli altri. Molte volte tocca adattarsi alle situazioni e regolarsi di conseguenza. Non credi?

  • Re: Query di raggruppamento con diversi intervalli di date

    10/04/2024 - Antony73 ha scritto:


    Non credi?

    No!

    Il meccanico batteva con la mazzetta sul perno a sfera…

    Temendo per la macchina nuova ho chiesto se non ci fosse un altro modo. Mi fa: tu che mestiere fai? Programmo! Ok, tu vai a programmare che io faccio il meccanico!

    Ora la domanda la faccio a te: chi sta facendo il programma? Se ti dicessero di non creare relazioni? 

    Devi risolvere un problema non stai battendo a macchina una lettera scritta dal capo.

  • Re: Query di raggruppamento con diversi intervalli di date

    Non dico di abbassare la testa e fare quello che gli altri ti ticono di fare senza fiatare. Non è questa la situazione. Il fatto è che certe procedure sono fissate da regolamenti che non puoi cambiare perché sono legiferati. Ma pure se fosse…. Rimane sempre lo spirito di trovare la soluzione al problema posto. Come faccio a fare quei raggruppamenti? 

  • Re: Query di raggruppamento con diversi intervalli di date

    Cicli di lavorazione da materia prima o orodotto grezzo a prodotto finito.

    Considera la trasformazione non il tempo.

    Ergo, oltre a ordine aggiungi un lotto di produzione incrementante oer ogni produzione e l da li estrapoli oltre il tempo massimo (min data inizio - max data fine) considera le ore impiegate filtrando entrambe per ordine e lotto o processo produttivo (se preferisci).

  • Re: Query di raggruppamento con diversi intervalli di date

    Dovendo solo mostrare per ogni singolo Ordine la data di Inizio e la data di Fine evasione la soluzione proposta da By65Franco è corretta.

    Se così non fosse devi spiegati meglio sul risultato che vorresti ottenere.

  • Re: Query di raggruppamento con diversi intervalli di date

    Ciao,

    per i vari gruppi di date sovrapponibili per lo stesso Ordine si potrebbe fare il tutto da codice Vba abbandonando la strada della query.

    Per esempio poniamo di avere in tabella questi records:

    Secondo questi records si devono ottenere i raggruppamenti per Ordine di questo tipo:

    per Ordine nr.1: Antonio Rossi
    ordine 1 data inizio 10/03/2024 data fine 18/05/2024
    ordine 1 data inizio 10/06/2024 data fine 22/06/2024

    per Ordine nr. 2: Gianni Bianchi
    ordine 2 data inizio 01/02/2024 data fine 10/03/2024

    per Ordine nr.3: Paperino Paolino
    ordine 3 data inizio 05/01/2024 data fine 13/01/2024
    ordine 3 data inizio 20/01/2024 data fine 22/02/2024


    Con una piccola routine in vba si potrebbe fare una cosa di questo tipo :

    Sub MyGetRangeOverLap()
    ' initialize variables
    Dim intOrdineSave As Integer
    Dim dateStartSave As Date
    Dim dateEndSave As Date
    Dim isFirstOverlap As Boolean
    
    ' set first record
    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
            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
            ' retreive overlapping range date
            Debug.Print intOrdineSave & " " & dateStartSave & " " & dateEndSave
            ' save new record
            intOrdineSave = rs.Fields("NrOrdine").Value
            dateStartSave = rs.Fields("DateStart").Value
            dateEndSave = rs.Fields("DateEnd").Value
        End If
        ' move next
        rs.MoveNext
    Loop
    ' retrieve last overlapping range date
    Debug.Print intOrdineSave & " " & dateStartSave & " " & dateEndSave
    
    ' close recordset
    rs.Close
    Set rs = Nothing
    End Sub
    

    Dove vengono letti in un certo ordine i records della tabella in questa forma: (vedere stringa Sql sulla TblOrdini)

    Antonio Rossi 1 10/03/2024 17/03/2024
    Antonio Rossi 1 11/03/2024 19/03/2024
    Antonio Rossi 1 14/03/2024 18/05/2024
    Antonio Rossi 1 10/06/2024 17/06/2024
    Antonio Rossi 1 16/06/2024 22/06/2024
    Gianni Bianchi 2 01/02/2024 01/03/2024
    Gianni Bianchi 2 10/02/2024 10/03/2024
    Gianni Bianchi 2 14/02/2024 03/03/2024
    Paperino Paolino 3 05/01/2024 13/01/2024
    Paperino Paolino 3 20/01/2024 30/01/2024
    Paperino Paolino 3 28/01/2024 10/02/2024
    Paperino Paolino 3 09/02/2024 22/02/2024

    Ottenendo i raggruppamenti come sopra riportato che sono i seguenti: 
    (i tre valori per riga rappresentano … NrOrdine, DataInizio e DataFine)

    1 10/03/2024 18/05/2024
    1 10/06/2024 22/06/2024
    2 01/02/2024 10/03/2024
    3 05/01/2024 13/01/2024
    3 20/01/2024 22/02/2024


    Nel codice sopra riportato si estraggono questi records a rottura di livello (numero ordine/date inizio e fine che si sovraponpgono) e si possono intercettare per memorizzarli dove si vuole in due punti del programma:

    1.All'interno del ciclo di lettura dove si trova l'istruzione         Debug.Print intOrdineSave & " " & dateStartSave & " " & dateEndSave
    2.A fine del ciclo di lettura dove si trova l'istruzione        Debug.Print intOrdineSave & " " & dateStartSave & " " & dateEndSave
    come evidenziato in questa immagine :

    In questi due punti del codice puoi eseguire una azioni per salvare il raggruppamento dove più si ritiene opportuno. (per esempio in una tabella, in una matrice e/o array , ecc.ecc…)


    Prova a provare, l'ho fatto di corsa, con più records e diverse sovrapposizione di periodi per verificare se funziona correttamente.

    Se fa al caso tuo, implementare il codice nei due punti sopra evidenziati per avere il risultato richiesto nel thread.

  • Re: Query di raggruppamento con diversi intervalli di date

    11/04/2024 - By65Franco ha scritto:


    Antonio Rossi 1 10/03/2024 17/03/2024
    Antonio Rossi 1 11/03/2024 19/03/2024
    Antonio Rossi 1 14/03/2024 18/05/2024
    Antonio Rossi 1 10/06/2024 17/06/2024
    Antonio Rossi 1 16/06/2024 22/06/2024

    Mi sa che manca qualche informazione.

    Concettualmente il sig. Rossi comincia il 10/3, ricomincia l'11/3, porta avanti lo stesso ordine iniziando il 14/3 per finire il 17/3 finendo il 18/3 rifinendo il 19/3….

    Riprende l'ordine 1 il 10/6 per lavorarlo fino al 16/6 dove inizia per finire il giorno dopo (17/6) finendo ancora il 22/6….

    Ma cos' è il decreto mille proroghe?

    Logica impone tabella ordini tabella avanzamento lavori con le date di lavorazione ordine e una data consegna lavori.

  • Re: Query di raggruppamento con diversi intervalli di date

    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.

  • Re: Query di raggruppamento con diversi intervalli di date

    11/04/2024 - sihsandrea ha scritto:


    Ma cos' è il decreto mille proroghe?

    Mi sa di si …. ;-))

    Con la query non c'ho perso molto tempo perchè mi sembra un tantino ostica…  da vba è semplice e magari più flessibile ed implementabile.


    Edit
    Poi il sig.re Rossi è proprio una pippa… ogni due per tre si dimentica di un pezzo ;-)

    In generale vale il ragionamento e l'approccio che hai esposto… ma sembra che sia l'utente finale a fare l'Analisi e a pretendere certe soluzioni. Il povero sviluppatore alla fine si ritrova tra l'incudine e il martello. 

  • Re: Query di raggruppamento con diversi intervalli di date

    11/04/2024 - By65Franco ha scritt

    11/04/2024 - By65Franco ha scritto:


    Il povero sviluppatore alla fine si ritrova tra l'incudine e il martello. 

    11/04/2024 - By65Franco ha scritto:


    Il povero sviluppatore alla fine si ritrova tra l'incudine e il martello. 

Devi accedere o registrarti per scrivere nel forum
31 risposte