¿Qué tipo de variable tengo que emplear?

Tengo el siguiente código, que graba en una base de datos en sql server mediante un sp:
string temdesc
real temprec
temdesc=sle_1.text
temprec=real(em_9.text)
CONNECT USING SQLCA;
declare sp_IngresaArticulo_PB procedure for sp_IngresaArticulo @temdesc = :temdesc,@temprec=:temprec;
execute sp_IngresaArticulo_PB;
IF SQLCA.SQLCode = -1 THEN
MessageBox("SQL error", SQLCA.SQLErrText)
END IF
¿Por qué cuando grabo los datos, el dato temprec se guarda con muchos decimales? Ya que cuando, por ejemplo, guardo el dato 180.60 se guarda como 150.6000061035156 y así otros datos que tienen decimal. Ya intente anteponiedo al objeto editmask el tipo de variale float y pasa lo mismo, ¿o sera por el tipo que seleccione en el editmask?, ya que seleccione decilmalmask y numericmask y pasa lo mismo, empleo este objeto, editmask, porque no me permite el ingreso de caracteres en un campo donde solamente tienen que ir números con decimales.
Así mismo me doy cuenta que en la base de datos SQL Server también se graba así, es decir con varios decimales, te agradecería me puedas decir como debo hacer para poder grabar el dato tal como lo escribo, es decir si dígito 180.65 se grabe como tal y no como 180.64999999

4 Respuestas

Respuesta
1
El tipo de dato es float.. porque no intentas cambiando en tu base de datos el tipo de dato a el campo que tienes en float a decimal y en Precisión y Scale colocas los valores deseas que muestre al grabar ejemplo tu quieres que se grabe 180.65 entonces
Precisión 3
Scale 2
Espero haberte ayudado y si no es así no dudes en preguntar.
Gracias por tu pronta respuesta Barzi, la respuesta que me diste es excelente, justo lo que deseaba, solo que encontré un pequeño detalle, que la precisión se refiere a todos los dígitos, es decir si quiero guardar un numero de 5 dígitos (incluyendo a los decimales) en este caso para mi ejmp. (180.65) la precisión seria de 5 y la escala de 2.
Muchas gracias Paisano
Respuesta
1
Es un tema de precisión. Si no definís una cantidad de decimales los programas toman un valor por defecto (gralmente 6 ó 10 decimales).
Por esto cuando guardas algo te completa con los decimales que faltan.
Para empezar en PB usa decimal como tipo de datos.
Si necesitas una cantidad de decimales diferente podes definirlo así:
decimal ldec_sintope
decimal{3} ldec_con_3_dec
En la bd te va a pasar lo mismo. Si no podes corregir la precisión que tiene el campo lo que podes hacer es que después al consultar el valor lo redondees a la cantidad de decimales que quieres.
round(ldec_sintope, 3)
Respuesta
1
Verifiquemos lo siguiente:
El problema puede estar en en envío de dato que realiza power builder o en el Stored Procedure.
Verifiquemos el campo em_1
En Propiedades de em_1
campo precio decimal (18,2)
Mask: ###,###.00
MaskDataType: numericmask!
En el código
Te sugiero cambiar el tipo de variable.
string temdesc
dec temprec
temdesc=sle_1.text
temprec=dec(em_1.text)
CONNECT USING SQLCA;
declare sp_IngresaArticulo_PB procedure for sp_IngresaArticulo @temdesc = :temdesc,@temprec=:temprec;
execute sp_IngresaArticulo_PB;
IF SQLCA.SQLCode = -1 THEN
MessageBox("SQL error", SQLCA.SQLErrText)
END IF
Finalmente para verificar el dato que esta enviando verifica el valor en el debugger de Power Builder.
En el Stored Procedure los parámetros de ingreso tendrían que estar definidos.
@temdesc as varchar(50),
@temprec as decimal(18,2)
Respuesta
1
Aparentemente el problema es el tipo de dato que tienes en SQL server... la verdadque mucho de ello no se... pero por las dudas deberías ver como se esta guardadndo el valor en la variable... porque si los decimales se generan el la variable de PB tendrías que usar alguna función Truncate.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas