Chriz12 Ответов: 1

Запланированное задание-экспорт .rpt в PDF-файл


Привет,

Я хочу создать запланированное задание, которое экспортирует отчет crystal в pdf. Я использую Quartz NuGet в качестве планировщика. Вот мой код:

using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using Quartz;
using System;
using System.IO;
using System.Net;
using System.Web;
 
namespace TestSchedule.App_code
{
    public class LettersJob:IJob
    {
        public static string text;
 
        public void Execute(IJobExecutionContext context)
        {
            int appno = 2;
            int regNum = 1;
 
            PrintLetter(appno, regNum);
        }
 
        public void PrintLetter(int appno,int regNum)
        {
 
            text = text + "A";
            System.IO.File.WriteAllText("C:\\temp\\WriteText.txt", text);
 
            ReportDocument cryRpt = new ReportDocument();
            Random random = new Random();
            int randomNumber = random.Next(0, 100000);
 
            try
            {
                if (regNum == 1)
                    cryRpt.Load(System.Web.HttpContext.Current.Server.MapPath("~/ApproveLetterA.rpt"));
                else
                {
                    cryRpt.Load(System.Web.HttpContext.Current.Server.MapPath("~/ApproveLetterB.rpt"));
                }
 
                cryRpt.SetParameterValue("@appno", appno);             
 
                ExportOptions CrExportOptions;
                DiskFileDestinationOptions CrDiskFileDestinationOptions = new DiskFileDestinationOptions();
                PdfRtfWordFormatOptions CrFormatTypeOptions = new PdfRtfWordFormatOptions();
                CrDiskFileDestinationOptions.DiskFileName = "C:\\temp\\CertNo" + appno + randomNumber + ".pdf";
                CrExportOptions = cryRpt.ExportOptions;
                  {
                    CrExportOptions.ExportDestinationType = ExportDestinationType.DiskFile;
                    CrExportOptions.ExportFormatType = ExportFormatType.PortableDocFormat;
                    CrExportOptions.DestinationOptions = CrDiskFileDestinationOptions;
                    CrExportOptions.FormatOptions = CrFormatTypeOptions;
                  }
                    cryRpt.Export();                
            }
            catch (Exception ex) { Console.Write(ex.Message); }
        }

using Quartz;
using Quartz.Impl;
using System;
 
namespace TestSchedule.App_code
{
    public class JobScheduler
    {
        private IScheduler scheduler;
 
        public void Start()
        {
            scheduler = StdSchedulerFactory.GetDefaultScheduler();
            scheduler.Start();
 
            IJobDetail job = JobBuilder.Create<lettersjob>().Build();
 
            ITrigger trigger = TriggerBuilder.Create()
                       .WithIdentity("trigger1", "group1")
                       .StartNow()
                       .WithSimpleSchedule(x => x
                       .WithIntervalInSeconds(10)
                       .RepeatForever())
                       .Build();
 
            scheduler.ScheduleJob(job, trigger);
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Optimization;
using System.Web.Routing;
using System.Web.Security;
using System.Web.SessionState;
using TestSchedule.App_code;
 
namespace TestSchedule
{
    public class Global : HttpApplication
    {
        JobScheduler jobScheduler;
 
        void Application_Start(object sender, EventArgs e)
        {
            // Code that runs on application startup
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
 
            jobScheduler = new JobScheduler();
            jobScheduler.Start();
        }
    }
}


Проблема в том, что я не могу получить RPT, экспортированный в pdf, когда PrintLetter работает на планировщике.
Есть идеи, что я делаю не так? Есть ли другой способ реализовать планировщик?

Заранее спасибо.

Что я уже пробовал:

1. я запускаю PrintLetter при загрузке Default. aspx и получаю экспортированный файл, как и предполагалось.
2. я добавил команду write to file на PrintLetter и запустил планировщик, и текст записывается в файл, как и предполагалось.
3. Я бегу PrintLetter через планировщик я получаю только текст, записанный в текстовом файле.
4. я пытаюсь использовать службу Windows на основе этого примера (Повторяйте задачу каждые N интервалов с помощью службы Windows В C# и VB.Net[^]) но я получаю те же результаты, что и выше, запись в файл работает, но экспорт rpt в pdf не работает.

1 Ответов

Рейтинг:
7

Chriz12

Я только что нашел ошибку, кажется, что следующая строка не работает.

cryRpt.Load(System.Web.HttpContext.Current.Server.MapPath("~/ApproveLetterA.rpt));

Я изменил его на полный путь и работал.
cryRpt.Load(@"C:\ApproveLetterA.rpt");

не очень удобно ... но, по крайней мере, это работает.