none
Erro ao converter varchar em float RRS feed

  • Pergunta

  • Boa tarde..

    Estou gerando uma query e nessa query estou fazendo um join entre um campo varchar e um campo float.

    sendo o campo SY.YE_MOEDA e varchar e o campo DA1_A1_MOEDA e float.

    segue minha query

    SELECT
    DA.DA1_CODTAB  AS TABELA,
    DA.DA1_CODPRO  AS CODPRODUTO,
    SB.B1_DESC     AS DESCRICAO,
    SB.B1_PRV1     AS PRECOVENDA,
    DA.DA1_MOEDA   AS MOEDA,
    CONVERT(FLOAT, SY.YE_MOEDA) AS NOMEMOEDA
    FROM DA1010 AS DA
    INNER JOIN SB1010 AS SB WITH (NOLOCK) ON SB.B1_COD = DA.DA1_CODPRO
    INNER JOIN SYE010 AS SY WITH (NOLOCK) ON SY.YE_MOEDA = DA.DA1_MOEDA
    WHERE DA.D_E_L_E_T_ <> '*' AND DA.DA1_ATIVO = '1'

    segue o erro

    Msg 8114, Level 16, State 5, Line 1
    Error converting data type varchar to float.

    desde já agradeço.


    JUNIOR GUERREIRO T.I

    sábado, 11 de novembro de 2017 16:21

Respostas

  • Boa tarde Junior,

    O campo YE_MOEDA é a moeda cadastrada nos módulos de COMEX e o campo DA1_MOEDA é a moeda cadastrada nos módulos de materiais do Protheus.

    Seu JOIN deveria ficar da seguinte forma:

    SELECT
    DA1.DA1_CODTAB  AS TABELA,
    DA1.DA1_CODPRO  AS CODPRODUTO,
    B1.B1_DESC     AS DESCRICAO,
    B1.B1_PRV1     AS PRECOVENDA,
    DA1.DA1_MOEDA   AS MOEDA,
    CONVERT(FLOAT, YE.YE_MOEDA) AS NOMEMOEDA
    FROM DA1010 AS DA1
    INNER JOIN SB1010 AS B1 WITH (NOLOCK) ON B1.B1_COD = DA1.DA1_CODPRO
    INNER JOIN SYF010 AS YF WITH (NOLOCK) ON YF.YF_MOEFAT = DA1.DA1_MOEDA
    INNER JOIN SYE010 AS YE WITH (NOLOCK) ON YF.YF_MOEDA = YE.YE_MOEDA
    WHERE DA1.D_E_L_E_T_ <> '*' AND DA1.DA1_ATIVO = '1'

    A tabela SYF faz o de-para nas moedas do COMEX para Materiais.

    Outra coisa, tenha certeza de filtrar o D_E_L_E_T_ para todas as tabelas e o campo XX_FILIAL também, caso contrário você poderá estar pegando informações deletadas e/ou de filiais erradas

    Qualquer dúvida posta ai!

    Abraço!


    "A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski

    • Marcado como Resposta Junior Guerreiro segunda-feira, 13 de novembro de 2017 19:46
    segunda-feira, 13 de novembro de 2017 15:21

Todas as Respostas

  • Tente usar isso:

    SELECT
    DA.DA1_CODTAB  AS TABELA,
    DA.DA1_CODPRO  AS CODPRODUTO,
    SB.B1_DESC     AS DESCRICAO,
    SB.B1_PRV1     AS PRECOVENDA,
    DA.DA1_MOEDA   AS MOEDA,
    CONVERT(FLOAT, SY.YE_MOEDA) AS NOMEMOEDA
    FROM DA1010 AS DA
    INNER JOIN SB1010 AS SB WITH (NOLOCK) ON SB.B1_COD = DA.DA1_CODPRO
    INNER JOIN SYE010 AS SY WITH (NOLOCK) ON CONVERT(FLOAT, ISNULL(SY.YE_MOEDA,0)) = DA.DA1_MOEDA
    WHERE DA.D_E_L_E_T_ <> '*' AND DA.DA1_ATIVO = '1'

    Acredito que o DA.DA1_MOEADA seja um float?!

    ON SY.YE_MOEDA = DA.DA1_MOEDA --Não está acontecendo a conversão!

    Então Substitui por:

    ON CONVERT(FLOAT, ISNULL(SY.YE_MOEDA,0)) = DA.DA1_MOEDA

    Acredito que isso resolverá seu pequeno problema.

     


    Rafael Almeida
    Senior Developer .NET C#
    Development Leader at JAMSOFT Informática
    Criador e Mantenedor do Entity Framework Core for Firebird
    Contribuidor do Entity Framework Core
    Email: ralms@ralms.net
    Blog -  GitHub  -  LinkedIn -  Twitter


    sábado, 11 de novembro de 2017 16:38
  • Deleted
    sábado, 11 de novembro de 2017 16:42
  • Rafael muito obrigado pela atenção,realizei a alteração que vc sugeriu e mesmo assim o erro de conversão continua.

    SELECT
    DA.DA1_CODTAB  AS TABELA,
    DA.DA1_CODPRO  AS CODPRODUTO,
    SB.B1_DESC     AS DESCRICAO,
    SB.B1_PRV1     AS PRECOVENDA,
    DA.DA1_MOEDA   AS MOEDA,
    CONVERT(FLOAT, SY.YE_MOEDA) AS NOMEMOEDA
    FROM DA1010 AS DA
    INNER JOIN SB1010 AS SB WITH (NOLOCK) ON SB.B1_COD = DA.DA1_CODPRO
    INNER JOIN SYE010 AS SY WITH (NOLOCK) ON CONVERT(FLOAT, ISNULL(SY.YE_MOEDA,0)) = DA.DA1_MOEDA
    WHERE DA.D_E_L_E_T_ <> '*' AND DA.DA1_ATIVO = '1'

    Msg 8114, Level 16, State 5, Line 1
    Error converting data type varchar to float.


    JUNIOR GUERREIRO T.I

    sábado, 11 de novembro de 2017 16:45
  • SYE010 campo YE_MOEDA contem o nome da moeda Ex.  EUR, US$

    Jáa tebela DA1010 campo D1_Moeda contem o codigo da moeda,Ex. 1 ou 2 ou 3 onde 1 e moeda Real, 2 e moeda Dolar e 3 e Moeda Euro.

    SB1010 decrição do produto.


    JUNIOR GUERREIRO T.I

    sábado, 11 de novembro de 2017 16:52
  • Rafael muito obrigado pela atenção,realizei a alteração que vc sugeriu e mesmo assim o erro de conversão continua.

    SELECT
    DA.DA1_CODTAB  AS TABELA,
    DA.DA1_CODPRO  AS CODPRODUTO,
    SB.B1_DESC     AS DESCRICAO,
    SB.B1_PRV1     AS PRECOVENDA,
    DA.DA1_MOEDA   AS MOEDA,
    CONVERT(FLOAT, SY.YE_MOEDA) AS NOMEMOEDA
    FROM DA1010 AS DA
    INNER JOIN SB1010 AS SB WITH (NOLOCK) ON SB.B1_COD = DA.DA1_CODPRO
    INNER JOIN SYE010 AS SY WITH (NOLOCK) ON CONVERT(FLOAT, ISNULL(SY.YE_MOEDA,0)) = DA.DA1_MOEDA
    WHERE DA.D_E_L_E_T_ <> '*' AND DA.DA1_ATIVO = '1'

    Msg 8114, Level 16, State 5, Line 1
    Error converting data type varchar to float.


    JUNIOR GUERREIRO T.I

    Então isso é errado!
    CONVERT(FLOAT, SY.YE_MOEDA) AS NOMEMOEDA 

    Não deve acontecer essa conversão, aqui você deve usar algo pra identificar o campo!


    Rafael Almeida
    Senior Developer .NET C#
    Development Leader at JAMSOFT Informática
    Criador e Mantenedor do Entity Framework Core for Firebird
    Contribuidor do Entity Framework Core
    Email: ralms@ralms.net
    Blog -  GitHub  -  LinkedIn -  Twitter

    sábado, 11 de novembro de 2017 16:58
  • Tenta isso aqui:

    SELECT
    DA.DA1_CODTAB  AS TABELA,
    DA.DA1_CODPRO  AS CODPRODUTO,
    SB.B1_DESC     AS DESCRICAO,
    SB.B1_PRV1     AS PRECOVENDA,
    DA.DA1_MOEDA   AS MOEDA,
    SY.YE_MOEDA AS NOMEMOEDA
    FROM DA1010 AS DA
    INNER JOIN SB1010 AS SB WITH (NOLOCK) ON SB.B1_COD = DA.DA1_CODPRO
    INNER JOIN SYE010 AS SY WITH (NOLOCK) ON 
    (CASE WHEN SY.YE_MOEDA = 'EUR' THEN 3 ELSE (CASE WHEN SY.YE_MOEDA = 'US$' THEN 2 ELSE 1 END)  END) = DA.DA1_MOEDA
    WHERE DA.D_E_L_E_T_ <> '*' AND DA.DA1_ATIVO = '1'
    Com essa modificação acredito que consegue ter o resultado desejável!


    Rafael Almeida
    Senior Developer .NET C#
    Development Leader at JAMSOFT Informática
    Criador e Mantenedor do Entity Framework Core for Firebird
    Contribuidor do Entity Framework Core
    Email: ralms@ralms.net
    Blog -  GitHub  -  LinkedIn -  Twitter

    • Marcado como Resposta Junior Guerreiro sábado, 11 de novembro de 2017 19:16
    • Não Marcado como Resposta Junior Guerreiro sábado, 11 de novembro de 2017 22:04
    sábado, 11 de novembro de 2017 17:02
  • Deleted
    sábado, 11 de novembro de 2017 17:03
  • Também já tirei este campo da query e mesmo assim o erro persiste.

    SELECT
    DA.DA1_CODTAB  AS TABELA,
    DA.DA1_CODPRO  AS CODPRODUTO,
    SB.B1_DESC     AS DESCRICAO,
    SB.B1_PRV1     AS PRECOVENDA,
    DA.DA1_MOEDA   AS MOEDA,
    SY.YE_MOEDA    AS NOMEMOEDA
    FROM DA1010 AS DA
    INNER JOIN SB1010 AS SB WITH (NOLOCK) ON SB.B1_COD = DA.DA1_CODPRO
    INNER JOIN SYE010 AS SY WITH (NOLOCK) ON CONVERT(FLOAT, ISNULL(SY.YE_MOEDA,0)) = DA.DA1_MOEDA
    WHERE DA.D_E_L_E_T_ <> '*' AND DA.DA1_ATIVO = '1'


    JUNIOR GUERREIRO T.I

    sábado, 11 de novembro de 2017 17:04
  • Então o código da moeda e único para cada moeda, só que na tabela SYE010 eu não tenho este código e sim o nome da moeda Ex. código 1 na tabela DA1010 significa que e Real na tabela SYE010, o código 2 na tabela SD1010 e Dolar na tabela SYE010 e código 3 na tabela DA1010 e Euro na tabela SYE010.

    JUNIOR GUERREIRO T.I

    sábado, 11 de novembro de 2017 17:13
  • Então o código da moeda e único para cada moeda, só que na tabela SYE010 eu não tenho este código e sim o nome da moeda Ex. código 1 na tabela DA1010 significa que e Real na tabela SYE010, o código 2 na tabela SD1010 e Dolar na tabela SYE010 e código 3 na tabela DA1010 e Euro na tabela SYE010.

    JUNIOR GUERREIRO T.I

    Você tentou a query que postei acima?

    Rafael Almeida
    Senior Developer .NET C#
    Development Leader at JAMSOFT Informática
    Criador e Mantenedor do Entity Framework Core for Firebird
    Contribuidor do Entity Framework Core
    Email: ralms@ralms.net
    Blog -  GitHub  -  LinkedIn -  Twitter

    sábado, 11 de novembro de 2017 17:23
  • Você tem como enviar em banco com essas tabelas para tentar simular e te ajudar?

    Rafael Almeida
    Senior Developer .NET C#
    Development Leader at JAMSOFT Informática
    Criador e Mantenedor do Entity Framework Core for Firebird
    Contribuidor do Entity Framework Core
    Email: ralms@ralms.net
    Blog -  GitHub  -  LinkedIn -  Twitter

    sábado, 11 de novembro de 2017 17:24
  • Deleted
    sábado, 11 de novembro de 2017 17:25
  • O que necessito saber é qual é a sigla utilizada na tabela SYE010 para a moeda real. É R$? Ou é BRL? Ou outra coisa?

    Mas uma solução é próxima à que o Rafael propôs, usando construção CASE na junção.

    Mas continuo achando estranhíssimo que duas tabelas de um mesmo sistema (Protheus?) utilizem codificações diferentes para uma mesma informação.


    e-mail       José Diz     Belo Horizonte, MG - Brasil



    Eu ainda estou sem compreender direito, até acreditei com o case resolveria o problema dele, mais ele questionou outra coisa que não compreendi, você entendeu algo diferente José? pra tentarmos ajudar o amigo.

    Rafael Almeida
    Senior Developer .NET C#
    Development Leader at JAMSOFT Informática
    Criador e Mantenedor do Entity Framework Core for Firebird
    Contribuidor do Entity Framework Core
    Email: ralms@ralms.net
    Blog -  GitHub  -  LinkedIn -  Twitter

    sábado, 11 de novembro de 2017 18:05
  • Obrigado a todos pela ajuda, a resposta do Rafael Almeida deu certo aqui...

    JUNIOR GUERREIRO T.I

    sábado, 11 de novembro de 2017 19:17
  • Deleted
    sábado, 11 de novembro de 2017 20:38
  • José boa tarde...

    Seu questionamento faz todo o sentido sim, mas e mesmo desta forma que tenho nas tabelas, por isso a dificuldade de fazer o join, e que em cada tabela trato a moeda de forma diferente, e na tabela DA1010 que e a tabela de preço tenho um campo chamado DA1_MOEDA, que ele trata com valor 1, 2 e 3 como expliquei antes, e na tabela onde incluo o valor da moeda eu não tenho este código e sim tenho o nome da moeda Ex. SYE010  - EUR, US$ e R$, só que preciso do valor da moeda na tabela DA1010 pra fazer a conversão do valor da tabela de preços toda para real.

    Achei que o case resolveria meu problema, mas infelizmente ainda não resolveu... 


    JUNIOR GUERREIRO T.I

    sábado, 11 de novembro de 2017 22:04
  • Deleted
    domingo, 12 de novembro de 2017 01:43
  • Bom dia José, maseu consegui uma solução criando um campo na tabela SYE010 com o código da moeda.

    então a versão do protheus e a 11

    o objetivo da query,e que minha tabela de preço esta em dolar e euro, preciso do valor da moeda que e lançado na tabela SYE010  para fazer a conversão.

    Esta ai a estrutura da tabela SYE010

    YE_FILIAL          varchar(2) Unchecked
    YE_DATA          varchar(8) Unchecked
    YE_MOE_FIN  varchar(2) Unchecked
    YE_MOEDA  varchar(3) Unchecked
    YE_VLCON_C  float                 Unchecked
    YE_VLFISCA  float                 Unchecked
    YE_TX_COMP  float                 Unchecked
    D_E_L_E_T_  varchar(1) Unchecked
    R_E_C_N_O_  int                 Unchecked
    R_E_C_D_E_L_  int                 Unchecked
    YE_XCODMOE  float                 Unchecked


    JUNIOR GUERREIRO T.I


    domingo, 12 de novembro de 2017 14:15
  • Deleted
    domingo, 12 de novembro de 2017 15:57
  • Boa tarde Junior,

    O campo YE_MOEDA é a moeda cadastrada nos módulos de COMEX e o campo DA1_MOEDA é a moeda cadastrada nos módulos de materiais do Protheus.

    Seu JOIN deveria ficar da seguinte forma:

    SELECT
    DA1.DA1_CODTAB  AS TABELA,
    DA1.DA1_CODPRO  AS CODPRODUTO,
    B1.B1_DESC     AS DESCRICAO,
    B1.B1_PRV1     AS PRECOVENDA,
    DA1.DA1_MOEDA   AS MOEDA,
    CONVERT(FLOAT, YE.YE_MOEDA) AS NOMEMOEDA
    FROM DA1010 AS DA1
    INNER JOIN SB1010 AS B1 WITH (NOLOCK) ON B1.B1_COD = DA1.DA1_CODPRO
    INNER JOIN SYF010 AS YF WITH (NOLOCK) ON YF.YF_MOEFAT = DA1.DA1_MOEDA
    INNER JOIN SYE010 AS YE WITH (NOLOCK) ON YF.YF_MOEDA = YE.YE_MOEDA
    WHERE DA1.D_E_L_E_T_ <> '*' AND DA1.DA1_ATIVO = '1'

    A tabela SYF faz o de-para nas moedas do COMEX para Materiais.

    Outra coisa, tenha certeza de filtrar o D_E_L_E_T_ para todas as tabelas e o campo XX_FILIAL também, caso contrário você poderá estar pegando informações deletadas e/ou de filiais erradas

    Qualquer dúvida posta ai!

    Abraço!


    "A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski

    • Marcado como Resposta Junior Guerreiro segunda-feira, 13 de novembro de 2017 19:46
    segunda-feira, 13 de novembro de 2017 15:21
  • Deleted
    segunda-feira, 13 de novembro de 2017 16:01
  • (...) A tabela SYF faz o de-para nas moedas do COMEX para Materiais.

    Kanaãm, nada como você, que entende de Protheus, para mostrar o caminho das pedras. Eu não via sentido em tratar a junção de forma hard-coded. A questão da cláusula FROM me parece resolvida.

    Mas acho que a parte "preciso do valor da moeda que é lançado na tabela SYE010 para fazer a conversão" ainda não está resolvida; alguma sugestão?


    e-mail       José Diz     Belo Horizonte, MG - Brasil



    Nesse caso basta verificar se a conversão será feita baseada na taxa de compra (YE_MOE_FIN) ou venda (YE_VLCON_C) da moeda. Acredito eu que o mais correto seria utilizar o campo YE_VLCON_C, pois nele é armazenado a taxa da moeda no dia, multiplicado pelo preço de venda que está registrado na tabela de preços (DA1_PRCVEN).

    Não acredito que seja a melhor prática pegar o valor que consta no cadastro de produtos(B1_PRV1), pois pode ser que para diferentes locais você tenha um valor de venda diferente.

    Abraço!


    "A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski

    segunda-feira, 13 de novembro de 2017 16:56
  • Boa tarde...

    Isso fiz o que o Kanaãm me indicou e deu certinho também, muito obrigado pelo empenho de vcs do forum pra ajudar com este pequeno problema..


    JUNIOR GUERREIRO T.I

    segunda-feira, 13 de novembro de 2017 19:46