CODICE VBA PER LA CREAZIONE DI N RECORD

Anonimo
2018-09-24T15:11:26+00:00

Ciao a tutta la community

sempre io a chiedere chiarimenti e soluzioni per il progetto che stò elaborando.

Il problema che vi pongo oggi è il seguente.

Ho ampliato il mio dbase in modo da fare la programmazione, o meglio a redigere, in modo semplicistico, il cronoprogramma finanziario del mio progetto e, di conseguenza, del finanziamento.

Ho creato una nuova tabella che ho chiamato CRONO, dove, per ogni singolo progetto, inserisco l'annualità di riferiemnto ed il relativo importo di spesa presunto che avrò nella stessa annualità per creare un cronoprogramma di spesa.

Naturalmente sia la tempistica (gli anni che prevedo per la realizzazione del progetto) che l'importo (ammontare della spesa presunta per quell'anno) sono molto fittizi, ma la norma richiede questo tipo di dati, per cui mi tornerebbe comodo inserirlo per avere il crono a disposizione.

Infine, nella maschera princiapale del mio progetto (tabella di riferiemnto PROGETTI ho aggiunto un campo numerico dove inserisco il numero delle annualità che si prevedono per la realizzazione dell'opera. Ho il limite massimo=quinquennale.

Vorrei che, nella Sottomaschera_CRONOPROGRAMMA , si creassero tanti record per quante annualità ho deciso di realizzare il progetto.

Esempio: se il mio progetto prevedo di realizzarlo in due anni nella sottomaschera_CRONOPROGRAMMA si dovranno creare due record con la prima annualità = all'anno corrente oppure, ancora meglio, che inserisco prima della creazione.

Spero di esser stato chiaro sulla soluzione che vorrei creare a cui io non riesco a dare soluzione.

Se troppo complicato mi limiterò ad inserire un controllo/blocco inserendo in una query il conteggio dei record inseriti nella tabella CRONO e confrontarli con le annualità che ho inserito nel campo "ANNUALITA' CRONOPROGRAMMA", qualora il vaore del conteggio sia uguale al valore inserito nel predetto campo un msgbox mi avvisa che non è consentito inserire altre annualità per quel crono.

Grazie del vs aiuto

PS: A questo link è scaricabile una demo del DB  

https://1drv.ms/u/s!AtAJ5hV8tzhMjzUbtJUyfBPC0roQ

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

17 risposte

Ordina per: Più utili
  1. Anonimo
    2018-10-13T22:53:06+00:00

    Ciao Luca,

    purtroppo nella "sottomaschera_CRONOPROGRAMMA" ci sono un po' di errori.

    Non so se già te l'avevo consigliato, la cosa più importante da fare è inserire la dichiarazione obbligatoria delle variabili "Option Explicit".

    Se l'avessi fatto, tale dichiarazione ti avrebbe condotto ad errori che ho in qualche modo corretto e che puoi verificare.

    Seleziona e copia tutto il codice qui sotto, apri la sottomaschera in visualizzazione struttura, entra in uno dei moduli e dopo dopo aver selezionato tutto il codice, incolli.

    Option Compare Database

    Option Explicit ' <- da aggiungere

    Dim nAnni As Integer

    Dim nn As Integer

    Private Sub ANNO_CRONO_BeforeUpdate(Cancel As Integer)

        If ANNO_CRONO < Year(Now()) Then

        MsgBox "ATTENTIONE !!! L'annualià inserita è antecedente a quella attuale.", vbInformation

        ' scritto male -> cencel = True

        Cancel = True

        Me.Undo

        End If

    End Sub

    Private Sub ANNO_CRONO_GotFocus()

    nn = Me!ANNO_CRONO

    End Sub

    Private Sub Form_BeforeUpdate(Cancel As Integer)

    Dim n As Variant

    If Parent!COLLAUDATO = False Then

        If DCount("RESIDUO_CRONO", "QRY_RESIDUO_CRONO_PROGETTO", "ID_PROG=" & Me!ID_PROG) > 0 Then

            n = DLookup("RESIDUO_CRONO", "QRY_RESIDUO_CRONO_PROGETTO", "ID_PROG=" & Me!ID_PROG) - Me!IMPORTO_CRONO

        Else

            n = Parent!IMPORTO_PROGETTO - Me!IMPORTO_CRONO

        End If

        If Me!IMPORTO_CRONO = 0 Then

            MsgBox "Attenzione, i dati sono incompleti" & vbCrLf & _

            "Per annullare i dati premere - esc - sulla tastiera.", vbInformation

            Me!IMPORTO_CRONO.SetFocus

            Cancel = True

            Exit Sub

        End If

        If Nz(DSum("IMPORTO_CRONO", "CRONO", "ID_PROG=" & Me!ID_PROG)) + _

            Me!IMPORTO_CRONO > Parent!IMPORTO_PROGETTO Then

            MsgBox "Il cronoprogramma complessivo è maggiore dell'importo del progetto." & vbCrLf & "I dati inseriti verranno annullati.", vbInformation

            Cancel = True

            Me.Undo

            Exit Sub

        End If

        If Nz(DSum("IMPORTO_CRONO", "CRONO", "ID_PROG=" & Me!ID_PROG)) + _

            Me!IMPORTO_CRONO < Parent!IMPORTO_PROGETTO Then

            MsgBox "L'importo residuo ancora da programmare per il progetto corrente è di " & Format$(n, "€ " & "#,###.00"), vbInformation

        ElseIf Nz(DSum("IMPORTO_CRONO", "CRONO", "ID_PROG=" & Me!ID_PROG)) + _

            Me!IMPORTO_CRONO = Parent!IMPORTO_PROGETTO Then

            MsgBox "Il cronoprogramma è stato correttamente compilato! ", vbInformation

        End If

        End If

    Me!VERIFICA_CRONO = 1

    End Sub

    Private Sub ANNO_CRONO_AfterUpdate()

    If DLookup("TOT_PROG_CRONO", "QRY_RESIDUO_CRONO_PROGETTO", "ID_PROG=" & Me!ID_PROG) = Parent!IMPORTO_PROGETTO And Parent!COLLAUDATO = 0 Then

        MsgBox "Il cronoprogramma per il progetto corrente è stato compilato correttamente! ", vbInformation

        'Dopo aggiornamento è errato -> Cancel = True

        'Dopo aggiornamento è errato -> Me.Undo

        Exit Sub

    End If

    Dim rs As DAO.Recordset

    Dim i As Integer

    If Me!IMPORTO_CRONO = 0 Then

        Exit Sub

    End If

    Set rs = CurrentDb.OpenRecordset("Crono")

        nAnni = Me!ANNO_CRONO - nn

        For i = 1 To nAnni

            rs.AddNew

                rs!ID_PROG = Me.ID_PROG

                rs!ANNO_CRONO = nn

                rs!IMPORTO_CRONO = 1

                rs!VERIFICA_CRONO = 1

            rs.Update

                nn = nn + 1

        Next i

        Me.Requery

    End Sub

    Private Sub IMPORTO_CRONO_BeforeUpdate(Cancel As Integer)

    If Me!IMPORTO_CRONO > Parent!IMPORTO_PROGETTO And Parent!COLLAUDATO = 0 Then

        MsgBox "Attenzione, l'importo inserito è maggiore dell'importo di progetto.", vbInformation

        Me.Undo

        Exit Sub

    End If

    End Sub

    Private Sub IMPORTO_CRONO_Change()

    If Me!VERIFICA_CRONO = 1 Then

       If MsgBox("Attenzione, per modificare il record bisogna prima eliminarlo, continuare?", _

        vbQuestion + vbCritical + vbYesNo) = vbNo Then

            Me.Undo

            Exit Sub

          Else

            Me.Undo

           ' DoCmd.OpenForm "ELIMINA_CRONOPROGRAMMA", , , "[ID_ PROG] = " & Me!ID_ PROG

            Exit Sub

        End If

    End If

    End Sub

    Una volta fatto, potrai capire come implementare i record con il numero di date scelte e quale altro codice eliminare per evitare che ostacoli tale operazione.

    Vladimiro

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2018-10-12T07:28:00+00:00

    Ciao Luca,

    non trovandomi a casa cerco di aiutarti acquisendo più informazioni :-)

    5 anni dal 2017:

    2017

    2018

    2019

    2020

    2021

    2018

    Quello che cercavo di farti capire non è un problema di errore ma di visualizzazione.

    Come da esempio, vedresti i 5 record implementati più l'ultimo(anno corrente) preimpostato.

    Se per te questa soluzione va bene, appena posso ti posto il codice.

    Vladimiro

    Ciao Vladimiro

    per ovviare alla visualizzazione dell'anno corrente ... eliminiamo il valore preimpostato dell'anno in modo da avere una visualizzazione più pulita del tipo:

    2017

    2018

    2019

    2020

    2021

    Come già ti ho scritto non ho nessuna fretta a riguardo, per cui fai tutto con calma !!!!

    Grazie Vladimiro del tuo interessamento.

    Luca

    PS: Questo db in buona sostanza possiamo asserire di averlo pensato in "tandem"

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2018-10-12T04:29:56+00:00

    Ciao Luca,

    non trovandomi a casa cerco di aiutarti acquisendo più informazioni :-)

    5 anni dal 2017:

    2017

    2018

    2019

    2020

    2021

    2018

    Quello che cercavo di farti capire non è un problema di errore ma di visualizzazione.

    Come da esempio, vedresti i 5 record implementati più l'ultimo(anno corrente) preimpostato.

    Se per te questa soluzione va bene, appena posso ti posto il codice.

    Vladimiro

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2018-10-11T13:43:12+00:00

    Ciao Luca,

    d'accordo, tu inserisci ad esempio 2019 e avendo come ultimo record ad esempio 2017 avresti:

    2017

    2018

    2019

    Il problema però è che dopo il 2019 ti darebbe in automatico, come da codice inserito, l'anno corrente, in questo caso il 2018.

    E' un po' un controsenso, o sbaglio?

    Vladimiro

    No Vladimiro

    quello che vorrei facesse il codice è diverso.

    Quando compilo la maschera principale del progetto, popolo il campo "ANNUALITA' CRONOPROGRAMMA" (esempio 3 - che stà per annualità del crono).

    Quando passo alla sottomaschera per la compilazione del cronoprogramma, dovrò scegliere la prima annualità (che attualmente io ho impostato uguale all'anno corrente).

    Dopo aver inserito la prima annualità e l'ammontare delle spesa che penso dovrò sostenere in quell'anno, il codice mi dovrebbe creare (magari dopo aver digitato l'importo) un record per il 2019 e successivamente un record per il 2020 (pari a tre annualità così come impostato nella maschera principale del progetto).

    Se immaginiamo, invece, di fare una programmazione di 5 anni con inizio dal 2017 (penso ad un progetto grosso già iniziato) il codice dovrebbe crearmi i record partendo dal primo che scelgo=2017.

    Se l'impostazione predefinita del campo annualità crea problemi ... possiamo anche eliminarla e scegliere dalla combo l'anno di riferimento da cui partire.

    Spero di essere stato più chiaro nell'esposizione.

    Ciao

    Luca

    PS: Ogni progetto ha una sua programmazione autonoma.

    La risposta è stata utile?

    0 commenti Nessun commento
  5. Anonimo
    2018-10-11T11:39:21+00:00

    Ciao Luca,

    d'accordo, tu inserisci ad esempio 2019 e avendo come ultimo record ad esempio 2017 avresti:

    2017

    2018

    2019

    Il problema però è che dopo il 2019 ti darebbe in automatico, come da codice inserito, l'anno corrente, in questo caso il 2018.

    E' un po' un controsenso, o sbaglio?

    Vladimiro

    La risposta è stata utile?

    0 commenti Nessun commento