none
Error al usar ReportViewer RRS feed

  • Pregunta

  • Buenos días amigos. 

    Me pongo en contacto con vosotros para ver si me podéis ayudar en un problema que tengo con un desarrollo en C# utilizando Visual Studio 2013 y SQL Server , ya que es un problema que llevo más de una semana intentando solucionarlo y no doy con el "chiste". 

    Os pongo un poco en antecedentes. 

    La programación permite sacar diferentes listados e informes (utilizo reportviewer) donde toma la información a través de una consulta a la base de Datos (XSD), todos los informes funcionan correctamente menos uno, aunque con mi base de datos funciona, en la del cliente no (he comprobado que la estructura y datos de la BD sea igual a la que tengo en local).

    El reportviewer en cuestión le paso una variable para que forme la consulta según el criterio que marque el cliente, la consulta del XSD es esta: 

    select RTRIM(NMA_PEDIDO) AS NMA_PEDIDO,NMA_FECHAE,NMA_FECHAP,LSM_COMART,LSM_SUSTID,RTRIM(LSM_UNID) as LSM_UNID,RTRIM(LSM_CLAAR1) as LSM_CLAAR1,nivel,RTRIM(NMA_SERIE)AS NMA_SERIE, RTRIM(NMA_PEDIDO) AS_NMA_PEDIDO,RTRIM(hijos.ART_REFERE) as REFEHIJOS, RTRIM(hijos.ART_NOMBRE) AS NOMBREHIJOS, RTRIM(hijos.ART_STOACT) AS ART_STOACT,RTRIM(Artículos.ART_REFERE) AS ART_REFERE,RTRIM(Artículos.ART_NOMBRE) AS ART_NOMBRE from VW_035_estructuraUltNiv 
    inner join Artículos on ART_CLAVE = EST_PADRE 
    inner join Artículos hijos on hijos.ART_CLAVE = EST_CLAAR2
    inner join _035_ListaMateriales ON est_padre = LSM_PADRE and EST_CLAAR1 = LSM_CLAAR1 AND EST_CLAAR2 = LSM_CLAAR2 and EST_SECUEN = LSM_SECUEN
    inner join _035_Maquinas on NMA_CLAART = EST_PADRE
    where EST_PADRE = @padre

    Utilizo una vista y otras tablas relacionadas como podéis observar en la consulta de arriba. 

    El error que arroja la programación es este: 

    Instrucción SQL ejecutada: La consulta
    Origen del error: .Net SqlCliente Data Provider
    Mensaje de error: Error de desbordamiento aritmético al convertir numeric al tipo de datos numeric.

    Sin embargo si copio esa consulta tal cual y la ejecuto desde el SQL Server Managment no me arroja ningún error y me devuelve los datos....

    Otra prueba que he hecho es en vez de utilizar una variable en la consulta poner el valor directamente (en forma de ejemplo) y sin usar la variable me ejecuta el ReportViewer perfectamente. 

    La prueba final ha sido hacerlo de nuevo desde cero, por si alguna  configuración u opción se me había pasado por alto. 

    Entiendo que así es difícil ayudarme con las explicaciones, si alguien ve oportuno podría darle acceso a mi equipo y ver el proyecto directamente. 

    Muchas gracias.

    jueves, 21 de agosto de 2014 9:04

Respuestas

  • El código de error es el 8115, así que busca por ahí como solucionar ese problema, en este post de MSDN hablan de como intentar buscar el porqué de este problema.

    http://blogs.msdn.com/b/sethus/archive/2009/09/09/troubleshooting-arithmetic-overflow-errors-in-queries-using-extended-events-in-sql-server-2008.aspx

    Espero que te sea de ayuda.

    Muchas gracias por la información, al final he conseguido solucionarlo tomando otro camino ya que sospecho que el principal problema venía por una conversión interna a la cual no tengo control de la vista. 

    Lo he solucionado de la siguiente forma, antes de lanzar el listado mediante código me traigo los datos de las vistas y los inserto en una tabla, luego el informe toma los datos de la tabla en vez de la vista, en el momento de cerrar el listado hago un delete de la tabla que he usado para dicho fin para su posterior uso. 

    Espero que si alguien tiene este problema tenga al menos una posible solución. 

    De nuevo muchas gracias !!

    viernes, 22 de agosto de 2014 10:32

Todas las respuestas

  • Hola,

    Viendo el error que te devuelve el driver de SQL Server parece ser que hay alguna columna con un tipo de dato que al hacer la query da un desbordamiento aritmético al hacer la conversión.

    Si funciona en un entorno y no en otro, puede ser por dos cosas, por los datos que sean distintos, y donde te da el error haya un valor que produzca el desbordamiento. Y la otra posibilidad sea que los esquemas de las tablas sean diferentes y la precisión del tipo numérico de la tabla cambien haciendo que la conversión de los tipos sea diferente.

    Saludos. Luis.

    jueves, 21 de agosto de 2014 9:21
  • Hola,

    Viendo el error que te devuelve el driver de SQL Server parece ser que hay alguna columna con un tipo de dato que al hacer la query da un desbordamiento aritmético al hacer la conversión.

    Si funciona en un entorno y no en otro, puede ser por dos cosas, por los datos que sean distintos, y donde te da el error haya un valor que produzca el desbordamiento. Y la otra posibilidad sea que los esquemas de las tablas sean diferentes y la precisión del tipo numérico de la tabla cambien haciendo que la conversión de los tipos sea diferente.

    Saludos. Luis.

    Muchas gracias Luis por tu respuesta. 

    Cuando vi el error pensé exactamente eso, que era un problema con algún valor de una tabla o similar. He comparado ambas base de datos y no se encuentra ninguna diferencia, ni de campos ni de sus propiedades. 

    La variable que le paso es un string donde antes de pasarlo hago un Trim() para quitarle todos los posibles espacios ya que es un valor limitado a 16 caracteres.

    Lo que no entiendo es porque si a la consulta desde el XSD lo indico sin variable, sino con el valor ya en la propia consulta no me da error. Ya que el valor de la variable es apriori correcto. En los otros ReportViewer hago lo mismo y no tengo problemas, la única diferencia que existe es que en esta consulta hago un select a una vista y a unas tablas mientras que en los otros reportviewers lo hago solo a tablas... Y con mi base de datos local funciona con variable.. 


    jueves, 21 de agosto de 2014 9:29
  • Pero cuidado con el error, porque según lo que has indicado en el error, la excepción la está dando el driver de SQL Server, es decir, cuando se ejecuta la consulta contra el SQL Server y SQL Server está devolviendo el error, creo que si puedes depurar la aplicación puedes ver específicamente el código de error en el objeto SqlException, con ese código de error lo mismo tienes más información sobre que está pasado.

    http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlexception(v=vs.110).aspx

    Saludos. Luis.

    jueves, 21 de agosto de 2014 9:49
  • Pero cuidado con el error, porque según lo que has indicado en el error, la excepción la está dando el driver de SQL Server, es decir, cuando se ejecuta la consulta contra el SQL Server y SQL Server está devolviendo el error, creo que si puedes depurar la aplicación puedes ver específicamente el código de error en el objeto SqlException, con ese código de error lo mismo tienes más información sobre que está pasado.

    http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlexception(v=vs.110).aspx

    Saludos. Luis.

    He probado a usar un try catch con SQLException como me has comentado y esto es lo que me arroja en la consola...  No se si puede darte algo más información del error exacto. 

    System.Data.SqlClient.SqlException (0x80131904): Error de desbordamiento aritmético al convertir numeric al tipo de datos numeric.
       en System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
       en System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
       en System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
       en System.Data.SqlClient.SqlDataReader.TryHasMoreRows(Boolean& moreRows)
       en System.Data.SqlClient.SqlDataReader.TryReadInternal(Boolean setTimeout, Boolean& more)
       en System.Data.SqlClient.SqlDataReader.Read()
       en System.Data.Common.DataAdapter.FillLoadDataRow(SchemaMapping mapping)
       en System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue)
       en System.Data.Common.DataAdapter.Fill(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
       en System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
       en System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
       en System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
       en HidraGesAda.FichaTecnicaTableAdapters._035_ListaMaterialesTableAdapter.Fill(_035_ListaMaterialesDataTable dataTable, String padre) en c:\ProyectosVS2013\HidraGesADA\HidraGesAda\HidraGesAda\FichaTecnica.Designer.cs:línea 1381
       en HidraGesAda.ImprimirFichaTecnica.ImprimirFichaTecnica_Load(Object sender, EventArgs e) en c:\ProyectosVS2013\HidraGesADA\HidraGesAda\HidraGesAda\ImprimirFichaTecnica.cs:línea 28
    ClientConnectionId:5e2e99fa-9668-4860-a3d1-d8459e2a5555
    El subproceso 0x864 terminó con código 0 (0x0).
    El subproceso 0xf94 terminó con código 0 (0x0).
    Gracias ;-)


    jueves, 21 de agosto de 2014 11:14
  • >>He comparado ambas base de datos y no se encuentra ninguna diferencia, ni de campos ni de sus propiedades.

    intentaste ejecutar esa query pero conectado con el management studio a la db del cliente ?

    >>La variable que le paso es un string donde antes de pasarlo hago un Trim() para quitarle todos los posibles espacios ya que es un valor limitado a 16 caracteres.

    con esto apuntas al parametro @padre, no ?

    si es asi el campo EST_PADRE  de que tipo es en la tabla? es un varchar

    el parametro se lo asignas a un SqlCommand o usas algun metodo de un TableAdapter

    >>Lo que no entiendo es porque si a la consulta desde el XSD lo indico sin variable, sino con el valor ya en la propia consulta no me da error.

    esta parte no la entendi, por xsd imagino te refieres a un dataset tipado, pero que seria que "indicas sin variable"?

    >>la única diferencia que existe es que en esta consulta hago un select a una vista y a unas tablas mientras que en los otros reportviewers lo hago solo a tablas.

    pero esto lo haces dentro del propio reporte o en un dataset tipado previo

    los reportes son rdl o rdlc ? digo estan integrados a rpeorting service o asignas un dataset tipado como datasurce del reporte

    que pasa si quitas la vista de en medio y la query que esta define la pones como parte del reporte como haces con los otros que si funcionan, digo para ver si esto esta afectando

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 21 de agosto de 2014 11:32
  • Me refería a cuando estas depurando y puedes acceder al objeto de la excepción, si pones el ratón encima, verás que hay más propiedades en el objeto que puedes explorar.

    Eso que muestras solamente es la pila y el mensaje de error. Fíjate en la url que he puesto en mi último post donde aparecen las propiedades del objeto SqlException y verás que hay más información de la que tú has puesto aquí.

    Saludos. Luis.

    jueves, 21 de agosto de 2014 11:33
  • >>He comparado ambas base de datos y no se encuentra ninguna diferencia, ni de campos ni de sus propiedades.

    intentaste ejecutar esa query pero conectado con el management studio a la db del cliente ?

    >>La variable que le paso es un string donde antes de pasarlo hago un Trim() para quitarle todos los posibles espacios ya que es un valor limitado a 16 caracteres.

    con esto apuntas al parametro @padre, no ?

    si es asi el campo EST_PADRE  de que tipo es en la tabla? es un varchar

    el parametro se lo asignas a un SqlCommand o usas algun metodo de un TableAdapter

    >>Lo que no entiendo es porque si a la consulta desde el XSD lo indico sin variable, sino con el valor ya en la propia consulta no me da error.

    esta parte no la entendi, por xsd imagino te refieres a un dataset tipado, pero que seria que "indicas sin variable"?

    >>la única diferencia que existe es que en esta consulta hago un select a una vista y a unas tablas mientras que en los otros reportviewers lo hago solo a tablas.

    pero esto lo haces dentro del propio reporte o en un dataset tipado previo

    los reportes son rdl o rdlc ? digo estan integrados a rpeorting service o asignas un dataset tipado como datasurce del reporte

    que pasa si quitas la vista de en medio y la query que esta define la pones como parte del reporte como haces con los otros que si funcionan, digo para ver si esto esta afectando

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    Gracias Leandro por tu respuesta. 

    Te voy contestando. 

    1 - Efectivamente he probado a ejecutar  la misma consulta apuntando a la base de datos del cliente a través de SQL Server Managment y me devuelve datos. 

    2 - EST_PADRE es un varchar de  una longitud de 16 caracteres.

    3- Exacto, me refiero a un dataset tipado. 

    4 - Los informes/listados son .rdlc y utilizo un dataset tipado como datasource del reporte, es decir, para cada listado tengo un WindowsForms que comprende un objeto Report y allí le digo que reporte debe de salir y que origen de datos debe de tomar. (DTSX)

    5 - Lo pruebo y te digo. 

    Muchas gracias por tu ayuda.

    jueves, 21 de agosto de 2014 11:40
  • Me refería a cuando estas depurando y puedes acceder al objeto de la excepción, si pones el ratón encima, verás que hay más propiedades en el objeto que puedes explorar.

    Eso que muestras solamente es la pila y el mensaje de error. Fíjate en la url que he puesto en mi último post donde aparecen las propiedades del objeto SqlException y verás que hay más información de la que tú has puesto aquí.

    Saludos. Luis.

    He comentado lo que dices y efectivamente da mucha más info, pero no doy con el motivo exacto. 

    Dejo la imagen por si detectáis algo raro.

    Muchas gracias

    jueves, 21 de agosto de 2014 11:59
  • El código de error es el 8115, así que busca por ahí como solucionar ese problema, en este post de MSDN hablan de como intentar buscar el porqué de este problema.

    http://blogs.msdn.com/b/sethus/archive/2009/09/09/troubleshooting-arithmetic-overflow-errors-in-queries-using-extended-events-in-sql-server-2008.aspx

    Espero que te sea de ayuda.

    jueves, 21 de agosto de 2014 13:39
  • El código de error es el 8115, así que busca por ahí como solucionar ese problema, en este post de MSDN hablan de como intentar buscar el porqué de este problema.

    http://blogs.msdn.com/b/sethus/archive/2009/09/09/troubleshooting-arithmetic-overflow-errors-in-queries-using-extended-events-in-sql-server-2008.aspx

    Espero que te sea de ayuda.

    Muchas gracias por la información, al final he conseguido solucionarlo tomando otro camino ya que sospecho que el principal problema venía por una conversión interna a la cual no tengo control de la vista. 

    Lo he solucionado de la siguiente forma, antes de lanzar el listado mediante código me traigo los datos de las vistas y los inserto en una tabla, luego el informe toma los datos de la tabla en vez de la vista, en el momento de cerrar el listado hago un delete de la tabla que he usado para dicho fin para su posterior uso. 

    Espero que si alguien tiene este problema tenga al menos una posible solución. 

    De nuevo muchas gracias !!

    viernes, 22 de agosto de 2014 10:32