Messaggistica in stile facebook

sabato 30 gennaio 2010 - 19.47

miomiomio Profilo | Junior Member

ciao a tutti

ho creato uno spazio per i giovani della mia parrocchia nella quale possono lasciare messaggi testuali.
adesso se non è troppo difficile mi piacerebbe aggiungere la possibilità di rispondere ad un messaggio e poi visualizzarlo sotto al messaggio al quale si è risposto.

esempio di come è strutturato adesso:
id ... x0 che ore sono? x1 come stai? x2 sono le ore 12,00 x3 sto bene

esempio di come vorrei che fosse:
id ... x0 che ore sono? x2 sono le ore 12,00 x1 come stai? x3 sto bene


l'inserimento lo faccio nella stessa tabella inserendo l'id del messaggio a cui si risponde?

e poi come si fa a richiamare i messaggi e a metterli in ordine secondo le risposte?

grazie

Jeremy Profilo | Guru

Ciao.
Ti basterebbe aggiungere un criterio in più alla clausola OrderBy.... invece di ordinare i messaggi solo cronologicamente, li ordini ANCHE per IdMessaggioIniziale

Facci sapere....
Ciao

miomiomio Profilo | Junior Member

in che senso?

adesso la tabella messaggi è così composta:

id | idutente | messaggio |...

aggiungo un altro campo?
id | idpadre | idutente | messaggio |...

la query la ordino per id e ordine (ordine lo uso se voglio mantenere un messaggio visibile in alto)
ORDER BY ordine ASC, id ASC, idpadre ASC???

grazieeeeee

Jeremy Profilo | Guru

Esatto!

Facci sapere....
Ciao

miomiomio Profilo | Junior Member

in questo modo ho capito (che non è poco) credo di riuscire anche a farlo!!

ma il mio problema è questo.

per ora ho fatto questi passaggi

ad ogni messaggio ho inserito un pulsante "rispondi" che punta alla pagina di inserimento scrivi.asp?p=<%=id%> (è un sistema corretto?)

inserisco l'id che ricevo da querystring nel campo idpadre e intanto a questo messaggio il database assegna un id (tramite il classico contatore id increment)

e questo funziona bene

il problema sorge per i nuovi messaggi che non sono risposta a nessun precedente messaggio.

idpadre rimane vuoto.
io ci dovrei andare a mettere l'id di se stesso ovvero se è l'id 150 anche idpadre deve contenere 150 giusto? in questo modo in query farò un orderby in questo modo:
order by id asc, idpadre asc

ma come faccio a conoscere quale numero access assegnerà???

se il mio ultimo messaggio in tabella ha id 250 ma io ho eliminato precedentemente il messaggio 251 e 252 il contatore mi ripartirà da 253 e come posso ricavarmi questo valore?

Jeremy Profilo | Guru

>ad ogni messaggio ho inserito un pulsante "rispondi" che punta alla pagina di inserimento scrivi.asp?p=<%=id%> (è un sistema corretto?)
SI
>ma come faccio a conoscere quale numero access assegnerà???
Hai due modi per farlo ... uno semplice semplice, ma impreciso(poi ti spiego perchè) ed un'altro semplice e preciso.
Il primo metodo è semplicemente quello di fare una query che ottine il numero di Id massimo con la funzione Sql MAX(Id) ed aggiungere 1.....in caso di cancellazione di un record, però, potrebbe capitare una condizione in cui L'Id che ottieni con questo calcolo potrebbe essere già stato assegnato ad un record successivamente cancellato e quindi non corrisponderebbe al vero.
Il secondo è quello di eseguire un comando Sql che restituisce esattamente l'id che il DBMS assegnerà al record che verrà inserito ... non ricordo bene come funzioni ma se cerchi informazioni riguardo @@IDENTITY troverai sicuramente quello di cui sto parlando.

Facci sapere ....
Ciao

miomiomio Profilo | Junior Member

ho trovato questo modo qui

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

ma mi dà errore
ADODB.Recordset error '800a0cc1'

Item cannot be found in the collection corresponding to the requested name or ordinal.

/Admin/msg/a.asp, line 10

la riga 10 è numes=rs("ident")
come mai?????


ho trovato anche questo articolo ma nn c'ho capito niente...

Jeremy Profilo | Guru

Ciao
Tira via gli apici sul nome del campo
("SELECT @@IDENTITY AS ident FROM messaggi")

Facci sapere...
Ciao

miomiomio Profilo | Junior Member

senza apici non mi dà più errore
ma il valore di numes è 0
che significa?

Jeremy Profilo | Guru

Vuol dire che il valore dell'ultima chiave inserita è 0, quindi, aggiungendo 1, ottieni il valore della prossima chiave.

Facci sapere...
Ciao

miomiomio Profilo | Junior Member

no la tabella contiene gia messaggi e il numero della nuova chiave dovrebbe essere 166

Jeremy Profilo | Guru

Fai così:
("SELECT @@IDENTITY FROM messaggi") numes=res(0)

Facci sapere....
Ciao

miomiomio Profilo | Junior Member

niente
numes=rs(0)

mi dà comunque zero
se ad esempio scrivo select id, @@identi....

numes2=rs(id) = 32 ovvero il primo id che è in tabella. perche i 31 record precedenti li ho eliminati e parte dal 32esimo

se metto order by id desc mi dà l'ultimo id inserito (162 che posso fare +1 perche non è quello dell'identity)
se metto order by @@identity desc mi dà errore...io ho provato comunque!

questo per dire che al database si collega e anche alla tabella messaggi

rimane il problema aperto

Jeremy Profilo | Guru

Allora .... la select è giusta ... quindi il risultato dovrebbe essere il numero dell'ultima chiave inserita.
A questo punto ho due domande.
1) Su quale DataBase stai lavorando?
2) Sei sicuro che il campo Id sia un tipo Intero con autoincremento(contatore) e chiave primaria?

Facci sapere...
Ciao

miomiomio Profilo | Junior Member

sicurissimo cmq ho ricontrollato ed è intero lungo contatore
il database è un database access 2003 .mdb


ho finalmente trovato il bandolo della matassa!!!

@@IDENTITY funziona solo subito dopo una insert all'interno della stessa connessione

quindi ho fatto così

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
questo codice va messo subito dopo l'execute dell'insert e prima di chiudere la connessione altrimenti dà zero
finalmenteeeeeeeeeeeee

grazie per le dritte e l'aiuto, senza di te jeremy non ci sarei mai arrivato


MM_editCmd.Execute
MM_editCmd.CommandText = "SELECT @@IDENTITY as ident FROM messaggi"
Set numes = MM_editCmd.Execute
numes=numes("ident")

MM_editCmd.ActiveConnection.Close

Jeremy Profilo | Guru

Ciao.
Grazie anche a te ... questa cosa che andava fatta la select subito dopo una insert .... sinceramente non la sapevo neppure io.
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5