Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-02-2012
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #2  
Antiguo 09-02-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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
Responder Con Cita
  #3  
Antiguo 10-02-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #4  
Antiguo 10-02-2012
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
__________________
Siempre Novato
Responder Con Cita
  #5  
Antiguo 10-02-2012
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
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,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #6  
Antiguo 10-02-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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.
Responder Con Cita
  #7  
Antiguo 10-02-2012
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.

Última edición por marcoszorrilla fecha: 10-02-2012 a las 22:01:47.
Responder Con Cita
  #8  
Antiguo 11-02-2012
Gallosuarez Gallosuarez is offline
Miembro
 
Registrado: feb 2007
Posts: 92
Poder: 18
Gallosuarez Va por buen camino
Talking 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...
Responder Con Cita
  #9  
Antiguo 11-02-2012
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
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.
Responder Con Cita
  #10  
Antiguo 11-02-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Eso sí que es una respuesta bien trabajada, Al
Responder Con Cita
  #11  
Antiguo 11-02-2012
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #12  
Antiguo 14-02-2012
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #13  
Antiguo 14-02-2012
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Enhorabuena Marcos.

Me da gusto que haya quedado solucionado.
Responder Con Cita
  #14  
Antiguo 14-02-2012
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
¿cómo aumentar el número de factura en una base de datos paradox ? Master23 Varios 2 09-04-2010 00:42:26
Campo numeric sql server amerika111 Varios 1 30-12-2009 10:26:21
Aumentar Decimales RUBI MADELIN OOP 4 23-07-2007 19:35:39
Problama con campo NUMERIC(15,2) El_Raso SQL 7 11-02-2007 10:58:16


La franja horaria es GMT +2. Ahora son las 10:30:32.


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
Copyright 1996-2007 Club Delphi