- Este tópico contém 8 respostas, 2 vozes e foi atualizado pela última vez 17 anos, 1 mês atrás por
mpvargas.
-
AutorPosts
-
26 de janeiro de 2009 às 8:22 pm #84908
mpvargas
ParticipanteCaros Amigos,
Gostaria de saber se alguém trabalha com DBS 2006 (Delphi 2006 – Borland Developer Studio) com Banco Oracle 10g + Linux Red Hat.
Aqui no trabalho um analista me perguntou a respeito do tratamento do Oracle com relação ao tipo NUMBER.
Quando ele acessa o banco pelo Delphi, o tipo Number vira BCD.
Estamos tentando importar alguns arquivos para o banco, mas com esse detalhe não está dando certo.
Tem como converter esse campo para Float ou Currency, que são os padrões do Delphi? E como deve ser feita essa conversão?
Obrigado.26 de janeiro de 2009 às 8:39 pm #84910Rodrigo Almeida
ParticipanteEu acho estranho um campo númerico no banco de dados realizar a conversão para STRING!!!
Com certeza isso está na camada de aplicação, pq o campo NUMBER trabalha bem com o BDE da Delphi.
Pode estar acontecendo algum tipo de equivoco e vendo o campo errado, mascaramento no front-end, conversão para HEXADECIMAL qualquer coisa…
Tem que nunca podemos descartar BUGS… desde a parte do Oracle até mesmo a versão utilizada pelo BDE… mas acho díficil… pode ser alguma configuração de propriedades do campo que está alterada.
Abraços,
Rodrigo Almeida26 de janeiro de 2009 às 8:55 pm #84913mpvargas
ParticipanteRodrigo,
Obrigado pela ajuda.
Eu também não consegui encontrar uma explicação para esse problema.
Quando ele tenta usar o campo como string ele funciona, mas se usar como number não dá erro, mas não carrega os dados.
Estranho.26 de janeiro de 2009 às 8:58 pm #84914Rodrigo Almeida
ParticipanteMarcelo,
Posta para nós somente a estrutura da tabela que está sofrendo a carga.
E depois os properties do DBE para a conexão do Recordset no aplicativo.
Algumas dúvidas:
1)O campo que a aplicação está tentando inserir é realmente nessa coluna?
2)O arquivo que está tentando inserir não pode estar com dados sujos, ou seja, onde deveria ter NUMBER tem algum outro caracter não númerico?Abraços,
Rodrigo Almeida
27 de janeiro de 2009 às 9:56 pm #84930mpvargas
ParticipanteCaro Rodrigo,
Segue abaixo o que foi solicitado:
1)Estrutura da Tabela Clientes
desc fazenda.clientes
Name Null Type
CLI_EMPRESA NOT NULL VARCHAR2(2)
CLI_CODIGO NOT NULL NUMBER(4)
CLI_NOME NOT NULL VARCHAR2(50)
CLI_ENDERECO NOT NULL VARCHAR2(50)
CLI_BAIRRO NOT NULL VARCHAR2(30)
CLI_CIDADE NOT NULL VARCHAR2(30)
CLI_ESTADO NOT NULL VARCHAR2(2)
CLI_CEP NOT NULL VARCHAR2(8)
CLI_FONE_COM VARCHAR2(15)
CLI_FONE_RES VARCHAR2(15)
CLI_FONE_CEL VARCHAR2(15)
CLI_FAX VARCHAR2(15)
CLI_TIPO_PESSOA VARCHAR2(1)
CLI_CIC VARCHAR2(18)
CLI_EMAIL VARCHAR2(40)2)Fragmento do arquivo texto
101000HELDER HENRIQUE GALERA E OUTROS …
701001MARIA AMELIA FACURY NOVAIS …
801002ANTONIO VILLELA COUTO …3)Trecho da aplicação
with DataModule do begin cdsClientes.Insert; cdsClientesCLI_EMPRESA.AsString := wempresa; cdsClientesCLI_CODIGO.AsFloat := StrToFloat(wcodigo); cdsClientesCLI_NOME.AsString := wnome; cdsClientesCLI_ENDERECO.AsString := wendereco; cdsClientesCLI_BAIRRO.AsString := wbairro; cdsClientesCLI_CIDADE.AsString := wcidade; cdsClientesCLI_ESTADO.AsString := westado; cdsClientesCLI_CEP.AsString := wcep; cdsClientesCLI_FONE_COM.AsString := wtele; cdsClientesCLI_FONE_RES.AsString := ''; cdsClientesCLI_FONE_CEL.AsString := ''; cdsClientesCLI_FAX.AsString := ''; cdsClientesCLI_TIPO_PESSOA.AsString := wtipo; cdsClientesCLI_CIC.AsString := wcic; cdsClientesCLI_EMAIL.AsString := wemail; cdsClientes.Post; end;27 de janeiro de 2009 às 10:17 pm #84931Rodrigo Almeida
ParticipanteMarcelo,
A linha:
cdsClientesCLI_CODIGO.AsFloat := StrToFloat(wcodigo);
Está lendo as 6 primeiras posições do arquivo TXT?
E pq não utiliza a opção cdsClientesCLI_CODIGO.AsInteger desde Float.
Abraços,
Rodrigo Almeida29 de janeiro de 2009 às 4:09 pm #84963mpvargas
ParticipanteRodrigo,
Na verdade o que acontece é que quando a tabela é carregada pro Delphi, automaticamente o tipo do campo Number muda pra BCD.
Aí na hora de carregar o arquivo, utilizando a aplicação, ele não carrega em virtude dessa troca de tipo.29 de janeiro de 2009 às 5:11 pm #84968Rodrigo Almeida
ParticipanteMarcelo,
Estou meio confuso, TABELA ou DADOS carregados para o DELPHI?
Se for realmente TABELA, qual o motivo que ele faz isso? Regra de negócio…
Abraços,
Rodrigo Almeida30 de janeiro de 2009 às 12:01 am #84980mpvargas
ParticipanteRodrigo,
O aplicativo está lendo 4 posições do arquivo txt (posição 3 até 6).
O problema é que a captura dos campos da tabela feita pelo ClientDataSet está interpretando o campo CLI_CODIGO como tipo BCD.
No momento do ApplyUpdates ocorre o erro de tipos incompatíveis caso troque para cdsClientesCLI_CODIGO.AsInteger.
Usando AsFloat não ocorre o erro mas também não acontece a carga da tabela. Agora, trocando esse campo (CLI_CODIGO) para VARCHAR2 no Oracle e tratando no aplicativo como String a carga da tabela é feita normalmente.
O que eu gostaria de saber é se não existe um local no BDS2006 onde seja possível informar que o campo tipo NUMBER do Oracle deve ser tratado como Float, Currency ou algum outro tipo e não como BCD. -
AutorPosts
- Você deve fazer login para responder a este tópico.