Convertir valor nvarchar a smallint

Buenas tardes,

Tengo un problema con la ejecución de un informe de cierre de taquillas y es que un usuario creo una factura y en la lista de precios puso datos alfanuméricos (CX) y el campo en el informe lo espera de forma numérica, lo cual hace que me genere el siguiente error.

Mens. 245, Nivel 16, Estado 1, Línea 1
Error de conversión al convertir el valor nvarchar ‘CX’ al tipo de datos smallint.

No he encontrado la forma de convertir los datos a smallint para que me deje ejecutar el informe o que mas puedo hacer para poder solucionarlo?

Este es el código

select t0.docdate,(select u_name from ousr where USERID = T0.UserSign) 'nomuser',
       T0.[u_taquilla],t1.itemcode,
       t1.dscription,(case when t1.u_lista_precios is null then '1' else t1.U_LISTA_PRECIOS end) 'lista',
       (case when t1.u_lista_precios is null then 'Base Parque Explora'   
	      else (select listname from opln t3 where t1.u_lista_precios=t3.listnum) end) 'nom_lista',
        sum(t1.quantity)'tcant',
       sum(t1.linetotal) 'tline',
       0 'totefec',
       0 'tottrans','P' 'TipoM',0 'Doci',0 'Docf',0 'TT'
	   from OINV T0  INNER JOIN INV1 T1 ON T0.DocEntry = T1.DocEntry
	   where t0.docdate='09/12/2018'
      group by t0.docdate, t0.usersign,T0.u_taquilla,t1.itemcode,t1.dscription,t1.u_lista_precios

Esta es la parte del código que no me deja ejecutar el informe. Resalto en negrita donde me dice que lo que sea diferente de un número de lista de precios me lo deje como Base Parque

(case when t1.u_lista_precios is null then '1' else t1.U_LISTA_PRECIOS end) 'lista',
       (**case when t1.u_lista_precios is null then 'Base Parque Explora'**   
	      else (select listname from opln t3 where t1.u_lista_precios=t3.listnum) end) 'nom_lista'

Agradezco su ayuda.

Hola amigo, lo que pasa es que estas combinando el tipo de datos en un mismo campo, para ellos primero debes convertir todo a un tipo de dato, verifica el tipo de dato de tus campos y convierte todos al mismo.

(case when t1.u_lista_precios is null then '1' else convert(nvarchar,t1.U_LISTA_PRECIOS) end) 'lista',
       (case when t1.u_lista_precios is null then 'Base Parque Explora'
	      else (select listname from opln t3 where t1.u_lista_precios=t3.listnum) end) 'nom_lista'
1 me gusta

Hola @Ricardo_Quiro,

Igual convirtiendo el campo t1.U_LISTA_PRECIOS me sigue saliendo el mensaje de error de conversión.
Sería algo así

select t0.docdate,(select u_name from ousr where USERID = T0.UserSign) 'nomuser',
       T0.[u_taquilla],t1.itemcode,
       t1.dscription,   
	  (case when convert(int,t1.u_lista_precios) is null then '1' else convert(int,t1.u_lista_precios) end) 'lista',
		(case when convert(int,t1.u_lista_precios) is null then 'Base Parque Explora'   
	      else (select listname from opln t3 where convert(int,t1.u_lista_precios)=t3.listnum) end) 'nom_lista',
       sum(t1.quantity)'tcant',
       sum(t1.linetotal) 'tline',
       0 'totefec',
       0 'tottrans','P' 'TipoM',0 'Doci',0 'Docf',0 'TT'
	   from OINV T0  INNER JOIN INV1 T1 ON T0.DocEntry = T1.DocEntry
	   where t0.docdate='09/12/2018'
      group by t0.docdate, t0.usersign,T0.u_taquilla,t1.itemcode,t1.dscription,convert(int,t1.u_lista_precios),t0.DocNum

Hola @villa54
Comprendo mejor, en un campo smallint se ingreso un alfanumérico, por tanto por mas que intentes convertirlo a int tendrás problemas, queda convertir ese campo a nvarchar no a int.

1 me gusta

@Ricardo_Quiro,

El campo en la BD es image

Lo que paso es que se ingreso el texto “CX” en el campo lista de precios en la factura y como esa lista no existe me genera este problema.

Hola @villa54 después de varias vueltas pude ver que el smallint al que te hace referencia pertenece a la tabla OPLN en tu where estas igualando un alfanumérico con un número. Verifica y me avisas:

select t0.docdate,(select u_name from ousr where USERID = T0.UserSign) 'nomuser',
       T0.[u_taquilla],t1.itemcode,
       t1.dscription,   
	  (case when t1.u_lista_precios is null then '1' else t1.u_lista_precios end) 'lista',
		(case when t1.u_lista_precios is null then 'Base Parque Explora'   
	      else (select listname from opln t3 where t1.u_lista_precios=CONVERT(NVARCHAR,t3.listnum)) end) 'nom_lista',
       sum(t1.quantity)'tcant',
       sum(t1.linetotal) 'tline',
       0 'totefec',
       0 'tottrans','P' 'TipoM',0 'Doci',0 'Docf',0 'TT'
	   from OINV T0  INNER JOIN INV1 T1 ON T0.DocEntry = T1.DocEntry
	   where t0.docdate='09/12/2018'
      group by t0.docdate, t0.usersign,T0.u_taquilla,t1.itemcode,t1.dscription,t1.u_lista_precios,t0.DocNum
1 me gusta

@Ricardo_Quiro
Efectivamente mi amigo,

Haciendo la validación veo que el campo ListNum es tipo smallint.

Muchas gracias por tomarte el tiempo de ayudar.
Funcionó perfecto.
:grinning:

1 me gusta

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