Condividi tramite

Lettura, Inserimento, Eliminazione, Modifica dei record

Anonimo
2010-11-17T09:20:14+00:00

Ciao a tutti,

Consideriamo una maschera (di inserimento dati in TABELLA2) nella quale ci sono tre caselle di testo:

“Casella_Giorno”          formato “Data in cifre”   i cui dati vanno inseriti nel campo “Giorno”

“Casella_Numero”         formato “Numero gen.”  i cui dati vanno inseriti nel campo “Numero”

“Casella_Euro”            formato “Euro”             i cui dati vanno inseriti nel campo “Euro”

Per la lettura, l’inserimento, l’eliminazione e la modifica dei record, io utilizzo le istruzioni seguenti.

Esse funzionano bene, però volevo chiedere (accertarmi) se sono quelle ottimali, oppure se sono

migliorabili in termini di brevità ed efficienza?

Lettura

Dim rs As DAO.Recordset

Set rs = CurrentDb.OpenRecordset("SELECT * FROM TABELLA2 WHERE _

Giorno = #" & Format(Casella_Giorno.Value, "mm/dd/yyyy") & "# ", dbOpenDynaset)

    ……….

Set rs = Nothing

Inserimento

Dim strSQL As String 

strSQL = "INSERT INTO TABELLA2 (Giorno, Numero, Euro) VALUES _

(‘" & Casella_Giorno.Value & "’ ,’" & Casella_Numero.Value & "’,'" & Casella_Euro.Value & "')”

CurrentDb.Execute strSQL,  dbFailOnError

Eliminazione

Dim strSQL As String

strSQL = "DELETE * FROM TABELLA2 WHERE Giorno = ‘" & Casella_Giorno.Value & "’ "

CurrentDb.Execute strSQL,  dbFailOnError

Modifica

Dim strSQL As String

strSQL = "UPDATE TABELLA2 SET Numero = Casella_Numero.Value, Euro = Casella_Euro.Value 

WHERE Giorno = ‘" & Casella_Giorno.Value & "’ "

DoCmd.SetWarnings False        'Disattiva gli avvisi dell'esecuzione query

DoCmd.RunSQL strSQL            'Esegui la query di registrazione record

DoCmd.SetWarnings True         'Riattiva gli avvisi dell'esecuzione query

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

Risposta accettata dall'autore della domanda

Anonimo
2010-11-17T15:16:53+00:00

Eulero wrote:

...

Esse funzionano bene, però volevo chiedere (accertarmi) se sono

quelle ottimali, oppure se sono migliorabili in termini di brevità ed efficienza?

Lettura

Dim rs As DAO.Recordset

Set rs = CurrentDb.OpenRecordset("SELECT * FROM TABELLA2 WHERE _

Giorno = #" & Format(Casella_Giorno.Value, "mm/dd/yyyy") & "# ",

dbOpenDynaset)

....

Set rs = Nothing

Il tuo modo è ok. Certo ci sono gusti e varianti. Io di solito lo faccio così:

Dim db As DAO.Databae

Dim rs As DAO.Recordset

Dim strSQL As String

Set db = Currentdb

strSQL = "SELECT * FROM TABELLA2" & _

               " WHERE Giorno = " & cdbl(Me!Casella_Giorno

Set rs = db.OpenRecordset(strSQL) , dbOpenDynaset)

....

Set rs = Nothing

Commenti:

La variabile di oggetto per Currentdb faccio almeno se l'uso

più volte nella procedura per non istanziare il db più volte.

La variabile strSQL uso già se l'enunciato SQL non è un semplice

"SELECT * FROM tabella" ma include una clausola WHERE ecc.

Se fai un'interruzione di riga in una stringa SQL devi usare " & _

La tua versione deve dare un errore.

Ci sono diversi varianti per passare una data alla stringa SQL,

vedi anche http://www.donkarl.com/it?FAQ6.8.

Scrivo sempre Me! se si tratta di controlli sulla maschera dove

si trova anche il codice. Così si vede subito di cosa si tratta e

non è da confondere con variabili ecc.

Inserimento

Dim strSQL As String

strSQL = "INSERT INTO TABELLA2 (Giorno, Numero, Euro) VALUES _

('" & Casella_Giorno.Value & "' ,'" & Casella_Numero.Value & "','" &

Casella_Euro.Value & "')"

CurrentDb.Execute strSQL, dbFailOnError

strSQL = "INSERT INTO TABELLA2 (Giorno, Numero, Euro)" & _

        " VALUES('" & _

          Me!Casella_Giorno & "','" & _

          Me!Casella_Numero & "','" & _

          Me!Casella_Euro & "')"

Nella tua variante le carattere ' ' invece degli apostrofi ' devono dare errori.

...

Modifica

Dim strSQL As String

strSQL = "UPDATE TABELLA2 SET Numero = Casella_Numero.Value, Euro =

Casella_Euro.Value

WHERE Giorno = '" & Casella_Giorno.Value & "' "

Certo qui mancano alcuni " & ecc. per combinare la stringa e di nuovo

non sono apostrofi ma penso questo sai bene.

DoCmd.SetWarnings False 'Disattiva gli avvisi dell'esecuzione query

DoCmd.RunSQL strSQL 'Esegui la query di registrazione record

DoCmd.SetWarnings True 'Riattiva gli avvisi dell'esecuzione query

Perché esegui la query con RunSQL invece del Execute di più sopra?

Disattivare gli avvisi è sempre un po' pericoloso.

Vedi anche  http://www.donkarl.com/it?FAQ2.4.


Ciao

Karl

*******

Access FAQ:  http://www.donkarl.com/it

La risposta è stata utile?

0 commenti Nessun commento

4 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2010-11-22T08:14:16+00:00

    Grazie Karl!

    Clausole WHERE

    Quindi in tutte le clausole WHERE di Lettura, Eliminazione, Modifica

    si indica il giorno così: Giorno = “ & DCbl(Me!Casella_Giorno)

    (  e non così:   Giorno = ‘ “ & Casella_Giorno.Value & ”   come avevo scritto

    erroneamente nel mio primo post, in Eliminazione e Modifica. )

    Volevo chiarire alcuni dettegli:

    Inserimento

    Nel codice di Inserimento, i VALUES della strSQL si possono racchiudere tra 

    apostrofi e apici ( ‘ “ & Me!Casella & ” ’ ) per tutti i formati* di caselle?

    E se invece delle caselle venissero utilizzate delle variabili, si racchiudono

    anch’esse tra apostrofi e apici ( ‘ “ & Variabile & ” ’ ) per tutti i formati* ?

    (Se non sbaglio per gli integer è sufficiente utilizzare solo gli apici “  ”)

    * formati: data, string, integer, double, valuta, percentuale, ecc.

    Modifica

    Riguardo il codice di Modifica, volevo chiedere quali formati di caselle,

    devono essere indicati con str  ( es.:   “ & str(Me!Casella_Euro) & ” )

    e quali senza str  ( es.:   “ & Me!Casella_Numero & ” ) ?

    E se invece delle caselle venissero utilizzate delle variabili, è la stessa cosa?

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2010-11-19T18:16:46+00:00

    Eulero wrote:

    ...

    1. Il codice: Set db = CurrentDb serve per non istanziare il db più

    volte, per esempio

    quando all'interno di una procedura (es. Sub) si estraggono dati da

    diverse tabelle.

    Alla fine della procedura se non sbaglio bisogna scrivere: Set db =

    Nothing

    Sì.

    Inserimento

    Non capisco: "Nella tua variante le carattere ' ' invece degli

    apostrofi ' devono dare errori"

    Abbiamo usato entrambi sia apostrofi (') che apici ("), per esempio:

    ' " & Me!Casella_Giorno & " '

    Se non sbaglio per date, euro e double è necessario usare: ' "

    Casella " ' , invece per integer

    è sufficiente usare " Casella " .

    Credo che è solo un problema coll'aspetto del font che usi nel forum.

    I tuoi apostrofi per me sembrano come segni diversi ma se sono

    apostrofi e apici "normali" non ci sono problemi.

    Modifica

    Utilizzo il seguente codice:

    DoCmd.SetWarnings False 'Disattiva gli avvisi dell'esecuzione query

    DoCmd.RunSQL strSQL 'Esegui la query di registrazione record

    DoCmd.SetWarnings True 'Riattiva gli avvisi dell'esecuzione query

    perchè con il codice:

    db.Execute strSQL, dbFailOnError

    mi esce un errore di run-time 3061: Parametri insufficienti. Previsto

    n.

    Dove n è il numero di campi presenti in strSQL. Non riesco capire il

    perché !?

    Nel tuo messaggio precedente hai scritto che si tratta di:

    strSQL = "UPDATE TABELLA2 SET Numero = Casella_Numero.Value,

    Euro = Casella_Euro.Value

    WHERE Giorno = '" & Casella_Giorno.Value & "' "

    DoCmd.RunSQL è un metodo di macro che praticamente fa lo stesso

    che l'editore per query di Access e capisce riferimenti a oggetti di Access.

    Execute invece è un metodo DAO (o ADO) che non sa cosa sono

    questi riferimenti. Per questo il messaggio di parametri insufficienti.

    Per Execute devi escludere i riferimenti dalla stringa e invece

    passare i valori alla stringa prima di eseguirla. Cioè:

    strSQL = "UPDATE TABELLA2"  & _

    " SET Numero =" & Me!Casella_Numero  & _

    ", Euro =" & str(Me!Casella_Euro)  & _

    " WHERE Giorno = " & cdbl(Me!Casella_Giorno)

    db.Execute strSQL, dbFailOnError


    Ciao

    Karl

    *******

    Access FAQ:  http://www.donkarl.com/it

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2010-11-19T16:44:18+00:00

    Grazie mille per i consigli che mi hai dato Karl !!

    Hai ragione per fare le interruzioni di riga in una stringa SQL bisogna utilizzare:  “ & _

    Lettura

    Dim db As DAO.Database                                                                   

    Dim rs As DAO.Recordset                                 

    Dim strSQL As String

    Set db = Currentdb

    strSQL = "SELECT * FROM TABELLA2" & _

                   " WHERE Giorno = " & CDbl(Me!Casella_Giorno)

    Set rs = db.OpenRecordset(strSQL , dbOpenDynaset)

    ....

    Set rs = Nothing

    Quindi se ho capito bene:

    1)   Se c’è una clausola WHERE ecc. va bene utilizzare tutto il codice scritto sopra,

    se invece non ci sono clausole, allora conviene sostituire il codice azzurro con:

    Set rs = db.OpenRecordset("SELECT * FROM TABELLA2", dbOpenDynaset)

    2)   Per passare una data alla stringa SQL mi piace ilcodice:  " & CDbl(Me!Casella_Giorno)

    perché è il più breve di tutti.

    3)   Si il codice:   Me!Casella_Giorno      è meglio di:   Casella_Giorno.Value

    perché si confonde meno con le variabili.

    4)   Il codice:   Set db = CurrentDb    serve per non istanziare il db più volte, per esempio

    quando all’interno di una procedura (es. Sub) si estraggono dati da diverse tabelle.

    Alla fine della procedura se non sbaglio bisogna scrivere:   Set db = Nothing

    Inserimento

    Non capisco: “Nella tua variante le carattere ' ' invece degli apostrofi ' devono dare errori”

    Abbiamo usato entrambi sia apostrofi (‘) che apici (“), per esempio: ‘ " & Me!Casella_Giorno & " ’

    Se non sbaglio per date, euro e double è necessario usare: ‘ “ Casella ” ’ , invece per integer

    è sufficiente usare “ Casella ” .

    Eliminazione

    Visto che anche nell’eliminazione c’è la clausola WHERE, il codice si può scrivere così:

    Dim db As DAO.Database

    Dim strSQL As String

    Set db = Currentdb

    strSQL = "DELETE * FROM TABELLA2” & _

                 “ WHERE Giorno = " & CDbl(Me!Casella_Giorno)

    db.Execute strSQL,  dbFailOnError

    Modifica

    Utilizzo il seguente codice:

    DoCmd.SetWarnings False        'Disattiva gli avvisi dell'esecuzione query

    DoCmd.RunSQL strSQL            'Esegui la query di registrazione record

    DoCmd.SetWarnings True         'Riattiva gli avvisi dell'esecuzione query

    perchè con il codice:

    db.Execute strSQL,  dbFailOnError

    mi esce un errore di run-time 3061: Parametri insufficienti. Previsto n.

    Dove n è il numero di campi presenti in strSQL. Non riesco capire il perché !?

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2010-11-19T16:03:14+00:00

    Ciao

    Ci sono novità in merito al tuo problema?

    Ricorda sempre di tener informato il forum.

    Saluti


    Gianluca Cani.

    Microsoft Certified Professional - Technology Specialist

    EMEA Global Technical Support Center

    Se questo post ti è stato utile, clicca su "Vota come utile”

    In questo modo aiuterai gli altri utenti a trovare la soluzione al problema

    La risposta è stata utile?

    0 commenti Nessun commento