- Este tópico contém 12 respostas, 4 vozes e foi atualizado pela última vez 4 anos, 2 meses atrás por José Laurindo Chiappa.
-
AutorPosts
-
20 de agosto de 2020 às 2:26 pm #146838LHCParticipante
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 000755087Tá 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 ?
20 de agosto de 2020 às 2:51 pm #146839LHCParticipanteSÓ 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 00075508720 de agosto de 2020 às 3:17 pm #146840LHCParticipante- Tá vendo onde tá 104? se fizer o calculo seria 35 (dias).
21 de agosto de 2020 às 12:14 pm #146841Sergio WilliansMestreOpa @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
21 de agosto de 2020 às 5:17 pm #146843José Laurindo ChiappaModeradorOi 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
22 de agosto de 2020 às 9:03 am #146850MottaParticipanteSó 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.
🙂
24 de agosto de 2020 às 9:00 am #146901LHCParticipanteExato, 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: 19Pelo 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.
24 de agosto de 2020 às 9:20 am #146902Sergio WilliansMestreEstava 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
24 de agosto de 2020 às 10:48 am #146904LHCParticipanteMestre 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.
24 de agosto de 2020 às 7:47 pm #146914MottaParticipanteNota , 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…
28 de agosto de 2020 às 8:07 pm #146932José Laurindo ChiappaModeradorOi, 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
3 de setembro de 2020 às 9:04 pm #147000MottaParticipanteChiappa , 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.
4 de setembro de 2020 às 4:57 pm #147008José Laurindo ChiappaModeradorcaracoles…. 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
-
AutorPosts
- Você deve fazer login para responder a este tópico.