Subproceso anulado al exportar PDF Crystal Reports

Buen día expertos, tengo un problema al querer generar un PDF con Crystal Reports desde .NET

La función que ejecuto es la siguiente:

private void saveCR(string docEntry)
{
    try
    {
        ReportDocument objRepDoc = new ReportDocument();
        objRepDoc.Load(@"C:\ruta.rpt");
        objRepDoc.SetParameterValue(0, docEntry);
        objRepDoc.SetParameterValue(1, 23);

        ConnectionInfo objConn = new ConnectionInfo();
        objConn.DatabaseName = "DB_Name";
        objConn.ServerName = "Server_Name";
        objConn.UserID = "user";
        objConn.Password = "pass";

        TableLogOnInfo objTableLogOnInfo = new TableLogOnInfo();
        objTableLogOnInfo.ConnectionInfo = objConn;
        objRepDoc.Database.Tables[0].ApplyLogOnInfo(objTableLogOnInfo);

        objRepDoc.ExportToHttpResponse(ExportFormatType.PortableDocFormat, Response, true, docNum);

        ShowMessage("Se ha guardado el PDF correctamente", MessageType.Success);

        //CloseReports(objRepDoc);
        //objRepDoc.Close();
        //objRepDoc.Dispose();
    }
    catch (Exception ex)
    {
        error = "Error al crear el documento de CR: " + ex.StackTrace;
        ShowMessage(error, MessageType.Error);
    }
}

La aplicación me marca error Subproceso anulado al llamar a ExportToHttpResponse, el stack trace de la excepción que obtengo dice esto:

en System.Threading.Thread.AbortInternal()
en System.Threading.Thread.Abort(Object stateInfo)
en System.Web.HttpResponse.AbortCurrentThread()
en System.Web.HttpResponse.End()
en CrystalDecisions…

Alguien ha tenido algún problema similar? Si me descarga el PDF como adjunto, pero me marca ese error y el código siguiente no lo ejecuta.

Gracias de antemano, saludos cordiales.

Intenta cambiando el tipo de dato de DocEntry a integer.

Buen día @juliancab, gracias por su respuesta, acabo de intentar con ese cambio, sin embargo me marca el mismo error que antes :frowning_face: alguna otra sugerencia??

De antemano gracias.

ruta.rpt es tu formato en CRYSTAL REPORTS, y quiero pensar que la tienes conectado a un servidor x con una bd x…

quita todo esto para testear:

ConnectionInfo objConn = new ConnectionInfo();
objConn.DatabaseName = “DB_Name”;
objConn.ServerName = “Server_Name”;
objConn.UserID = “user”;
objConn.Password = “pass”;

    TableLogOnInfo objTableLogOnInfo = new TableLogOnInfo();
    objTableLogOnInfo.ConnectionInfo = objConn;
    objRepDoc.Database.Tables[0].ApplyLogOnInfo(objTableLogOnInfo);

Me a pasado que en modo runtime esta parte me genera ese error, pero ya empaquetado si es necesario para que se actualice la conexion.

Hice la prueba quitando lo que me indicó señor Julian, y me descarga el PDF con la pura plantilla pero sin la información del documento (líneas, cliente, total, etc.), y después de descargar el PDF me arroja la misma excepción.

¿Qué será lo que estoy haciendo mal? Conoce otro modo de descargar el PDF que pudiera intentar?

Te comparto como lo hago:

if (!File.Exists(sArchivoPDF))
{
EventLog.WriteEntry(sSource, "Iniciando proceso para archivo: " + sArchivoPDF);
ReportDocument cryReportDocument = new ReportDocument();
cryReportDocument.Load(sPlantilla);
cryReportDocument.SetDatabaseLogon(usuarioBD, passBD, servidorBD, nombreBD);
cryReportDocument.SetParameterValue(“DocKey@”, iDocEntry);
cryReportDocument.ExportToDisk(ExportFormatType.PortableDocFormat, sArchivoPDF);
cryReportDocument.Dispose();
EventLog.WriteEntry(sSource, “PDF Creado”);
}

espero te sea de utilidad.

2 Me gusta

Muchas gracias por su respuesta @juliancab, logro generar el archivo en una ruta física con el ejemplo que me proporcionó, sin embargo no consigo que se descargue desde el navegador, debido a que la aplicación está en una página web, requiero que el usuario pueda descargar el PDF como adjunto directamente.

@chavalito Veo que tienes mucha experiencia con DI API, has trabajado con esto de casualidad?

Bueno después de un poco de investigación fuera de lo relacionado con DI API, me encontré con que al parecer este comportamiento es el normal, y parte del proceso de la rutina Response es arrojar una excepción.

Lo pude solucionar de la siguiente manera:

private void saveCR(string docEntry)
{
    try
    {
        objRepDoc = new ReportDocument();
        objRepDoc.Load(@"C:\xml\COT_CR.rpt");
        objRepDoc.SetParameterValue(0, docEntry);
        objRepDoc.SetParameterValue(1, 23);

        ConnectionInfo objConn = new ConnectionInfo();
        objConn.DatabaseName = "DB_Name";
        objConn.ServerName = "Server";
        objConn.UserID = "user";
        objConn.Password = "pass";

        TableLogOnInfo objTableLogOnInfo = new TableLogOnInfo();
        objTableLogOnInfo.ConnectionInfo = objConn;
        objRepDoc.Database.Tables[0].ApplyLogOnInfo(objTableLogOnInfo);

        objRepDoc.ExportToHttpResponse(ExportFormatType.PortableDocFormat, Response, true, docNum);
    }
    catch (ThreadAbortException)
    {
        //Ignoro la excepción ocasionada por el Response.End()
    }
    catch (Exception ex)
    {
        error = "Error al crear el documento: " + ex.Message;
        lblError.Text = error;
        lblError.Visible = true;
    }
    finally
    {
        //Cerrar reporte y borrar temporales generados
        CloseReports(objRepDoc);
        objRepDoc.Close();
        objRepDoc.Dispose();
    }
}

Fuente: _ttp://support.microsoft.com/kb/312629

Lo dejo por si a alguien en un futuro le es de utilidad. Saludos cordiales.

2 Me gusta

Buenas tardes @l.villarreal

Una disculpa por contestar tan tarde, te comento que en programación web, solo se lo básico, yo utilizo DIAPI con aplicaciones de escritorio, o tipo servicios de windows cuando no es necesario la intervención del usuario.
Ahora bien, como comentario, yo lo realizo igual que @juliancab, ya sea para exportarlo en PDF o para enviarlo a la impresora, según sea el requerimiento.

Con respecto a la solución que aplicaste, yo lo que haría es un try-catch general que abarque todo el proceso, y un try-catch específico para la linea que está causando el problema, a menos que antes de esa linea no exista la posibilidad de que arroje un error, de lo contrario lo estarías ignorando.

Saludos
SAP B1, v9.2 PL03
México

Gracias por tu respuesta, y descuida no hay problema.

Por fortuna en esta pestaña/página de la aplicación es el único proceso que se realiza, así que salvo por un par de validaciones runtime, es la única excepción que puede generarse, de igual forma para rescatar cualquier otro escenario dejo el catch a nivel general. Muchas gracias!

Este tema se cerró automáticamente 7 días después del último post. No se permiten nuevas respuestas.