Newsgroup: it.comp.appl.access
Titolo: Gestione recordset vuoto e pulsanti sulla barra delle applicazioni

Due domandine facili facili per voi.
1. In una maschera ho un pulsante che ne apre un'altra usando il
comando:
"DoCmd.OpenForm NomeForm, , , strFiltro" dove strFiltro contiene una
stringa Sql. Voglio che se strFiltro non produce nessun record, la nuova
maschera non venga aperta e venga mostrato un messaggio del tipo "Nessun
record presente!". Ho provato con il seguente codice nell'evento
Form_Open della nuova maschera:
If Nz(IDSoggetto) = 0 Then
   MsgBox "Nessun soggetto presente!", vbExclamation
   Cancel = True
EndIf
Ma non funziona: mi da un messaggio del tipo "Nessun valore
nell'espressione immessa!" ed apre la maschera ugualmente.
Come posso ottenere questa funzionalità (ci vorrebbe qualcosa di simile
all'evento Report_NoData dei report, ma per le maschere non c'è niente
di simile).
2. Secondo problema: ogni volta che apro una maschera in
un'applicazione, tengo aperte quelle precedenti, questa soluzione non
sarà il massimo dell'eleganza in termini di programmazione, ma è
necessaria perché spesso ho bisogno di scambiare informazioni con le
maschere precedenti e, in ogni caso, quando l'utente chiude una maschera
deve tornare esattamente alla situazione della maschera precedente.
In Access 97 la cosa non da problemi è sufficiente far lavorare le
maschere a schermo pieno in modo che ognuna copra le precedenti, ma in
Access 2000 ogni maschera aggiunge un pulsante sulla barra delle
applicazioni per cui questa si riempie di nuovi pulsanti disorientando
l'utilizzatore.
Qualcuno conosce un modo per evitare questo tipo di problema.
Grazie a tutti per l'aiuto
Tonio Tanzi

 Qualcuno conosce un modo per evitare questo tipo di problema.
Il 2000 non lo conosco (ringraziando il cielo). Nel 97 avrei comunque usato
il trucco di rendere invisibili le maschere e poi di riattivarle quando
chiudo la maschera "figlia" (usando la proprietà visible). Magari il 2000
una maschera non visibile non la fa vedere neanche come icona...
Antonio

 Antonio
Grazie per i 2 suggerimenti.
In merito al primo nel frattempo ho trovato quest'altra soluzione che
sottopondo alla lista per eventuali commenti.
In un modulo generale inserisco la seguente funzione che riceve il nome
di un recordset (può essere una tabella, una query o direttamente
un'istruzione sql):
Public Function RecordsetVuoto(RstName As String) As Boolean
Dim dbs As Database, rs As Recordset
    Set dbs = CurrentDb
    Set rs = dbs.OpenRecordset(RstName, dbOpenDynaset)
    RecordsetVuoto = (rs.BOF And rs.EOF)
    rs.Close
    Set dbs = Nothing
End Function
Nell'evento FormOpen della maschera da aprire inserisco il seguente
codice:
Private Sub Form_Open(Cancel As Integer)
Dim strFiltro As String
    strFiltro = "Select * From [" & Me.RecordSource & "] Where " &
Me.Filter
    if RecordsetVuoto(strFiltro) Then
	MsgBox "Record non trovato!"
        Cancel=True
    End If
End Sub
Fatemi sapere
Tonio Tanzi

 
puoi evitare la visualizzazione dei pulsanti multipli sulla barra delle applicazioni intervenendo in strumenti/opzioni, scheda visualizzazione, icone sulla barra delle applicazioni.
ciao
fabio

 un'istruzione sql):
E' esattamente la mia soluzione solo che il test lo sposti in una funzione
piuttosto che farlo direttamente nel main...
Antonio

 *--------------------------------------------------------------------------*
Rispondo qui a questa mail che Alessandro B. mi ha postato in privato.
Effettivamente, pensandoci, concordo con te sul fatto che è più corretto
effettuare il test nella maschera chiamante.
Per quanto rigurada l'aver spostato il test in una funzione pubblica (e
qui mi collego all'ultimo post di Antonio Bisio in questo tread) mi
sembra la soluzione migliore dal punto di vista informatico in quanto mi
consente di riusare la funzione tutte le volte che voglio, anche in
altre applicazioni, senza dover riscriverne il codice ogni volta.
E' vero che si tratta di poche semplici righe, ma, come Murphy insegna,
se c'è una possibilità di sbagliare.... :o)
Ciao a tutti
Tonio

 sembra la soluzione migliore dal punto di vista informatico in quanto mi
Hmmm... hai lavorato in C eh?
Antonio
P.S.
BisIo... SIGH...

 BisIo... SIGH...
Ops, m'è scappata una i di troppo, scusa e grazie ancora per l'aiuto.
Tonio Tanzi

 altro linguaggio :o)
Sono comunque d'accordo con te...
L'essermi dedicato ad access ed aver imparato il vba mi ha spesso fatto
inorridire per l'uso di goto... anche se a volte è la soluzione più
comoda...
Antonio