75 messaggi dal 04 ottobre 2007
Per cortesia mi aiutate a pensare su quesa cosa che devo fare?
Mi spiego meglio:

Faccio una

SELECT DISTINCT IDSessione FROM carrello WHERE DataAggiunta = (CURDATE() - interval 2 day) 

    Set RSnews4 = Conn.Execute(SQLnews4)
    If Not RSnews4.EOF Then
    
    RSnews4.MoveFirst
    Do While Not RSnews4.EOF


Per cercare tutte le sessioni nel carrello con una certa data...

Ora per ogni sessione ci sono più prodotti aggiunti quindi dovrei mandare 1 e dico UNA sola email per ogni sessione ma che all'interno ci siano tutti i prodotti legati alla stessa sessione... quindi farei così:


SQLnews5 = " SELECT carrello.*, prodotti.PFoto, prodotti.Prodotto FROM carrello INNER JOIN prodotti ON carrello.IDProdotto = prodotti.ID WHERE carrello.IDSessione = '"& RSnews4("IDSessione")&"'"

        Set RSnews5 = Conn.Execute(SQLnews5)

            If Not RSnews5.EOF Then
            RSnews5.MoveFirst
            
            Do While Not RSnews5.EOF
            articolo =  RSnews5("prodotto")


Ora dovrei inserire il ciclo dei prodotti (ad esempio prodotto1, prodotto2, ecc) della stessa sessione alla mail ma non so come fare

.HTMLBody = .HTMLBody & "<tr>" & vbCRLF & ""
.HTMLBody = .HTMLBody & "<td>" & vbCRLF & ""
.HTMLBody = .HTMLBody & "<font face=Arial size=3><b>"&articolo&"</b>:" & vbCRLF & "" 
.HTMLBody = .HTMLBody & "</td>" & vbCRLF & ""
.HTMLBody = .HTMLBody & "</tr>" & vbCRLF & ""


Quindi devo mettere piu righe articolo...
Spero possiate darmi qualche consiglio, grazie in anticipo
F
salve,
stavo pensando tu stessi cercando una soluzione in codice SQL, ma non mi pare questo il caso, vero?
vuoi che sposti la tua domanda in altro forum?

al di la' di questo, senza ciclare con piu' query, "forse" (dipendentemente da quante informazioni devi estrarre nel ciclo interno), in SQL Server io penserei forse anche a preaggregare direttamente il risultato in un resultset unico... nel caso (sicuramente esemplificativo) che riportavi, mi pare tu richieda come risultato proiettato {IdSessione | concatenazione_di_prodotti}
in questo caso, (di nuovo, sicuramente esemplificativo e non completo), io concatenerei Prodotti.Prodotto utilizzando la funzionalita' di proiezione FOR XML prevista in Transact-SQL, questo passando come parametro di quuery alla sub query interna di aggregazione la SessionID del carrello... quindi, con il DISTINCT(SessionID) proietto in CROSS APPLY il risultato concatenato ottenuto, ad esempio

SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.Carrello (
  IdSessione int NOT NULL,
  DataAggiunta datetime NOT NULL,
  IdProdotto int NOT NULL
  );
CREATE TABLE dbo.Prodotti (
  Id int NOT NULL,
  Prodotto varchar(5) NOT NULL,
  PFoto varchar(5) NOT NULL
  );
GO
INSERT INTO dbo.Prodotti
  VALUES (1, 'p1', 'pf1'), (2, 'p2', 'pf2'), (3, 'p3', 'pf3'), (4, 'p4', 'pf4'), (5, 'p5', 'pf5');

INSERT INTO dbo.Carrello
  VALUES ( 1, '2018-07-31 18:25', 1), ( 1, '2018-07-31 18:45', 2), ( 1, '2018-07-31 18:55', 3);

INSERT INTO dbo.Carrello
  VALUES ( 2, '2018-07-31 18:25', 4), ( 2, '2018-07-31 18:45', 5);

INSERT INTO dbo.Carrello
  VALUES ( 3, '2018-08-01 18:25', 1), ( 3, '2018-08-01 18:45', 2), ( 3, '2018-08-01 18:55', 3);

INSERT INTO dbo.Carrello
  VALUES ( 4, '2018-07-31 18:25', 5), ( 4, '2018-07-31 18:45', 1);

GO
DECLARE @data date = '2018-07-31';
SELECT DISTINCT (outC.IdSessione), x.PROD
  FROM dbo.Carrello outC
  CROSS APPLY (
  SELECT SUBSTRING(
    (
      SELECT CHAR(10) + p.Prodotto AS 'data()'
        FROM dbo.Carrello c
          JOIN dbo.Prodotti p ON p.Id = c.IdProdotto
        WHERE DATEDIFF(DAY, @data, c.DataAggiunta ) = 0
          AND c.IdSessione = outC.IdSessione
        FOR XML PATH('')
    ), 2 , 9999) As PROD
  ) x
  WHERE DATEDIFF(DAY, @data, outC.DataAggiunta ) = 0
GO
DROP TABLE dbo.Carrello, dbo.Prodotti
--<--------
IdSessione  PROD
----------- -----
1           p1 
            p2 
            p3
2           p4 
            p5
4           p1 
            p5


solitamente le concatenazioni si fanno "inline" con separatore "," oppure "-", ma qui, per "tua" convenienza visto che concatenavi poi tu dal resultset interno con CRLF, ho messo come separatore CHAR(10)

non va comunque ancora bene in quanto avresti bisogno di tutto il mark up di riga, ma "mi piaceva" provare in questo senso... OK, si potrebbe comunque proporre il risultato testuale cone il mark up gia' innestato... ma non viene molto bello...

forse e' comunque meglio che ti sposto la domanda in altro forum, vero?
saluti
Modificato da Andrea Montanari il 01 agosto 2018 19.46 -

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
75 messaggi dal 04 ottobre 2007
si grazie, uso Mysql come database ma programmazione asp... grazie davvero per tutto il tempo speso nella speigazione...
F
salve,
ti devo poi spostare il thread in altro forum, o lo fai tu?
saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
fatto... saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
75 messaggi dal 04 ottobre 2007
Non c'è nessuno che riesce ad aiutarmi per favore?
11.097 messaggi dal 09 febbraio 2002
Contributi
Ciao,
non sono sicuro di aver capito il problema perché mi sembra che tu abbia tutti gli elementi per risolverlo.


ora dovrei inserire il ciclo dei prodotti (ad esempio prodotto1, prodotto2, ecc) della stessa sessione alla mail ma non so come fare


Devi solo mettere il codice in cui componi il body della mail all'interno del While con cui cicli il recordset.
SQLnews5 = " SELECT carrello.*, prodotti.PFoto, prodotti.Prodotto FROM carrello INNER JOIN prodotti ON carrello.IDProdotto = prodotti.ID WHERE carrello.IDSessione = '"& RSnews4("IDSessione")&"'"
Set RSnews5 = Conn.Execute(SQLnews5)

If Not RSnews5.EOF Then
RSnews5.MoveFirst
            
Do While Not RSnews5.EOF
articolo =  RSnews5("prodotto")

With tuoOggettoMail
.HTMLBody = .HTMLBody & "<tr>" & vbCRLF & ""
.HTMLBody = .HTMLBody & "<td>" & vbCRLF & ""
.HTMLBody = .HTMLBody & "<font face=Arial size=3><b>"&articolo&"</b>:" & vbCRLF & "" 
.HTMLBody = .HTMLBody & "</td>" & vbCRLF & ""
.HTMLBody = .HTMLBody & "</tr>" & vbCRLF & ""
End With

RSnew5.MoveNext
Wend


ciao,
Moreno
Modificato da BrightSoul il 21 agosto 2018 13.45 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.