Avatar billede steen_hansen Forsker
23. august 2018 - 19:01 Der er 1 kommentar og
1 løsning

Relation: Ret værdi, når brugerne kommer ind på siden (ASP/MySQL)

Dim RSCheckDuration2
    Set RSCheckDuration2 = Conn.Execute("SELECT * FROM lbr_messages WHERE duration = 2")

    If Not RSCheckDuration2.EOF Then
        Do Until RSCheckDuration2.EOF
            Dim RSCheckDurationRead
            Set RSCheckDurationRead = Conn.Execute("SELECT * FROM lbr_messages_read WHERE newID = " & RSCheckDuration2("messageID") & " And NotRead = 0 And duration = 1")
            'Conn.Execute "UPDATE lbr_messages SET duration = 1 WHERE messageID = " & RSCheckDurationRead("newID") & ""

        If RSCheckDurationRead("NotRead") <> 1 Then
            Conn.Execute "UPDATE lbr_messages SET duration = 1 WHERE messageID = " & RSCheckDurationRead("newID") & ""
        End If

        RSCheckDuration2.MoveNext
        Loop
    End If




Jeg ved ikke lige hvordan jeg skulle formulere spørgsmålet i titlen. Men jeg har 2 tabeller: messages og messages_read

Den ene bruges til beskeder: Bruger opretter en besked med en tilhørende titel. Den indeholder følgende, som er relevante for dette spørgsmål:

1. messageID
2. duration

Med nummer "2. duration" menes der, at man ved oprettelse kan vælge:

1. Skal slettes ved midnat (flygtig information, som kun er relevant for den indeværende dag, værdi = 1)
2. Skal først slettes, når alle brugere har læst beskeden (værdi = 2. Brugerne kan være syge, på ferie, på kursus osv. Så skal beskeden ikke fjernes før de alle er kommet tilbage og har læst den)

Så hvis brugeren markerer i "Slettes ved midnat", er det ikke noget problem. Jeg har lavet et script, som sletter alle recordsets med messageID nummer X, både fra messages og messages_read. Det er efterprøvet, og virker perfekt.

Da det er til beskeder for alle brugerne, kopierer jeg alle brugerne fra "users" over i messages_read hver gang der er en bruger, som opretter en besked.. Her tager jeg messageID fra messages og lægger over i newID ud for hver bruger i messages_read. Virker fint. Ligeledes kommer duration med. messages_read indeholder disse relevante recordsets

1. newID (= messageID fra messages)
2. readers (= alle brugerne fra "users")
3. NotRead (standardværdi = 1. Når bruger går ind på siden, ændres 1 til 0; brugeren har været inde på siden)
3. newID (= messageID fra messages)

Forfatteren opretter beskeden, og den får tildelt et ID i messageID (messages)
Alle brugere kopieres fra "users" over i messages_read, sammen med duration fra messages til messages_read, og messageID fra messages til newID ud for hver enkelt user i messages_read.

Når den første bruger går ind på siden, vil NotRead for denne bruger ændres fra 1 til 0. Resten af brugerne vil stadig have værdien 1 i NotRead, siden de endnu ikke har været inde endnu.

Så er problemet: Når samtlige brugere har været inde og læse beskederne, står der 0 i NotRead ud for alle brugerne. Når der gør det, skal duration i messages ændres fra 2 til 1. Så kan det slettes ved næste datoskifte. Og det skal kunne rettes i toppen besked-siden. Dvs der skal laves et tjek i toppen af siden, hvor:

1. NotRead bliver ændret fra 1 til 0 på den pågældende bruger i messages_read
2. Hvis der står 0 i NotRead ud for samtlige brugere i messages_read, skal duration ændres fra 2 til 1. Så har alle læst beskeden, og så kan den slettes fra messages, og tilhørende data slettes fra messages_read ved næste datoskifte. Og det er mit problem. Jeg kan ikke få det til at virke, jeg kan ikke ændre duration  i messages fra 2 til 1 på den pågældende messageID i messages, når der står 0 i NotRead på alle brugere i messages_read. Et eksempel på tabellerne kunne se sådan her ud:

MESSAGES:
messagesID = 1
duration = 2 'Siden NotRead = 0 på dette ID i messages_read, skal duration ændres fra 2 til 1

messagesID = 2
duration = 2 'Bruger B har endnu ikke læst denne besked. Ergo skal duration fortsat hedde 2

MESSAGES_READ
BugerA:
newID = 1
NotRead = 0

Buger B:
newID = 1
NotRead = 0

BugerA:
newID = 2
NotRead = 0

Buger B:
newID = 2
NotRead = 1

Nu har jeg rodet meget rundt i det her for at få det til at virke, så tilgiv mig, at koden måske ikke ser logisk ud:

'RET NotRead til 0 PÅ BrugerX (virker fint)
'-------------------------------------------------------------------------------------------------------------------------------------------------------
    Dim RSMessage
    Set RSMessage = Conn.Execute("SELECT * FROM messages ORDER BY messageID DESC")

    Conn.Execute "UPDATE messages_read SET NotRead = 0, duration = 1 WHERE readers = '" & SQLEncode(Session("username")) & "'"
'-------------------------------------------------------------------------------------------------------------------------------------------------------


'HVIS NotRead = 0 HOS ALLE BRUGERE I messages_read PÅ DET SAMME newID i messages_read, RET duration TIL 1 I messages
'-------------------------------------------------------------------------------------------------------------------------------------------------------
    Dim RSCheckDuration2
    Set RSCheckDuration2 = Conn.Execute("SELECT * FROM messages WHERE duration = 2")

    If Not RSCheckDuration2.EOF Then
        Do Until RSCheckDuration2.EOF
            Dim RSCheckDurationRead
            Set RSCheckDurationRead = Conn.Execute("SELECT * FROM messages_read WHERE newID = " & RSCheckDuration2("messageID") & " And NotRead = 0 And duration = 1")
            Conn.Execute "UPDATE messages SET duration = 1 WHERE messageID = " & RSCheckDurationRead("newID") & ""
        RSCheckDuration2.MoveNext
        Loop
    End If
'-------------------------------------------------------------------------------------------------------------------------------------------------------
Avatar billede steen_hansen Forsker
23. august 2018 - 19:21 #1
Se venligst bort fra scriptet øverst på siden. Det skulle ikke have været med.
Avatar billede steen_hansen Forsker
15. september 2018 - 09:39 #2
Lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester