Данные SQL Server в макет HTML - PullRequest
       0

Данные SQL Server в макет HTML

0 голосов
/ 25 октября 2010

Привет всем, я пытаюсь этот код ниже, чтобы поместить в мой собственный HTML-макет для экспорта в PDF.

SELECT 
DISTINCT i.InvoiceNumber as 'Invoice', 
'$' + CONVERT(varchar(50),round((CONVERT(int,Points) * .1),0)) AS 'Amount', 
'$' + CONVERT(varchar(50), 1.50) AS 'Fee' 
FROM tblHGP HGP, OrderDetails OD, tblInvoices i
        JOIN tblCS cs ON i.InvoiceNumber = cs.InvoiceNumber
        JOIN tblEC ac ON i.InvoiceNumber = ac.InvoiceNumber 
WHERE cs.SoldTo = HGP.ECardInd 
AND issued BETWEEN '2010-09-01' AND '2010-09-30 23:59:59' 
AND CountryCode = 'US' 
AND HGP.invoiceNumber = OD.orderdetailsid 
Order by i.InvoiceNumber

Сейчас он возвращает 6 записей, и мне нужно иметь возможность создать HTML для КАЖДОЙ найденной записи (и в этом примере 6)

Это мой HTML-код:

SET @theHTML= '<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<style type="text/css"><!--
span.cls_002{font-family:Arial,serif;font-size:15.6px;color:rgb(0,0,0);font-weight:bold;font-style:normal}
div.cls_002{font-family:Arial,serif;font-size:13.6px;color:rgb(0,0,0);font-weight:bold;font-style:normal}
....
<div style="position:absolute; left:90.00px; top:313.08px; width: 249px" class="cls_004">' + @whatReportFees + '</div>
<div style="position:absolute; left:347px; top:313.32px" class="cls_004">' + @FeesQty + '</div>
<div style="position:absolute; left:424.44px; top:313.32px" class="cls_004">$1.50</div>
<div style="position:absolute; left:482.89px; top:313.32px" class="cls_004">$' + convert(varchar(30), CONVERT(MONEY, @FeesTotal, 3), 3) + '</div>
<div style="position:absolute; left:90px; top:329px; width: 249px" class="cls_004">' + @whatReportRed + '</div>
 etc...

Я действительно не знаю, как включить HTML-код в запрос, чтобы он создавал новый каждый раз, когда находит новый номер счета. whatReportRed , FeesQty будет в том месте, куда нужно будет отправлять данные.

Тогда я бы запустил это, чтобы создать ящик PDF

 exec clrPdfFromHTML '\\reports\report.pdf', @theHTML

Любой вклад был бы великолепен! : О)

ИСПЫТАНИЯ

DECLARE @HtmlHead varchar(4000); SET @HtmlHead = '<html><head></head><body>'
DECLARE @HtmlTail varchar(4000); SET @HtmlTail = '</body></html>'

DECLARE @theHTML varchar(4000)
DECLARE CreatePdf_Cursor CURSOR FOR
SELECT @HtmlHead
    + '<div>' + i.InvoiceNumber + '</div>'
    + @HtmlTail AS theHTML
FROM 
    (SELECT 
    DISTINCT i.InvoiceNumber as 'Invoice', 
    '$' + CONVERT(varchar(50),round((CONVERT(int,Points) * .1),0)) AS 'Amount', 
    '$' + CONVERT(varchar(50), 1.50) AS 'Fee' 
    FROM tblHGP HGP, OrderDetails OD, tblInvoices i
    JOIN tblCS cs ON i.InvoiceNumber = cs.InvoiceNumber
    JOIN tblEC ac ON i.InvoiceNumber = ac.InvoiceNumber 
     WHERE cs.SoldTo = HGP.ECardInd 
    AND issued BETWEEN '2010-09-01' AND '2010-09-30 23:59:59' 
    AND CountryCode = 'US' 
    AND HGP.invoiceNumber = OD.orderdetailsid)
OPEN CreatePdf_Cursor
WHILE 1=1
BEGIN
    FETCH NEXT FROM CreatePdf_Cursor INTO @theHTML
    IF @@FETCH_STATUS <> 0 BREAK
    --exec clrPdfFromHTML '\\reports\report.pdf', @theHTML
END
CLOSE CreatePdf_Cursor
DEALLOCATE CreatePdf_Cursor

ERROR

Msg 156, Level 15, State 1, Line 21

Неверный синтаксис рядом с ключевым словом «OPEN».

David

Ответы [ 2 ]

1 голос
/ 25 октября 2010

Код, который вы добавили под ТЕСТИРОВАНИЕ, должен выглядеть следующим образом:

DECLARE @HtmlHead varchar(4000); SET @HtmlHead = '<html><head></head><body>'
DECLARE @HtmlTail varchar(4000); SET @HtmlTail = '</body></html>'

DECLARE @theHTML varchar(4000)
DECLARE CreatePdf_Cursor CURSOR FOR
SELECT @HtmlHead
    + '<div>' + Cast(mySubquery.Invoice as varchar(100)) + '</div>'
    + @HtmlTail AS theHTML
FROM 
    (SELECT 
    DISTINCT i.InvoiceNumber as 'Invoice', 
    '$' + CONVERT(varchar(50),round((CONVERT(int,Points) * .1),0)) AS 'Amount', 
    '$' + CONVERT(varchar(50), 1.50) AS 'Fee' 
    FROM tblHGP HGP, OrderDetails OD, tblInvoices i
    JOIN tblCS cs ON i.InvoiceNumber = cs.InvoiceNumber
    JOIN tblEC ac ON i.InvoiceNumber = ac.InvoiceNumber 
     WHERE cs.SoldTo = HGP.ECardInd 
    AND issued BETWEEN '2010-09-01' AND '2010-09-30 23:59:59' 
    AND CountryCode = 'US' 
    AND HGP.invoiceNumber = OD.orderdetailsid) as mySubquery
OPEN CreatePdf_Cursor
WHILE 1=1
BEGIN
    FETCH NEXT FROM CreatePdf_Cursor INTO @theHTML
    IF @@FETCH_STATUS <> 0 BREAK
    --exec clrPdfFromHTML '\\reports\report.pdf', @theHTML
END
CLOSE CreatePdf_Cursor
DEALLOCATE CreatePdf_Cursor
1 голос
/ 25 октября 2010

Вызов хранимой процедуры для каждой строки в наборе результатов действительно требует курсора, это одна из немногих вещей, которые вы не можете сделать с помощью SQL на основе набора, если не разберете хранимую процедуру.

Чтобы использовать более простой пример:

DECLARE @HtmlHead varchar(4000); SET @HtmlHead = '<html><head></head><body>'
DECLARE @HtmlTail varchar(4000); SET @HtmlTail = '</body></html>'

DECLARE @theHTML varchar(4000)
DECLARE CreatePdf_Cursor CURSOR FOR
    SELECT @HtmlHead
        + '<div>' + col1 + '</div>'
        + @HtmlTail AS theHTML
    FROM table
OPEN CreatePdf_Cursor
WHILE 1=1
BEGIN
    FETCH NEXT FROM CreatePdf_Cursor INTO @theHTML
    IF @@FETCH_STATUS <> 0 BREAK

    exec clrPdfFromHTML '\\reports\report.pdf', @theHTML
END
CLOSE CreatePdf_Cursor
DEALLOCATE CreatePdf_Cursor

С такими курсорами я предпочитаю прерываться в середине бесконечного цикла, а не повторять код FETCH NEXT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...