Viniciusr9
Members-
Total de itens
20 -
Registro em
-
Última visita
Tudo que Viniciusr9 postou
-
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? DECLARE V_DS_COLAB VARCHAR2(50); BEGIN APEX_DEBUG.MESSAGE('CHECK:'|| vCHECK); FOR A IN 1 .. APEX_APPLICATION.G_F01.COUNT LOOP BEGIN SELECT C.DS_COLABORADOR INTO V_DS_COLAB FROM COLABORADOR C WHERE C.USER_APEX = V('APP_USER') ; EXCEPTION WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR(-20001,'NENHUM REGISTRO ENCONTRADO!'); WHEN TOO_MANY_ROWS THEN RAISE_APPLICATION_ERROR(-20002,'MAIS QUE UM REGISTRO ENCONTRADO!'); WHEN OTHERS THEN RAISE_APPLICATION_ERROR(-20003,'ERRO NAO PREVISTO' || SQLERRM) ; END; :P12_SUPER := (V_DS_COLAB || ' - ' || TO_CHAR(SYSDATE,'DD/MM/RRRR HH24:MI')); UPDATE COMPETENCIA_COLABORADOR CC SET FINALIZADO_SN = 'S' WHERE CC.CD_EQUIPE = :P12_EQUIPE AND CC.CD_COMPETENCIA = (SELECT C.CD_COMPETENCIA FROM COMPETENCIA C WHERE TO_DATE(LPAD(C.MES_COMPETENCIA,2,'0') || '/' || C.ANO_COMPETENCIA,'MM/RRRR') = TO_DATE(:P12_COMPETENCIA,'MM/RRRR')); END LOOP; END;
-
Pelo título do tópico acho que não Motta kk
- 5 respostas
-
- java
- algorithms
-
(e mais 1 )
Tags:
-
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.
-
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;
-
Teste: qual universidade você deveria mentir no CV?
Viniciusr9 respondeu ao tópico de Motta em Boteco iMasters
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 ).
-
[Resolvido] ORA-00937: Não é uma função de grupo de grupo simples
Viniciusr9 postou um tópico no fórum Oracle
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)) -
[Resolvido] ORA-00937: Não é uma função de grupo de grupo simples
Viniciusr9 respondeu ao tópico de Viniciusr9 em Oracle
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 ! -
[Resolvido] ORA-00937: Não é uma função de grupo de grupo simples
Viniciusr9 respondeu ao tópico de Viniciusr9 em Oracle
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)) -
[Resolvido] ORA-00937: Não é uma função de grupo de grupo simples
Viniciusr9 respondeu ao tópico de Viniciusr9 em Oracle
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 ? -
[Resolvido] ORA-00937: Não é uma função de grupo de grupo simples
Viniciusr9 respondeu ao tópico de Viniciusr9 em Oracle
Continua o mesmo erro , mesmo incluindo o AU.DT_FIM e DT_INI no group by.. -
[Resolvido] ORA-00937: Não é uma função de grupo de grupo simples
Viniciusr9 respondeu ao tópico de Viniciusr9 em Oracle
continua com o mesmo erro -
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!
-
vou testar aqui, obrigado pela ajuda Motta !