Errore VBA in Access

lunedì 27 ottobre 2008 - 09.38

jampicoll Profilo | Junior Member

Ciao a tutti.
Stò realizzando una piccola applicazione in Access 2003 e mi sono imbattuto per la prima volta nel linguaggio VB.
In una maschera di access dovrei mettere un pulsante che esegua un filtro su dei dati e tramite VB e consultando qualche guida on-line ho scritto il seguente codice

Private Sub Comando_Click()
Me.FilterOn = True
If (AGENDA.[Agenda Ultimo Aggiornamento] < AGENDA.[Agenda Data] Or AGENDA.[Agenda Ultimo Aggiornamento] = "Null") Then
Me.Filter = "Agenda.[Operatore ID]=Forms!AGENDA!Testo33 AND AGENDA.[Agenda Data]>=Forms!AGENDA!Testo29 AND AGENDA.[Agenda Data]<=Forms!AGENDA!Testo31"
Else
Me.Filter = "Agenda.[Operatore ID]=Forms!AGENDA!Testo33 AND AGENDA.[Agenda Ultimo Aggiornamento]>=Forms!AGENDA!Testo29 AND AGENDA.[Agenda Ultimo Aggiornamento]<=Forms!AGENDA!Testo31"
End If
Me.Requery
End Sub

Nell'esecuzione del comando mi da il seguente errore:
Errore run-time 424
Necessario Ogetto

Ed eseguendo il debug viene evidenziata la Riga che contiene l'istruzione IF......

Spero di essere stato chiaro, datemi una mano per favore.
Ciao!!!

Dainesi Profilo | Senior Member

E' giusto che ritorni un errore.

Osserva la tua linea di codice:
If (AGENDA.[Agenda Ultimo Aggiornamento] < AGENDA.[Agenda Data] Or AGENDA.[Agenda Ultimo Aggiornamento] = "Null")

Vista così l'interprete del codice VBA trova un oggetto AGENDA che invoca un metodo od una proprietà "[Agenda Ultimo Aggiornamento]" che chiaramente non era il tuo intendimento.

La tua condizione penso sia il risultato di una query e così devi trattarla.

jampicoll Profilo | Junior Member

praticamente quel tasto deve eseguire una query di selezione su delle date.
Se il campo "Agenda ultimo Aggiornanamento" è presente ed è > di "Agenda Data"
per la selezione deve utilizzare quella data,
Altrimenti come data di selezione deve utilizzare "Agenda Data".

Come risolvo allora???

Dainesi Profilo | Senior Member

Dopo il primo aggiornamento il campo Ultimo Aggiornamento sarà sempre presente per cui quello che devi fare è interrogare i dati ed agire di conseguenza.

jampicoll Profilo | Junior Member

Forse mi sono spiegato male...
Nello stesso record ci sono due valori di date:
1. Agenda Data
2. Agenda Ultimo Aggiornamento

Se il campo "Agenda Ultimo Aggiornamento" è vuoto o < di "Agenda Data" il filtro da applicare deve usare come riferimento "Agenda Data"
Altrimenti il filtro come riferimento di data deve usare "Agenda Ultimo Aggiornamento"

Ti chiedo gentilmente di aiutarmi a scrivere queste poche righe di codice perche non me la cavo molto bene.

Grazie assai

Dainesi Profilo | Senior Member

Prova così

Private Sub Comando_Click()

Dim db As DAO.Database
Dim rc As DAO.Recordset
Dim strSQL As String

Set db = CurrentDb()

strSQL = "SELECT * FROM Agenda"
Set rc = db.OpenRecordset(strSQL, dbOpenSnapshot)

Me.FilterOn = True
If IsNull(rc.Fields("Agenda Ultimo Aggiornamento")) Then
Me.Filter = "Agenda.[Operatore ID]=Forms!AGENDA!Testo33 AND AGENDA.[Agenda Data]>=Forms!AGENDA!Testo29 AND AGENDA.[Agenda Data]<=Forms!AGENDA!Testo31"
ElseIf rc.Fields("Agenda Ultimo Aggiornamento") < rc.Fields("Agenda Data") Then
Me.Filter = "Agenda.[Operatore ID]=Forms!AGENDA!Testo33 AND AGENDA.[Agenda Data]>=Forms!AGENDA!Testo29 AND AGENDA.[Agenda Data]<=Forms!AGENDA!Testo31"
Else
Me.Filter = "Agenda.[Operatore ID]=Forms!AGENDA!Testo33 AND AGENDA.[Agenda Ultimo Aggiornamento]>=Forms!AGENDA!Testo29 AND AGENDA.[Agenda Ultimo Aggiornamento]<=Forms!AGENDA!Testo31"
End If

rc.Close
db.Close

Set rc = Nothing
Set db = Nothing

Me.Requery

End Sub

jampicoll Profilo | Junior Member

Innanzitutto GRAZIE TANTISSIMO!!!!
...ma c'è qualcosa che non va...

E' come se non funzionassero i primi due IF non funzionassero.
In pratica come data di riferimento utilizza sempre "Agenda Ultimo Aggiornamento"

Dainesi Profilo | Senior Member

Per aiutarti meglio dovrei avere il file mdb. Se vuoi .... analizzo, correggo e rimando. Se non è enorme s'intende ...

jampicoll Profilo | Junior Member

ok.
ti mando tutto all'indirizzo ddainesi@infinito.it.
vedo di mandarti solo l'indispensabile

Dainesi Profilo | Senior Member

A me funziona, o così mi pare. Non è che potresti rispiegarmi esattamente cosa ti sembra che non faccia ?

jampicoll Profilo | Junior Member

Se in un qualsiasi record prima a cancellare il campo "nuova data" (che contiene il valore "agenda ultimo aggiornamento" lui non considera il campo "data visita" come data di riferimento da considerare.

ES:
cosi come te l'ho mandato il secondo contatto ha solo il valore data visita = 06/11/2008 e il campo "nuova data" è vuoto.
Se provi a fare la selezione con operatore 4 e come estremi metti
01/10/2008 <-->30/11/2008 dovrebbe trovare entrambi i valori.
Invece trova solo il primo.

Dainesi Profilo | Senior Member

ora provo ...

jampicoll Profilo | Junior Member

Funziona???

Dainesi Profilo | Senior Member

ho avuto un piccolo imprevisto con la corrente, ora provo

...

Ok, prova così:

Sub Comando_Click()

Me.FilterOn = True

Me.Filter = "([Agenda Data]>=Forms!AGENDA!Testo29 AND [Agenda Data]<=Forms!AGENDA!Testo31) OR ([Agenda Ultimo Aggiornamento]>=Forms!AGENDA!Testo29 AND [Agenda Ultimo Aggiornamento]<=Forms!AGENDA!Testo31)"

Me.Requery

End Sub

jampicoll Profilo | Junior Member

Cosi funziona solo se è presente uno dei due valori di data perche prende in considerazione uno o l'altro, ma non funziona se ci sono scritte entrambe le date: in quel caso deve considerare la data maggiore delle due

Dainesi Profilo | Senior Member

>Cosi funziona solo se è presente uno dei due valori di data perche prende in considerazione uno o l'altro, ma non funziona se ci sono scritte entrambe le date: in quel caso deve considerare
>la data maggiore delle due

Modifichiamola così allora

Dim SFiltro as String

sFiltro = "([Agenda Data]>=Forms!AGENDA!Testo29 AND [Agenda Data]<=Forms!AGENDA!Testo31 AND [Agenda Ultimo Aggiornamento]Is NULL) OR"
sFiltro = sFiltro & " ([Agenda Ultimo Aggiornamento]>=Forms!AGENDA!Testo29 AND [Agenda Ultimo Aggiornamento]<=Forms!AGENDA!Testo31)"
Me.Filter = sFiltro

jampicoll Profilo | Junior Member

FUNZIONA PERFETTAMENTE!!!!
....ORA STO CERCANDO DI CAPIRE ALMENO COME FUNZIONA.

GRAZIE TANTO

jampicoll Profilo | Junior Member

Ormai che ci siamo...ti chiedo un ultima cosa semplicissima.
Come faccio a far diventare un applicazione del genere a tutto schermo senza menù e senza la possibilità di accedere alle tabelle ecc...?

Dainesi Profilo | Senior Member

>Ormai che ci siamo...ti chiedo un ultima cosa semplicissima.
>Come faccio a far diventare un applicazione del genere a tutto schermo senza menù e senza la possibilità di accedere alle tabelle ecc...?

La cosa semplicissima non lo è poi così tanto.
Andiamo con ordine.
In Access (così come in tutte le applicazioni Office) esistono delle routine che se presenti vengono eseguiti prima di tutto. Vengono chiamati "autorun".
In Access questo compito è svolto da una macro chiamata AutoExec

Quello che devi fare quindi è avere (o creare) una macro che si chiami AutoExec ed al suo interno richiamare l'apertura di una maschera (quella che vuoi tu)
Devi inoltre codificare l'evento Load (caricamento) della maschera che si andrà ad aprire per far si che la finestra sia massimizzata e che le barre degli strumenti, nonché i menù siano nascosti.

jampicoll Profilo | Junior Member

dal menu avvio riesco ad ottenere l'avvio della maschera ma non riesco ad eliminare il menu principale (quello File---Modifica---Visualizza).
Cmq non vorrei rubarti altro tempo.
Ti ringrazio per il grande aiuto e la disponibilità.

Dainesi Profilo | Senior Member

>dal menu avvio riesco ad ottenere l'avvio della maschera ma non riesco ad eliminare il menu principale (quello File---Modifica---Visualizza).
>Cmq non vorrei rubarti altro tempo. Ti ringrazio per il grande aiuto e la disponibilità.

Giusto per finire in bellezza ....

Inserisci questo codice nella routine Sub Form_Load() della maschera che richiami con la macro AutoExec

Dim i As Integer

For i = 1 To CommandBars.Count
CommandBars(i).Enabled = False
Next

Ciao !
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5