MUDAR TIPO DE DADOS EM FIREBIRD

MARCELO.VB.PIRA 29/12/2011 12:40:34
#392109
Olá amigos!!!

Estou com um problema e gostaria de contar com a atenção de vocês.

Minhas bases de dados em meus clientes, operam com o tipo de campo DOUBLE PRECISION para valores financeiros.

Graças a NF-e, alguns de meus clientes precisam de no mínimo 5 casas decimais em valores financeiros. E o campo DOUBLE PRECISION trabalha com no máximo 3.

Montei uma rotina para listar todas as tabelas da base de dados e sub-listar todos os campos de cada tabela, pegando o seu nome e o tipo (5, no caso do campo DOUBLE PRECISION)

Mas para mudar o tipo de campo DOUBLE PRECISION para NUMERIC (onde vou poder usar quantas casas decimais precisar), o IB Expert me deu a seguinte solução:

Citação:

update RDB$FIELDS set
RDB$FIELD_TYPE = 16,
RDB$FIELD_SCALE = -5,
RDB$ FIELD_PRECISION = 10
where RDB$FIELD_NAME = [ô]RDB$1580[ô]



onde [ô]RDB$1580[ô] é o “domínio” do campo.

Porem para usar via código, observei que este solução acima se baseia nos domínios, e não no nome da tabela e no nome do campo.

O código que estou usando para listar as tabelas, campos e tipo de cada campo é o seguinte:

20    Set RsVen = New ADODB.Recordset
30 RsVen.Open [Ô]SELECT RDB$RELATION_NAME as tabname FROM RDB$RELATIONS WHERE RDB$VIEW_BLR IS NULL AND (RDB$SYSTEM_FLAG = 0 OR RDB$SYSTEM_FLAG IS NULL) order by RDB$RELATION_NAME;[Ô], ConexaoBD, adFowardOnly, adLockReadOnly
40 Text1 = [Ô][Ô]
50 FimDosRegistros = RsVen.RecordCount
60 For i = 1 To FimDosRegistros
70 Text1 = Text1 + Trim(RsVen!tabname) & vbNewLine
80 DoEvents
90 Set RsGeral = New ADODB.Recordset
100 RsGeral.Open [Ô]Select * from [Ô] & RsVen!tabname & [Ô];[Ô], ConexaoBD, adFowardOnly, adLockReadOnly
110 For iw = 0 To RsGeral.Fields.Count - 1
120 Text1 = Text1 & [Ô] [Ô] & RsGeral.Fields.Item(iw).Name & [Ô] - [Ô] & RsGeral.Fields.Item(iw).type & vbNewLine
130 DoEvents
140 Next iw
150 RsGeral.Close
160 Set RsGeral = Nothing
170 RsVen.MoveNext
180 Next i
200 RsVen.Close
210 Set RsVen = Nothing


O resultado ele joga numa textBox com propriedade MultLine=true e com scrollbar vertical. O resultado seria este:

Citação:

AGENDA
CODIGO - 3
DATACRIA - 7
HORACRIA - 134
USUARIOCRIA - 202
USUARIOCOMP - 202
COMPROMISSO - 203
DATACOMP - 7
HORACOMP - 134
STATUS - 202
ALUGUEL
ID_EMP - 3
CODIGO - 3
DATA - 7
CODIGOCLIENTE - 3
CLIENTE - 202
TOTAL_SERVICOS - 5
TOTAL_PRODUTOS - 5
SUB_TOTAL_JUROS - 5
DESCONTO_VAL - 5
DESCONTO_PER - 6
TOTAL_LIQUIDO - 5
CODIGOVENDEDOR - 3
NOMEVENDEDOR - 202
LEMBRETE - 203
SITUACAO - 202
HORA - 134
TOTAL_HORAS - 202
QTD_HORAS - 202
SUBTOTAL - 5
DATA_INI - 7
DATA_FIN - 7
HORA_INI - 134
HORA_FIN - 134
VALOR_SERVICO - 5
QTD_PARCELAS - 3
VALOR_ENTRADA - 5
DATA_PARCELA_01 - 7
TAXA_JUROS_MES - 6
TOTAL_DE_JUROS - 6
TOTAL_A_PRAZO - 5
ENTREGUE - 202
CIDADE - 202
RAZAO - 202
AREA - 202
CONTATO - 202
TELEMARKETING - 3
ASSINATURA - 202
CODIGOPRESTADOR - 3
NOMEPRESTADOR - 202
DESC_PRO - 5
DESC_SER - 5
DATA_ENTREGA - 7
FECHAMENTO - 7
COMISSAO - 202
REFERENCIA - 203
DATA_REFERENCIA - 7
BAIRRO - 202
ALUGUEL_CONTA
ID_EMP - 3
CODIGO_OS - 3
NUMERO_PAGAMENTO - 3
EMISSAO - 7
VENCIMENTO - 7
PAGAMENTO - 7
VALOR - 5
DOC - 202
TIPO_MOEDA - 202
CODIGO_CONTA - 3
CODIGO_CLIENTE - 3
CODIGO_COMISSAO - 3
CODIGO_VENDEDOR - 3
CODIGO_COMISSAO_PRESTADOR - 3
CODIGO_PRESTADOR - 3
CODIGO_CHEQUE - 3
CODIGO_CAIXA - 3
CODIGO_BOLETO - 3
COMPENSACAO - 3
BANCO - 3
AGENCIA - 202
CONTA - 202
EMITENTE - 202
ATIVIDADES
DATA - 7
HORA - 134
USUARIO - 202
ACAO - 202
EMPRESA - 202
UNIDADE - 202
MAQUINA - 202
ATUALIZACOES
ATUALIZACAO - 202
DATA - 7
TEMPO – 202





Resumo da ópera:

PRINCIPAL: OS DADOS ARMAZENADOS TEM QUE SER MANTIDOS!!!

Temos duas situações:

01. Para usar a solução do IB Expert:
update RDB$FIELDS set
RDB$FIELD_TYPE = 16,
RDB$FIELD_SCALE = -5,
RDB$ FIELD_PRECISION = 10
where RDB$FIELD_NAME = [ô]RDB$1580[ô]
Eu teria que ter o nome do domínio de cada campo, e não estou conseguindo pegar. Alguém sabe como? (Utilizando o exemplo do código acima, lógico)

02. Alguém teria outra forma (via código) para alterar o tipo de dados dos campos da tabela?

Obrigado a todos!!!!
MARCELO.VB.PIRA 29/12/2011 13:12:56
#392115
Lembrando que todo o meu problema se deve ao fato de precisar de pelo menos 5 casas deciamis... e no campo DOUBLE PRECISION, APARENTEMENTE não dá para mudar...

Estou usando o firebird 2.1

[Ô]Detalhe:[Ô]
São 193 tabelas com 4177 campos , deste eu vou ter que alterar 533


valeu!!!!
ARNALDOCRUZ 29/12/2011 14:36:41
#392125
Resposta escolhida
CAMPO DOUBLE trabalha com quantos digitos depois da virgla vc quiser

fiz um teste com 6 numeros e funfou legal

basta na hora d e gravar vc formatar pra seis casas decimais

outro tipo de dados que vc pode trabalha é o decimal (18,5) ou (18,6)

vc pode criar um script criando os campos decimais
depois vc faz um loop e passa os valores dou para o campo decimal
depois vc faz outro script deletando o campo double
depois faz um outro script renomeando os campos decimais para os nomes dos campo deletados

observação ; faça copia do baco de dados
MARCELO.VB.PIRA 29/12/2011 15:37:43
#392129
Olá amigo Arnaldo...

mas como você fez isso via código?

com campos já criados (e preenchidos) não consegui.

ou você está me falando que se eu na hora de alimentar (ou alterar) o BD, é só enviar com 6 casas que ele vai aceitar e gravar assim no BD?

a ideia do loop criando novos campos, tranferindo dados dos antigos para os novos, deletando os antigo e renomeando os novos com os nomes do antigos é a única opção válida até agora.
Tópico encerrado , respostas não são mais permitidas