Condividi tramite

Access apertura maschera vai a record

Anonimo
2016-04-06T11:41:31+00:00

Buongiorno, sono di nuovo a chiedere lumi su un problema.

Ho una maschera continua con una serie di campi "precompilati"; l'operatore deve inserire solamente il campo "città" e il campo "importo". Alla sua apertura vorrei che:

  • se tutti i campi "importo" di tutti i records sono null : il cursore si posizioni sul primo record;
  • se alcuni campi "importo" sono compilati (diversi da null): il cursore si posizioni sul primo null.

Ho provato con:

 If [Importo] = Null Then

DoCmd.GoToRecord acDataForm, [miamaschera], acFirst

Else

DoCmd.GoToRecord acDataForm, [miamaschera], acNext

End If

e alcune svariate combinazioni, ma da errore e non riesco a capire perché.

Grazie e buona giornata.

Andrea

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
2016-04-07T12:34:31+00:00

ciao Andrea,

Private Sub Form_Load()

Me.Recordset.AddNew

With Me.RecordsetClone

    .FindFirst "nz(importo)=''"

    If Not .NoMatch Then

        Me.Bookmark = .Bookmark

    End If

End With

Me.importo.SetFocus

End Sub

Grazie ancora e buon giovedì.

anche a te :-)

Andrea

ciao, Sandro

La risposta è stata utile?

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2016-04-06T12:27:41+00:00

ciao Andrea,

come stai?

Private Sub Form_Load()

With Me.RecordsetClone

    .FindFirst "len(importo & '')=0"

    If Not .NoMatch Then

        Me.Bookmark = .Bookmark

        Me.importo .SetFocus

    End If

End With

End Sub

ciao,  Sandro.

La risposta è stata utile?

0 commenti Nessun commento

4 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2016-04-09T11:48:44+00:00

    ciao Andrea,

    [...]

    Almeno, se capisco il codice, le prossime volte spero di essere autonomo e non scocciarvi più.

    [...]

    non tu scocci mai, anzi...l'approccio di capire il codice non è da tutti e lo apprezzo molto ed è l'unico vero modo per imparare altrimenti il tutto si riduce ad un infruttuoso ed inutile copia/incolla.

    quindi così hai non porte ma portoni spalancati :-)

    [...]

    • con with me.recordsetclone si inizia un ciclo che fa riferimento all'origine dei dati;

    [...]

    non proprio. un ciclo è tipico delle istruzioni for...next....for each ...next...do while....loop ...oppure do... loop until.

    qui usiamo il costrutto with...end with per riferirci al recordsetclone della form, che è appunto un clone del recordset della form stessa.

    il costrutto with...end with permette di rendere il codice ( mio parere) più chiaro e lineare e scorrevole ed inoltre di evitere di ripetere sempre in modo ridondate la variabile oggetto.

    ad esempio  supponi di dichiarare un recordset

    dim rst as dao.recorset

    set rst=dbengine(0)(0).openRecordset("tuaTabella",dbopneDynaset)

    e di aggiungere un riga, è meglio procedere così :

    with rst

          .addnew

          .fields("mioCampo")=mioValore

         .fields("mioCampo2")=mioValore2

          .fields("mioCampo3")=mioValore3

        .update

    end with

    oppure

    rst.addnew

    rst.fields("mioCampo")=mioValore

    rst.fields("mioCampo2")=mioValore2

    rst.fields("mioCampo3")=mioValore3

    rst.update

    entrambe corrette ma la prima è certamente migliore.

    Il costrutto può essere anche nidificato.

    Lo stesso uso e stessa logica per quanto alla proprietà recordsetClone del post precedente.

    [...]

    • con .FindFirst "nz(importo)=''" cerchiamo il primo record con importo null;

    [...]

    utilizziamo il metodo findFirst alla ricerca del primo record che soddisfa la condizione impostata rendendo quel record se individuato il record corrente.

    [...]

    con If Not .NoMatch Then se non viene rispettata la condizione precedente allora;

    [...]

    E' sempre bene verificare la proprietà noMatch per determinare che la ricerca abbia dato esito positivo.

    NoMatch rende vero se non viene trovata alcuna corrispondenza quindi falso se ne trova:

    invochiamo if not .noMatch per identificare il soddisfacimento della condizione precedentemente impostata.

    mi dirai tu....non era più facile chiamarla match ed evitare la doppia negazione....? si, ma MSFT così ha deciso.

    [...]

    con Me.Bookmark = .Bookmark non ho la più pallida idea

    [...]

    bookmark significa segnalibro, quell'istruzione non fa altro che sincronizzare il recordset della form con il recorsetClone, in pratica è l'esecuzione di questa istruzione che sposta il puntatore sul record che soddisfa la condizione ed li successivo setFocus sposta il cursore sul controllo scelto.

    [...]

    Ho provato ad impostare dopo "end with" come "setfocus" un altro campo, ma mi da errore: perché ?

    [...]

    end with non lo devi spostare lascialo li, ma se sposti il focus su un altro controllo ( controlli propri di forms e reports campi di tabelle e queries) dovresti vedere lo spostamento.

    il setFocus messo alla fine permette di spostare il cursore sul record nuovo nel momento in cui la condizione settata in findFirst non è soddisfatta.

    Ciao, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2016-04-09T10:56:49+00:00

    Da diligente alunno ho provato a capire il codice da te suggerito, che funziona perfettamente, ma non ho capito quasi niente; credo di aver intuito che:

    • con with me.recordsetclone si inizia un ciclo che fa riferimento all'origine dei dati;
    • con .FindFirst "nz(importo)=''" cerchiamo il primo record con importo null;

    - con If Not .NoMatch Then se non viene rispettata la condizione precedente allora;

    • con Me.Bookmark = .Bookmark non ho la più pallida idea.

    Ho provato ad impostare dopo "end with" come "setfocus" un altro campo, ma mi da errore: perché ?

    Potresti per cortesia verificare se quel poco che credo di aver intuito è giusto ? Almeno, se capisco il codice, le prossime volte spero di essere autonomo e non scocciarvi più.

    Grazie

    Andrea

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2016-04-07T06:54:38+00:00

    Tutto bene, grazie Sandro: tempestivo e utile come al solito.

    Funziona benissimo salvo che in un caso;

    • se la maschera è completamente vuota negli importi OK
    • se sono compilati alcuni importi OK
    • se sono compilati tutti gli importi si posiziona sul primo record; nella prima domanda non lo avevo specificato ma vorrei che si posizionasse su un nuovo record.

    Grazie ancora e buon giovedì.

    Andrea

    La risposta è stata utile?

    0 commenti Nessun commento