Creazione form stile Calendario per planner impegni mensili

di il
6 risposte

Creazione form stile Calendario per planner impegni mensili

Buongiorno,

giro da un pò nella rete e per mia incompetenza sono sempre al punto di partenza...

ho bisogno di aiuto per creare una maschera di riepilogo in stile calendario che mi visualizzi gli ordini e gli appuntamenti presi...

ho fatto già un planner settimanale creando 7 subform ad hoc ma l'idea di crearmi 42 subform oltre che essere faticosa penso sia anche concettualmente sbagliata....

ho visto gli esempi di agenda di @alex e altro materiale simile in rete ma non sono riuscito ad adattarlo alle mie esigenze e quindi , piuttosto che mettere mani su codice che avrei difficoltà a modificare, preferirei scriverne di mio secondo le mie esigenze e capacità...

la teoria dovrebbe essere...una maschera(sottomaschera) che prenda in ingresso un parametro data e mi restituisca i record da una tabella (qlc di simile a una query parametrata)....la stessa maschera ripetuta per 42 volte con 42 date diverse tramite ciclo FOR in vba sui controllisottomaschera (n1,n2,n3,etc)

qui mi son perso....perchè non ho capito come passargli il parametro

ovviamente con la stessa teoria rifarei anche il planner settimanale riducendo cosi il nr di maschere cercando di migliorale il db...

sono in cerca di qlc volenteroso o (tutorial per neofiti) che mi prenda per mano e mi aiuti a realizzare quanto sopra descritto...

Grazie in anticipo a chi avrà tempo e pazienza da dedicarmi...

6 Risposte

  • Re: Creazione form stile Calendario per planner impegni mensili

    Ti spiego velocemente la logica che ho usato io.
    Sapendo che si può sfruttare la Relazione Master/Detail tra Form e SubForm tramite i campi Master/Secondari, ho realizzato una Maschera Generica che mostra gli appuntamenti del Giorno(qualsiasi giorno con dettaglio 15min), se la apro in modalità maschere continue, ovviamente non avendo filtri vedi tutti i giorni in base alla definizione Oraria.
    A supporto di questa maschera ho la Tabella Appuntamenti con il campo Data [gg/mm/aaaa hh:mm:ss]
    Quindi se io metto nella Maschera principale(NON ASSOCIATA) una TextBox con la Data di Oggi, quindi Value=Date(), ed inserisco come Sottomaschera la maschera di prima(Giorno)... relaziono nella SubForm i Campi Master(Textbox Maschera principale) e come Secondario Il FIX(campo [Data]) ottengo che la SubForm visualizza solo i dati di Oggi(quelli relazionati con il controllo TextBox valorizzato a Date()).
    Ho messo FIX(Campodata) in quanto devo prendere tutti gli appuntamenti del giorno escludendo quindi hh:mm:ss

    Quindi se metto 31 TextBox che valorizzo in base al Mese con i giorni del Mese con un banale ciclo, e 31 Istanze di SubForm collegando ognuna come Campo Master alla Textbox progressiva... ottengo 31Subform dipendenti da 31 TextBox.

    Se voglio cambiare mese mi basta cambiare le 31TextBox e le SubForm si aggiornano al giorno modificato...

    Credo sia estremamente semplice anche da fare come DEMO tuo...!

    Ecco il mio esempio fa questo.
  • Re: Creazione form stile Calendario per planner impegni mensili

    @Alex ha scritto:




    Credo sia estremamente semplice anche da fare come DEMO tuo...!

    sei troppo buono....

    in realtà nella subform del giorno mi basta visualizzare 2 dati : 1)il nr degli appuntamenti presi e 2) il nr degli ordini in lavorazione...al momento non ho bisogno di dettagli... magari dopo tramite l'evento su clic posso riferirmi a una maschera "giornoEstesa"...

    @Alex ha scritto:


    ...
    e 31 Istanze di SubForm collegando ognuna come Campo Master alla Textbox progressiva... ottengo 31Subform dipendenti da 31 TextBox.
    ...
    quando parli di istanziare mi perdo...
    
    ...
    
    for n =0 to 31
    dim F(n) as Form
    set F(n) = New Form_Giorno	' qui creo l'istanza
    
    me.controllo(n) = F(n)		' qui dovrebbe avvenire l'assegnazione 
    
    	' con rowsource dovrei cambiargli i dati restituiti...
    fn.rowsource = strsql   ' la stringa che ho generato tramite una funzione apposita che prende in entrata come argomento il contatore "n"
    next
    
    ....
    
    l'ho scritto di getto senza passare dall'editor...per farvi capire il mio empasse....


    faro dei tentativi... il tuo demo è ovviamente di un livello superiore... io mi accontenterei di passare ai 31/42 controlli subform un valore diverso per farmi restituire dei dati diversi...

    probabilmente sarà cosi banale che in rete non ho trovato tutorial esaustivi...o non ho cercato la cosa giusta(più facile)....

    ho visto che usavi anche la proprietà TAG (anche in altri esempi la usi)... è un dettaglio cui posso fare a meno o lo usi per la parte grafica??? ci sono talmente tante funzioni che dopo che rintraccio la prima mi perdo:D...skerzo...

    grazie ancora per l'interessamento e l'aiuto sempre puntuale
  • Re: Creazione form stile Calendario per planner impegni mensili

    Istanziare significa mettere 31 Oggetti Subform nella Form principale... devi solo trascinarli dalla Barra laterale nella Form per 31 volte.
    Poi una per una selezioni il Container ed accedi alle Proprietà Collega Campi Master/Secondari...

    ZERO CODICE per quello che ti ho suggerito...!
  • Re: Creazione form stile Calendario per planner impegni mensili

    @Alex ha scritto:


    Istanziare significa mettere 31 Oggetti Subform nella Form principale... devi solo trascinarli dalla Barra laterale nella Form per 31 volte.
    Poi una per una selezioni il Container ed accedi alle Proprietà Collega Campi Master/Secondari...

    ZERO CODICE per quello che ti ho suggerito...!
    esattamente quello che ho fatto... a beneficio dei poco esperti come me... per assegnare i campimaster/secondario dalla scheda delle proprietà... non cliccate sui 3 puntini a destra ....essendo la form principale una "non associata" dà l'errore e non vi da la possibilità di inserire i campi... si risolve tutto scrivendoli nei relativi campi

    grazie come sempre per l'aiuto...

    il codice credo di utilizzarlo per caricare le 31 textbox... per migliorare la parte grafica(sab/dom etc...) la cosa che mi mancava era proprio quello che ho segnalato in apertura... caricare la stessa maschera e riferirla a campi diversi...GRAZIEEE
  • Re: Creazione form stile Calendario per planner impegni mensili

    Ottimo esattamente come hai detto, se la Form principale non è associata va digitato a mano, o copiaincollato.
    Il codice per compilare i 31 Controlli è banale, le funzioni poi da usare per la somma dei gg è DateAdd("d",1,DataInizio) in un ciclo.
    Fai però attenzione che alcuni mesi hanno 30gg e Febb<30 quindi se sommi sempre 31 sbordi mese, il che va bene basta saperlo.
    Per i Sabati, le Domeniche usa WeekDay per rilevare 6 e 7 come giorno della settimana, e gestire la grafica, puoi usare questa funzione
    Private Function WeekEnd(ByVal laDate As Date) As Boolean
        WeekEnd = ((Weekday(laDate, vbMonday) = 6) Or (Weekday(laDate, vbMonday) = 7)) 
    End Function
    Quindi ad esempio:
    
    If WeekEnd(VariabileData) Then
       Me.Controls("d" & IndiceProgr).BackColor=vbRed
    Else
       Me.Controls("d" & IndiceProgr).BackColor=  Grigio
    End if
    Oppure, io preferisco questa:
    
    Select Case Weekday(VariabileData, vbMonday)
    	Case 6:                                Me.Controls("d" & IndiceProgr).BackColor= ColoreSabato
            Case 7:                                Me.Controls("d" & IndiceProgr).BackColor=ColoreDomenica
            Case Else:                             Me.Controls("d" & IndiceProgr).BackColor=ColoreFeriale
    End Select
    mentre per i Festivi uso queste Funzioni:
    
    Public Function Holiday(ByVal DateIsHoliday As Date) As Boolean
        Dim YearOfDate As Integer
        Dim NotWorkingDay(1 To 12) As Date
        Dim i As Integer
        
        YearOfDate = Year(DateIsHoliday)
        
        NotWorkingDay(1) = DateSerial(YearOfDate, 1, 1)
        NotWorkingDay(2) = DateSerial(YearOfDate, 1, 6)
        NotWorkingDay(3) = DateSerial(YearOfDate, 5, 1)
        NotWorkingDay(4) = DateSerial(YearOfDate, 5, 8)
        NotWorkingDay(5) = DateSerial(YearOfDate, 6, 2)
        NotWorkingDay(6) = DateSerial(YearOfDate, 8, 15)
        NotWorkingDay(7) = DateSerial(YearOfDate, 11, 1)
        NotWorkingDay(8) = DateSerial(YearOfDate, 12, 25)
        NotWorkingDay(9) = DateSerial(YearOfDate, 12, 26)
        NotWorkingDay(10) = EasterMonday(YearOfDate)
        NotWorkingDay(11) = NotWorkingDay(9) + 38 ' Ascension = lundi de Paques + 38
        NotWorkingDay(12) = NotWorkingDay(9) + 49 ' Lundi Pentecôte = lundi de Paques + 49
        
        For i = 1 To 11
            If Fix(DateIsHoliday) = NotWorkingDay(i) Then
                Holiday = True
                Exit For
            End If
        Next
        
    End Function
     
    Public Function EasterMonday(ByVal Iyear As Integer) As Date
            Dim L(6) As Long, Lj As Long, Lm As Long
           
            L(1) = Iyear Mod 19: L(2) = Iyear Mod 4: L(3) = Iyear Mod 7
            L(4) = (19 * L(1) + 24) Mod 30
            L(5) = ((2 * L(2)) + (4 * L(3)) + (6 * L(4)) + 5) Mod 7
            L(6) = 22 + L(4) + L(5)
           
            If L(6) > 31 Then
                    Lj = L(6) - 31
                    Lm = 4
            Else
                    Lj = L(6)
                    Lm = 3
            End If
            EasterMonday = DateAdd("d", 1, (Lj & "/" & Lm & "/" & Iyear))
    End Function
    Quindi riassumendo:
    
        Dim VariabileData As Date
        Dim i As Integer
        Dim DtInizio As Date
    
        dtInizio = #1/1/2020#   ' Esempio per Gennaio
        For i = 1 To 31
            VariabileData = DateAdd("d", i, dtInizio)
            If Holiday(VariabileData) Then
                 Me.Controls("d" & IndiceProgr).BackColor = ColoreFestivo 'io uso quello della Domenica
            Else
                Select Case Weekday(VariabileData, vbMonday)
                   Case 6:                                 Me.Controls("d" & IndiceProgr).BackColor = ColoreSabato
                   Case 7:                                 Me.Controls("d" & IndiceProgr).BackColor = ColoreDomenica
                   Case Else:                              Me.Controls("d" & IndiceProgr).BackColor = ColoreFeriale
                End Select
            End If
        Next
    Quì trovi una serie di funzioni per le Date, ad esempio che ti sarà utile è quella per determinare il 1°gg del Mese e l'Ultimo...
    forum.masterdrive.it/access-79/raccolta-funzioni-manipolazione-date-95382/

    FirstDayInMonth/LastDayInMonth

    Buon lavoro.
  • Re: Creazione form stile Calendario per planner impegni mensili

    @Alex ha scritto:




    Quì trovi una serie di funzioni per le Date, ad esempio che ti sarà utile è quella per determinare il 1°gg del Mese e l'Ultimo...
    forum.masterdrive.it/access-79/raccolta-funzioni-manipolazione-date-95382/

    FirstDayInMonth/LastDayInMonth

    Buon lavoro.
    sono stato un pò preso da altro... ma prima o poi mi toccherà rimetterci mani...

    per le funzioni Giorno citate pensavo di scopiazzarle già dal tuo demo Agenda stile outlook... che avevo già preso come riferimento ma mi mancava il passaggio della subform associata alla txtbox...

    non vorrei uscire fuori 3d ma credo che ne aprirò un altro per intercettare (olFolder....qlc) un calendario Google condiviso sull'outlook del client....mi manca solo quel pezzo per risolvere anche quella chicca... si accettano suggerimenti e grazie come sempre...
Devi accedere o registrarti per scrivere nel forum
6 risposte