Duvida de DashBoards!

Oracle Business Intelligence, Oracle Warehouse Builder OWB, Oracle Discoverer, BI Publisher, XML Publisher, OLAP, Data Mining, ODI Oracle Data Integrator, etc
Responder
Avatar do usuário
tiagodutra
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Qua, 19 Jan 2011 2:50 pm
Localização: Novo Hamburgo - RS
Tiago

Boa tarde galera,

Estou com um problema e não consegui achar uma função para resolve-lo, vamos ao exemplo pra vocês entenderem meu problema, tenho operadoras de tele aqui na empresa e uso o BI para exibir o progresso do trabalho delas numero total de contatos, contatos com sucesso sem sucesso, tentativas de ligações registradas e assim vai, mas agora a gerente quer saber a média diária de contatos com sucesso de cada uma das operadoras, ai o meu problema na Coluna total de contatos com sucesso eu uso o seguinte comando para chegar ao número;

FILTER("- Fato Contatos de CRM"."Quantidade" USING ("- Fato Contatos de CRM"."Status do Contato" = 'Finalizado' AND "- Fato Contatos de CRM"."Data de Finalização" BETWEEN @{DATA_INICIAL}{'01/07/2011'} AND @{DATA_FINAL}{'31/07/2011'}))

Agora no meu entender seria somente dividir esse número pelo número de dias úteis do período em questão mas não achei nada parecido no help do OBIEE o mais perto disso foi assim;

FILTER("- Fato Contatos de CRM"."Quantidade" USING ("- Fato Contatos de CRM"."Status do Contato" = 'Finalizado' AND "- Fato Contatos de CRM"."Data de Finalização" BETWEEN @{DATA_INICIAL}{'01/07/2011'} AND @{DATA_FINAL}{'31/07/2011'}))/ DAYOFMONTH(@{DATA_FINAL}{'31/07/2011'})

Mas fazendo isso ele divide o total pelo número do dia atual o que não é o correto, pois elas não fizeram ligações nos sábados e domingos.

Se alguém puder me dar uma dica fico muito agradecido.
:shock:
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Tiago,

Não sou especialista em OBIEE, mas notei que existe uma função DAYOFWEEK, que indica o dia da semana.

Para sabados e domingos, esta função adota os valores 1 e 7. Talvez você possa alterar as fórmular de seu DASHBOARD, para não computar os fins de semana.

O código abaixo provavelmente está incorreto. Mesmo que funcione, creio que ainda não computaria o que deseja, mas seria mais para você ter uma idéia do uso desta função.

Selecionar tudo

FILTER("- Fato Contatos de CRM"."Quantidade" USING ("- Fato Contatos de CRM"."Status do Contato" = 'Finalizado' AND "- Fato Contatos de CRM"."Data de Finalização" BETWEEN @{DATA_INICIAL}{'01/07/2011'} AND @{DATA_FINAL}{'31/07/2011'}  AND DAYOFWEEK("- Fato Contatos de CRM"."Data de Finalização" NOT IN (1,7)))
Ou talvez:
- você pudesse criar uma função para computar os dias úteis entre dois períodos
- você pudesse criar uma tabela de datas úteis (exceto sábados, domingos ou feriados).

Espero que consiga uma solução para o tema. Não se esqueça de postar a mesma por aqui.

Me desculpe não poder ajudar mais você sobre este tema.

Abraços,

Sergio Coutinho
Avatar do usuário
tiagodutra
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Qua, 19 Jan 2011 2:50 pm
Localização: Novo Hamburgo - RS
Tiago

Bom dia!!!

Sergio valeu pela força meu, mas não teve jeito não ... o velho e bom PL-SQL teve que trabalhar pra resolver o problema - hehehehehe - criei uma PROCEDURE que calcula os dias utéis e uma Function que chama essa procedure dentro do Warehouse para levar em uma DWD um campo dias utéis antes dessa data, o código ficou mais ou menos assim;

PROCEDURE:

CREATE OR REPLACE PROCEDURE P_DIAS_UTEIS
(P_DATA IN DATE,
P_DIAS_UTEIS IN OUT NUMBER, P_DIAS_UTEIS_ANTES IN OUT NUMBER,
P_DIAS_UTEIS_DEPOIS IN OUT NUMBER) IS
CONTADOR NUMBER(5) := 0;
CONTADOR2 NUMBER(5) := 0;
DIA_CORRENTE DATE;
DATA_INICIAL DATE;
DATA_FINAL DATE;
DATA_FERIADO2 DATE;
CURSOR LE_FERIADO IS
SELECT DATA_FERIADO
FROM FERIADO
WHERE TRUNC(DATA_FERIADO) = TRUNC(DIA_CORRENTE);
BEGIN
DATA_INICIAL := P_DATA;
DATA_FINAL := LAST_DAY(DATA_INICIAL);
DIA_CORRENTE := TO_DATE('01'||TO_CHAR(DATA_INICIAL,'MMYYYY'),'DDMMYYYY');
LOOP
IF TO_NUMBER(TO_CHAR(DIA_CORRENTE,'D')) IN (2,3,4,5,6) THEN
OPEN LE_FERIADO;
FETCH LE_FERIADO INTO DATA_FERIADO2;
IF LE_FERIADO%NOTFOUND THEN
CONTADOR := CONTADOR + 1;
IF TRUNC(DIA_CORRENTE) <= TRUNC(DATA_INICIAL) THEN
CONTADOR2 := CONTADOR2 + 1;
END IF;
END IF;
CLOSE LE_FERIADO;
END IF;
IF TRUNC(DIA_CORRENTE) = TRUNC(DATA_FINAL) THEN
EXIT;
END IF;
DIA_CORRENTE := DIA_CORRENTE + 1;
END LOOP;
P_DIAS_UTEIS := CONTADOR; -- DIAS UTEIS
P_DIAS_UTEIS_ANTES := CONTADOR2; -- DIAS UTEIS ATÉ A DATA
P_DIAS_UTEIS_DEPOIS := CONTADOR - CONTADOR2; -- DIAS UTEIS APÓS A DATA
END;


FUNCTION:

create or replace function f_dias_uteis (p_data in date, p_tipo in number) return number is
v_dias number(2);
v_dias_antes number(2);
v_dias_depois number(2);
begin
--
-- p_tipo
-- 1= Dias uteis do mês
-- 2= Dias uteis do mês antes da data
-- 3= Dias uteis do mês depois da data
--
p_dias_uteis(p_data,v_dias,v_dias_antes,v_dias_depois);

if p_tipo = 1 then
return(nvl(v_dias,0));
elsif p_tipo = 2 then
return(nvl(v_dias_antes,0));
elsif p_tipo = 3 then
return(nvl(v_dias_depois,0));
else
return(null);
end if;
end;


Assim consegui levar os campos dias uteis dpois dessa data e antes dessa data para o BI e utiliza-los para Calcular a quantidade de contatos por dia como eu queria no OBIEE o Código ficou esse;

FILTER("- Fato Contatos de CRM"."Quantidade" USING ("- Fato Contatos de CRM"."Status do Contato" = 'Finalizado' AND "- Fato Contatos de CRM"."Data de Finalização" BETWEEN @{DATA_INICIAL}{'01/07/2011'} AND @{DATA_FINAL}{'31/07/2011'}))/ "- Dimensão Tempo"."Dias Úteis Antes desta Data"


Assim ficou certinho espero ter respondido a altura e agradeço muito a atenção de todos e espero ter ajudado alguém com a dica e se alguém ai souber um meio mais fácil ou correto de fazer esse cálculo por favor não se contenha publique :D

Valeu a força Sérgio
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 3 visitantes