Meu requisito é criar o e-mail automatizado como ( Um e-mail HTML formatado via Database Mail) O requisito básico foi concluído onde quando o Job é acionado ele insere os dados em uma Tabela e essa informação foi agendada para ser enviada como um E-mail, mas agora o cliente solicitou neste formato.
Formato atual que fiz
PO Date:2014-11-26 PO ID:PO1 SAP Ref:0001106102 GRN:1067 DealerID:045 Dealer Name:ABC(Pvt)Ltd. 2 Status:New
Formato solicitado pelo cliente em formato de tabela
PO Date |PO ID| SAP Ref| GRN|DealerID|Dealer Name|Status
Esta é a consulta SQL que utilizo para inserir os dados no Email_Table(_ERROR_MAIL) e isso precisa ser cobiçado de acordo com o requisito
IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'ImpCancelledGRN')
BEGIN
DROP PROCEDURE [dbo].[ImpCancelledGRN]
END
GO
CREATE PROCEDURE [dbo].[ImpCancelledGRN]
WITH ENCRYPTION
AS
SET NOCOUNT ON
BEGIN
BEGIN TRY
-- Begin transaction
BEGIN TRAN
INSERT INTO _ERROR_MAIL(Recipients, Subject, CreationDate, IsNew, LastModifiedBy, Body)
SELECT '[email protected]', 'SAP CANCELLED GRN', GETDATE(), 1, 'sapws',
'PO Date:' + CONVERT(VARCHAR(10),P.Date,120) +
' PO ID:' + P.ID +
' SAP Ref:' + P.ID2 +
' GRN:' + G.ID +
' Dealer ID:' + D.ID +
' Dealer Name:' + D.Name +
' Status:' + CASE WHEN G.SubmittedDate IS NULL THEN 'New' ELSE 'Dealer Submitted' END
FROM I_CancelledGRN I
INNER JOIN TxnGRN G ON G.ID = I.ID
INNER JOIN Distributor D ON D.UID = G.DistributorUID
INNER JOIN POTxn P ON P.SiteUID = G.POTxn_SiteUID AND P.UID = G.POTxnUID
WHERE IsCancelled IS NULL;
UPDATE TxnGRN
SET ExpiryDate = GETDATE()
, SAPCancellationDate = I.Date
, SAPCancelledBy = 'SAP'
, IsCancelled = 1
FROM I_CancelledGRN I
INNER JOIN TxnGRN G ON G.ID = I.ID
WHERE IsCancelled IS NULL;
-- Commit transaction
COMMIT TRAN
END TRY
BEGIN CATCH
-- Get error message, severity and satus information
DECLARE @ErrorMessage NVARCHAR(4000), @ErrorSeverity INT, @ErrorState INT;
SELECT @ErrorMessage = ERROR_MESSAGE(), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE();
-- Rollback transaction
ROLLBACK TRAN;
-- Log error message details
INSERT INTO _ERROR_LOG(Module, SubModule, Text, Date)
VALUES('SAP', '[ImpCancelledGRN]', @ErrorMessage, GETDATE());
-- Raise error
RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);
END CATCH
RETURN 0;
END
SET NOCOUNT OFF
GO
Aqui, como você pode criar parte do corpo HTML do seu e-mail.
Passo 1:
Etapa 2: criar perfil de e-mail do banco de dados
Etapa 3: enviar e-mail
Meus usuários estão encontrando a solução "XML PATH" e tentando usá-la, mas eles não são programadores e ficam confusos. Em vez de tentar ajudá-los a aprender a usar XML PATH, criei um procedimento que recebe o nome de uma tabela e retorna uma string contendo a marcação HTML para exibir a tabela como uma tabela HTML. Minha solução deriva dinamicamente os nomes das colunas da tabela HTML da fonte de dados.
Exemplo de uso do procedimento HtmlTable
A variável @tableHtml contém apenas marcação para uma tabela HTML, que é apropriada para inclusão em um corpo de email. Para visualizar sozinho, você precisa envolver a saída com as tags html, head e body.
Saída do procedimento HtmlTable
Código para o procedimento HtmlTable
Observe que estou invocando o procedimento "DataSourceCheck" para determinar se o parâmetro @data_source contém o nome de uma tabela válida. DataSourceCheck não precisa ser um procedimento separado - o SQL pode ser incluído diretamente no procedimento HtmlTable, mas eu o mantenho separado para modularidade e reutilização.
Exemplo de uso do procedimento DataSourceCheck
Resultado
Agora solte a tabela e veja o que acontece:
Resultado
Código para o procedimento DataSourceCheck
Eu também tenho uma versão do HtmlTable que cria um arquivo CSV de uma tabela (em vez de uma tabela HTML).