sexta-feira, 7 de fevereiro de 2014

CEP - Controle Estatístico de Processos


"O Controle Estatístico de Processos (CEP) é uma ferramenta da qualidade utilizada nos processos produtivos (e de serviços) com objetivo de fornecer informações para um diagnóstico mais eficaz na prevenção e detecção de defeitos/problemas nos processos avaliados e, consequentemente, auxilia no aumento da produtividade/resultados da empresa, evitando desperdícios de matéria-prima, insumos, produtos, etc. Posteriormente o CEP trará menos re-trabalho aproveitando melhor os recursos disponíveis e o bem estar dos funcionários que passarão a trabalhar melhor e com metas específicas para cada área, podendo assim implantar outros programas como o plano de remuneração variável (PRV). Estes recursos podem ser usados tanto numa grande empresa como na mais simples delas, tendo como característica comum o uso de uma ferramenta gráfica e pessoas capacitadas para analisar criticamente os resultados obtidos para implementarem as melhorias possíveis."


http://pt.wikipedia.org/wiki/Controle_estat%C3%ADstico_de_processos

BLOG do CEP
Last Update 
Iniciado 06/05/2009 09:48
Refazendo versão 2.0 11/02/2014


INTERFACE DO SISTEMA

                                                                                                                               

             
INTERFACE DO SISTEMA

No menu principal do SGM, incluir um módulo denominado “CEP” com subtítulo “Controle Estatístico de Processo”. Esse módulo deve ser incluído logo abaixo do módulo “Documentos”, e deve conter os seguintes itens:

CEP OK
Controle Estatístico de Processo OK
  • Consultas de Processos OK
    • Listagem de Processos OK
  • Consultas de Estudos OK
    • Listagem de Estudos OK
  • Consultas de Modelos de Variáveis
    • Listagem de Modelos de Variáveis OK

Listagem “Processos”:
  • Filtros
    • Identificação OK
    • Descrição OK
    • Situação (combobox): “Em elaboração”, “Em execução”, “Concluído” OK
  • Colunas
    • Identificação OK
    • Descrição OK
    • Situação OK
  • Tela de edição
    • Identificação OK
    • Descrição OK
    • Situação: combobox com as opções “Em elaboração”, “Em execução”, “Concluído”OK
    • Aba “Estudos” com as seguintes colunas: Os estudos do processo não estão sendo listados nessa listagem embutida.
      • Identificação OK
      • Descrição OK
      • Situação OK
      • Início OK
      • Término OK
    • Aba “Diário do processo” com as seguintes colunas:
      • Data A tela de edição deve exibir a data e hora, sugerindo a data/hora atual (now) mas permitindo ao usuário alterar o valor se desejar. A maneira como está agora não permite fazer isso poiso valor da hora não é visível na tela de edição.
      • Ocorrência OK
      • Ações tomadas OK
      • Usuário OK

Listagem “Estudos”:
  • Filtros
    • Identificação OK
    • Descrição OK
    • Situação (combobox): “Em elaboração”, “Em execução”, “Concluído” OK
    • Processo OK
  • Colunas
    • Identificação OK
    • Descrição OK
    • Situação OK
    • Início OK
    • Término OK
  • Tela de edição
    • Processo: campo cepProcesso.Identificacao, em modo RO (Read Only) OK
    • Identificação OK
    • Descrição OK
    • Início OK
    • Término OK
    • Situação: combobox com as opções “Em elaboração”, “Em execução”, “Concluído”. OK
    • Aba “Variáveis” com as seguintes colunas (listagem embutida da tabela cepVariavelEstudo linkada com cepVariavel em alguns campos): OK
      • Identificação OK
      • Modelo de variável OK
      • Situação OK
      • Entrada de dados OK
      • Prefixo OK
      • Unidade OK
      • Modelo OK
      • Faixa OK
      • Valor analisado (CodTipoVariavel) OK
      • Ponto (cepVariavelEstudo.ValorPonto) OK
    • Aba “Diário do estudo” com as seguintes colunas: OK
      • Data A tela de edição deve exibir a data e hora, sugerindo a data/hora atual (now) mas permitindo ao usuário alterar o valor se desejar. A maneira como está agora não permite fazer isso pois o valor da hora não é visível na tela de edição.
      • Ocorrência OK
      • Ações tomadas OK
      • Usuário OK

Listagem “Modelos de variáveis”:
  • Filtros
    • Nome OK
    • Entrada de dados OK
    • Unidade OK
    • Modelo OK
    • Valor analisado OK
  • Colunas OK
    • Nome OK
    • Entrada de dados OK
    • Prefixo OK
    • Unidade OK
    • Modelo OK
    • Faixa OK
    • Valor analisado OK
  • Tela de edição
    • Nome OK
    • Entrada de dados OK
    • Tipo calibração: somente disponível para Entrada de dados = Calibrações.
    • Modelo: somente disponível para Entrada de dados = Calibrações. OK
    • Faixa: somente disponível para Entrada de dados = Calibrações. OK
    • Valor ponto: somente disponível para Entrada de dados = Calibrações. OK
    • Valor analisado: somente disponível para Entrada de dados = Calibrações. OK
    • Prefixo: somente editável para Entrada de dados = Manual. Quando a entrada de dados for “Calibrações”, deve ser read-only e preenchido automaticamente com o prefixo da faixa do modelo escolhida. OK
    • Unidade: somente editável para Entrada de dados = Manual. Quando a entrada de dados for “Calibrações”, deve ser read-only e preenchido automaticamente com a unidade da faixa do modelo escolhida. OK



Tela de edição da “Variável do estudo”: Não estou mais conseguindo cadastrar nenhuma variável, pois esse campo está sempre bloqueado no modo de inclusão. Parece que ao invés de bloquear a situação você bloqueou o modelo de variável (opssss). Dessa forma, não consegui testar algumas coisas...
  • Processo (Read Only) OK
  • Estudo (Read Only) OK
  • Identificação Está permitindo criar duas variáveis com a mesma identificação no mesmo estudo. Acho que você ainda não criou a constraint na base, certo? Não consegui testar novamente pois não consigo criar uma nova variável. Vc está atualizada
  • Modelo de variável (combobox) Tá travado na inclusão e não deveria.
  • Situação (combobox): “Em elaboração”, “Em estabilização”, “Em supervisão”, “Concluído”. Não consigo gravar a situação, pois qualquer valor que seja selecionado é “apagado” ao gravar o registro. Agora está destravado mas deveria estar travado na inclusão. Não consigo testar o que acontece após gravar pq o campo do modelo da variável está travado.
  • Entrada de dados (Read Only) OK
  • Instrumento associado: se a entrada de dados for manual, permitir cadastrar qualquer instrumento. Se a entrada for através de calibração, somente devem estar disponíveis instrumentos do mesmo modelo da variável. OK
  • Ponto: somente disponível para Entrada de dados = Calibrações. Nesse caso, o campo deve ser automaticamente preenchido com o valor do campo “cepVariavel.ValorPonto”, mas o usuário pode editar o campo se desejar (o valor inicial é apenas sugerido). OK
  • Tamanho subgrupo (n) OK
  • Limite superior (LSE) OK
  • Valor alvo OK
  • Limite inferior (LIE) OK
  • Campo “SubgruposSemMedicoes” do tipo checkbox com a legenda:
[ ] Subgrupos sem medições (considerar cada valor importado como
a média do subgrupo e utilizar a incerteza como desvio padrão).
      O seu valor “default” deve ser FALSO, e deve ficar visível (ou habilitado) somente quando AMBAS as condições abaixo forem satisfeitas:
    • A entrada de dados for DIFERENTE DE “Manual”.
AND
    • cepVariavelEstudo.n > 1.
  • Período medição subgrupo OK
  • Tipo período medição OK
  • Qtd. Subgrupos calculados OK
  • ABA “Valores calculados”: Contém os registros da tabela cepHistoricoVariavelEstudo. Não deve permitir a inclusão manual de registros nessa aba, e deve conter a seguintes colunas: Ao abrir a tela de um registro, essa aba está mostrando o conteúdo da aba “Duração do estudo” (e esta aba fica vazia). Caso o usuário saia da aba “Valores calculados” e volte para ela o seu conteúdo é exibido corretamente. O mesmo ocorreu para outras abas, ou seja, ao entrar em modo de edição as abas ficam “malucas”, mas após navegar para outra aba o comportamento é normalizado. BUG !
    • Data/hora: Campo “DataHora” em ordem decrescente. OK
    • Descrição OK
    • Usuário OK
  • ABA “Subgrupos”: Contém todos os subgrupos da respectiva variável do estudo. Não deve permitir a inclusão manual de novos registros caso a entrada de dados seja diferente de “Manual”, e deve exibir a seguintes colunas:Está ocorrendo um erro ao tentar incluir um subgrupo em uma variável “Manual” (Sintaxe incorreta próxima a '=').
    • Data/hora: Campo “DataHora” em ordem crescente. Está em ordem decrescente.
    • Média (X_bar) OK
    • Amplitude (R) OK
    • Desvio padrão (s) OK
    • Amplitude móvel (mR) OK
    • Situação OK
  • ABA “Critérios cálculo limites de controle”: Os campos dessa aba não estão mais fazendo efeito no cálculo.
    • Qtde. últimos dias a considerar: Campo “QtdDiasLC”. OK
    • Qtde. últimos subgrupos a considerar: Campo “QtdSubGruposLC”. OK
  • ABA “Critérios de análise”: Utilizada para implementar as regras de detecção de pontos fora de controle (Western Electric Company – WECO Rules). Para isso, deve-se criar a tabela cepCriteriosWECO contendo 8 campos: Criterio1 a Criterio8. Nesta aba deve-se exibir estes 8 campos no formato “checkbox” com as seguintes legendas:
o        Critério 1: 1 ponto além de 3 sigma. (campo com valor default = true) OK
o        Critério 2: 8 pontos sucessivos no mesmo lado da linha média. OK
o        Critério 3: 6 pontos sucessivos em tendência de subida ou descida. OK
o        Critério 4: 14 pontos sucessivos alternando subida e descida. OK
o        Critério 5: 2 de 3 pontos sucessivos além de 2 sigma. OK
o        Critério 6: 4 de 5 pontos sucessivos além de 1 sigma. OK
o        Critério 7: 15 pontos sucessivos dentro de 1 sigma. OK
o        Critério 8: 8 pontos sucessivos fora de 1 sigma. OK
  • ABA “Duração do estudo”: Deve conter a seguintes colunas: Testar esses campos na entrada manual de dados.
    • Data inicial estudo: Campo "DataHoraInicial". OK
    • Data final estudo: Campo "DataHoraFinal". OK
    • Limite subgrupos estudo: Campo "QtdeMaxSubGrupos". Esse campo não está fazendo efeito na rotina de importação dos dados.
  • ABA “Diário de bordo” na tela de edição da variável do estudo, onde os usuários poderão inserir informações a respeito de fatos que ocorreram no processo. Essa aba deve conter as seguintes colunas:
    • Data A tela de edição deve exibir a data e hora, sugerindo a data/hora atual (now) mas permitindo ao usuário alterar o valor se desejar. A maneira como está agora não permite fazer isso pois o valor da hora não é visível na tela de edição.
    • Ocorrência OK
    • Ações tomadas OK
    • Usuário OK
  • BOTÕES:
    • “Calcular Limites de Controle”: Esse botão deve recalcular todos os valores da variável que são gravados na tabela “cepHistoricoVariavelEstudo”, e incluir um registro nessa tabela com a data atual. Para o cálculo dos valores deverão ser utilizados somente os subgrupos que atenderem aos critérios gravados nos campos QtdDiasLC (quantos dias recentes considerar) e QtdSubGruposLC (quantos últimos subgrupos considerar). Não permitir o cálculo caso a quantidade de subgrupos considerados (k) seja inferior a 2.
    • “Gráficos de Controle”: Esse botão deve abrir a tela com os filtros para a geração dos gráficos disponíveis para a respectiva variável.
    • “Importar novas medições”: Este botão deve ser exibido somente nas variáveis cuja entrada de dados seja diferente de “Manual”, e dispara a importação dos valores das novas calibrações que ainda não foram importadas para o módulo CEP. Caso a entrada de dados seja através de calibrações e o tamanho do subgrupo (n) seja maior do que 1, cada subgrupo deve ser criado a partir a partir de n calibrações. Cada medição do subgrupo terá registrado o código da calibração que a originou, e a data da medição será igual à data da calibração. O subgrupo formado por n medições oriundas de calibrações receberá a data da calibração mais recente (a que “fechou” o subgrupo).
  • Existe uma listagem de variáveis do estudo (http://localhost/metroval/Listador.aspx?entidade=cepVariavelEstudo&consulta) cuja coluna “Identificação” está vazia, e portanto não consigo acessar nenhum registro pois o link não está disponível nessa primeira coluna.




Tela de edição do Subgrupo:
  • Campos: Data/hora, Média, Amplitude, Desvio padrão, Amplitude móvel, Situação e Tamanho (esse é o campo “TamanhoSubgrupo” que vem read-only da tabela cepVariavelEstudo, e portanto não deve ser um campo da tabela cepSubGrupo, já que todos os subgrupos da mesma variável terão o mesmo tamanho). Deve-se também incluir um campo check-box com a descrição “Não considerar nos cálculos”, que deve ser read-only e seu conteúdo será alterado somente através do botão descrito adiante neste item (o default deste campo é “desmarcado” ao criar um registro de subgrupo).
    • O campo “Tamanho subgrupo” está vazio ao inserir um novo subgrupo. Não consegui testar novamente pois não consigo inserir um novo subgrupo.
    • Após gravar um subgrupo, o botão “Gravar” permanece habilitado. Não consegui testar novamente pois não consigo inserir um novo subgrupo.
  • Botão para “Calcular subgrupo”. Este botão (re)calculará todos os valores do subgrupo a partir das leituras informadas, mas antes fará uma validação para identificar se existem as n medições do subgrupo na base de dados (se as medições não estiverem “completas”, ele não recalcula). Esse botão não está fazendo a validação correta dos dados do subgrupo antes de tentar efetuar os cálculos, além de realizar a mesma operação 2 vezes.
  • Botão “Excluir/incluir subgrupo dos cálculos”. Este botão deve exibir uma interface para que o usuário registro um comentário sobre o motivo da ação executada, e essa informação deve ser registrada na aba “Histórico” do subgrupo, detalhada no item “e” abaixo. Além disso, deve-se alterar o conteúdo do campo “Não considerar nos cálculos” de acordo com a ação executada. O label deste botão deve ser alterado de acordo com o conteúdo do campo “Não considerar nos cálculos”, pois se este campo estiver “marcado” o label deve ser “Incluir subgrupo dos cálculos”, e se estiver “desmarcado” (situação default ao criar um subgrupo) o label deve ser “Excluir subgrupo dos cálculos”. Ao excluir ou incluir um subgrupo, NÃO RECALCULAR os valores da Variável do Estudo (grande média, amplitude média, desvio padrão médio, etc), pois eles são recalculados somente quando os limites de controle são recalculados. Esse botão não está gerando nenhum registro na aba “Histórico subgrupo”. Se for complicado mostrar a tela para o usuário registrar o motivo, pode gravar o registro sem esse campo preenchido e o usuário edita e altera depois. Além disso, após executar a ação desse botão é interessante dar um refresh automático na tela pois o checkbox não está sendo atualizado automaticamente.
  • As situações possíveis para um subgrupo são: “Não calculado” (default na inclusão), “Calculado” e “Não considerado”. Após clicar no botão “Excluir subgrupo dos cálculos”, a situação do subgrupo deve ser “Não considerado”. Após clicar no botão “Incluir subgrupo dos cálculos”, a situação do subgrupo deve ser “Calculado”.
  • Aba “Medições”: Essa aba deverá conter todas as medições do subgrupo em uma listagem embutida com as seguintes colunas: Ordem, Valor e Data/hora. Acho que é melhor alterar a ordem das colunas (colocar a Data/hora primeiro) e ordenar em ordem crescente de data/hora.
  • Aba “Histórico”: Essa aba deverá conter uma listagem embutida dos registros de histórico de inclusão/exclusão do subgrupo nos cálculos, com as seguintes colunas: Data (ordem DESC), Ação (Inclusão ou Exclusão), Usuário e Comentário. Não deve ser permitida a inclusão de registros nessa aba (todos serão incluídos automaticamente pelo botão “Excluir/incluir subgrupo dos cálculos”).

Tela de edição da “Medição”:  
  • Data/hora
  • Valor

Tela de edição de “Valores calculados” (tabela cepHistoricoVariavelEstudo): Como o usuário vai fazer se desejar excluir um históric de cálculo da variável?
  • Data/hora OK
  • Descrição OK Seria interessante permitir a edição somente deste campo, mas pode ficar para depois.
  • Usuário OK
  • Qtde. últimos dias considerados: Campo “QtdDiasLC” OK
  • Qtde. subgrupos considerados: Campo “QtdSubGruposLC” OK
  • ABA “Média e Desvio Padrão”:
    • Limite superior (X_bar): LSC_X_bar_s
    • Linha média (X_bar): X_bar_bar
    • Limite inferior (X_bar): LIC_X_bar_s
    • Limite superior (s): LSC _s
    • Linha média (s): s_bar
    • Limite inferior (s): LIC _s
  • ABA “Média e Amplitude”:
    • Limite superior (X_bar): LSC_X_bar_R acho que o campo da base tá incorreto, pois o valor está igual ao da aba referente ao desvio padrão.
    • Linha média (X_bar ): X_bar_bar
    • Limite inferior (X_bar): LIC_X_bar_R acho que o campo da base tá incorreto, pois o valor está igual ao da aba referente ao desvio padrão.
    • Limite superior (R): LSC _R
    • Linha média (R): R_bar Falta um espaço entre o parêntesis e a palavra “média”.
    • Limite inferior (R): LIC _R
  • ABA “Indivíduos e Amplitude Móvel”:
    • Limite superior (X): LSC _X
    • Linha média (X): X_bar_bar
    • Limite inferior (X): LIC _X
    • Limite superior (mR): LSC _mR
    • Linha média (mR): mR_bar
    • Limite inferior (mR): LIC _mR
  • ABA “Índices de capacidade”:
    • Sigma estimado: sigma_estimado
    • Sigma calculado: sigma_calculado
    • Cp
    • Cpk
    • Cpm
    • Pp
    • Ppk


1.       IMPORTAÇÃO DADOS CALIBRAÇÕES

  • Após importar dados para uma variável, o primeiro subgrupo fica com a amplitude móvel nula, o que está correto. No entanto, caso sejam importados subgrupos “anteriores” ao primeiro subgrupo que já havia sido importado, o cálculo da amplitude móvel não é revisto e fica nulo em dois subgrupos. Veja a imagem abaixo: eu havia importado somente sugrupos dos dias 1/04 e 2/04, e por isso o subgrupo de 1/04 ficou sem mR. Feito isso, mudei a “faixa” de tempo a considerar no estudo para iniciar no dia 31/03 e reimportei os dados. Veio o subgrupo do dia 31/03, mas o valor de mR do subgrupo de 1/04 não foi calculado.



  • Criei uma variável com entrada de dados via calibração e n = 5. Após importar os dados das calibrações, os subgrupos foram criados porém nenhuma medição aparece na tela de edição do subgrupo (na aba “Medições”).



2.       CÁLCULOS SUBGRUPO E VARIÁVEL ESTUDO

  • A verificação da quantidade mínima de subgrupos (mínimo k = 2) estava funcionando e parece que não está mais. Agora você pode preencher o valor “1” (um) nos dois campos da aba “Critérios cálculo subgrupos” e o cálculo ocorre da mesma forma.
  • Ao calcular os limites de controle de uma variável, o resultado é que são adicionados 2 registros na tabela cepHistoricoVariavelEstudo (o cálculo está sendo feito 2 vezes).
  • Ao calcular os limites de controle de uma variável onde não foi possível obter no mínimo 2 subgrupos, a mensagem abaixo foi exibida. Corrigir o texto para: “Não é possível calcular os Limites de Controle para esta variável, pois é necessário um mínimo de 2 subgrupos.”.


  • Ao tentar calcular um subgrupo sem medições, obtive a mensagem abaixo. Deve-se melhorar esta mensagem para que fique da seguinte forma: “Quantidade  insuficiente de medições: tamanho subgrupo = nn, medições atuais = xx.”
  • Ainda sobre a mensagem abaixo, o subgrupo não possuía nenhuma medição (SubgruposSemMedicao = True), então porquê a mensagem indicou que o subgrupo possuía 1 medição?



  • A variável “Importar – MultiCalibrador” possui 2 conjuntos de valores de LC calculados, e em cada um deles consta a descrição “Calculo efetuado automatícamente pelo sistema”. Como essa descrição foi inserida? Quando é que algum cálculo de LC’s é feito automaticamente? O certo não seria pedir para o usuário inserir um comentário ao calcular os LC’s? BUG DO FRAMEWORK.
  • Seria interessante se os valores fossem exibidos na tela com somente 2 algarismos significativos (o que é diferente de 2 casas decimais), mas internamente no banco de dados fossem mantidos com todas as casas decimais disponíveis.

3.       Incluir o campo “CodigoReferencia” na tabela cepSubgrupo, para ser utilizado no caso onde o campo SubgrupoSemMedicoes = TRUE.

4.       Não permitir que os usuários criem consultas personalizadas.

5.       Melhoria sugerida para o futuro: criar um cadastro para regras personalizadas pelo usuário, conforme a tela de exemplo apresentada a seguir.




6.       Implementar controle de acesso para o módulo CEP. No cadastro de privilégios do AutoLab Windows, incluir um novo grupo denominado “CEP”. Dentro desse grupo, criar os seguintes privilégios configuráveis:
  • Acessar módulo CEP
  • Incluir processos
  • Alterar processos
  • Excluir processos
  • Incluir estudos
  • Alterar estudos
  • Excluir estudos
  • Incluir variáveis do estudo
  • Alterar variáveis do estudo
  • Excluir variáveis do estudo
  • Calcular limites de controle da variável do estudo
  • Visualizar gráficos de controle da variável do estudo
  • Incluir subgrupos
  • Alterar subgrupos
  • Excluir subgrupos
  • Calcular subgrupos
  • Incluir medições
  • Alterar medições
  • Excluir medições
  • Incluir modelos de variável
  • Alterar modelos de variável
  • Excluir modelos de variável

Não sei exatamente se isso está funcionando pois não sei quais privilégios você concedeu ao grupo do usuário “Paco”. Na tela de edição por exemplo, não consigo mais visualizar a aba “Medições”, mas não sei se está certo ou é um bug pois preciso ver quais permissões o grupo “Metrologia” possui. Sendo assim, acho que a única forma de eu testar isso rapidamente seria sincronizar os arquivos em meu computador e efetuar os testes localmente. Quando poderei sincronizar para realizar estes testes?

7.       Implementar os controles necessários para limitação da inclusão de subgrupos em uma variável de acordo com os limites estabelecidos na aba “Duração do estudo” da tela de edição da variável do estudo (data inicial e final ou limite de subgrupos analisados).

8.       Implementar controles para impedir que sejam cadastradas mais do que “n” leituras em um subgrupo.

9.       A exclusão de todos os registros deve funcionar em cascata (processos, estudos, variáveis do estudo, etc).


Fórmulas para cálculo do subgrupo (tabela cepSubgrupo):

>> Campo “cepSubgrupo.X_bar”:
  • IF cepVariavelEstudo.SubgruposSemMedicoes = TRUE: 
  • IF cepVariavelEstudo.SubgruposSemMedicoes = FALSE: 
Onde:
Xi = cepMedicaoSubgrupo.X
n = cepVariavelEstudo.n


>> Campo “cepSubgrupo.R”:
  • IF n > 1 AND cepVariavelEstudo.SubgruposSemMedicoes = FALSE: 
  • IF n = 1 OR cepVariavelEstudo.SubgruposSemMedicoes = TRUE: 
Onde:
X = cepMedicaoSubgrupo.X (varrer todos os registros da tabela cepMedicaoSubgrupo associados ao respectivo subgrupo sendo calculado, para encontrar o máximo e o mínimo).
n = cepVariavelEstudo.n

>> Campo “cepSubgrupo.s”:
  • IF cepVariavelEstudo.SubgruposSemMedicoes = TRUE: 
  • IF n > 1 AND cepVariavelEstudo.SubgruposSemMedicoes = FALSE: 
  • IF n = 1: 
Onde:
Xi = cepMedicaoSubgrupo.X
cepSubgrupo.X_bar
n = cepVariavelEstudo.n

>> Campo “cepSubgrupo.mR”:
  • IF n = 1: 
  • IF n > 1: 
Onde:
 = cepSubgrupo.mR do subgrupo atual.
 = cepSubgrupo.X_bar do subgrupo atual.
 = cepSubgrupo.X_bar do subgrupo imediatamente anterior.


Fórmulas para cálculo dos campos da tabela cepHistoricoVariavelEstudo (histórico da variável do estudo). A variável “k” corresponde à quantidade de subgrupos utilizados no cálculo, que é definida pelos campos “QtdDiasLC” (quantos dias recentes considerar) e “QtdSubGruposLC” (quantos últimos subgrupos considerar) da tabela cepVariavelEstudo:





>> Campo “X_bar_bar”:
Onde:
 = cepSubgrupo.X_bar.
k = quantidade de subgrupos utilizados no cálculo.

>> Campo “R_bar”:
Onde:
cepSubgrupo.R.
k = quantidade de subgrupos utilizados no cálculo.

>> Campo “mR_bar”:
Onde:
cepSubgrupo.mR.
k = quantidade de subgrupos utilizados no cálculo.

>> Campo “s_bar”:
Onde:
cepSubgrupo.s.
k = quantidade de subgrupos utilizados no cálculo.

>> Campo “LIC_X”:
  • IF n = 1:  
  • IF n > 1: 
Onde:
cepHistoricoVariavelEstudo.X_bar_bar.
 = cepHistoricoVariavelEstudo.mR_bar.
n = cepVariavelEstudo.n

>> Campo “LSC_X”:
  • IF n = 1:
  • IF n > 1: 
Onde:
cepHistoricoVariavelEstudo.X_bar_bar.
 = cepHistoricoVariavelEstudo.mR_bar.
n = cepVariavelEstudo.n


>> Campo “LIC_X_bar_R”:
  • IF n = 1:
  • IF 1 < n <= MAX(cepConstantesEstatisticas.n):
  • IF n > MAX(cepConstantesEstatisticas.n):
Onde:
cepHistoricoVariavelEstudo.X_bar_bar.
cepConstantesEstatisticas.UC_A2 WHERE cepConstantesEstatisticas.n = cepVariavelEstudo.n.
 = cepHistoricoVariavelEstudo.R_bar.
n = cepVariavelEstudo.n

>> Campo “LSC_X_bar_R”:
  • IF n = 1:
IF 1 < n <= MAX(cepConstantesEstatisticas.n):
  • IF n > MAX(cepConstantesEstatisticas.n):
Onde:
cepHistoricoVariavelEstudo.X_bar_bar.
cepConstantesEstatisticas.UC_A2 WHERE cepConstantesEstatisticas.n = cepVariavelEstudo.n.
 = cepHistoricoVariavelEstudo.R_bar.
n = cepVariavelEstudo.n

>> Campo “LIC_X_bar_s”:
  • IF n = 1:
  • IF 1 < n <= MAX(cepConstantesEstatisticas.n):
  • IF n > MAX(cepConstantesEstatisticas.n): 
Onde:
cepHistoricoVariavelEstudo.X_bar_bar.
cepConstantesEstatisticas.UC_A3 WHERE cepConstantesEstatisticas.n = cepVariavelEstudo.n.
 = Deve ser calculado através das 2 fórmulas abaixo:
 = cepHistoricoVariavelEstudo.s_bar.
n = cepVariavelEstudo.n

>> Campo “LSC_X_bar_s”:
  • IF n = 1:
  • IF 1 < n <= MAX(cepConstantesEstatisticas.n):
  • IF n > MAX(cepConstantesEstatisticas.n): 
Onde:
cepHistoricoVariavelEstudo.X_bar_bar.
cepConstantesEstatisticas.UC_A3 WHERE cepConstantesEstatisticas.n = cepVariavelEstudo.n.
 = Deve ser calculado através das 2 fórmulas abaixo:
 = cepHistoricoVariavelEstudo.s_bar.
n = cepVariavelEstudo.n

>> Campo “LIC_R”:
  • IF n = 1:
  • IF 1 < n <= MAX(cepConstantesEstatisticas.n):
  • IF n > MAX(cepConstantesEstatisticas.n): 
Onde:
cepConstantesEstatisticas.UC_D3 WHERE cepConstantesEstatisticas.n = cepVariavelEstudo.n.
 = cepHistoricoVariavelEstudo.R_bar.
n = cepVariavelEstudo.n

>> Campo “LSC_R”:
  • IF n = 1: 
  • IF 1 < n <= MAX(cepConstantesEstatisticas.n):
  • IF n > MAX(cepConstantesEstatisticas.n): 
Onde:
cepConstantesEstatisticas.UC_D4 WHERE cepConstantesEstatisticas.n = cepVariavelEstudo.n.
 = cepHistoricoVariavelEstudo.R_bar.
n = cepVariavelEstudo.n

>> Campo “LIC_mR”:
  • IF n = 1:
  • IF n > 1:
Onde:
cepConstantesEstatisticas.UC_D3 WHERE cepConstantesEstatisticas.n = cepVariavelEstudo.n.
 = cepHistoricoVariavelEstudo.mR_bar.
n = cepVariavelEstudo.n

>> Campo “LSC_mR”:
  • IF n = 1:
  • IF n > 1:
Onde:
cepConstantesEstatisticas.UC_D4 WHERE cepConstantesEstatisticas.n = cepVariavelEstudo.n.
 = cepHistoricoVariavelEstudo.mR_bar.
n = cepVariavelEstudo.n

>> Campo “LIC_s”:
  • IF n = 1: 
  • IF 1 < n <= MAX(cepConstantesEstatisticas.n): 
  • IF n > MAX(cepConstantesEstatisticas.n): 
Onde:
cepConstantesEstatisticas.UC_B3 WHERE cepConstantesEstatisticas.n = cepVariavelEstudo.n.
 = Deve ser calculado através das 2 fórmulas abaixo:
 = cepHistoricoVariavelEstudo.s_bar.
n = cepVariavelEstudo.n

>> Campo “LSC_s”:
  • IF n = 1: 
  • IF 1 < n <= MAX(cepConstantesEstatisticas.n): 
  • IF n > MAX(cepConstantesEstatisticas.n): 
Onde:
cepConstantesEstatisticas.UC_B4 WHERE cepConstantesEstatisticas.n = cepVariavelEstudo.n.
 = Deve ser calculado através das 2 fórmulas abaixo:
 = cepHistoricoVariavelEstudo.s_bar.
n = cepVariavelEstudo.n

>> Campo “sigma_estimado”:
  • IF n = 1: 
  • IF 1 < n <= MAX(cepConstantesEstatisticas.n): 
  • IF n > MAX(cepConstantesEstatisticas.n): 
Onde:
 = cepHistoricoVariavelEstudo.s_bar.
cepConstantesEstatisticas.LC_c4 WHERE cepConstantesEstatisticas.n = cepVariavelEstudo.n.
, onde n = cepVariavelEstudo.n

>> Campo “sigma_calculado”:

  • IF cepVariavelEstudo.SubgruposSemMedicoes = TRUE:  = NULO
  • IF cepVariavelEstudo.SubgruposSemMedicoes = FALSE: 
Onde:
cepMedicaoSubgrupo.X
cepHistoricoVariavelEstudo.X_bar_bar
n = cepVariavelEstudo.n
k = quantidade de subgrupos utilizados no cálculo


>> Campo “Cp”:
  • IF n = 1:  = NULO
  • IF n > 1: 
Onde:
LSE = cepVariavelEstudo.LSE
LIE = cepVariavelEstudo.LIE
 = cepHistoricoVariavelEstudo.sigma_estimado

>> Campo “Cpk”:
  • IF n = 1:  = NULO
  • IF n > 1: 
Onde:
LSE = cepVariavelEstudo.LSE
LIE = cepVariavelEstudo.LIE
cepHistoricoVariavelEstudo.X_bar_bar
 = cepHistoricoVariavelEstudo.sigma_estimado

>> Campo “Cpm”:
  • IF n = 1:  = NULO
  • IF n > 1: 
Onde:
LSE = cepVariavelEstudo.LSE
LIE = cepVariavelEstudo.LIE
cepHistoricoVariavelEstudo.X_bar_bar
X_alvo = cepHistoricoVariavelEstudo.X_alvo
 = cepHistoricoVariavelEstudo.sigma_estimado

>> Campo “Pp”:
  • IF cepVariavelEstudo.SubgruposSemMedicoes = TRUE: Pp = NULO
  • IF cepVariavelEstudo.SubgruposSemMedicoes = FALSE: 
Onde:
LSE = cepVariavelEstudo.LSE
LIE = cepVariavelEstudo.LIE
 = cepHistoricoVariavelEstudo.sigma_calculado

>> Campo “Ppk”:
  • IF cepVariavelEstudo.SubgruposSemMedicoes = TRUE: Ppk = NULO
  • IF cepVariavelEstudo.SubgruposSemMedicoes = FALSE: 
Onde:
LSE = cepVariavelEstudo.LSE
LIE = cepVariavelEstudo.LIE
cepHistoricoVariavelEstudo.X_bar_bar
 = cepHistoricoVariavelEstudo.sigma_calculado

Constantes estatísticas

A tabela “cepConstantesEstatisticas” contém os fatores para o cálculo dos limites de controle para variáveis do estudo. Os campos que iniciam com “LC” são constantes em letra minúscula (Lower Case), e os que iniciam com “UC” são constantes em letra maiúscula (Upper Case).

n
LC_c4
LC_d2
UC_A2
UC_A3
UC_B3
UC_B4
UC_D3
UC_D4
1
NULO
NULO
NULO
NULO
NULO
NULO
0,000
3,267
2
0,7979
1,128
1,880
2,659
0,000
3,627
0,000
3,267
3
0,8862
1,693
1,023
1,954
0,000
2,568
0,000
2,575
4
0,9213
2,059
0,729
1,628
0,000
2,266
0,000
2,282
5
0,9400
2,326
0,577
1,427
0,000
2,089
0,000
2,115
6
0,9515
2,534
0,483
1,287
0,030
1,970
0,000
2,004
7
0,9594
2,704
0,419
1,182
0,118
1,882
0,076
1,924
8
0,9650
2,847
0,373
1,099
0,185
1,815
0,136
1,864
9
0,9693
2,970
0,337
1,032
0,239
1,761
0,184
1,816
10
0,9727
3,078
0,308
0,975
0,284
1,716
0,223
1,777
11
0,9754
3,173
0,285
0,927
0,321
1,679
0,256
1,744
12
0,9776
3,258
0,266
0,886
0,354
1,646
0,283
1,717
13
0,9794
3,336
0,249
0,850
0,382
1,618
0,307
1,693
14
0,9810
3,407
0,235
0,817
0,406
1,594
0,328
1,672
15
0,9823
3,472
0,223
0,789
0,428
1,572
0,347
1,653
16
0,9835
3,532
0,212
0,763
0,448
1,552
0,363
1,637
17
0,9845
3,588
0,203
0,739
0,466
1,534
0,378
1,622
18
0,9854
3,640
0,194
0,718
0,482
1,518
0,391
1,608
19
0,9862
3,689
0,187
0,698
0,497
1,503
0,403
1,597
20
0,9869
3,735
0,180
0,680
0,510
1,490
0,415
1,585
21
0,9876
3,778
0,173
0,663
0,523
1,477
0,425
1,575
22
0,9882
3,819
0,167
0,647
0,534
1,466
0,434
1,566
23
0,9887
3,858
0,162
0,633
0,545
1,455
0,443
1,557
24
0,9892
3,895
0,157
0,619
0,555
1,445
0,451
1,548
25
0,9896
3,931
0,153
0,606
0,565
1,435
0,459
1,541

Para variáveis com n > MAX(cepConstantesEstatisticas.n) são utilizadas as fórmulas abaixo, e nesse caso somente será possível gerar o gráfico “X_bar – s”:




Gráficos do sistema

Dei uma olhada rápida nos gráficos, e tenho alguns comentários iniciais:
  • Retirar a hora das datas que aparecem nos gráficos (filtros, legendas, tabela de valores, etc).
  • Tem como colocar atalho para calendário nos filtros por data?
  • Não está pré-filtrando ainda os tipos de gráfico disponíveis para a respectiva variável.


Interface:

O sistema deve possui uma interface que permita o usuário escolher qual gráfico deseja plotar para uma determinada Variável do Estudo. Os gráficos disponíveis para uma determinada variável devem ser pré-filtrados pelo sistema de acordo com o critério abaixo:

Gráfico
Valores necessários
Disponibilidade do gráfico de acordo com o tamanho do subgrupo
n = 1
1< n <= MAX(cepConstantesEstatisticas.n)
n > MAX(cepConstantesEstatisticas.n)
Valores Individuais e Amplitude Móvel (X - mR)
X\, X\\ e mR\ (para X), mR e mR\ (para mR)
OK


Média e Amplitude (X_bar - R)
X\, X\\ e R\ (para X\), R e R\ (para R)

OK (somente se SubgruposSemMedicoes = F)

Média e Desvio padrão (X_bar - s)
X\, X\\ e s\ (para X\), s, s\\ e X\\ (para s)

OK
OK

Nos nomes dos gráficos disponíveis no combobox, trocar “X\” por “X_bar”.

Filtros:

Todos os gráficos gerados devem permitir os seguintes filtros:

Data inicial [         ] (edit data com calendário)
Data final   [         ] (edit data com calendário)
Qtde últimos subgrupos a considerar: [        ] (edit)
Eixo horizontal [Data dos subgrupos] / [Número dos subgrupos] (combobox)         

Valores plotados nos gráficos:


Os gráficos devem ser construídos a partir de duas tabelas principais:
a)       cepSubgrupo: Fornece os valores dos pontos a serem plotados.
b)       cepHistoricoVariavelEstudo: Fornece os valores dos limites de controle e da linha média dos gráficos. Estes valores devem ser “combinados” com os valores dos pontos (cepSubgrupo) de acordo com a data de cada subgrupo (ponto) plotado no gráfico, ou seja, para cada ponto (tabela cepSubgrupo) deve-se buscar o valor dos limites de controle e da linha média (tabela cepHistoricoVariavelEstudo) vigentes na respectiva data.

Os gráficos não são plotados (o relatório fica vazio, apenas com o cabeçalho) caso nenhum limite de controle tenha sido calculado ainda para a variável.

Ao plotar os pontos da curva nos gráficos (valores da tabela cepSubgrupo), deve-se efetuar a análise do valor dos pontos com base nos critérios “ativados” para a variável do estudo (campos Criterio1 a Criterio8 da tabela cepVariavelEstudo). Os pontos que atenderem a pelo menos um critério “ativo” para a variável devem ser plotados em cor diferente (vermelho, por exemplo) de modo a destacar para o usuário.

O cabeçalho dos gráficos gerados deve conter as seguintes informações:
  • Processo
  • Estudo
  • Identificação Incluir este campo
  • Modelo de Variável (prefixo+unidade) Alterar o título deste campo
  • Data/hora emissão
  • Usuário

Incluir no final do texto de descrição do eixo Y um hífen seguido pelo prefixo e o símbolo da unidade da variável. Exemplo: “Média (X_bar) – kPa”.

Gráfico Valores Individuais e Amplitude Móvel (X – mR). Disponível somente para n = 1:

Para o gráfico Valores Individuais (X):
  • X = cepSubgrupo.X_bar
  • LM = cepHistoricoVariavelEstudo.X_bar_bar
  • LSC = cepHistoricoVariavelEstudo.LSC_X
  • LIC = cepHistoricoVariavelEstudo.LIC_X

Para o gráfico Amplitude Móvel (mR):
  • mR = cepSubgrupo.mR
  • LM = cepHistoricoVariavelEstudo.mR_bar
  • LSC = cepHistoricoVariavelEstudo.LSC_mR
  • LIC = cepHistoricoVariavelEstudo.LIC_mR


Gráfico Média e Amplitude (X_bar – R). Disponível somente para 1 < n <= MAX(cepConstantesEstatisticas.n) AND SubgruposSemMedicoes = FALSE:

Para o gráfico Média (X_bar):
  • X_bar = cepSubgrupo.X_bar
  • LM = cepHistoricoVariavelEstudo.X_bar_bar
  • LSC = cepHistoricoVariavelEstudo.LSC_X_bar_R
  • LIC = cepHistoricoVariavelEstudo.LIC_X_bar_R

Para o gráfico Amplitude (R):
  • R = cepSubgrupo.R
  • LM = cepHistoricoVariavelEstudo.R_bar
  • LSC = cepHistoricoVariavelEstudo.LSC_R
  • LIC = cepHistoricoVariavelEstudo.LIC_R



Gráfico Média e Desvio Padrão (X_bar – s). Disponível somente para n > 1:

Para o gráfico Média (X_bar):
  • X_bar = cepSubgrupo.X_bar
  • LM = cepHistoricoVariavelEstudo.X_bar_bar
  • LSC = cepHistoricoVariavelEstudo.LSC_X_bar_s
  • LIC = cepHistoricoVariavelEstudo.LIC_X_bar_s

Para o gráfico Desvio Padrão (s):
  • s = cepSubgrupo.s
  • LM = cepHistoricoVariavelEstudo.s_bar
  • LSC = cepHistoricoVariavelEstudo.LSC_s
  • LIC = cepHistoricoVariavelEstudo.LIC_s



ATENÇÃO: Quando o usuário selecionar a opção “Data dos subgrupos” no filtro “Eixo horizontal”, deve-se trazer a data dos subgrupos nas legendas do eixo horizontal, conforme o exemplo abaixo:





Abaixo deixo o exemplo da query de implementação em PS SQL, agora estou portando para Python...

set dateformat ymd;
/*
declare @qtdUltimosSubGruposConsiderar int
declare @codVariavelEstudo int
declare @dataInicialRelatorio datetime
declare @dataFinalRelatorio datetime
declare @tipoEixoHorizontal int
*/
declare @contadorDescida int
declare @anterior float
declare @count2 int
declare @max2 int
declare @valorAtual float
declare @contadorSubida int
declare @alternou int
declare @totalPontosSub int
/*
select @codVariavelEstudo = 13   
select @tipoEixoHorizontal = 1
*/

/*
select @codVariavelEstudo = 10
select @tipoEixoHorizontal = 1
*/

declare @max int
declare @count int
declare @totalPontos int
declare @totalPontosSelecionados int

declare @criterio1  bit --1 ponto além de 3 sigma.
declare @criterio2  bit --8 pontos sucessivos no mesmo lado da linha média.
declare @criterio3  bit --6 pontos sucessivos em tendência de subida ou descida.
declare @criterio4  bit --6 pontos sucessivos em tendência de subida ou descida.
declare @criterio5  bit --2 de 3 pontos sucessivos além de 2 sigma.
declare @criterio6  bit --4 de 5 pontos sucessivos além de 1 sigma.
declare @criterio7  bit --15 pontos sucessivos dentro de 1 sigma.
declare @criterio8  bit --8 pontos sucessivos fora de 1 sigma.

declare @descricaoEixoY varchar(50)

select @descricaoEixoY='Média (X_bar)'  /*1 - Altere aqui a descricao do Relatorio*/




declare @top int
select @top = isnull(@qtdUltimosSubGruposConsiderar,0)

declare @CodHistVariavelEstudoMin int
declare @dataMinima datetime
select @dataMinima=min(dataHora)   from cepHistoricoVariavelEstudo dataMin where dataMin.codVariavelEstudo=@codVariavelEstudo
select @CodHistVariavelEstudoMin = CodHistVariavelEstudo from cepHistoricoVariavelEstudo   cepHist where  cepHist.codVariavelEstudo=@codVariavelEstudo   and cepHist.DataHora =  @dataMinima




/*Passo 1 Cria a estrutura de controles*/

if(object_id('tempdb..#Intervalos')>0)
             drop table #Intervalos

create table #Intervalos
(
       id int identity(1,1),
       codHistVariavelEstudo int,
       DataHora datetime
)

insert #Intervalos(codHistVariavelEstudo,DataHora)
select hist.codHistVariavelEstudo,hist.dataHora
              from cepHistoricoVariavelEstudo hist
             where  hist.codVariavelEstudo = @codVariavelEstudo


if(object_id('tempdb..#Analise')>0)
             drop table #Analise


create table #Analise
(
       id int identity(1,1),
        CodSubGrupo int
       , DataHora datetime
       , EixoX varchar(50)
       ,LSC float
       ,areatop3  float
       ,areatop2  float
       ,areatop1  float
       ,area0     float
       ,areasub1  float
       ,areasub2  float
       ,areasub3  float
       ,LIC       float
       ,Valor     float
       ,criterio1 bit
       ,criterio2 bit
       ,criterio3 bit
       ,criterio4 bit
       ,criterio5 bit
       ,criterio6 bit
       ,criterio7 bit
       ,criterio8 bit
       ,DescricaoEixoX  varchar(50)
    ,DescricaoEixoY  varchar(50)
)

/*Passo 2 Insere os subGrupo para Analise*/

set rowcount @top
insert #Analise( CodSubGrupo
                           , DataHora
                           , EixoX
                           , LSC
                           , areatop3 
                           , areatop2 
                           , areatop1 
                           , area0    
                           , areasub1 
                           , areasub2 
                           , areasub3 
                           , LIC      
                           , Valor    
                           , DescricaoEixoX
                           , DescricaoEixoY
)
select
        CodSubGrupo
       , DataHora
       , EixoX
       ,LSC
       ,areatop3  = LM + (3 * ((LSC-LM)/3))
       ,areatop2  = LM + (2 * ((LSC-LM)/3))
       ,areatop1  = LM +    ((LSC-LM)/3)
       ,area0  = LM
       ,areasub1 = LM - ((LM-LIC)/3)
       ,areasub2 = LM - (2 * ((LM-LIC)/3))
       ,areasub3 = LM - (3 * ((LM-LIC)/3))
       ,LIC
       ,Valor = X
       , DescricaoEixoX  = CASE @tipoEixoHorizontal WHEN 1 THEN 'Subgrupos' WHEN 2 THEN 'Medições' END
    , DescricaoEixoY  = @descricaoEixoY              

 from (

select
             EixoX  = CASE @tipoEixoHorizontal
                                               WHEN 1 THEN convert(varchar(10),CodSubGrupo)
                                               WHEN 2 THEN convert(varchar(40),Relatorio.DataHora,20)
                           END
             ,  CodSubGrupo
             , DataHora = Relatorio.DataHora
             , X    = X
             , LM   =      X_bar_bar          /* 2 Altere aqui o valor do LM*/
             , LSC  =      LSC_X_bar_s               /* 3 Altere aqui o valor do LSC*/
             , LIC  =      LIC_X_bar_s               /*4 Altere aqui o valor do LIC*/
             from
(
       select
                     codSubGrupo               =      sub.CodSubGrupo
                    ,DataHora                         =      sub.DataHora
                    ,X                                      =      sub.X_bar           /*5.1 Altere aqui o valor do X*/
                    ,codHistVariavelEstudo     =      Relatorio2.codHistVariavelEstudo
                    from cepSubGrupo sub
                   
                left outer join (      
                           select hist.codHistVariavelEstudo,dataInicial = hist.dataHora ,dataFinal = dateadd(second,-1,isnull(hist2.dataHora,getdate()+365))
                           from #Intervalos hist                     left outer join #Intervalos hist2       on hist.id = hist2.id-1
                           ) as Relatorio2
                    on sub.dataHora between Relatorio2.dataInicial and Relatorio2.dataFinal
                   
                    where sub.CodSituacaoSubGrupo = 1 and sub.codVariavelEstudo=@codVariavelEstudo  

       union
       select
                     codSubGrupo               =      sub.CodSubGrupo
                    ,DataHora                         =      sub.DataHora
                    ,X                                      =      sub.X_bar                  /*5.2 Altere aqui o valor do X*/
                    ,codHistVariavelEstudo  = @CodHistVariavelEstudoMin
                    from cepSubGrupo sub
                    where sub.dataHora between isnull(@dataInicialRelatorio,'1900-01-01')  and dateadd(second,-1,@dataMinima)
                    and sub.CodSituacaoSubGrupo = 1 and sub.codVariavelEstudo=@codVariavelEstudo    

) as Relatorio
       inner join cepHistoricoVariavelEstudo hist2 on Relatorio.codHistVariavelEstudo = hist2.codHistVariavelEstudo
       and hist2.codVariavelEstudo = @codVariavelEstudo

) as RelatorioFinal
order by DataHora asc

/*Troca Visual troca o codigo do subgrupo pela sequencia de ID*/
update #Analise
       set EixoX=CASE @tipoEixoHorizontal WHEN 1 THEN  CONVERT(VARCHAR(50),ID) WHEN 2 THEN EixoX END

select
               @criterio1 = criterio1 
             , @criterio2 = criterio2 
             , @criterio3 = criterio3 
             , @criterio4 = criterio4 
             , @criterio5 = criterio5 
             , @criterio6 = criterio6 
             , @criterio7 = criterio7 
             , @criterio8 = criterio8
             from cepVariavelEstudo where codVariavelEstudo = @codVariavelEstudo

if(@criterio1=1)
begin
/* 1 ponto além de 3 sigma.*/
       update #Analise
       set criterio1=1
       where (Valor > areatop3)
       and areatop3 is not null

update #Analise
       set criterio1=1
       where (Valor<areasub3)
       and areasub3 is not null
      

end
if(@criterio2=1)
begin
/* 8 pontos sucessivos no mesmo lado da linha média.*/

       select @count = 1
       select @max = count(*) from #Analise

       select @totalPontos =  8
       set nocount on
       /*Varre os pontos verificando os pontos sucessivos*/
       while(@count<=@max)
       begin

          /*a) Critério Bilateral acima de LM*/
             select @totalPontosSelecionados=count(*) from #Analise a
             where id >=@count AND id <= (@totalPontos+@count-1)
             and Valor > area0 /*do mesmo lado da linha media*/

             if(@totalPontosSelecionados=@totalPontos)
             begin
                    update #Analise
                           set criterio2=1
                           where id >=@count AND id <= (@totalPontos+@count-1)
                           and Valor > area0 /*do mesmo lado da linha media*/

             end

         /*b) Critério Bilateral abaixo de LM*/
             select @totalPontosSelecionados=count(*) from #Analise a
             where id >=@count AND id <= (@totalPontos+@count-1)
             and Valor < area0 /*do mesmo lado da linha media*/

             if(@totalPontosSelecionados=@totalPontos)
             begin
                    update #Analise
                           set criterio2=1
                           where id >=@count AND id <= (@totalPontos+@count-1)
                           and Valor < area0 /*do mesmo lado da linha media*/

             end

             select @count=@count+1
       end

       select @criterio2=@criterio2
end
if(@criterio3=1)
begin
/* 6 pontos sucessivos em tendência de subida ou descida.*/

       select @count = 1
       select @max = count(*) from #Analise
       select @totalPontos =  6

       set nocount on
       /*Varre os pontos verificando os pontos sucessivos*/
       while(@count<=@max)
       begin

             select @totalPontosSelecionados=count(*) from #Analise a
             where id >=@count AND id <= (@totalPontos+@count-1)
             /*1) Existe a quantidade de pontos sucessivos*/
             if(@totalPontosSelecionados=@totalPontos)
             begin

                    select @count=@count+1
            
                    if(object_id('tempdb..#AnaliseCriterio6')>0)
                                  drop table #AnaliseCriterio6


                    create table #AnaliseCriterio6
                    (
                           id int identity(1,1),
                            valor float,
                            idAnalise int
                    )

                    insert #AnaliseCriterio6(valor,idAnalise)
                    select Valor,id from #Analise a
                           where id >=@count AND id <= (@totalPontos+@count-1)

            

                    /*2) Realiza a Analise da Tendencia de Subida*/

                           select @anterior=valor from #AnaliseCriterio6 where id=1
                           select @count2=2,@max2=count(*),@contadorSubida=1 from #AnaliseCriterio6


                           while(@count2<=@max2)
                           begin
                                 
                                  select @valorAtual=valor from #AnaliseCriterio6 where id=@count2
                                  if(@anterior<@valorAtual)
                                  begin
                                        select @contadorSubida=@contadorSubida+1
                                  end
                                  if(@anterior>@valorAtual)        
                                  begin
                                        select @contadorDescida=@contadorDescida+1
                                  end

                                  select @count2=@count2+1
                           end

                           if(@contadorSubida=@totalPontos or @contadorDescida=@totalPontos)
                           begin
                                 
                                  update #Analise
                                  set #Analise.criterio3=1
                                  from #AnaliseCriterio6
                                  where #Analise.id=#AnaliseCriterio6.idAnalise
                                 
                           end
            
             end
             select @count=@count+1
       end



end
if(@criterio4=1)
begin
/* 14 pontos sucessivos alternando subida e descida.*/

       select @alternou =0
       select @count = 1
       select @max = count(*) from #Analise
       select @totalPontos =  14

       set nocount on
       /*Varre os pontos verificando os pontos sucessivos*/
       while(@count<=@max)
       begin

             select @totalPontosSelecionados=count(*) from teste a
             where id >=@count AND id <= (@totalPontos+@count-1)
             /*1) Existe a quantidade de pontos sucessivos*/


             if(@totalPontosSelecionados=@totalPontos)
             begin

                    select @count=@count+1
            
                    if(object_id('tempdb..#AnaliseCriterio4')>0)
                                  drop table #AnaliseCriterio4


                    create table #AnaliseCriterio4
                    (
                           id int identity(1,1),
                            valor float,
                            idAnalise int
                    )

                    insert #AnaliseCriterio4(valor,idAnalise)
                    select Valor,id from teste a
                           where id >=@count AND id <= (@totalPontos+@count-1)


                    /*2) Critério 4: 14 pontos sucessivos alternando subida e descida.*/

                           select @anterior=valor from #AnaliseCriterio4 where id=1
                           select @count2=2,@max2=count(*),@contadorSubida=0,@contadorDescida=0,@alternou=0 from #AnaliseCriterio4


                           while(@count2<=@max2)
                           begin
                                 
                                  select @valorAtual=valor from #AnaliseCriterio4 where id=@count2
                                  if(@anterior<@valorAtual) --desceu
                                  begin
                                        select @contadorSubida=@contadorSubida+1
                                        if(@contadorDescida=0)
                                               select @alternou=@alternou+1
                                        select @contadorDescida=0
                                  end
                                  if(@anterior>@valorAtual) --desceu            
                                  begin
                                        if(@contadorSubida=0)
                                               select @alternou=@alternou+1
                                        select @contadorDescida=@contadorDescida+1
                                        select @contadorSubida = 0

                                  end

                                  select @count2=@count2+1
                           end

                           if(@alternou=(@totalPontos/2))
                           begin
                                 
                                 
                                  update #Analise
                                  set #Analise.criterio4=1
                                  from #AnaliseCriterio4
                                  where #Analise.id=#AnaliseCriterio4.idAnalise

                           end
            
             end
             select @count=@count+1
       end



       select @criterio4=@criterio4
end
if(@criterio5=1)
begin
/* 2 de 3 pontos sucessivos além de 2 sigma.*/
       select @count = 1
       select @max = count(*) from #Analise
       select @totalPontos =  3
       select @totalPontosSub =  2

       set nocount on
       /*Varre os pontos verificando os pontos sucessivos*/
       while(@count<=@max)
       begin

             select @totalPontosSelecionados=count(*) from #Analise a
             where id >=@count AND id <= (@totalPontos+@count-1)
             /*1) Existe a quantidade de pontos sucessivos*/


             if(@totalPontosSelecionados=@totalPontos)
             begin

                    select @count=@count+1
            
                    if(object_id('tempdb..#AnaliseCriterio5')>0)
                                  drop table #AnaliseCriterio5


                    create table #AnaliseCriterio5
                    (
                           id int identity(1,1),
                            valor float,
                            idAnalise int,
                            areatop2 int,
                            areasub2 int
                    )

                    /*2) Pegue 3 pontos sucessivos*/
                    insert #AnaliseCriterio5(valor,idAnalise,areatop2 ,areasub2 )
                    select Valor,id,areatop2, areasub2 from #Analise a
                           where id >=@count AND id <= (@totalPontos+@count-1)
                   
                    /*2) Critério 5: 2 de 3 pontos sucessivos além de 2 sigma*/

                    select @max2=count(*) from #AnaliseCriterio5
                    where (valor>areatop2 or valor < areasub2)
                    if(@max2>=@totalPontosSub)
                    begin

                           update #Analise
                           set #Analise.criterio5=1
                           from #AnaliseCriterio5
                           where #Analise.id=#AnaliseCriterio5.idAnalise
                           and (#AnaliseCriterio5.valor>#AnaliseCriterio5.areatop2 or #AnaliseCriterio5.valor < #AnaliseCriterio5.areasub2)
                    end
            
             end
             select @count=@count+1
       end
       select @criterio5=@criterio5
end
if(@criterio6=1)
begin

/* 4 de 5 pontos sucessivos além de 1 sigma.*/
       select @criterio6=@criterio6
    select @count = 1
       select @max = count(*) from #Analise
       select @totalPontos =  5
       select @totalPontosSub =  4

       set nocount on
       /*Varre os pontos verificando os pontos sucessivos*/
       while(@count<=@max)
       begin

             select @totalPontosSelecionados=count(*) from #Analise a
             where id >=@count AND id <= (@totalPontos+@count-1)
             /*1) Existe a quantidade de pontos sucessivos*/


             if(@totalPontosSelecionados=@totalPontos)
             begin

            
             select @max2=COUNT(*) from #Analise a
                           where id >=@count AND id <= (@totalPontos+@count-1)
                        and (valor>areatop1 or valor < areasub1)

                    if(@max2>=@totalPontosSub)
                    begin
                           update #Analise
                           set #Analise.criterio6=1
                           where id >=@count AND id <= (@totalPontos+@count-1)
            
                    end

                          
            
             end
             select @count=@count+1
       end



end

if(@criterio7=1)
begin

/* o   Critério 7: 15 pontos sucessivos dentro de 1 sigma. */
    select @count = 1
       select @max = count(*) from #Analise
       select @totalPontos =  15

       set nocount on
       /*Varre os pontos verificando os pontos sucessivos*/
       while(@count<=@max)
       begin

             select @totalPontosSelecionados=count(*) from #Analise a
             where id >=@count AND id <= (@totalPontos+@count-1)
             /*1) Existe a quantidade de pontos sucessivos*/


             if(@totalPontosSelecionados=@totalPontos)
             begin

            
             select @max2=COUNT(*) from #Analise a
                           where id >=@count AND id <= (@totalPontos+@count-1)
                        and (valor between area0 and areasub1) or  (valor between area0 and areatop1)

                    if(@max2>=@totalPontos)
                    begin
                           update #Analise
                           set #Analise.criterio7=1
                           where id >=@count AND id <= (@totalPontos+@count-1)
            
                    end

                          
            
             end
             select @count=@count+1
       end

end

if(@criterio8=1)
begin
/* o   Critério 8: 8 pontos sucessivos fora de 1 sigma. */
    select @count = 1
       select @max = count(*) from #Analise
       select @totalPontos =  8

       set nocount on
       /*Varre os pontos verificando os pontos sucessivos*/
       while(@count<=@max)
       begin

             select @totalPontosSelecionados=count(*) from #Analise a
             where id >=@count AND id <= (@totalPontos+@count-1)
             /*1) Existe a quantidade de pontos sucessivos*/


             if(@totalPontosSelecionados=@totalPontos)
             begin

            
                           select @max2=count(*) from #Analise a
                           where id >=@count AND id <= (@totalPontos+@count-1)
                        and (valor < areasub1) or  (valor > areatop1)

                    if(@max2>=@totalPontos)
                    begin
                           update #Analise
                           set #Analise.criterio8=1
                           where id >=@count AND id <= (@totalPontos+@count-1)
            
                    end

                          
            
             end
             select @count=@count+1
       end

end


select

                             CodSubGrupo
                           , DataHora = convert(varchar(50),DataHora,103)+' '+convert(varchar(50),DataHora,108) 
                           , EixoX
                           , LSC
                           , areatop3 
                           , areatop2 
                           , areatop1 
                           , area0    
                           , areasub1 
                           , areasub2 
                           , areasub3 
                           , LIC      
                           , Valor    
                           , DescricaoEixoX
                           , DescricaoEixoY
                           , CorPonto = case when
                           criterio1=1 or
                           criterio2=1 or  
                           criterio3=1 or  
                           criterio4=1 or  
                           criterio5=1 or  
                           criterio6=1 or  
                           criterio7=1 or  
                           criterio8=1   
                           then 'Red' else 'Green' end  
                    from #Analise

                    where  (DataHora between isnull(@dataInicialRelatorio,'1900-01-01') and isnull(@dataFinalRelatorio,'2999-01-01')       )


/* Fim da Query*/
Postar um comentário