Pular para o conteúdo

Marcado: ,

  • Este tópico contém 12 respostas, 4 vozes e foi atualizado pela última vez 3 anos, 7 meses atrás por Avatar de José Laurindo ChiappaJosé Laurindo Chiappa.
Visualizando 13 posts - 1 até 13 (de 13 do total)
  • Autor
    Posts
  • #146838
    Avatar de LHCLHC
    Participante

      Mestres boa tarde, estou com uma duvida de como fazer uma situação.

      Exemplo:

      Tenho uma query que faz um calculo gerando uma nova coluna subtraindo a (data de vencimento – data de emissão).

      o resultado aparece na coluna “SUB” porém quando passa de 30 dias não retorna o valor certo da subtração fica um numero exemplo: 104 (seria 45 dias).

       

      A query é a seguinte:

      SELECT DISTINCT A1_COD, A1_NOME, A1_EST, A1_SATIV1 , X5_DESCRI,
      E1_PARCELA, E1_EMISSAO, E1_VENCTO,
      e1_vencto – e1_emissao AS SUB,
      E1_VALOR, E1_NUM
      FROM SE1310
      INNER JOIN SA1010 ON SA1010.A1_COD = E1_CLIENTE AND SA1010.A1_LOJA = E1_LOJA AND SA1010.D_E_L_E_T_ = ‘ ‘
      INNER JOIN SX5310 ON SX5310.X5_CHAVE = A1_SATIV1 AND SX5310.X5_TABELA = ‘T3’ AND SX5310.D_E_L_E_T_ = ‘ ‘
      WHERE SE1310.D_E_L_E_T_ = ‘ ‘

      ORDER BY E1_EMISSAO, A1_COD,E1_NUM, E1_PARCELA

       

      Resultado EX:

      COD – NOME – ESTADO – CODATI – DESC – PARC – DT EMISS – DT VENC – VALOR – NOTA

      007084 OSVALDO  ES 83 GRANDES REDES A 20200101 20200122 21 23443,56 000755000
      007084 OSVALDO ES 83 GRANDES REDES B 20200101 20200129 28 23443,56 000755009
      007084 OSVALDO ES 83 GRANDES REDES C 20200101 20200205 104 23443,57 000755087

      Tá vendo onde tá 104? se fizer o calculo seria 45 (dias).

       

      Então agora vem a pergunta consigo tratar isso dentro do meu select utilizando a variável (coluna) SUB que foi criada pela expressão? Ou qual outra forma eu consigo tratar essa informação? tentei colocar um case e até tentei criar um outro select dentro do mesmo mais como eu to aprendendo ainda não tive sucesso apresentando cada hora um erro.

      Alguém poderia me ajudar ?

       

      #146839
      Avatar de LHCLHC
      Participante

        SÓ CORRIGINDO (FALTOU A COLUNA DIAS QUE É A SUB (RESULTADO DA EXPRESSÃO)

        Resultado EX:

        COD – NOME – ESTADO – CODATI – DESC – PARC – DT EMISS – DT VENC – DIAS – VALOR – NOTA

        007084 OSVALDO  ES 83 GRANDES REDES A 20200101 20200122 21 23443,56 000755000
        007084 OSVALDO ES 83 GRANDES REDES B 20200101 20200129 28 23443,56 000755009
        007084 OSVALDO ES 83 GRANDES REDES C 20200101 20200205 104 23443,57 000755087

        #146840
        Avatar de LHCLHC
        Participante
          • Tá vendo onde tá 104? se fizer o calculo seria 35 (dias).
          #146841
          Avatar de Sergio WilliansSergio Willians
          Mestre

            Opa @LHC ! Tudo bem ?

            Então, acho que está ocorrendo um erro de conceito sobre o tipo de dado utilizado. Primeiro, vamos pegar uma calculadora e executar o seguinte cálculo:

            20200205 – 20200101 = 104

            Veja que se entendermos que é um cálculo numérico, o resultado está correto.

            O que ocorre é que provavelmente os campos e1_vencto e e1_emissao estão como VARCHAR e não como DATE. Quando você colocou em sua query o cálculo (e1_vencto – e1_emissao), ele fez um casting para numérico e efetuou o cálculo.

            Experimente fazer a seguinte mudança:

            SELECT DISTINCT A1_COD, A1_NOME, A1_EST, A1_SATIV1 , X5_DESCRI,
            E1_PARCELA, E1_EMISSAO, E1_VENCTO,
            TO_DATE(e1_vencto,’YYYYMMDD’) – TO_DATE(e1_emissao,’YYYYMMDD’) AS SUB,
            E1_VALOR, E1_NUM
            FROM SE1310
            INNER JOIN SA1010 ON SA1010.A1_COD = E1_CLIENTE AND SA1010.A1_LOJA = E1_LOJA AND SA1010.D_E_L_E_T_ = ‘ ‘
            INNER JOIN SX5310 ON SX5310.X5_CHAVE = A1_SATIV1 AND SX5310.X5_TABELA = ‘T3’ AND SX5310.D_E_L_E_T_ = ‘ ‘
            WHERE SE1310.D_E_L_E_T_ = ‘ ‘

            ORDER BY E1_EMISSAO, A1_COD,E1_NUM, E1_PARCELA

             

            #146843
            Avatar de José Laurindo ChiappaJosé Laurindo Chiappa
            Moderador

              Oi Sérgio, blz ? Espero que sim… Então, acho que vc matou a pau, é quase Certo que é um datatype errado/inválido para conter valores de data – isso imho fica Evidente quando a gente vê na query que as colunas com datas aparecem assim :

              20200101 20200122

              ie, sem barra, sem traço, sem nada… Concordo 100% com vc que isso OU é NUMBER ou é STRING, sim : via de regra só esses dois datatypes é que apareceriam assim….

              E a solução realmente SERIA usar o datatype ** CORRETO ** (até por Segurança e Integridade de dados, pois quando se bota datas numa coluna DATE ou TIMESTAMP ou similar vc tem 100% de certeza que o Oracle VAI VALIDAR a data, sendo Impossível vc informar um dia ou mês ou ano inválido : quando se enfia um dado num datatype string ou number esses caras aceitam Qualquer Coisa em princípio, quem faz isso está JOGANDO PELA JANELA qquer chance de Integridade de dados pelo database, via de regra) mas Concordo novamente, se não for possível fazer o certo e correto é fazer uma Conversão para date explícita, via TO_DATE(colunastring ou TO_DATE(TO_CHAR(colunanumber, cfrme for o datatype que erradamente foi usado para guardar datas nessa tabela, sim….

              []s

              Chiappa

              #146850
              Avatar de MottaMotta
              Participante

                Só para ajudar o colega @LHC , este formato de “data” é de um ERP do mercado, ele deve ter pouca culpa nisto.

                Digamos que já tive problemas com isto.

                🙂

                #146901
                Avatar de LHCLHC
                Participante

                  Exato, ERP Protheus.

                  Então amigos entendi a explicação desde já agradecido.

                  Mais voltando ao assunto não deu certo, tinha tentado fazer dessa forma porém dá erro:

                  ORA-00911: caractere inválido
                  00911. 00000 – “invalid character”
                  *Cause: identifiers may not start with any ASCII character other than
                  letters and numbers. $#_ are also allowed after the first
                  character. Identifiers enclosed by doublequotes may contain
                  any character other than a doublequote. Alternative quotes
                  (q’#…#’) cannot use spaces, tabs, or carriage returns as
                  delimiters. For all other contexts, consult the SQL Language
                  Reference Manual.
                  *Action:
                  Erro na linha: 3 Coluna: 19

                   

                  Pelo que entendi o código não consegue converter esse campo mesmo sendo ele do tipo DATA no protheus.

                  Vou tentar tratar isso no advpl.

                  Obrigado a todos.

                   

                  #146902
                  Avatar de Sergio WilliansSergio Willians
                  Mestre

                    Estava com a aspa errada, tente agora com a query abaixo:

                    SELECT DISTINCT A1_COD, A1_NOME, A1_EST, A1_SATIV1 , X5_DESCRI,
                    E1_PARCELA, E1_EMISSAO, E1_VENCTO,
                    TO_DATE(e1_vencto,’YYYYMMDD’) – TO_DATE(e1_emissao,’YYYYMMDD’) AS SUB,
                    E1_VALOR, E1_NUM
                    FROM SE1310
                    INNER JOIN SA1010 ON SA1010.A1_COD = E1_CLIENTE AND SA1010.A1_LOJA = E1_LOJA AND SA1010.D_E_L_E_T_ = ‘ ‘
                    INNER JOIN SX5310 ON SX5310.X5_CHAVE = A1_SATIV1 AND SX5310.X5_TABELA = ‘T3’ AND SX5310.D_E_L_E_T_ = ‘ ‘
                    WHERE SE1310.D_E_L_E_T_ = ‘ ‘

                    ORDER BY E1_EMISSAO, A1_COD,E1_NUM, E1_PARCELA

                    #146904
                    Avatar de LHCLHC
                    Participante

                      Mestre deu certim, que o senhor continue te abençoando com sua sabedoria e generosidade.

                      Estava começando a tratar isso pelo ADVPL mais isso me economizou algumas linhas de codigos hehehehe.

                      Desde já agradeço a todos pela atenção, muito obrigado.

                      #146914
                      Avatar de MottaMotta
                      Participante

                        Nota , em datas não obrigatórias tipo e1_baixa ser for preciso faça to_date(trim(e1_baixa),’yyyymmdd’).

                        Fora isto é esta trabalheira para fazer algo banal…

                        #146932
                        Avatar de José Laurindo ChiappaJosé Laurindo Chiappa
                        Moderador

                          Oi, Mota, só um comentário : pelo TRIM da sua obs eu DEDUZO que além de fazer a caquinha e não usar datatype DATE para as colunas de datas o tal ERP ** além disso ** usa datatype STRING (ie, CHAR ou VARCHAR/VARCHAR2) e pra Coroar ainda bota um espaço em branco pra indicar valor não preenchido ao invés do NULL, o que Exige a adição do TRIM ???
                          Coisinha feia… Mas sim, se é assim que o monstrengo foi programado, é assim que a pessoa tem que proceder….

                          []s

                          Chiappa

                          #147000
                          Avatar de MottaMotta
                          Participante

                            Chiappa , o ERP cria todos os campos com CHAR , assim IVO SÁ e Dom Pedro II usam o mesmo espaço em disco …o

                            Os campos são NOT NULL.

                            Aí o DBA desavisado sugere melhorias , já sai de reunião para não mandar o cara para lugares não republicanos … 🙂

                            Outra o nome do campo tem só 6 posições , fora a redundancia da tabela , sem o dicionário fica difícil fazer certas coisas.

                             

                            #147008
                            Avatar de José Laurindo ChiappaJosé Laurindo Chiappa
                            Moderador

                              caracoles…. Confesso que eu só tinha trabalhado com Protheus há uns 3 anos atrás num projeto de migração de Protheus aqui em SP para uma empresa multinacional alimentícia, migrando de client/server num datacenter para cloud (onde os usuários iam acessar um servidor cloud via citrix), mas eu atuava como PMO auxiliar, eu só ajudava a moça que PMO na coordenação e operacionalização do projeto, eu não programava, então não sabia que era tão tão assim….

                              Mas blz, tudo é experiência, tudo serve pra agregar…

                               

                              Abraços,

                               

                              Chiappa

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