Newsgroup: it.comp.appl.access
Titolo: un paio di consigli per affinare una maschera...

buongiorno a tutti.
da una maschera ho un pulsante che mi consente di creare un nuovo record.
Questo è il codice:
 
DoCmd.OpenForm "frmIntervento", acNormal, "", "", acAdd, acNormalForms![frmIntervento]!Progr.Value = DCount("[Progr]", "[Numerazioni]") + 1
 
Dopo aver creato e numerato il record vado a valorizzare una ventina di campi.
Forms![frmIntervento]!Status = ComboStatus
ecc ecc..
 
L'ultimo campo che viene compilato è "PrevRG" che ha ordine di spostamento 1, e valore predefinito "PT" in pratica all'apertura della maschera diventa attivo.
Questo campo ha sempre formato "PT+un numero di sei cifre".
 
Forms![frmIntervento]!PrevRG = Testo253
 
Funziona tutto bene.
Il mio problema è questo. Ricapitolo cosa mi succede operativamente.
Apro il record, la maschera si avvia e ci mette una trentina di secondi a valorizzare la ventina di campi.
Siccome (spessissimo) devo inserire a mano il valore (numerico) di "PrevRG" vorrei se possibile :
 
1)un bip quando è possibile iniziare a inserire il dato in "PrevRG". Mi è già successo di iniziare a digitare prima che fosse terminato il codice, interrompendo l'operazione di valorizzazione delle celle.
 
2)che il puntatore si posizionasse dopo il "PT" in modo tale da dover inserire solo il valore numerico e senze dover rispostare il cursore.
 
Grazie infinite a chi mi potrà aiutare, sono piccoli accorgimenti ma molto, molto utili...
grazie
 


Per la 1): alla fine del tuo modulo col codice aggiungi l'istruzione:
Beep
semplicemente.
Oppure all'inizio del modulo scrivi:
Declare Function sndPlaySound Lib "winmm.dll" _
Alias "sndPlaySoundA" (ByVal lpszSoundName As String, _
ByVal uFlags As Long) As Long
e alla fine del caricamento dei dati scrivi:
sndPlaySound CurrentProject.Path & "\ding.wav", 1
sostituendo il 'ding' con un qualche file wav di tuo gradimento, completo di percorso.
 
Per la 2): Forms!frmIntervento!PrevRG.selstart=2
oppure la casella di testo conterrà solo la parte numerica e il PT sarrà scritto nella sua etichetta. Quando poi scriverai il valore, questo sarà:
"PT" & Forms!frmIntervento!PrevRG
 
Quanto ai tempi di caricamento, mi sembrano ecccessivi, non vorrei che ti si aggrovigliassero dei calcoli in loop.
Di solito, io carico i dati in caselle non associate così:
Set RST =  = CurrentDb.OpenRecordset("SELECT * FROM <la tua tabella/query> WHERE <campo> = <valore>;")
e poi valorizzo caselle così:
Forms!miaForm!casella1=RST!campo1
Forms!miaForm!casella2=RST!campo2
Forms!miaForm!casella3=RST!campo3
eccetera. Quindi:
Set RST = Nothing
 
Buon lavoro
Riccardo Baldinotti


ciao Riccardo,
grazie mille per la tempestiva e esaustiva risposta, che sto già mettendo in pratica.
Per quanto attiene il punto 1) non riesco a venirne a capo.
Ti preciso che una volta inserito il codice in parola, la maschera non si apre più dando messaggio di errore:
 
"L'espressione su apertura immessa come impostazione della proprietà di evento ha generato l'errore seguente: Dopo End Sub, End Function o End Property sono ammessi solo commenti."
 
Ovviamente se bypasso la riga di codice di cui sopra, la maschera funziona regolarmente.
 
Ho anche cercato qualche esempio in google per capirne di più ed ho provato a scrivere:
 
Public Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long
 
purtroppo, complice la mia ignoranza, senza alcun miglioramento...
 
grazie infinite ciao

ciao Riccardo,
scusa se insisto ma anche al punto2, probabilmente per la mia capronaggine non riesco a venirne fuori.
In pratica la mia maschera contiene i dati di un nuovo record che andrò a valorizzare nella tabella "NumerazioniRoberto".
Ti scrivo il mio vecchio codice per le prime tre istruzioni e quello che pedestremente ho cercato di applicare in base al tuo prezaioso suggerimento.
 
'conta i record in tabella e incrementa di uno il numero progressivo.
    Forms![frmIntervento]!Progr.Value = DCount("[Progr]", "[NumerazioniRoberto]") + 1
 
'le mie vecchie tre prime istruzioni:
Forms![frmIntervento]!Status = ComboStatus
Forms![frmIntervento]!CentrodiCosto = TestoCosto
Forms![frmIntervento]!SettoreContabile = TestoCoCe
 
oviamente ComboStatus,TestoCosto e TestoCoCe sono caselle della maschera che vado a valorizzare nel corrispondente campo del nuovo record.
 
Questa è l'istruzione che ho compreso dal tuo esempio ma che non riesco a far funzionare...
 
Set RST = CurrentDb.OpenRecordset("SELECT * FROM <NumerazioniRoberto> WHERE <campo> = <valore>;")
 
    Forms![frmIntervento]!Status = RST!ComboStatus
    Forms![frmIntervento]!CentrodiCosto = RST!TestoCosto
    Forms![frmIntervento]!SettoreContabile = RST!TestoCoCe
ecc. ecc.
 
ti ringrazio ancora per il cortese aiuto, grazie  ciao.
 
 
 
 

>>>>  
http://www.bb2002.it
 :)  <<<<<
........... [ al lavoro ] ...........

 "L'espressione su apertura immessa come impostazione della proprietà di evento ha generato l'errore seguente: Dopo End Sub, End Function o End Property sono ammessi solo commenti."
 
Ehm... ha ragione! Il tuo codice è, per esempio, con:
Sub <mia routine>
... qui ci sono le tue istruzioni...
End Sub
La End spiega eappunto che le istruzioni sono finite. Quindi dovrai scrivere:
Sub <mia routine>
... qui ci sono le tue istruzioni...
Beep
End Sub


End Sub è già l'ultima riga di istruzione.....non riesco a capire dove sia l'errore....

 ti ringrazio ancora per il cortese aiuto, grazie  ciao.
 
Dunque, in primo luogo, le parole fra le parentesi angolari < e > vanno sostituite con i nomi reali delle tue tabelle o query. Per esempio:
Set RST = CurrentDb.OpenRecordset("SELECT * FROM NumerazioniRoberto WHERE IDprog = " & Forms![frmIntervento]!Progr & ";")
Nota che la SELECT è fra virgolette, perché stai passando il TESTO della query da eseguire, ma la parte Forms![frmIntervento]!Progr è fuori dalle virgolette, perché gli passi il valore effettivo.
Inoltre all'inizio del codice bisogna scrivere
Dim RST As Recordset
per spiegare cosa è quella 'parolaccia' RST.
 
Ma credo di capire che questo non è il tuo caso, perché vedo ora che i tuoi valori sono stati inseriti nelle caselle di un'altra maschera.  Se io lo avessi capito prima, non ti avrei ingolfato di istruzioni del mio primo post.
Se ComboStatus, TestoCosto, TestoCoCe eccetera sono caselle di una maschera dove hai il codice, forse è meglio scrivere Me.ComboStatus, Me.TestoCosto, Me.TestoCoCe, così si capisce meglio di che si tratta.
Mi spieghi perché hai messo i dati in una maschera, di cui non so il nome, e poi apri la maschera frmIntervento e ce li riscrivi?
Questo, come vedi, è un messaggio interlocutorio per:
- spiegare la procedura per valorizzare delle caselle con dati esistenti, cosa che non è il tuo caso ma magari ti potrà servire,
- precisarmi meglio la tua situazione reale.
Scusa la prolissità.
Riccardo Baldinotti

 End Sub è già l'ultima riga di istruzione.....non riesco a capire dove sia l'errore....
 
Allora mandaci il testo del tuo codice, quello che comincia con Sub e anche quello che trovi dopo End Sub.

ciao Riccardo e Ammammata,
 
cerco di spiegare meglio il mio problema e allego in calce il mio fatidico e orripilante codice.
 
Da una combo (in una prima maschera) scelgo il record (da una tabella esterna) che devo caricare nel mio db.
Scegliendo il record la ventina di campi che devo caricare (ComboStatus, TestoCosto,TestoCoCe, ecc.) vengono assegnati alle rispettive caselle presenti nella mia maschera.
Nella maschera stessa valorizzo anche altri campi da assegnare al nuovo record.
Quando ho finito, clicco su un pulsante (quello con il  mio codice riportato sotto) che:
 
-crea un nuovo record in tabella "NumerazioniRoberto"
-gli dà un numero "progr" +1
-valorizza il nuovo record con i valori contenuti nella mia maschera.
-salva il record.
 
quando ho creato il nuovo record, mi si apre la relativa maschera  "frmIntervento" che ci mette un pò, circa un minuto a caricarsi completamente.
Quando la maschera ha terminato di caricare tutti i dati,(la clessidra va e viene più volte) vorrei poter avere un segnale acustico o altro che mi avvisi che posso iniziare a lavorarci sopra.
Mi è già successo di iniziare a digitare prima del termine e di perdere i dati non ancora trasferiti.
 
Qui in calce il codice, grazie infinite a tutti per l'aiuto.
 
Private Sub Comando39_Click()
On Error GoTo Err_Comando39_Click
 
    Dim stDocName As String
    Dim stLinkCriteria As String
 
 
    'funzione per suono al termine valorizzazione celle maschera
'Public Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long
 
    'su conferma volontà creazione record aggiunge un nuovo record
    DoCmd.OpenForm "frmIntervento", acNormal, "", "", acAdd, acNormal
 
    'abbina i campi dell'Ufficio alla maschera avvio
    Forms![frmIntervento]!Progr.Value = DCount("[Progr]", "[NumerazioniRoberto]") + 1
 
 
'Set RST = CurrentDb.OpenRecordset("SELECT * FROM <NumerazioniRoberto> WHERE <campo> = <valore>;")
 
    Forms![frmIntervento]!Status = ComboStatus
    Forms![frmIntervento]!CentrodiCosto = TestoCosto
    Forms![frmIntervento]!SettoreContabile = TestoCoCe
    Forms![frmIntervento]!Filiale = TestoFili
    Forms![frmIntervento]!TipoUso = TestoUso
    Forms![frmIntervento]!Anno = "2015"
    Forms![frmIntervento]!Tecnico = Tecnico
    Forms![frmIntervento]!settore = Tecnico.Column(1)
    Forms![frmIntervento]!nomignolo = Tecnico.Column(2)
    Forms![frmIntervento]!settoreGIMMO = settore
    Forms![frmIntervento]!Tipoapertura = Tipoapertura
    Forms![frmIntervento]!CostoInvestimento = CostoInvestimento
    Forms![frmIntervento]!tipologia = Testo139
    Forms![frmIntervento]!dataapertura = Testo52
    Forms![frmIntervento]!Denominazione = Testo47
    Forms![frmIntervento]!CodiceImmobile = TestoCodimmo
    Forms![frmIntervento]!UnitàLocazione = TestoLoca
    Forms![frmIntervento]!UnitàEconomica = TestoEco
    Forms![frmIntervento]!Regione = TestoRegi
    Forms![frmIntervento]!indirizzo = TestoIndi
    Forms![frmIntervento]!CAP = TestoCAP
    Forms![frmIntervento]!Località = TestoLocalita
    Forms![frmIntervento]!PRO = TestoProv
    Forms![frmIntervento]!GIMMO = GIMMO
    Forms![frmIntervento]!DESCRIZIONE = Testo219
    Forms![frmIntervento]!TIPOINTERVENTO = Testo220
    Forms![frmIntervento]!settoreGIMMO = Testo221
    Forms![frmIntervento]!ComboGRUPPOMERCE = Testo250
    Forms![frmIntervento]!IMPORTOOrdinativo = Importo
    Forms![frmIntervento]!Ticket = Testo228
    Forms![frmIntervento]!PrevRG = Testo25
    Forms![frmIntervento]!PrevRG.SelStart = 2
 
 
'esegue suono disponibile
'sndPlaySound CurrentProject.Path & ":D\SIGH22.wav", 1
 
 
'in base a costo /investimento visualizza o meno la sottomaschera autorizzazioni
    If Me.CostoInvestimento = "Costo" Then
    Forms![frmIntervento]!SottomascheraAutorizzazioni.Visible = False
    Forms![frmIntervento]!CasellaCost.Visible = True
    Forms![frmIntervento]!CasellaInve.Visible = False
 
    ElseIf Me.CostoInvestimento = "Investimento" Then
    Forms![frmIntervento]!SottomascheraAutorizzazioni.Visible = True
    Forms![frmIntervento]!CasellaInve.Visible = True
    Forms![frmIntervento]!CasellaCost.Visible = False
    End If
 
'salva record
    DoCmd.RunCommand acCmdSaveRecord
 
Exit_Comando39_Click:
    Exit Sub
Err_Comando39_Click:
    MsgBox Err.Description
    Resume Exit_Comando39_Click
 
End Sub

     
Questa 'Set ... ' non serve più, i dati sono già caricati.

Effettivamente, se dopo la End Sub non c'è altro, è strano. Prova a mettere un punto d'interruzione alla riga 'DoCmd.OpenForm ...' e vedi cosa succede.

se inserisco l' istruzione:
 
Public Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long
 
 mi da errore 
 
 "L'espressione su apertura immessa come impostazione della proprietà di evento ha generato l'errore seguente: Dopo End Sub, End Function o End Property sono ammessi solo commenti." 
 
preciso che l'inizio del codice è :
 
Private Sub Comando39_Click()
On Error GoTo Err_Comando39_Click
 
    Dim stDocName As String
    Dim stLinkCriteria As String
'funzione per suono al termine valorizzazione celle maschera
    'Public Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long
 
 
e che ho provato a spostare la riga anche prima dei due Dim.
Sono un impedito e mi scuso ma il codice non è il mio pane.
 
grazie ancora pe rl'interesse.


Ecco, prima di:
Private Sub Comando39_Click()
spostaci Public Declare  eccetera.