Newsgroup: it.comp.appl.access
Titolo: SysCmd e valori ritornati

Ciao a tutti.
Non riesco ad ottenere da SysCmd i valori acObjStateNew e
acObjStateDirty.
In pratica la funzione mi restituisce sempre 0 (se il form non è
aperto o non esiste) o 1 (acObjStateOpen) se è aperto.
Per ora ho risolto semplicemente testando forms!nomeForm.Dirty, una
volta che so che è aperto, e regolandomi di conseguenza, ma sarei
curiosa di sapere dove sbaglio.
In questo caso uso access97 (ho degli altri progetti con 2000 sullo
stesso PC) e il codice che uso è praticamente quello dell'help
statoForm = SysCmd(acSysCmdGetObjectState, acForm, nomeForm)
dove statoForm è integer (ho provato anche con variant) e nomeForm la
stringa che contiene il nome del form da testare.
A qualcuno di voi è mai capitato?
Ciao
A.

 ha scritto nel messaggio
news:1188827449.7...@22g2000hsm.googlegroups.com...
Ciao a tutti.
Non riesco ad ottenere da SysCmd i valori acObjStateNew e
acObjStateDirty.
In pratica la funzione mi restituisce sempre 0 (se il form non č
aperto o non esiste) o 1 (acObjStateOpen) se č aperto.
Per ora ho risolto semplicemente testando forms!nomeForm.Dirty, una
volta che so che č aperto, e regolandomi di conseguenza, ma sarei
curiosa di sapere dove sbaglio.
In questo caso uso access97 (ho degli altri progetti con 2000 sullo
stesso PC) e il codice che uso č praticamente quello dell'help
statoForm = SysCmd(acSysCmdGetObjectState, acForm, nomeForm)
dove statoForm č integer (ho provato anche con variant) e nomeForm la
stringa che contiene il nome del form da testare.
A qualcuno di voi č mai capitato?
Ciao
A.
Cosa devi ottenere in definitiva....?
Se vuoi usare SysCmd per testare se una Form č aperta si puň fare cosě:
Public Function IsLoaded(ByVal strFormName As String) As Integer
'*****************************************************************
'Name      : IsLoaded (Function)
'Purpose   : Verifie if Form passed is already OPEN
'Called by :
'Calls     :
'Inputs    : String=Form.Name
'Output    : Return True if Form is Open
'*****************************************************************
    Const conObjStateClosed = 0
    Const conDesignView = 0
    If SysCmd(acSysCmdGetObjectState, acForm, strFormName) <>
conObjStateClosed Then
        If Forms(strFormName).CurrentView <> conDesignView Then
            IsLoaded = True
        End If
    End If
End Function
Tieni presente perň che forse questo č piů comodo:
CurrentProject.AllForms("NomeForm").IsLoaded
Ciao
-- 
@Alex (Alessandro Baraldi)
---------------------------------------------------------------------------
http://www.sitocomune.com/
http://www.alessandrobaraldi.it
---------------------------------------------------------------------------

Mi spiego meglio: non ho problemi a capire se un form è aperto, oltre
a questo (che riesco a fare col codice che ho postato) devo scoprire
nel caso che il form sia aperto se i dati sono stati modificati o,
detto meglio, se il record corrente è in corso di modifica o se sto
inserendo un nuovo record e non l'ho ancora salvato.
Per completezza aggiungo che il fine è:
- se il form non è aperto lo apro con determinati parametri
(sfruttando openargs)
- se è già aperto ma il record corrente non è in fase di modifica lo
chiudo e lo riapro con i parametri specifici (ci sarà anche un metodo
più elegante, ma per questa cosetta va bene così)
- se è aperto con record corrente in fase di modifica un msgbox dice
"Controlla i dati e salva"
Questo in sintesi, e riesco a fare il tutto integrando il valore
ritornato di SysCmd e la proprietà Dirty del form.
Però mi chiedo: non dovrei riuscire a fare tutto con un'unica chiamata
alla funzione SysCmd, che dovrebbe dirmi anche se il record è
modificato o nuovo? Questo a quanto leggo nell'help sotto il titolo
"Funzione SysCmd" e nell'esempio dell'help che riporto per intero:
Sub VerificaProdotti()
Dim intStato As Integer
Dim intTipoCorrente As Integer
Dim strNomeCorrente As String
intTipoCorrente = Application.CurrentObjectType
strNomeCorrente = Application.CurrentObjectName
If intTipoCorrente = acForm And strNomeCorrente = "Prodotti" Then
  intStato = SysCmd(acSysCmdGetObjectState, intTipoCorrente,
strNomeCorrente)
  ' Maschera Prodotti modificata ma non salvata.
  If intStato = acObjStateDirty + acObjStateOpen Then
    ' Chiude maschera Prodotti e salva modifiche.
    DoCmd.Close intTipoCorrente, strNomeCorrente, acSaveYes
  End If
End If
End Sub
Ora però mi viene un dubbio: non sarà che acObjStateDirty si riferisce
non ai dati contenuti nella maschera, ma alla maschera stessa (aperta,
con struttura modificata e non salvata).
Se è così sono proprio una fessacchiotta (per usare una parola
educata), ma a questo punto l'utilità di queste informazioni in un
applicativo normale mi sembra davvero nulla (quando mai l'utente apre
in modifica della struttura un form? Si spera mai, usando l'mde)
Faccio un'altra prova e posto le conclusioni.
A.

 con struttura modificata e non salvata).
E' proprio come temevo, e lo ripeto in caso qualche tontolone come me
prima o poi ci sbatta la testa:
le costanti acObjStateDirty e acObjStateNew restituite dalla funzione
SysCmd (combinate ovviamente con acObjStateOpen) si riferiscono allo
stato di una maschera aperta in visualizzazione struttura, alla quale
siano state apportate modifiche non ancora salvate, o che non sia
ancora stata salvata per la prima volta (new).
Dopodiché ribadisco il mio parere che avere queste informazioni per lo
più non serve a un tubo.
E che l'unico modo per fare quello che dovevo fare penso che sia
proprio il sistema che ho usato (se qualcuno ha soluzioni più
semplici, senza scomodare le API, per carità) è ben accetto.
Ciao
A.

 più elegante, ma per questa cosetta va bene così)
io uso il Filter
Ho letto il tuo ultimo post. Dal primo non si capiva assolutamente cosa 
volevi fare. Dall'ultimo neanche.
Normalmente sarebbe meglio, appunto, dire cosa si vorrebbe ottenere non 
quello che si e' fatto altrimenti si rischia di andare, come si suol 
dire, fuori strada. Per fare quello che, "immaginando", desideri, usare 
*syscmd* e' l'ultima cosa che farei, dopo la frutta.
-- 
ac
y-1=x

 ha scritto nel messaggio 
news:1188840781.1...@19g2000hsx.googlegroups.com...





A.
[risposta]
Se la form è aperta puoi ottenere lo stato del recordset, non dal SysCmd ma 
tramite la proprietà Dirty:
es.
if (maschera aperta) then
    select case forms!nomeForm.Form.Dirty
        case -1 '<-- recordset da salvare (modifiche appese)
        case 0 '<-- recorset salvato (o nessuna modifica appesa)
        case else
    end select
end if
Ciao.
-- 
Sergio MAZZA 

 tramite la proprietà Dirty:
Grazie Sergio, mi confermi che il codice che ho scritto fin
dall'inizio è corretto ed è l'unico modo veloce (l'alternativa a mio
avviso più scomoda è scorrere la collection dei form aperti) per
sapere se
1. un form è aperto (usando syscmd)
2. nel caso sia aperto se i dati sono modificati e non salvati o no
(proprietà Dirty)
ovviamente usando A97, cosa che ho specificato fin da subito.
L'avevo scritto fin dal primo post, qui
--> Per ora ho risolto semplicemente testando forms!nomeForm.Dirty <--
ma evidentemente non ero stata sufficientemente chiara.
Tutto quel che è venuto dopo era per evidenziare la possibile errata
interpretazione delle costanti ritornate da SysCmd, come è successo a
me, e specificare per bene come funziona la SysCmd sui form, nella
speranza di essere utile al programmatore access "medio" (che magari
lavora con parecchi ambienti di sviluppo e fa quello che deve senza
essere un guru in nulla in particolare).
Grazie a tutti quelli che hanno dato il loro contributo.
Ciao
A.

 ha scritto nel messaggio 
news:1188996348....@50g2000hsm.googlegroups.com...
Grazie Sergio, mi confermi che il codice che ho scritto fin
dall'inizio è corretto ed è l'unico modo veloce (l'alternativa a mio
avviso più scomoda è scorrere la collection dei form aperti) per
sapere se
1. un form è aperto (usando syscmd)
2. nel caso sia aperto se i dati sono modificati e non salvati o no
(proprietà Dirty)
ovviamente usando A97, cosa che ho specificato fin da subito.
L'avevo scritto fin dal primo post, qui
--> Per ora ho risolto semplicemente testando forms!nomeForm.Dirty <--
ma evidentemente non ero stata sufficientemente chiara.
[risposta]
Acc... Sicuramente sono stato superficiale nella lettura.
Tutto quel che è venuto dopo era per evidenziare la possibile errata
interpretazione delle costanti ritornate da SysCmd, come è successo a
me, e specificare per bene come funziona la SysCmd sui form, nella
speranza di essere utile al programmatore access "medio" (che magari
lavora con parecchi ambienti di sviluppo e fa quello che deve senza
essere un guru in nulla in particolare).
Grazie a tutti quelli che hanno dato il loro contributo.
Ciao
A.
[risposta]
Ciao.
-- 
Sergio MAZZA