[RISOLTO] Aggiornamento Recordsource sottomaschera di 2 livello

di il
2 risposte

[RISOLTO] Aggiornamento Recordsource sottomaschera di 2 livello

Buongiorno,
spero di non aver sbagliato titolo e,
come ho fatto in altre occasioni, procedo prima ad una panoramica e poi al problema:

Ho 3 Maschere: Maschera A, Maschera B e Maschera C. (intendo effettivamente solo 3 maschere - nessuna maschera doppione)
- In ogni Maschera A ci sono 04 Maschere B;
- In ogni Maschera B ci sono 14 Maschere C;
- In ogni Maschera C ci sono 04 TextBox;

Il Codice della maschera C è:

Option Compare Database

Private colTxtObj As New Collection

Private Sub Form_Load()

    Dim txtObject As clsTextBox
    Dim oCtrl As Access.Control
    
    For Each oCtrl In Me.Controls
        If oCtrl.ControlType = acTextBox Then
            Set txtObject = New clsTextBox
            oCtrl.OnChange = "[Event Procedure]"
            oCtrl.OnKeyDown = "[Event Procedure]"
            oCtrl.OnExit = "[Event Procedure]"
            oCtrl.OnEnter = "[Event Procedure]"
            Set txtObject.setItem = oCtrl
            colTxtObj.Add txtObject
            If Me.RecordsetClone.RecordCount > 0 Then
                Debug.Print oCtrl.Name
                oCtrl.SetFocus
                Call txtObject.TestDebug
            End If
        End If
    Next
   
    Set txtObject = Nothing
    Set oCtrl = Nothing
    
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Set colTxtObj = Nothing
End Sub

La classe instanziata nella maschra C ha il seguente codice:

Option Compare Database

Public WithEvents mTxtObject As Access.TextBox

Public Property Set setItem(textBoxControl As Access.TextBox)
    Set mTxtObject = textBoxControl
End Property

Private Sub Class_Terminate()
    Set mTxtObject = Nothing
End Sub

Private Sub mTxtObject_Change()
    'Codice che gestisce cosa deve succedere se modifico il valore di un textbox
End Sub

Private Sub mTxtObject_Enter()
    'Codice che gestisce cosa deve succedere se "entro in un textbox"
End Sub

Public Function TestDebug()
    Debug.Print mTxtObject.Name & " - " & mTxtObject.Value
End Function
All'apertura della maschera A, a cascata, vado ad aggiornare mediante ciclo for il recordsource di ognuna delle maschere C in maniera che ognuna presenti dati differenti.

Me.Controls("sfrm_HrzMilTwiceWeek_" & CStr(i)).Form.Controls("sfrm_HrzMilDay_" & CStr(j)).Form.RecordSource = strSQL
in pratica ogni maschera C mi fa vedere in nei 4 textbox, orario programmato di lavoro, orario effettuato, differenza ore, ore eccedenti.

E tutto va egregiamente nel senso che:
. quando la maschere A, B e C sono caricate i dati sono visualizzati correttamente e la modifica ai dati nei singoli textbox modifica in maniera corretta la tebella cui punta il recordsource;
- Se cambio valore nei textbox accade esattamente quello che ho previsto nell'evento onchange della classe ecc.

il problema riguarda un'operazione che vorrei fare nel momento in cui tutte le maschere sono state caricate ovvero, in particolare, mi piacerebbe controllare che il testo inserito nel textbox dell'orario programmato equello inserito nell'orario effettuato siano conformi ai criteri di input da me impostati all'interno della classe... una specie di maschera di input intelligente personalizzata per intendersi... solo che mi piacerebbe farlo sututte le maschere C che vedo sullo schermo (ovvero vorrei controllare tutti le 56 instanze alla Form...

la cosa bella è che, come detto in precedenza, se l'utente interagisce con i textbox tutto funziona regolarmente, ma se ad esempio in un textbox c'è un dato non conforme già inserito non riesco a rilevarlo al momento dell'aperture e non riesco a capire perché...

infatti se guardano l'esito della funzione pubblica "TestDebug" sembra quasi che il recordsource non sia stato aggiornato dalle istruzioni che ho inserito nella maschera A .. come se tali istruzioni fossero eseguite solo al termine del caricamento di tutte le sottomaschere B e C e quindi come se le istruzioni di quest'ultima maschera si riferissero ad un recordsource non aggiornato...

So che quello che ho scritto non è di facile comprensione ma io ci provo lo stesso...

Grazie

2 Risposte

  • Re: [RISOLTO] Aggiornamento Recordsource sottomaschera di 2 livello

    Mentre mi impegnavo a scrivere la problematica mi è venuta in mente una possibile soluzione e dopo averla appurata mi sono reso conto che "forse" ho risolto... in pratica ho pensato che se davvero le istruzioni nella Maschera A ovvero l'aggiornamento del recordsource di ogni singola Maschera C avviene quando quest'ultime sono già state caricate allora "forse" il controllo complessivo devo farlo nella maschera A e non nella maschera C nel momento in cui instanzio la classe che personalizza i textbox... infatti se nella maschera A inserisco una funzione del tipo:
    
    Private Function ControlRecordSource()
        Dim i As Integer, j As Integer
        Dim strSQL As String
        
        For i = 1 To 4
            For j = 1 To 14
                If Me.Controls("sfrm_HrzMilTwiceWeek_" & CStr(i)).Form.Controls("sfrm_HrzMilDay_" & CStr(j)).Form.RecordsetClone.RecordCount Then
                    Debug.Print Me.Controls("sfrm_HrzMilTwiceWeek_" & CStr(i)).Form.Controls("sfrm_HrzMilDay_" & CStr(j)).Form.Controls("txtProg").Value
                    Debug.Print Me.Controls("sfrm_HrzMilTwiceWeek_" & CStr(i)).Form.Controls("sfrm_HrzMilDay_" & CStr(j)).Form.Controls("txtE1").Value
                    Debug.Print Me.Controls("sfrm_HrzMilTwiceWeek_" & CStr(i)).Form.Controls("sfrm_HrzMilDay_" & CStr(j)).Form.Controls("txtE2").Value
                    Debug.Print Me.Controls("sfrm_HrzMilTwiceWeek_" & CStr(i)).Form.Controls("sfrm_HrzMilDay_" & CStr(j)).Form.Controls("txtE3").Value
                End If
            Next
        Next
    End Function
    
    riesco a vedere la situazione aggiornata di ogni singola instanza alla maschera C... tuttavia ho come l'impressione che ci sia qualcosa che mi sfugga....
  • Re: [RISOLTO] Aggiornamento Recordsource sottomaschera di 2 livello

    Concludo.

    Confermo la mia supposizione.. in effetti vengono eseguite prima le istruzioni della Maschera C (figlia di 2 livello), poi quelle della maschera B (figlia di 1 livello) e solo alla fine quella della maschera principale che le contiene tutte... io avevo supposto il contrario... mi sembrava più logico ma a quanto pare non è così...

    Pertanto effettuando il controllo a livello di Maschera A riesco ad accedere ai textbox della maschera C successivamente all'aggiornamento del recordsource e quindi a validarne la proprietà text

    Per me è [RISOLTO]
Devi accedere o registrarti per scrivere nel forum
2 risposte