Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   variable de Tipo Decimal envia error (https://www.clubdelphi.com/foros/showthread.php?t=88820)

novato_erick 06-08-2015 20:32:47

variable de Tipo Decimal envia error
 
Hola Chicos como estan nuevamente algo currioso con firebird:

estoy realizando un procedimiento que actualiza campos directamente con firebird

Código SQL [-]
CREATE PROCEDURE ACTUALIZAPRECIO(
  ID_ARTCOMPRA INTEGER,
  NEW_COMPRA DECIMAL(5, 2))
RETURNS(
  IDPRECIO INTEGER,
  IDART INTEGER,
  IDARTXIVA INTEGER,
  COMISION DECIMAL(12, 2),
  GASTOS DECIMAL(12, 2),
  MARGEN DECIMAL(12, 2),
  MARGENDETALLE DECIMAL(12, 2),
  PCOMPRAPRODUCTO DECIMAL(12, 2),
  MONTOIMPUESTO DECIMAL(12, 2),
  PRECIOCIV DECIMAL(12, 2),
  PRECIOSIV DECIMAL(12, 2))
AS
DECLARE VARIABLE IDPRECIOCOMPRA INTEGER;
DECLARE VARIABLE IDARCOMPRA INTEGER;
DECLARE VARIABLE IDARTXIMPUESTO INTEGER;
DECLARE VARIABLE COMISIONCOMPRA DECIMAL(12, 2);
DECLARE VARIABLE GASTOCOMPRA DECIMAL(12, 2);
DECLARE VARIABLE MARGENCOMPRA DECIMAL(12, 2);
DECLARE VARIABLE MARGENDETALLECOMPRA DECIMAL(12, 2);
DECLARE VARIABLE NEWPCOMPRA DECIMAL(12, 2);
DECLARE VARIABLE MONTOIVA DECIMAL(12, 2);
DECLARE VARIABLE NEW_PRECIOCIV DECIMAL(12, 2);
DECLARE VARIABLE NEW_PRECIOSIV DECIMAL(12, 2);
DECLARE VARIABLE OLDPCOMPRA DECIMAL(12, 2);
DECLARE VARIABLE IDIMPUESTO INTEGER;
DECLARE VARIABLE PORCENTAJEIVA DECIMAL(3, 2);
BEGIN
 FOR 
      SELECT 
         PRECIO.ID_PRECIO,
         PRECIO.ID_ARTICULO,
          PRECIO.ID_ARTXIMPUES,
         PRECIO.COEF_COMISION,
          PRECIO.COEF_GASTOS,
          precio.COEF_MARGEN,
          precio.COEF_MARGENDETALLE,
          precio.PRECIOCOMPRA,
          PRECIO.MONTO_IMPUESTO,
          PRECIO.PRECIO_CIV,
          PRECIO.PRECIO_SIV
            FROM
             PRECIO where precio.ID_ARTICULO = :ID_ARTCOMPRA
         INTO
         :IDPRECIO,
         :IDART,
         :IDARTXIVA,
         :COMISION,
         :GASTOS,
         :MARGEN,
         :MARGENDETALLE,
         :PCOMPRAPRODUCTO,
         :MONTOIMPUESTO,
         :PRECIOCIV,
         :PRECIOSIV  
                    
 DO

 BEGIN
  SELECT
  ARTXIMPUES.ID_IMPUESTO, IMPUESTO.PORCENTAJE
   FROM ARTXIMPUES, IMPUESTO 
   WHERE IMPUESTO.ID_IMPUESTO = ARTXIMPUES.ID_IMPUESTO AND
   ARTXIMPUES.ID_ARTXIMPUES = :IDARTXIVA 
   INTO :IDIMPUESTO, :PORCENTAJEIVA;
 
    COMISIONCOMPRA = 0.00;--aquí es donde tengo el problema que me envia: scale must be between zero and precision
    GASTOCOMPRA = 0.00;
    MARGENCOMPRA = 0.00;
    MARGENDETALLECOMPRA = 0.00;

  IF (PCOMPRAPRODUCTO < NEW_COMPRA) THEN
  BEGIN
    COMISIONCOMPRA = (NEW_COMPRA * COMISION)/100;
    GASTOCOMPRA = (NEW_COMPRA * GASTOS)/100;
    MARGENCOMPRA = (NEW_COMPRA * MARGEN)/100;
    MARGENDETALLECOMPRA = (NEW_COMPRA * MARGENDETALLE)/100;
  END  

 /* UPDATE 
  PRECIO  
  SET 
  PRECIOCOMPRA = :NEWPCOMPRA,
  PRECIO_CIV = :PRECIO_CIV,
  PRECIO_SIV = :PRECIO_SIV,
  MONTOSUMAFIJA = :MONTOSUMAFIJA,
  MONTO_IMPUESTO = :MONTO_IMPUESTO,
  COEF_COMISION = :COEF_COMISION,
  COEF_GASTOS = :COEF_GASTOS,
  COEF_MARGEN = :COEF_MARGEN,
  COEF_MARGENDETALLE = :COEF_MARGENDETALLE
 
WHERE 
  ID_PRECIO = :ID_PRECIO */
  
   

 END
SUSPEND; 
END;

en fin como mencione en el código con un comentario me manda ese error.


Saludos

Casimiro Notevi 06-08-2015 20:55:37

A ver si te sirve:
Cita:

SCALED DATATYPES

Purpose
Use a scaled datatype to hold numbers with fixed size fractions.
Syntax
<scaled_type> ::=
{DECIMAL | NUMERIC} [(precision [, scale])]



Semantics
Firebird supports two scaled datatypes, NUMERIC and DECIMAL, for handling numeric data with a fixed decimal point, such as monetary values. You can specify optional precision and scale factors for both datatypes:
  • Precision is the total number or maximum number of digits, both significant and fractional, that can appear in a column of these datatypes. The allowable range for precision is from 1 to a maximum of 18.
  • Scale is the number of digits to the right of the decimal point that comprise the fractional portion of the number. The allowable range for scale is from zero to precision; in other words, scale must be less than or equal to precision.
NUMERIC and DECIMAL differ subtly in the way they handle numbers larger than the specified size. NUMERIC defines a datatype that holds a maximum of precision digits, whereas DECIMAL defines a datatype that holds at least that number of digits, and possibly more.
You can specify NUMERIC and DECIMAL datatypes without precision, in which case they are identical to INTEGER. The default value for scale is zero.
The below example declares a variable of type NUMERIC:
DECLARE a NUMERIC(5,3);



See also
INTEGER DATATYPE, FLOAT DATATYPE

novato_erick 06-08-2015 22:28:13

La teoria dice:

Cita:

Firebird es compatible con dos tipos de datos a escala, numeric y decimal, para el manejo de datos numéricos con un punto decimal fijo, como los valores monetarios

[color=#004465][font=Arial, sans-serif]

ok entiendo eso ya que lo encontre directamente aquí: http://www.janus-software.com/fbmanu...=psql&topic=30

sin embargo al hacer esto:
Código SQL [-]
IF (PCOMPRAPRODUCTO < NEW_COMPRA) THEN
  BEGIN     
      COMISIONCOMPRA = (NEW_COMPRA * COMISION)/100;  
      GASTOCOMPRA  = (NEW_COMPRA + COMISIONCOMPRA) * GASTOS /100;
      MARGENCOMPRA = (NEW_COMPRA + GASTOCOMPRA + MARGENCOMPRA)* MARGEN /100; 
      PVENTASINIVA = (COMISIONCOMPRA + GASTOCOMPRA + MARGENCOMPRA);
      SUBTOTALVENTA = NEW_COMPRA + PVENTASINIVA; 
      MONTOIVA = (SUBTOTALVENTA * PORCENTAJEIVA)/100;  
      PRECIOVENTACONIVA =  MONTOIVA + SUBTOTALVENTA; 

         UPDATE  PRECIO SET  PRECIOCOMPRA = :NEW_COMPRA,
                                       PRECIO_CIV = :PRECIOVENTACONIVA, --el valor que trae es null     
                                       PRECIO_SIV = :SUBTOTALVENTA,
                                       MONTO_IMPUESTO = :MONTOIVA
                               WHERE 
                               ID_PRECIO = :IDPRECIO;

Saludos

Casimiro Notevi 06-08-2015 22:34:45

No lo he mirado a fondo, apenas un vistazo, pero cambia el decimal por numeric en todos.

novato_erick 06-08-2015 22:47:02

Sip ya lo habia hecho en todo y nada aun me da el error


Saludos casimiro y disculpa la molestia..


novato_erick

Casimiro Notevi 06-08-2015 22:55:51

Pues cambia
COMISIONCOMPRA = 0.00
por
COMISIONCOMPRA = 0

novato_erick 06-08-2015 23:03:21

Ok encontré el problema:

tube que declarar las variables con un valor por defecto:

Código SQL [-]
as
DECLARE VARIABLE PRECIOVENTACONIVA NUMERIC(12, 2) DEFAULT 0

Esto solucionó el problema: aunque al inicializar mis variables en 0 al principio del post no se porque no tomaban ese valor si no es que estan definido en la declaración.

Extraño

pero Casimiro Gracias por tu aporte dejo este link que me ayudó a comprender cuando usar numeric y decimal:

https://firebird21.wordpress.com/201...ric-y-decimal/


Saludos a todos;

novato_erick 06-08-2015 23:08:04

casimiro no habia visto tu post anterior jajajajaja


pero nuevamente Gracias amigo


Saludos

Casimiro Notevi 06-08-2015 23:09:02

Para hacer cálculos deberías usar double, independientemente que luego lo guardes en un campo numeric.

novato_erick 06-08-2015 23:21:45

Te refieres a DOUBLE PRECISION en Firebird directamente?

porque en Delphi si mis variables son double.

Saludos

Casimiro Notevi 06-08-2015 23:40:44

Sí, claro, en firebird.
Que uses numeric(15,2) por ejemplo, si vas a guardar importes con 2 decimales, pero eso es la definición del campo.
Para hacer cálculos y no perder decimales, usa double precision.

orodriguezca 07-08-2015 01:14:51

Volviendo al problema original quizas el punto decimal no sea punto sino coma, no más digo no.

Código SQL [-]
   COMISIONCOMPRA = 0,00;

Casimiro Notevi 07-08-2015 10:12:03

Eso también ^\||/


La franja horaria es GMT +2. Ahora son las 20:16:06.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi