Pular para o conteúdo
  • Este tópico contém 8 respostas, 2 vozes e foi atualizado pela última vez 17 anos, 1 mês atrás por mpvargas.
Visualizando 9 posts - 1 até 9 (de 9 do total)
  • Autor
    Posts
  • #84908
    mpvargas
    Participante

      Caros 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.

      #84910
      Rodrigo Almeida
      Participante

        Eu 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 Almeida

        #84913
        mpvargas
        Participante

          Rodrigo,
          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.

          #84914
          Rodrigo Almeida
          Participante

            Marcelo,

            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

            #84930
            mpvargas
            Participante

              Caro 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;
              
              #84931
              Rodrigo Almeida
              Participante

                Marcelo,

                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 Almeida

                #84963
                mpvargas
                Participante

                  Rodrigo,

                  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.

                  #84968
                  Rodrigo Almeida
                  Participante

                    Marcelo,

                    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 Almeida

                    #84980
                    mpvargas
                    Participante

                      Rodrigo,

                      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.

                    Visualizando 9 posts - 1 até 9 (de 9 do total)
                    • Você deve fazer login para responder a este tópico.