Newsgroup: it.comp.appl.access
Titolo: bacheca annunci con gestione visto per ogni utente

buongiorno a tutti, vorrei realizzare una tabella annunci che contiene un campo testo contenente l'annuncio e questo annuncio verrà visualizzato a tutti o solo agli utenti appartenenti a un certo gruppo.
 
quando apro il database dovrei mostrare con popup il nuovo annuncio e fin qui tutto semplice il problema è come gestire il fatto che un utente abbia vistato oppure no quell'annuncio per non mostrarlo all'accesso successivo
 
la mia idea era quella di fare una sotto tabella 
 
tabella annunci --> 2 campi id contatore, annuncio tipo memo
tabella vistati --> 3 campi id contatore, idutente, idannuncio
 
quando un utente vede la notizia nel popup clicca "OK" e vado ad aggiungere un record nella tabella vistati in questo modo all'accesso successivo controllo se esiste il record id contatore, idutente, idannuncio non riapro l'annuncio?
 
credo però di dover controllare ogni notizia ad ogni accesso, un pò dispendioso a livello di prestazioni.
 
qualche idea\consiglio da parte vostra?


io farei un db centrale dove carico gli annunci, annunci con un id 
contatore, annuncio, data pubblicazione
 
nelle singole postazioni dove c'è il db client, all'apertura, 
scaricherei gli annunci presenti sul db centrale con id maggiore 
rispetto al ultimo id nella tabella locale degli annunci, in questo modo 
avrei traffico minimo di dati in rete. Si tratta in pratica di una query 
di accodamento dalla tabella remota a quella locale
 
nei db dei vari client la tabella che farei sarebbe composta da
id, annuncio, letto si/no, data pubblicazione
 
quando tizio mette il flag su "letto" non viene più riproposta
 
la data annuncio la metterei per poter decidere anche quando un annuncio 
deve essere scaricabile dai client. nel caso volessi gia caricare 
annunci che però saranno validi da una tale data. In questo caso invece 
di confrontare gli id remoti e locali confronterei le date annunci
 
ciao
BFS
 
 


ciao, buona idea però ho un dubbio, se sullo stesso pc possono effettuare il login utenti diversi in base al giorno lavorativo e quindi cambia il gruppo dell'utente loggato, un utente si ritroverebbe su quel client gli annunci dell'utente del giorno prima che era di un altro gruppo?
 


nella tabella locale ti basta aggiungere la colonna utente
 
ad ogni login scarichi tutti gli annunci per l'utente loggato con id 
maggiore rispetto al id locale
 
poi nella maschera di visualizzazione metti oltre il filtro letto anche 
il filtro utente corrente
 
BFS
 
 
 


ok direi che cosi è risolto, grazie.


Io userei tre tabelle:
- annunci
- utenti
- annunci_per_utente
 
La terza e' quella che contiene l'associazione id_annuncio-id_utente ed 
i flag per indicare messaggio letto, messaggio da leggere, messaggio da 
non visualizzare, messaggio in editing, ecc...
Con queste informazioni disponibili e' possibile visualizzare 
esattamente, per ogni  utente, gli annunci che si desidera
Usando Sql Server come contenitore dei dati, e delle query passthrough, 
rimarebbe contenuto pure il traffico di rete
A mio parere, l'uso di Access in multiutenza, con dati su file Access, 
non e' contemplato
 


ha un suggerimento su come creare una query che contiene i soli messaggi non letti dei quali non esiste in tabella letti (idutente, idmessaggio) la coppia utente loggato in quel momento e id messaggio?
 


ho provato cosi ma non funziona mi mostra tutti i messaggi pur valorizzando il campo utente della form maschera1 (qualche consiglio?)
 
SELECT Messaggi.ID, Messaggi.Messaggio
FROM Messaggi LEFT JOIN Letti ON (Messaggi.ID=Letti.IdMessaggio) And (Letti.IdUtente=forms!maschera1!utente) Is Null;


per curiosità, visto che ti preoccupavi delle prestazioni ad inizio post
di quanti annunci e quanti utenti parliamo?
 
ciao
BFS

 
 
mah... se hai un milione di annunci e 100.000 lettori il totale prestazioni 
richieste potrebbe *davvero* essere un po' dispendioso
 
prima di fasciarti la testa hai provato a generare un campione di mille 
annunci e di cento lettori per vedere che effetto che fa?
 
-- 
/-\ /\/\ /\/\ /-\ /\/\ /\/\ /-\ T /-\
-=- -=- -=- -=- -=- -=- -=- -=- - -=-
........... [ al lavoro ] ...........

 per curiositÃ 
 
per curiosità, ma tra tutti e tre che state portando avanti questo thread, 
possibile che nessuno abbia pensato di quotare meglio e ridurre la montagna 
di fuffa da saltare prima di arrivare alla riga nuova in fondo?



20 messaggi al mese

 BFS
 
20 messaggi al mese


No, l'errore e' nella parte centrale della query, dopo il LEFT JOIN ci 
deve essere una sottoquery che restituisce SOLO il cliente corrente, 
piu' o meno dovra' essere una roba del tipo:
 
SELECT *
FROM Messaggi LEFT JOIN
(sotto query che restituisce le righe su tabella LETTI in corrispondenza 
dell'utente corrente)
ON Messaggi.ID=Letti.IdMessaggio
WHERE Letti.IdMessaggio Is Null
 
e quindi
 
SELECT *
FROM Messaggi LEFT JOIN
(select * from LETTI where IDUtente=forms!maschera1!utente)
ON Messaggi.ID=Letti.IdMessaggio
WHERE Letti.IdMessaggio Is Null
 
Grossomodo dovrebbe essere cosi'
Da capire se dentro la sottoquery si possa mettere il nome tabella LETTI 
che si dovra' usare fuori, perche' e' probabile si debba rinominarla con 
qualcosa del tipo  (sottoquery) as LETTInew
Da ottimizzare coi nomi campi restituiti ed indicizzare sui campi usati 
come collegamento tra una tabella e l'altra, ma la struttura dovrebbe 
essere questa


il tuo codice sql mi da un errore non salva la query "errore di sintassi nell'operazione JOIN"
 
**tuo sql ***
SELECT * FROM Messaggi LEFT JOIN (select * from LETTI where IDUtente=forms!maschera1!utente) ON Messaggi.ID=Letti.IdMessaggio WHERE Letti.IdMessaggio Is Null
*** sql ***
mi evidenzia in nero la scritta "Letti" del pezzo 
ON Messaggi.ID=Letti.IdMessaggio
 
 
ho provato come segue:
ho creato una query di nome ---> queryletti
che mostra solo i messaggi letti da [forms]![maschera1]![utente]
 
***sql***
SELECT Letti.IdMessaggio, Letti.Idutente
FROM Letti WHERE (((Letti.Idutente)=[forms]![maschera1]![utente]));
*** sql ****
 
poi ho creato una seconda query di nome ---> querymessaggi
che mostra i messaggi che sono stati letti
***sql***
SELECT Messaggi.ID, Messaggi.Messaggio
FROM Messaggi INNER JOIN QueryLetti ON Messaggi.ID = QueryLetti.IdMessaggio;
*** sql ****
 
dovrei in qualche modo inserire Un NOT in quest'ultima per ottenere il contrario di ciò che mostra ora


sono riuscito ad ottenere i messaggi non letti in questo modo:
 
SELECT Messaggi.ID, Messaggi.Messaggio, QueryLetti.IdMessaggio
FROM (Messaggi LEFT JOIN QueryLetti ON Messaggi.ID = QueryLetti.IdMessaggio) LEFT JOIN Utenti ON QueryLetti.Idutente = Utenti.ID
WHERE (((QueryLetti.IdMessaggio) Is Null));
 
 

 
 
questo quantitativo di dati lo gestisce comodamente anche il Vic-20


 
 
bisognerebbe sapere anche il contenuto dell'annuncio e il numero di 
utenti. magari bisogna scomodare il C-64
 
 


l'avevo valutato ma non si trova più, userò un commodore 64