Newsgroup: it.comp.appl.access
Titolo: Ordinare maschera filtrata in ADP

Ciao a tutti,
la cosa sembra semplice ma non riesco a ralņizzarlo:
devo ordinare una maschera in base a un campo data.
ho provato a ordinare direttamente il recordset e sembra funzionare, il
problema pero' sorge nel momento in cui cerco di aprire la maschera filtrata
tramite l'istruzione docmd, mi dice che il nome "MiaTabella" non e' un
prefisso valido per il campo.
questo problema scompare se non metto la clausola order by nell'istruzione
sql, pero' chiaramente i record non sono piu' ordinati.
ho pensato di impostare la pčroprieta' order by della maschera, ma
impostandola a mano la mascheraa non viene ordinata.
allora ho impostato la clausola orderby da codice e a questo punto la
maschera si apre regolarmente filtrata e ordinata.
PERO',
se la chiudo e la riapro mi accorgo che il filtro viene salvato insieme alla
maschera, quindi la maschera si riapre sempre sugli stessi dati
indipendentemente dai criteri specificati nella docmd che la apre.
Potrei valorizzare il recordset all'apertura, ma non vedo perche' realizzare
una cosa cosi' farragginosa quando esistono i mezzi per farlo piu'
facilmente.
Sib

 indipendentemente dai criteri specificati nella docmd che la apre.
Di previso, che istruzione utilizzi per aprire la maschera?
-- 
Gabriele Bertolucci
PBsoft 
www.pbsoft.it

 indipendentemente dai criteri specificati nella docmd che la apre.
Mi pareva d'aver letto che ci siano grossi problemi prestazionali con
l'OrderBy negli .ADP.
Comunque Access ha sempre avuto il pessimo vizio di salvare automaticamente
nel design di maschere e Report varie impostazioni.
Per ovviare devi creare il file p-compilato .MDE
Saluti.

 Per ovviare devi creare il file p-compilato .MDE
A parte che il compilato di un ADP č un ADE, alle volte purtroppo la
versione compilata non č sempre la migliore soluzione adottabile.
Per quanto riguarda il problema dei filtri salvati a design time, ho dovuto
aggiungere, per sicurezza, una routine che lancio manualmente e che va a
togliere tutti i filtri da tutte le maschere ed i report contenuti nell'ADP.


 Di previso, che istruzione utilizzi per aprire la maschera?
Quella che vedi sopra.
Ciao
Sib

 togliere tutti i filtri da tutte le maschere ed i report contenuti
nell'ADP.
Dovrebbe esistere un'altra soluzione: togli il pulsante di chiusura della
form, ne crei uno personalizzato e chiudi con docmd.close acform, acsavenone
(controlla l'help perchè sto andando a braccio).
Bye


Ciao Sib
Non passare il nome della tabella nella wherecondition, se nella tua query
hai campi con nome uguale ma di diverse tabelle usa degli alias.
Se questa è la tua Query
------------------------
SELECT *
FROM Cienti
ORDER BY Codice
------------------------
e imposti la wherecondition uguale a Codice > 100
Access la trasforma in questo modo
------------------------
SELECT *
FROM (SELECT * FROM Clienti) AS DRVD_TBL
WHERE Codice > 100
ORDER BY Codice
------------------------
La cosa è logica perchè deve comporre la clausola WHERE ma i riferimenti
alle tabelle originali vanno a farsi friggere.
Ciao Giorgio

 > > indipendentemente dai criteri specificati nella docmd che la apre.
Hai provato ad aprire la maschera sempre senza recuperare alcun record,
quindi applicare un ServerFilter e fare un requery della maschera?
Pensi che potrebbe fare al caso tuo?
Scusa se alcune mie frasi ti sembrano banali; posso avere sbagliato, ma
stavo solo cercando di rendermi utile.
Ciao.


 (controlla l'help perchč sto andando a braccio).
Ti ringrazio per il consiglio.
Comunque, tieni conto che, prima di distribuire l'applicazione, provvedo io
alla cancellazione dei filtri.
Da quel momento il cliente non ha piů il problema dei filtri salvati.
Grazie in ogni caso.


 stavo solo cercando di rendermi utile.
Ma figurati, non c'e' problema, un aiuto e' sempre ben accetto.
Ciao
Sib

 Scusa, non ho capito.
Dunque. Sono andato a ricontrollare del codice che io e Gionata abbiamo
scritto qualche mese fa per un ADP abbastanza grosso.
Nel caso nostro non c'era la necessità di aprire una maschera filtrata,
perciò, per rispondere alle esigenze del cliente riguardo alle ricerche,
abbiamo scelto la via delle Query By Form.
Con questo sistema, quando andiamo a fare una ricerca nei dati e vogliamo
aprire dunque una maschera con un filtro su queti, abbiamo fatto il seguente
test:
- se la maschera è chiusa allora la apriamo con un DoCmd a cui passiamo la
condizione di where complessa a piacere
- se la maschera è già aperta, ci creiamo un riferimento ad essa (come
AccessObject) ed andiamo ad impostare la proprietà ServerFilter
Un'alternativa potrebbe essere quella di aprire sempre la maschera in
aggiunta dati e, alla bisogna, modificare la sua proprietà ServerFilter.
Non so quale delle due soluzioni sia più performante.


 alle tabelle originali vanno a farsi friggere.
Non lo sapevo.
comunque devo dire che uso questo codice:
    stDocName = "Abbonamenti"
    stLinkCriteria = "[IDCliente]=" & Me![IDCliente]
    DoCmd.OpenForm stDocName, , , stLinkCriteria
come vedi non c'e' riferimento alla tabella.
Il codice SQL della maschera e' questo:
SELECT Abbonamenti.IDAbbonamento, Abbonamenti.IDCliente,
Abbonamenti.DataAbbonamento, Abbonamenti.DataScadenza, Abbonamenti.Sospeso,
Anagrafica.RagioneSociale FROM Abbonamenti INNER JOIN Anagrafica ON
Abbonamenti.IDCliente = Anagrafica.IDCliente
Forse quindi modificando questo SQL potrei risolvere il problema?
Sib

 Ciao Giorgio
qual e' il metodo piu' immediato per vedere la sintassi delle istruzioni
effettivamente inviate al server sql da access?
Sib

 effettivamente inviate al server sql da access?
Puoi utilizzare SQL Profiler. Registri una traccia attività monitorando le
operazioni che ti servono.
Poi stoppi la registrazione e vedi quello che è successo.


"Sib" <si...@SPAMiol.it> ha scritto nel messaggio
news:7xMqb.430636$R32.14...@news2.tin.it...

Io ho Office Xp Developer in cui vengono forniti i tools amministrativi di
Sql Server, tra questi c'è Sql Profile che intercetta e visualizza tutti i
comandi che arrivano al server (quando non capisci certi comportamenti è
illuminante).
Da Access non saprei come fare.
Ciao Giorgio

 Forse quindi modificando questo SQL potrei risolvere il problema?
Ciao Sib
Si non c'è riferimento alla tabella però rimane il problema di assegnare
un'alias al campo da ordinare.
Tu hai questa Query
----------------------------------------
SELECT
     Abbonamenti.IDAbbonamento,
     Abbonamenti.IDCliente,
     Abbonamenti.DataAbbonamento,
     Abbonamenti.DataScadenza,
     Abbonamenti.Sospeso,
     Anagrafica.RagioneSociale
FROM Abbonamenti
            INNER JOIN Anagrafica ON
           Abbonamenti.IDCliente = Anagrafica.IDCliente
ORDER BY  Abbonamenti.DataScadenza
-------------------------------------------
Quando apri il form con  DoCmd.OpenForm stDocName, , , stLinkCriteria Access
la trasforma così
----------------------------------------
SELECT * FROM (
SELECT
     Abbonamenti.IDAbbonamento,
     Abbonamenti.IDCliente,
     Abbonamenti.DataAbbonamento,
     Abbonamenti.DataScadenza,
     Abbonamenti.Sospeso,
     Anagrafica.RagioneSociale
FROM Abbonamenti
            INNER JOIN Anagrafica ON
           Abbonamenti.IDCliente = Anagrafica.IDCliente
)  AS DRVD_TBL
WHERE    IDCliente=2
ORDER BY  Abbonamenti.DataScadenza
-------------------------------------------
Come vedi L'Order By  è sbagliata perché fa riferimento a una tabella che
non esiste nella prima FROM , per risolvere assegni un'alias a DataScadenza
e imposti l'order by sull'alias, praticamente dopo aver assegnato l'alias e
tolto l'ordinamento al campo DataScadenza vai in fondo alla griglia di
composizione e aggiungi un nuovo campo digitando il nome dell'alias, togli
la spunta output e imposti l'ordinamento.
Il Risultato SQL è Questo
----------------------------------------------
SELECT
     Abbonamenti.IDAbbonamento,
     Abbonamenti.IDCliente,
     Abbonamenti.DataAbbonamento,
     Abbonamenti.DataScadenza AS DataScad,
     Abbonamenti.Sospeso,
     Anagrafica.RagioneSociale
FROM Abbonamenti
            INNER JOIN Anagrafica ON
           Abbonamenti.IDCliente = Anagrafica.IDCliente
ORDER BY DataScad
---------------------------------------------
e access nella OpenForm lo trasformerà in
--------------------------------------------
SELECT * FROM (
SELECT
     Abbonamenti.IDAbbonamento,
     Abbonamenti.IDCliente,
     Abbonamenti.DataAbbonamento,
     Abbonamenti.DataScadenza AS DataScad,
     Abbonamenti.Sospeso,
     Anagrafica.RagioneSociale
FROM Abbonamenti
            INNER JOIN Anagrafica ON
           Abbonamenti.IDCliente = Anagrafica.IDCliente
)  AS DRVD_TBL
WHERE    IDCliente=2
ORDER BY DataScad
--------------------------------------------
Adesso tutto funziona correttamente.
(Contrariamente ad Access in Sql Server si possono usare gli alias nella
Order By
ma non si possono usare per i campi calcolati)
Ciao Giorgio

 un'alias al campo da ordinare.
cut

Molte grazie.
io pensavo che l'orderby venisse racchiuso nelle parentesi mentre invece
capisco che viene completamente rielaborata l'istruzione.
Ciao
Sib

 Da Access non saprei come fare.
Non c'e' problema, anch'io ho OXP developer.
grazie.
grazie molte anche a Gabriele.
Ciao
Sib


Ciao Sib
Volevo solo aggiungere che creando una vista e inserendola come origine
record "SELECT * FROM Vista ORDER BY DataScadenza" il problema non si
presenta. Personalmente creo le viste solo se sono utili a più form in altro
caso preferisco assegnare l'origine record direttamente al form interessato
(come nel tuo caso).
Ciao Giorgio