Aggiornamento sottomaschera con ADO

di il
10 risposte

Aggiornamento sottomaschera con ADO

Ciao a tutti,
ho un problema con l'aggiornamento di una sottomaschera dopo aver eseguito una query in UPDATE.
Si tratta di un progetto Access con le tabelle su SQL Server e tutte le connessioni vengono effettuate con ADO
Maschera e sottomaschera sono queste:
[img]
MSM.jpg
MSM.jpg


Dopo aver caricato la maschera principale (mUtenti) che contiene la sottomaschera (smUtenti- oggetto maschera tabUtenti) popolo i campi sulla maschera, che utilizzo per aggiornare.
La sottomaschera carica i dati con ADO con questa routine su Form_Load

If Conn.State <> 1 Then
Conn.Open (strConn)
End If

txtSql = "SELECT idUtente, Nome, Cognome, Utente, PW, Profilo, Attivo, Abilitato " _
    & "FROM dbo.tUtenti A, dbo.tProfili B " _
    & "Where A.idProfilo= B. idProfilo "

With rsUtenti
Set .ActiveConnection = Conn
    .CursorType = adOpenKeyset
    .CursorLocation = adUseClient
    .LockType = adLockOptimistic
    .Open txtSql
End With

Set Me.Recordset = rsUtenti

c_idUtente.ControlSource = "idUtente"
c_Nome.ControlSource = "Nome"
c_Cognome.ControlSource = "Cognome"
c_Utente.ControlSource = "Utente"
c_Profilo.ControlSource = "Profilo"
c_Attivo.ControlSource = "Attivo"
c_Abilitato.ControlSource = "Abilitato"
Quando aggiorno i dati utilizzando un comando cmdSalva legato al tasto "Salva", modifico i dati sul DB ma non riesco a fare il refresh della sottomaschera.
Le ho provate tutte (refresh, requery, ecc) ma non risco ad aggiornare la tabella.
Credo che il motivo sia che Requery non funziona dato che nel subform non è presente l'origine record - gliela passo con il recordset ADO.
Ho provato a capire se c'è un modo per fare il reload della subform senza chiudere il form ma non ho trovato come
Mi sono letto anche tutti i post che ho trovato sull'argomento ma nessuno caricava i dati con ADO.
Grazie in anticipo
Ciao
R

10 Risposte

  • Re: Aggiornamento sottomaschera con ADO

    Metodo assai originale...

    Su che oggetto esegui il Requery...?
    Se sulla Form, ovviamente non va bene, hai provato sul RS ADO...?
    rsUtenti.Requery
    Ovviamente il RS deve rimanere un'oggetto aperto, se lo chiudi... non funziona, ed in quel caso devi Rieseguire quanto esegui su LOAD.
  • Re: Aggiornamento sottomaschera con ADO

    Ciao Alex,
    grazie per la risposta.
    Ci avevo pensato anche io, ma quando il Form finisce si eseguire il load chiude il recordset.
    Oppure no, ma non so come identificarlo.
    L'ho dichiarato come public su un modulo "Public rsUtenti As New ADODB.Recordset"
    R
  • Re: Aggiornamento sottomaschera con ADO

    PS: ho provato a fare il requery sia sul form che sul subform
    
    'Forms!Form_mUtenti!tabUtenti.Requery
    'Form_smUtenti.Form.Refresh
    'Form_mUtenti.Form.Requery
    'Form_mUtenti.Form.Refresh
    
  • Re: Aggiornamento sottomaschera con ADO

    Il Form non fa nulla, se il recordset viene chiuso sei tu che lo chiudi.
    Non serve dichiararlo come Public in un modulo, basta dichiararlo come Private nella Classe della Maschera, vive finchè vive la maschera... lo si chiude su UNLOAD.

    Perchè non usi il normale metodo DAO con Linked Table...?
    Chi usa un RDBMS, spesso, ha un'approccio che con Access non ha nulla a che fare... mi chiedo perchè sbattere la testa a piegare un sistema che offre il massimo della semplicità con metodi standard, che ovviamente non sono questi...!!!
  • Re: Aggiornamento sottomaschera con ADO

    Ho letto più forum e con SQL Server consigliano tutto ADO.
    Non vorrei linkare le tabelle pechè vorrei poi fare un programma ACCDE e non dare la possibilità agli utenti di vedere i dati
    Non so se sia la strada migliore, ma ho preso questa...
    Mi dici che il recordset rimane aperto (io non lo chiudo da codice): come faccio a indicare il riferimento dalla Form principale?
    Grazie
  • Re: Aggiornamento sottomaschera con ADO

    IlRed ha scritto:


    Ho letto più forum e con SQL Server consigliano tutto ADO.
    Indica le fonti, che magari leggiamo bene di cosa si parla...
    ADO si usava con i progetti ADP che consentivano di rendere il progetto NON DIPENDENTE dal Driver Nativo di Access DAO...!
    Oggi i progetti ADP non sono più supportati ed il driver nativo è sempre DAO, e, usare ADO è da ragionare in modo serio, non semplicemente con 2 chiacchiere.

    IlRed ha scritto:


    Non vorrei linkare le tabelle pechè vorrei poi fare un programma ACCDE e non dare la possibilità agli utenti di vedere i dati
    Non so se sia la strada migliore, ma ho preso questa...
    Chi ti ha messo in testa queste cose...?
    Secondo te quindi chi usa le LINKED TABLE, peraltro lo strumento principale di Access... ha lo scopo diverso, ovvero di consentire all'utente di giocare con le tabelle...?

    IlRed ha scritto:


    Mi dici che il recordset rimane aperto (io non lo chiudo da codice): come faccio a indicare il riferimento dalla Form principale?
    Grazie
    Se la variabile è dichiarata come ti ho detto...
    
    Set Me.Recordset = rsUtenti
    Mi capita da anni di vedere persone che si lasciano condizionare da amici che sviluppano in altri linguaggi, ad esempio VB6, il confronto era questo, e, senza nemmeno capire cosa viene detto, si cercava di applicare la logica di VB6 ad Access...
    Senza entrare nel merito di cosa fosse meglio... è indiscutibile che sono 2 prodotti diversi, e devono essere usati per quello che sono stati fatti.
    Usare Access come si usava VB6 e poi lamentarsi che ci sono problemi... a mio avviso impone una seria riflessione.

    Ora, se prima ci si sforzasse a capire gli aspetti Tecnici, magari poi si riuscirebbe a cogliere meglio tutta una serie di cose, incluso che forse Access non è il prodotto giusto, o forse che è sempre meglio capire di cosa si parla prima di partire a testa bassa con considerazioni "relative".

    Mio convincimento è che hai sbagliato tutto.
  • Re: Aggiornamento sottomaschera con ADO

    Per la scelta tra ADO e DAO la fonte è questa
    https://support.microsoft.com/it-it/office/connettere-access-a-sql-server-050d88f3-b2d6-4e76-b6f9-f3c556f139ea
    Al fondo dell'articolo dice "..Tuttavia, quando si esegue la migrazione a SQL Server, è consigliabile usare ADO per rendere la soluzione più efficiente". Non sono così esperto da valutare...ma detto direttamente da Microsoft mi sono fidato.
  • Re: Aggiornamento sottomaschera con ADO

    IlRed ha scritto:


    Per la scelta tra ADO e DAO la fonte è questa
    https://support.microsoft.com/it-it/office/connettere-access-a-sql-server-050d88f3-b2d6-4e76-b6f9-f3c556f139ea
    Al fondo dell'articolo dice "..Tuttavia, quando si esegue la migrazione a SQL Server, è consigliabile usare ADO per rendere la soluzione più efficiente". Non sono così esperto da valutare...ma detto direttamente da Microsoft mi sono fidato.
    Il suggerimento lo prendiamo, ma MS ha sostenuto cose che poi ha ritrattato un'anno dopo... come il fatto che ODBC fosse morto, a favore di OLEDB, e molte altre cose...
    Questa affermazione, tuttavia va capita nella sua complessità, e la differenza la fa proprio la tecnica di approccio, se si lavora in modalità DataBound su Linked o meno...
    Se si lavora in Unbound è evidente che ADO sia meglio, ma la differenza tra lavorare Bound ed Unbound è il cuore di Access che lo fa preferire, pur con i suoi limiti, ad altre scelte per velocità di "Produzione" su cose "easy"...
    Se devo valutare di usare Access con ADO, con tutto quello che ne consegue..., ho sbagliato prodotto, uso NET...
  • Re: Aggiornamento sottomaschera con ADO

    Grazie alle tue indicazioni sono riuscito a risolvere. Ora devo uscire, domani posto il risultato.
    Grazie ancora
    Ciao
    R
  • Re: Aggiornamento sottomaschera con ADO

    Ciao Alex,
    alla fine sono riuscito a far aggiornare la subform spostando la routine di caricamento su un modulo e togliendolo dal dal form.
    Non ho capito, però, perchè prima non funzionava dato che le istruzioni sono le stessa....tu lo sai, vero? ...per favore dimmelo.
    A dire la verità ho fatto una modifica: ho cambiato il CursorType da adOpenKeyset a adOpenDynamic, Può essere questo?'
    
    txtSql = "SELECT idUtente, Nome, Cognome, Utente, PW, Profilo, Attivo, Abilitato " _
        & "FROM dbo.tUtenti A, dbo.tProfili B " _
        & "Where A.idProfilo= B. idProfilo "
    
    With rsUtenti
    Set .ActiveConnection = Conn
        .CursorType = adOpenDynamic  'adOpenKeyset
        .CursorLocation = adUseClient
        .LockType = adLockOptimistic
        .Open txtSql
    End With
    
    rsUtenti.Requery
    Set Form_smUtenti.Recordset = rsUtenti
    
    Form_smUtenti.c_idUtente.ControlSource = "idUtente"
    Form_smUtenti.c_Nome.ControlSource = "Nome"
    Form_smUtenti.c_Cognome.ControlSource = "Cognome"
    Form_smUtenti.c_Utente.ControlSource = "Utente"
    Form_smUtenti.c_Profilo.ControlSource = "Profilo"
    Form_smUtenti.c_Attivo.ControlSource = "Attivo"
    Form_smUtenti.c_Abilitato.ControlSource = "Abilitato"
    
    Su Ms hai ragione, dicono e fanno tutto e il contrario di tutto, ma ci li dobbiamo tenere
    Grazie di tutto
Devi accedere o registrarti per scrivere nel forum
10 risposte