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)
-   -   Aumentar número de decimales campo Numeric (https://www.clubdelphi.com/foros/showthread.php?t=77595)

marcoszorrilla 09-02-2012 21:30:46

Aumentar número de decimales campo Numeric
 
BD. Firebird 2.5, Ibx y D7.

Tengo un campo Precio creado por medio de un dominio:
Código:

Create Domain DM_Euro
As Numeric(12,2)
Default 0;

La base de datos tiene 68 tablas y calculo que unas diez utilicen este campo. Pues bien me piden 3 decimales en vez de 2 que tengo ahora.

He intentado con el IbExpert pero no me deja aumentar los decimales.

Se me ocurrió lo siguiente. Crear otro dominio:

Código:

Create Domain DM_Euro3
As Numeric(12,3)
Default 0;

Ahora he abierto el IbExpert y le he cambiado de dominio al campo, no se ha quejado. Al abrir el programa me da un error (Size 3 y se esperaba 2) me he ido al IbDataset he seleccionado el campo y he cambiado su propiedad Size que por lo que infiero se refiere a decimales, pues me ha funcionado, quiero evitar un alter table...

Alguien tiene alguna idea de como hacer el cambio de otra manera más fácil, lo cierto es que después de esta prueba satisfactoria voy a hacer un estudio de cuantos IbDataset están implicados y cuantos campos porque la BD está en producción y haré una prueba más a fondo a ver si todo resulta como preveo.

Un Saludo.

Casimiro Notevi 09-02-2012 23:44:59

Pues ya nos contarás, yo he usado siempre el tipo double, hasta ahora, que en este nuevo proyecto estoy usando numeric, así que nunca me había encontrado con ese problema, por eso digo que ya nos contarás, por si acaso tengo que cambiarlos yo también :)

roman 10-02-2012 00:35:59

Yo de esto ni idea. Pero me da la impresión de que la parte de los datasets no la vas a poder evitar salvo usando algún tipo de experto que facilite el cambio.

Una pregunta, ¿no se puede borrar un dominio y volverlo a crear?

// Saludos

Caral 10-02-2012 02:03:10

Hola
Es curioso, en mi caso tengo un dominio asi:
FILE Type DOUBLE PRECISION
Este me da 3 decimales sin ponerle nada en el espacio Size, osea, vacío ' '
Tengo otros que son FILE Type INTEGER (sin decimales), pero no tengo ninguno que sea type Numérico.
No se si modificando el tipo de type podrás solucionar el problema o poner el campo size vacío.
Saludos

Delphius 10-02-2012 04:37:38

Por seguridad lo que yo haría es:

OPCIONAL: Creo un segundo dominio con el tipo adecuado
1) Creo un nuevo campo con el tipo/dominio adecuado
2) Vuelco los datos desde el campo viejo al nuevo
3) Elimino campo y/o dominio viejos
4) Renombro el nuevo campo como el viejo

Naturalmente en el aplicativo habrá que hacer retoques para que asimile el nuevo Size y visualice correctamente los decimales.

No se si es realmente innecesario hacer esto de crear, volcar, eliminar pero yo lo veo más seguro así... Naturalmente es tedioso hacer esto en cada tabla.

Saludos,

Casimiro Notevi 10-02-2012 09:24:52

Pienso igual que Delphius, aunque es precisamente ese engorro lo que se quiere evitar marcoszorrilla. Pero ese es seguramente el inconveniente de usar numeric, que aunque cambie el dominio a tres decimales, los datos quedarán con dos. Cosa que no ocurre, obviamente, con los double.
Yo estoy usando los numeric por primera vez, como dije antes, porque es un programa de contabilidad donde sólo pueden ir 2 decimales de la moneda, no es necesario para nada más decimales, pero para cualquier otra información numérica siempre uso el double, aunque se podría usar el numeric con 5 decimales, por ejemplo, en fin, dependerá de las exigencias de cada caso.
A la pregunta de Román, no se puede eliminar un dominio que se está usando.

marcoszorrilla 10-02-2012 21:58:39

Gracias por las opiniones, la semana que viene tengo previsto empezar los cambios, ya os contaré el resultado.

Es evidente que el tercer decimal será un 0, pero es que se piensan utilizar precios con tres decimales a partir de ahora.

Un Saludo.

Gallosuarez 11-02-2012 16:34:37

Posible solución ...
 
Marcoszorrilla:

Lo puedes hacer como lo comenta Delphius, o la otra opción que tienes es como lo estabas haciendo en un principio (es decir, cambiando el dominio), solamente que te faltó hacer un último paso: una vez cambiado el dominio debes de hacer un ciclo de "backup/restore" a tu base de datos.

Saludos,
GST

PD. Espero que te sea de utilidad... y no dejes de publicar tu solución ... saludos nuevamente...

Al González 11-02-2012 19:55:50

Hola Marcos, con esta vista (probada en Firebird 1.5) podrás ubicar rápidamente todos los campos que habrán de ser cambiados:

Código SQL [-]
CREATE VIEW VWCAMPOS(
    TABLA,
    CAMPO,
    POSICION,
    DESCRIPCION,
    TIPO,
    TAMAO,
    DECIMALES,
    PERMITENULOS)
AS
/* Vista para listar todos los campos de nuestra base de datos */

Select

RF.RDB$Relation_Name,  /* Nombre de la tabla/vista */
RF.RDB$Field_Name,  /* Nombre del campo */
RF.RDB$Field_Position,  /* Posición del campo */
RF.RDB$Description,  /* Descripción del campo */

/* Tipo concreto */
Case F.RDB$Field_Type
  When 261 /* BLOb */ Then
    Case F.RDB$Field_Sub_Type
      When 1 Then 'Texto BLOb'
      Else 'BLOb'
    End
  When 14 Then 'Texto Char'
  When 40 Then 'Texto CString'
  When 11 Then 'Numérico D_Float'
  When 27 Then 'Numérico Double'
  When 10 Then 'Numérico Float'
  When 16 /* Int64 */ Then
    Case F.RDB$Field_Sub_Type
      When 1 Then 'Numérico'
      When 2 Then 'Decimal'
      Else 'Entero Int64'
    End
  When 8 /* Integer */ Then
    Case F.RDB$Field_Sub_Type
      When 1 Then 'Numérico'
      When 2 Then 'Decimal'
      Else 'Entero Integer'
    End
  When 9 Then 'Quad'
  When 7 /* SmallInt */ Then
    Case F.RDB$Field_Sub_Type
      When 1 Then 'Numérico'
      When 2 Then 'Decimal'
      Else 'Entero SmallInt'
    End
  When 12 Then 'Fecha Date'
  When 13 Then 'Hora Time'
  When 35 Then 'Fecha y hora TimeStamp'
  When 37 Then 'Texto Varchar'
End,

/* Tamaño (sólo para Char, VarChar y flotantes) */
Case F.RDB$Field_Type
  When 14 /* Char */ Then F.RDB$Field_Length
  When 11 /* D_Float */ Then F.RDB$Field_Precision
  When 27 /* Double */ Then F.RDB$Field_Precision
  When 10 /* Float */ Then F.RDB$Field_Precision
  When 16 /* Int64 */ Then
    Case F.RDB$Field_Sub_Type
      When 1 /* Numeric */ Then F.RDB$Field_Precision
      When 2 /* Decimal */ Then F.RDB$Field_Precision
    End
  When 8 /* Integer */ Then
    Case F.RDB$Field_Sub_Type
      When 1 /* Numeric */ Then F.RDB$Field_Precision
      When 2 /* Decimal */ Then F.RDB$Field_Precision
    End
  When 7 /* SmallInt */ Then
    Case F.RDB$Field_Sub_Type
      When 1 /* Numeric */ Then F.RDB$Field_Precision
      When 2 /* Decimal */ Then F.RDB$Field_Precision
    End
  When 37 /* VarChar */ Then F.RDB$Character_Length
End,

/* Decimales */
Case F.RDB$Field_Scale
  When 0 Then Null
  Else Cast (F.RDB$Field_Scale * -1 As SmallInt)
End,

/* Permite o no valores nulos */
Case RF.RDB$Null_Flag
  When 1 Then 'No'
  Else 'Si'
End

From RDB$Relation_Fields RF

/* La información de campos está distribuida en las tablas
RDB$Relation_Fields y RDB$Fields */
Left Join RDB$Fields F On RF.RDB$Field_Source = F.RDB$Field_Name

/* No incluir tablas del sistema */
Where RF.RDB$System_Flag = 0
;

Si no resulta ser una cantidad excesiva de campos, creo que cambiarlos manualmente en IBExpert, como ya lo has hecho con uno de ellos, no es mala alternativa. De lo contrario, podrías implementar una macroinstrucción (script) que lleve a cabo estos cambios dentro de un ciclo (puede que sea necesario tratar con las tablas del sistema).

En cuanto a la propiedad Size de los objetos campos en Delphi, efectivamente, los que son de tipo (DataType) ftBCD y ftFMTBCD (este último generalmente corresponde al tipo Numeric de Firebird) usan dicha propiedad para indicar el número de dígitos a la derecha del separador decimal.

Espero que no te sea difícil solucionarlo, pero estaré pendiente de ello como los demás.

Un abrazo. :)

Al.

Casimiro Notevi 11-02-2012 20:24:21

Eso sí que es una respuesta bien trabajada, Al :eek:

marcoszorrilla 11-02-2012 20:42:50

Muchas gracias Al, esta semana que entra probablemente el miércoles me meta de lleno con ello.

Gracias por la aportación como siempre acertada y constructiva.

Un Saludo.

marcoszorrilla 14-02-2012 16:13:38

Hoy he solucionado el problema de la forma que apunté. Eran 11 Tablas, 27 Campos y 30 IbDataset.

He comenzado a las 6h30 y he terminado a las 8h10, justo antes de que empezaran a facturar.

De haber tenido que crear nuevo campo bajo el nuevo dominio, luego pasarle los datos, borrar el anterior renombrar el actual.... no me hubiese sido posible aparte del peligro de cometer un error.

Un Saludo.

Al González 14-02-2012 16:44:43

Enhorabuena Marcos.

Me da gusto que haya quedado solucionado. :)

marcoszorrilla 14-02-2012 22:24:57

Se me olvidaba comentar otra prueba que hice y es aumentar el propio dominio a 3 decimales, lástima que esto no era posible, porque el Dominio Dm_Euro se usa en más casos y tiene que tener 2 decimales en Base, IVA, Recargo, Total... por lo que tuve que optar como ya he comentado por crear un Clon de Dm_Euro con 3 decimales.

Un Saludo y gracias por los comentarios.


La franja horaria es GMT +2. Ahora son las 09:40:27.

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