Viniciusr9
-
Total de itens
20 -
Registro em
-
Última visita
Posts postados por Viniciusr9
-
-
Pelo título do tópico acho que não Motta kk
-
indo um pouco mais além se não for abusar também, como posso fazer para setar esse resultado na coluna da tabela de ausencias ? por exemplo, abaixo tenho um update ao final do loop que carrega o resultado pra coluna de hr_ausencia referente a ultima linha inserida, porém meu resultado é sempre 0 , nao consegui encontrar o erro
DECLARE
VA_CONTA NUMBER := 0;
VA_DT_INI DATE;
VA_DT_FIM DATE;
VA_QT_DIAS NUMBER := 0;
VA_DT_ATUAL DATE;
VA_FERIADO_SN NUMBER := 0;
VA_TOT_HR_AUS NUMBER:= 0;
VA_HR_AUS_SEXTA NUMBER:= 0;
VA_TOT_DIAS NUMBER :=0;
VA_TOT_SEXTA NUMBER := 0;
BEGIN
/*SELECT trunc(to_date('03/06/2019 13:00','dd/mm/yyyy hh24:mi')) - trunc(to_date('03/06/2019 18:00','dd/mm/yyyy hh24:mi')),
trunc(to_date('03/06/2019 13:00','dd/mm/yyyy hh24:mi')),
trunc(to_date('03/06/2019 18:00','dd/mm/yyyy hh24:mi'))
into VA_QT_DIAS,
VA_DT_INI,
VA_DT_FIM
from dual;*/
select DISTINCT (TRUNC(A.DT_FIM) - TRUNC(A.DT_INI)),
A.DT_INI,
A.DT_FIM
INTO VA_QT_DIAS,
VA_DT_INI,
VA_DT_FIM
FROM AUSENCIAS A
WHERE A.DT_INC = (SELECT MAX(DT_INC) FROM AUSENCIAS);
WHILE VA_CONTA <= VA_QT_DIAS LOOP -- VERIFICA CONTADOR(VA_CONTA) EQUANTO MENOR QUE TOTAL DE DIAS ENTRE AS DATAS (INI E FIM)
VA_DT_ATUAL := VA_DT_INI + VA_CONTA;
IF VA_DT_ATUAL <= VA_DT_FIM THEN --1 VERIFICA SE DATA DO LAÇO MENOR QUE DATA FINAL
SELECT COUNT(*) INTO VA_FERIADO_SN FROM FERIADOS WHERE TRUNC(DT_FERIADO) = TRUNC(VA_DT_ATUAL);
IF VA_FERIADO_SN = 0 THEN --2 RETORNO 0 NÃO É FERIADO
IF TO_CHAR(VA_DT_ATUAL, 'D') NOT IN (1, 7) THEN --3 VERIFICA DIA DIFERENTE DE SABADO E DOMINGO
VA_TOT_HR_AUS := (VA_DT_FIM - VA_DT_ATUAL) * 24;
IF (TO_CHAR(VA_DT_FIM, 'HH24:MI') BETWEEN '08' AND '18') AND (TO_CHAR(VA_DT_INI, 'HH24:MI') BETWEEN '08' AND '18')THEN --4 VERIFICA SE HORA ESTÁ ENTRE 08 E 18
IF (TO_CHAR(VA_DT_ATUAL, 'D') <> (6) AND VA_TOT_HR_AUS >9) THEN --5 VERIFICA DIA DIFERENTE DE SEXTA E SE HORA MAIOR QUE 9
VA_TOT_DIAS := VA_TOT_DIAS +1;
VA_TOT_HR_AUS := 9;
ELSIF (TO_CHAR(VA_DT_ATUAL, 'D') = 6 AND VA_TOT_HR_AUS > 8) THEN -- VERIFICA DIA IGUAL SEXTA E SE HORA MAIOR QUE 8
VA_HR_AUS_SEXTA := 8;
VA_TOT_SEXTA := VA_TOT_SEXTA +1;
END IF; --5
END IF; --4
END IF; --3
END IF; --2
VA_TOT_HR_AUS := (VA_TOT_HR_AUS*VA_TOT_DIAS) + (VA_HR_AUS_SEXTA * VA_TOT_SEXTA);
END IF; --1
VA_DT_ATUAL := VA_DT_ATUAL +1;
VA_CONTA := VA_CONTA + 1;
END LOOP;
UPDATE AUSENCIAS SET HR_AUSENCIA = VA_TOT_HR_AUS WHERE DT_INC = (SELECT MAX(A.DT_INC) FROM AUSENCIAS A);
END; -
Seriam 17 horas úteis certo( 9 horas da quinta e 8 horas da sexta) ? . no caso sim, são 17 horas "úteis". pra esses casos que ultrapassam um dia, a contagem retorna correto, porém pra contagens menores que um dia o resultado não está correto, por exemplo como citei DT_INI = 30/05/2019 08:00 e DT_FIM = 30/05/2019 10:00 , deve retornar 2 horas "úteis"
-
você diz a coluna em questão ou o sentido do que eu quero no script ?
Se for a coluna, preciso desse valor retornado dentro da coluna hr_ausencia ( da tabela ausencias)
Se for o sentido do script, seriam na vdd as horas "inutilizaveis por ausencia"
-
por exemplo , se testar DT_INI = 30/05/2019 08:00 e DT_FIM = 30/05/2019 10:00 eu preciso que me retorne 2 ao final ,pois são 2 horas de diferença . As horas são o que importam pra mim entre as datas
-
Alguém consegue dar uma ajuda ?agradeço.
-
Montei um script que está funcionando , mas notei que a conta das horas internamente não está como eu preciso, não estou conseguindo finalizar essa parte, poderia verificar e me auxiliar nesse pedaço? Tipo ele calcula as horas mas sempre um valor grande, eu preciso que dê as horas exatas , por exemplo se a DT_FIM = '30/05/2019 16:00' e DT_INI = '30/05/2019 18:00' o retorno de horas ao final na variável precisa ser 2 .
segue o scritp: (deixei os output pra validar os resultados , e os comentarios nos ifs pra facilitar compreensao)
DECLARE VA_CONTA NUMBER := 0; VA_DT_INI DATE; VA_DT_FIM DATE; VA_QT_DIAS NUMBER := 0; VA_DT_ATUAL DATE; VA_FERIADO_SN NUMBER := 0; VA_TOT_HR_AUS NUMBER:= 0; VA_HR_AUS_SEXTA NUMBER:= 0; VA_TOT_DIAS NUMBER :=0; VA_TOT_SEXTA NUMBER := 0; BEGIN select TRUNC(TO_DATE('31/05/2019 08:00', 'DD/MM/RRRR HH24:MI')) - TRUNC(TO_DATE('14/05/2019 09:00', 'DD/MM/RRRR HH24:MI')), TO_DATE('14/05/2019 09:00', 'DD/MM/RRRR HH24:MI'), TO_DATE('31/05/2019 08:00', 'DD/MM/RRRR HH24:MI') INTO VA_QT_DIAS, VA_DT_INI, VA_DT_FIM from DUAL; /* select DISTINCT (TRUNC(A.DT_FIM) - TRUNC(A.DT_INI)), A.DT_INI, A.DT_FIM INTO VA_QT_DIAS, VA_DT_INI, VA_DT_FIM FROM AUSENCIAS A WHERE CD_AUSENCIA = 174;*/ DBMS_OUTPUT.put_line('Dia inicial: ' || VA_DT_INI); DBMS_OUTPUT.put_line('Dia final: ' || VA_DT_FIM); DBMS_OUTPUT.put_line('total dias: ' || VA_QT_DIAS); DBMS_OUTPUT.put_line('------------------'); WHILE VA_CONTA <= VA_QT_DIAS LOOP -- VERIFICA CONTADOR MENOR QUE TOTAL DE DIAS ENTRE AS DATAS (INI E FIM) VA_DT_ATUAL := VA_DT_INI + VA_CONTA; IF VA_DT_ATUAL <= VA_DT_FIM THEN --1 VERIFICA SE DATA DO LAÇO MENOR QUE DATA FINAL SELECT COUNT(*) INTO VA_FERIADO_SN FROM FERIADOS WHERE TRUNC(DT_FERIADO) = TRUNC(VA_DT_ATUAL); -- DBMS_OUTPUT.PUT_LINE('ATUAL:' || VA_DT_ATUAL ||'FERIADO:' ||VA_FERIADO_SN);-- IF VA_FERIADO_SN = 0 THEN -- RETORNO 0 NÃO É FERIADO IF TO_CHAR(VA_DT_ATUAL, 'D') NOT IN (1, 7) THEN --2 VERIFICA DIA DIFERENTE DE SABADO E DOMINGO VA_TOT_HR_AUS := (VA_DT_FIM - VA_DT_ATUAL) * 24; IF (TO_CHAR(VA_DT_FIM, 'HH24:MI') BETWEEN '08' AND '18') AND (TO_CHAR(VA_DT_INI, 'HH24:MI') BETWEEN '08' AND '18')THEN --3 VERIFICA SE HORA ESTÁ ENTRE 08 E 18 IF (TO_CHAR(VA_DT_ATUAL, 'D') <> (6) AND VA_TOT_HR_AUS >9) THEN --4 VERIFICA DIA DIFERENTE DE SEXTA E SE HORA MAIOR QUE 9 VA_TOT_DIAS := VA_TOT_DIAS +1; VA_TOT_HR_AUS := 9; DBMS_OUTPUT.put_line('VALOR ATUAL:' || VA_TOT_HR_AUS); DBMS_OUTPUT.put_line('--------------'); ELSIF (TO_CHAR(VA_DT_ATUAL, 'D') = 6 AND VA_TOT_HR_AUS > 8) THEN -- VERIFICA DIA IGUAL SEXTA E SE HORA MAIOR QUE 8 -- VA_TOT_HR_AUS := 8; VA_HR_AUS_SEXTA := 8; DBMS_OUTPUT.put_line('VALOR ATUAL:' || VA_TOT_HR_AUS); DBMS_OUTPUT.put_line('--------------'); VA_TOT_SEXTA := VA_TOT_SEXTA +1; END IF; --4 END IF; --3 END IF; --2 VA_TOT_HR_AUS := (VA_TOT_HR_AUS*VA_TOT_DIAS) + (VA_HR_AUS_SEXTA * VA_TOT_SEXTA); END IF; --1 END IF; VA_DT_ATUAL := VA_DT_ATUAL +1; DBMS_OUTPUT.PUT_LINE('CALCULO: ' || VA_CONTA); VA_CONTA := VA_CONTA + 1; DBMS_OUTPUT.put_line('DATA ATUAL:' || VA_DT_ATUAL); END LOOP; DBMS_OUTPUT.PUT_LINE('DIA SEMANA:' || VA_TOT_DIAS); DBMS_OUTPUT.PUT_LINE('DIA SEXTA:' || VA_TOT_SEXTA); DBMS_OUTPUT.put_line('VALOR FINAL :' || ROUND(VA_TOT_HR_AUS, 2)); -- resultado retornado que me interessa END;
-
o Meu saiu Harvard.
-
eu tentei uma trigger mas deu meio errado . Vou tentar pela function , só preciso pensar um pouco mais nas regras internas ( por exemplo a de contar as horas no dia e travar após passar e contar o restante dos dias) . Não sei se aqui no forum tem algum específico pra Apex, é que eu utilizo ele e seria pra aplicar dentro de um item de formulario que eu estou montando o script.
Obrigado pela ajuda, qualquer coisa eu volto aqui .
-
Assim, eu já vi essas várias functions , blocos e etc que tem por aí, inclusive eu tenho uma que adaptei pra me retornar a quantidade de horas estimadas a trabalhar em um mês. Meu problema esta mais em fixar um valor máximo por período entre as 2 variáveis, por exemplo DT_INI (28/05/2019 08:00 ) DT_FIM ( 30/05/2019 09:00) . num calculo direto isso daria 49horas. eu preciso que volte 19 horas ( 9horas do dia 28, 9horas do dia 29 e 1 hora do dia 30), mas to me embaralhando pra montar o script nessa parte. Se puder me dar um exemplo parecido ou um caminho pra começar isso eu agradeço .
-
Bom dia Motta, analisei e ambas soluções são inviáveis para mim , eu precisaria de algo mais específico , como por exemplo : ( suponha que tenho minha data inicial no dia 31/05/2019 08:00 e a data final no dia 03/06/2019 12:00 . Nesse caso seria computado no máximo 9 horas por dia entre as datas, e desconsiderado os finais de semana e feriados , assim ao final eu teria como resultado as horas que necessito ).
-
Boa tarde pessoal,
basicamente eu preciso do retorno de horas entre duas datas, porém tenho condições a tratar .
basicamente tenho 2 colunas ( dt_fim e dt_ini ) que representam data final e data inicial. Preciso da diferença entre as duas retornada em uma outra coluna (hr_ausencias) , porém a cada dia posso computar no máximo 9 horas, e desconsiderar finais de semana e feriados( esses cadastrados em uma tabela) . Seria melhor tratar isso com uma Trigger , um Script PL/SQL , como me sugerem? Agradeço quem puder ajudar.
-
Fiz o SUM externo no Select externo e o restante mantive como o primeiro scritp que te mandei, fiz o group by dentro e fora , ai funcionou certinho. Ficou
SELECt VT.PROJETO,SUM(VT.ESFORCO_CALC),VT.EQUIPE FROM(
-- SCRIPT PRIMARIO --
) VT
WHERE TO_DATE(VT.PROJETO,'MM/RRRR') = TRUNC(SYSDATE,'MM')GROUP BY VT.EQUIPE,VT.PROJETO
. Muito Obrigado Motta !
-
Desse jeito ? , assim me retorna apenas o resultado de 1501 , porém o correto que eu necessito é
( EQUIPE 1 = 1299
EQUIPE 2 = 1010
EQUIPE 3 = 147)
SELECt SUM(NVL((VT.QT_HORAS_CHEIA - SUM(VT.DT_FIM - VT.DT_INI)*24 ),VT.QT_HORAS_CHEIA)) FROM(
select
LPAD(C.MES_COMPETENCIA,2,'0') ||'/'||C.ANO_COMPETENCIA AS PROJETO,
E.DS_EQUIPE as EQUIPE,
AU.DT_FIM,
AU.DT_INI,
QT_HORAS_CHEIA
from EQUIPE E,
COLABORADOR C1,
COMPETENCIA C,
COMPETENCIA_COLABORADOR CC,
AUSENCIAS AU
where E.CD_EQUIPE=CC.CD_EQUIPE
and C.CD_COMPETENCIA=CC.CD_COMPETENCIA
and C1.CD_COLABORADOR=CC.CD_COLABORADOR
and C1.STATUS = 1
AND C1.CD_GESTOR <> C1.CD_COLABORADOR
AND AU.CD_COLABORADOR (+) = C1.CD_COLABORADOR
AND TO_DATE(LPAD(C.MES_COMPETENCIA,2,'0') ||'/'||C.ANO_COMPETENCIA,'MM/RRRR') = TRUNC(SYSDATE,'MM')
-- GROUP BY CC.QT_HORAS_CHEIA,C1.DS_COLABORADOR
) VT
WHERE TO_DATE(VT.PROJETO,'MM/RRRR') = TRUNC(SYSDATE,'MM')GROUP BY VT.QT_HORAS_CHEIA,VT.EQUIPE,vt.projeto, vt.dt_ini,vt.dt_fim
--WHERE VT.PROJETO = ((select to_char(sysdate, 'MM') from dual)||'/'||(select to_char(sysdate, 'RRRR') from dual))
-
O erro persiste Motta. Pelo que eu tava lendo na net, eu não posso ter duas funções de grupo aninhadas do tipo :
SUM(NVL((CC.QT_HORAS_CHEIA - SUM(AU.DT_FIM - AU.DT_INI)*24 ),CC.QT_HORAS_CHEIA))
porém eu preciso dela pois eu preciso reduzir o QT_HORAS_CHEIA( horas totais) de SUM(AU.DT_FIM - AU.DT_INI)*24 que são as horas faltadas pra ter um retorno de horas reais. o SUM de fora acumula tudo pra mim, sem ele dá tudo errado .
Será que tem alguma maneira de converter isso e retirar um SUM porém tendo o mesmo retorno ?
-
13 minutos atrás, Motta disse:SELECT * FROM( select LPAD(C.MES_COMPETENCIA,2,'0') ||'/'||C.ANO_COMPETENCIA AS PROJETO, E.DS_EQUIPE as EQUIPE, SUM(NVL((CC.QT_HORAS_CHEIA - SUM(AU.DT_FIM - AU.DT_INI)*24 ),CC.QT_HORAS_CHEIA)) as "ESFORÇO CALCULADO" from EQUIPE E, COLABORADOR C1, COMPETENCIA C, COMPETENCIA_COLABORADOR CC, AUSENCIAS AU where E.CD_EQUIPE=CC.CD_EQUIPE and C.CD_COMPETENCIA=CC.CD_COMPETENCIA and C1.CD_COLABORADOR=CC.CD_COLABORADOR and C1.STATUS = 1 AND C1.CD_GESTOR <> C1.CD_COLABORADOR AND AU.CD_COLABORADOR (+) = C1.CD_COLABORADOR GROUP BY CC.QT_HORAS_CHEIA,U.DT_FIM,AU.DT_INI,E.DS_EQUIPE, LPAD(C.MES_COMPETENCIA,2,'0') ||'/'||C.ANO_COMPETENCIA ) VT WHERE VT.PROJETO = ((select to_char(sysdate, 'MM') from dual)||'/'||(select to_char(sysdate, 'RRRR') from dual))
Continua o mesmo erro , mesmo incluindo o AU.DT_FIM e DT_INI no group by..
-
continua com o mesmo erro
-
Boa tarde pessoal,
Sei que tem varios tópicos sobre esse erro, porém analisei todos e nenhum foi aplicável ao meu caso ( a maioria era porquê o pessoal esquecia do Group By ao final das Querys) .
Se alguém puder ajudar, agradeço . Os campos sem função estão inseridos no group by, porém o erro persiste .
SELECT * FROM( select LPAD(C.MES_COMPETENCIA,2,'0') ||'/'||C.ANO_COMPETENCIA AS PROJETO, E.DS_EQUIPE as EQUIPE, SUM(NVL((CC.QT_HORAS_CHEIA - SUM(AU.DT_FIM - AU.DT_INI)*24 ),CC.QT_HORAS_CHEIA)) as "ESFORÇO CALCULADO" from EQUIPE E, COLABORADOR C1, COMPETENCIA C, COMPETENCIA_COLABORADOR CC, AUSENCIAS AU where E.CD_EQUIPE=CC.CD_EQUIPE and C.CD_COMPETENCIA=CC.CD_COMPETENCIA and C1.CD_COLABORADOR=CC.CD_COLABORADOR and C1.STATUS = 1 AND C1.CD_GESTOR <> C1.CD_COLABORADOR AND AU.CD_COLABORADOR (+) = C1.CD_COLABORADOR GROUP BY E.DS_EQUIPE, LPAD(C.MES_COMPETENCIA,2,'0') ||'/'||C.ANO_COMPETENCIA ) VT WHERE VT.PROJETO = ((select to_char(sysdate, 'MM') from dual)||'/'||(select to_char(sysdate, 'RRRR') from dual))
-
vou testar aqui, obrigado pela ajuda Motta !
-
Script com retorno de dias uteis no mês ( desconsiderando finais de semana e feriados também ( os mesmos cadastrados em uma tabela )), ajuda!
Boa tarde,
alguém poderia me ajudar , tentei com alguns que vi pela net , fazendo alterações mas não consegui o que gostaria ainda. Preciso de um script que dado um valor (mês/ano) ele retorne a quantidade de dias uteis nesse mês, desconsiderando os sabados e domingos e os feriados listados na tabela de feriados, em Oracle Sql puro ou PL/SQL . Agradeço pela ajuda!
Erro no APEX_APPLICATION.G_F01 - ORACLE APEX
em Oracle
Postado
Estou com um problema com esse esse script abaixo:
tenho um checkbox na minha página ( não em relatório, na página mesmo, um item de página) e gostaria que o mesmo ao ser clicado e pressionado um botão submit realizasse o procedimento do script, porém ele faz o processo mas não me retorna nada. acredito que o problema seja no LOOP do APEX_APPLICATION.G_F01 . Alguém consegue me ajudar com isso?