Avatar billede goose Nybegynder
21. juli 2006 - 09:43 Der er 9 kommentarer og
1 løsning

Send kun en mail til hver modtager

Jeg har lavet et nyt modul til nyhedsbreve, men er rendt ind i et problem som jeg ikke rigtig kan se hvordan jeg løser.

Når man tilmelder sig nyhedsbrevet, kan man sætte vinge i nogle checkbokse ud fra ens interessepunkter.

Når jeg så udsender nyhedsbrev, så vinger jeg de interessepunkter (groupID) af som skal modtage nyhedsbrevet og sender nyhedsbrevet.

Til hver modtager i databasen, er der så tilknyttet et tekstfelt der indeholder id-numre på de grupper vedkommende er tilmeldt i formen: ,2,5,3, osv., altså et komma, et ID-nummer og et komma.

Jeg sender så på følgende måde:

arrModtager = Split(Request.form("groupID"), ", ")
For t = 0 to UBound(arrModtager)

SQLsend = "SELECT * FROM TBL_nyhedsbrev_modtagere where groupID like'%,"& arrModtager(t) &",%'"

set send = conn.execute(SQLsend)

.... og her sker selve opbygning og afsendelsen

send.movenext
loop
objMailer.close
set objMailer = nothing
send.close
set send = nothing
next

Problemet er jo blot, at da jeg lopper igennem hver groupID, og modtageren er tilknyttet flere grupper, ja så får vedkommende en mail for hver gruppe han står. Dette er ikke meningen.

Hvordan ændrer jeg så der kun udsendes én mail til hver modtager selvom vedkommende står opført i flere grupper?

/Goose
Avatar billede softspot Forsker
21. juli 2006 - 09:48 #1
Forsøg evt. med:

SQLsend = "SELECT DISTINCT * FROM TBL_nyhedsbrev_modtagere where groupID like'%,"& arrModtager(t) &",%'"
Avatar billede fennec Nybegynder
21. juli 2006 - 09:51 #2
Du skal opbygge SQL'en dynamisk:
arrModtager = Split(Request.form("groupID"), ", ")
For t = 0 to UBound(arrModtager)
    if t=0 then
        SQLsend = "SELECT distinct name, email FROM TBL_nyhedsbrev_modtagere where groupID like'%,"& arrModtager(t) &",%'"
    else
        SQLsend = SQLsend & "union SELECT distinct name, email FROM TBL_nyhedsbrev_modtagere where groupID like'%,"& arrModtager(t) &",%'"
    end if
next
set send = conn.execute(SQLsend)
while not send.eof
...
wend
Avatar billede softspot Forsker
21. juli 2006 - 10:03 #3
Ja, fennec har naturligvis ret i at SQL-sætningen skal sammensættes inden du kalder databasen (det giver med stor sandsynlighed også en bedre performance).

Men bort set fra det, så ville det være mere relationelt korrekt at lave en relation (altså en særskilt tabel) mellem brugeren og nyhedsbrevet, da dette ville gøre din forspørgsel lidt mere naturlig (med hjælp fra en join), men sådan skal det nok ikke være... :)
Avatar billede fennec Nybegynder
21. juli 2006 - 10:17 #4
Vil være enig med softspot om en ændring af databasen. Kommasepereret lister har INTET at gør i en DB. De skal udskiftes med en mellem-tabel. Noget i denne stil:

[user2group]
userID, groupID
1, 3
1, 4
1, 5
2, 2
2, 5
Avatar billede softspot Forsker
21. juli 2006 - 10:28 #5
...ja, relationer er jo netop det der gør at relationelle databaser fortjener den betegnelse ;-)
Avatar billede goose Nybegynder
21. juli 2006 - 13:19 #6
Jeg ved sg* ikke lige hvad der går galt, men hvis jeg bruger det fennec skriver, så ser min SQLsend således ud:

SELECT distinct modtager, user, customeratt FROM TBL_nyhedsbrev_modtagere where groupID like'%,5,%'union SELECT distinct modtager, user, customeratt FROM TBL_nyhedsbrev_modtagere where groupID like'%,6,%'

Nu aner jeg ikke hvad union gør/betyder, men det der sker er, at den tager den første modtager, og så pumper den bare mails afsted til den pågældende i et væk, som om den kommer ind i en uendelig løkke?

Selve afsendelsen ser nu således ud:

arrModtager = Split(Request.form("groupID"), ", ")
For t = 0 to UBound(arrModtager)
    if t=0 then
        SQLsend = "SELECT distinct modtager, user, customeratt FROM TBL_nyhedsbrev_modtagere where groupID like'%,"& arrModtager(t) &",%'"
    else
        SQLsend = SQLsend & "union SELECT distinct modtager, user, customeratt FROM TBL_nyhedsbrev_modtagere where groupID like'%,"& arrModtager(t) &",%'"
    end if
next


response.write(SQLsend)

set send = conn.execute(SQLsend)

while not send.eof

response.write send("modtager") & "<br>"
Response.Flush
wend
send.close
set send = nothing
conn.close
set conn = nothing

/Goose
Avatar billede goose Nybegynder
21. juli 2006 - 13:28 #7
Det ser ud til det virker hvis jeg bruger:

do while not send.eof

response.write send("modtager") & "<br>"
Response.Flush
send.movenext
loop


..... mærkeligt, men jeg tester lige lidt mere ...

/Goose
Avatar billede goose Nybegynder
21. juli 2006 - 14:44 #8
Det ser ud til det virker nu, og da fennec har givet den løsning som jeg brugte vil jeg godt have et svar fra fennec.

/Goose
Avatar billede fennec Nybegynder
21. juli 2006 - 14:49 #9
.o) <-- One Eyed Jack
Avatar billede goose Nybegynder
21. juli 2006 - 15:23 #10
Tak for hjælpen og god weekend.

/Goose
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
Kategori
Kurser inden for grundlæggende programmering

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