none
Trabalhando com Datas - Montando Diário de Classe RRS feed

  • Pergunta

  • Olá pessoal,

    Tenho a seguinte tabela MATRICULAFREQUENCIA:

    COLUNA TIPO TAM OBRIG DESCRIÇÃO
    ID int 10,0 True ID da Frequência/Nota
    MATRICULAID int 10,0 True ID da matrícula
    EDITALITEMID int 10,0 True ID do Edital
    PESSOAID int 10,0 True ID da Pessoa
    AVALIACAOID int 10,0 True ID do Tipo de Avaliação
    DTFREQUENCIA date   True Data da Frequência
    VALOR numeric 12,4   Dependendo do Tipo de Avaliação ste campo receberá a nota ou receberá 1 para presença ou 0 para falta
    USUCRIACAO int 10,0 True Usuário de Criação
    DTCRIACAO date   True Data de Criação
    USUALTERACAO int 10,0   Usuário de Alteração
    DTALTERACAO date     Data de Alteração


    O que preciso fazer é, de acordo com o tipo de avaliação, exibir os dias da semana no mês, ou seja, preciso que meus dados retornem da seguinte forma:

    MATRÍCULA NOME DO ALUNO SEG TER QUA QUI SEX SÁB SEG TER QUA QUI SEX SÁB FREQ
    4 5 6 7 8 9 11 12 13 14 15 16
    2021010045 Raimundo Nonato P P P P P P P P P P P P 100%
    2021010046 Rolando Lero P F F P P F P P F F F P 50%

    Primeiro, quero identificar os nomes dos dias da semana (linha amarela), em seguida, o dia exato dessa semana (linha verde). A primeira coisa que pensei seria fazer um union entre as linhas coloridas (primeiro select) e as linhas brancas (segundo select que contêm os nomes dos alunos e suas respectivas frequências, matrículas e total da frequência). Mas, como montá-los com esta visão? Bom, sei que isso é uma coisa de louco e talvez não tenha como fazê-la em SQL mas preciso fazer isso de alguma forma para exibir numa página web (ASPX) e num relatório (FastReport). Alguém teria uma sugestão de como posso fazer isso?

    Grato,

    Ilano.

    domingo, 27 de dezembro de 2020 18:38

Todas as Respostas

  • ilanocf,

    Vamos por partes, em relação aos dias da semana e seus respectivos nomes podemos começar solucionando este cenário fazendo uso das função DatePart() e DateName(), inclusive tem um post recente no meu blog que trata justamente estes dois cenários:

    Acesse: É Pá e Bola com o SQL Server – ④ | Junior Galvão – MVP – Data Platform (wordpress.com)

    Em relação as demais necessidades, vamos ter que analisar um pouco mais, na questão da frequência com base na coluna Valor, podemos fazer uso do operador lógico condicional Case, para que possamos aplicar a análise e trocar os valores 1 para P e 0 para F.

    O cálculo percentual da frequência também é possível implementarmos fazendo o contagem do total da quantidade de aulas possíveis para identificar seus respectivos percentuais... Até este ponto tudo bem, o que começa a se tornar um pouco complexo é justamente você estabelecer este "histórico" de frequência no formato horizontal como você esta querendo.

    Existe algum calendário ou tabela que contenha a relação das respectivas datas de aula?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    segunda-feira, 28 de dezembro de 2020 18:47
  • Feliz Ano Novo a todos do fórum! Vamos torcer para que 2021 nos traga tudo o que 2020 não nos trouxe e agradecer a Deus que tenhamos chegado até aqui com saúde e nossos familiares bem também pois, infelizmente, a gente sabe que isso não foi um privilégio de todos, então temos que agradecer mesmo por isso e pedir a Deus que conforte aqueles que perdeam seus entes queridos e aqueles que estão enfermos ou passando por dificuldades, que eles possam encontrar o caminho para o sucesso.

    Bom, voltando ao nosso problema, antes de tudo, quero te agradecer pela atenção Júnior Galvão. E sim, tenho uma tabela de calendário para cada filial a ser cadastrada:

      COLUNA TIPO TAM OBRIG. AUTOINC COMENTÁRIO
    PK ID int 10,0 True False  
    FK FILIALID int 10,0 True False  
      DTCALENDARIO date   True False  
      TIPO int 10,0 True False 0=Dia Letivo; 1 = Feriado Nacional; 2 = Feriado Estadual; 3 = Feriado Municipal; 4 = Ponto Facultativo
      HABILITAR int 10,0 True False  
      COMENTARIO text 2147483647 False False  

    sábado, 2 de janeiro de 2021 11:27
  • ilanocf,

    Obrigado por suas palavras, o ano de 2020 foi de muita luta e aprendizado, não podemos deixar de ver o que ele nos trouxe de sabedoria.

    Em relação a sua dúvida, vamos por partes.

    Você tem uma tabela calendário para cada filial, isso é um ponto importante na modelagem, vou deixar algumas perguntas:

    1 - Este calendário e gerado sempre no início do ano ou semestral?

    2 - Existe uma tabela definida como diário de classe para cada disciplina?

    3 - Como estão definidos os relacionamentos entre Disciplinas, Semestres, Turmas e Alunos?



    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 6 de janeiro de 2021 11:26
  • Olá Júnor Galvão,

    Desculpe a demora na resposta mas você sabe como está nossa missão nesses períodos de pandemia. Bom, retomando nosso post...

    1 - Este calendário e gerado sempre no início do ano ou semestral?

    Na verdade estes cursos são de curta duração, 2 semanas pra ser exato. Assim, já crio o calendário do ano inteiro e ele vai traer numa listbox as datas dento do especificado no edital de inscrição.

    2 - Existe uma tabela definida como diário de classe para cada disciplina?

    Não, não foi criada esta tabela. Criei apenas uma tabela que é alimentada de uma vez só assim que o professor abre a turma. Desta forma, já tenho todas as datas para estes alunos restanto ao professor apenas realizar a frequência deles.

    3 - Como estão definidos os relacionamentos entre Disciplinas, Semestres, Turmas e Alunos?

    Bom, como são cursos de rápida duração, não temos disciplinas, apenas cursos e eles são informados numa tabela chamada EDITALITENS, já que a tabela EDITAL apenas informa as datas de início e término das inscrições e temos, em média, 5 cursos sendo ofertados em diferentes horários e, geralmente, em turma única. Daí, quando o candidato se inscreve ele já é jogado numa outra tabela NSCRICAO vinculando seu código de pessoa e item do edital pra, só ao final da inscrição ou, em alguns casos, após o preenchimento de vagas, estes candidatos se tornarem alunos baseando na ordem de inscrição deles. E aí, quando o professor abrir a turma, já são jogados para a tabela MATRÍCULA e as datas para a tabela FREQUENCIA onde cada aluno matriculado terá suas datas para a realização da frequência pelo professor. A coisa é bem simples, não temos notas apenas frequência. Embora haja um projeto em que precisaremos atribuir notas mas isso será bem mais frente e serão pouquíssimos cursos. Mas já estou pensando em uma nova estratégia para estes alunos que deverá seguir os mesmos padrões apenas definindo o tipo de lançamento (Nota ou Frequência) mas também serão cursos mais tranquilos, nada de muito complexo como escolas ou faculdades.

    Bom, espero ter sido claro e mais uma vez me desculpe a demora em responder.

    Muito obrigado pela atenção.

    sábado, 13 de fevereiro de 2021 12:43
  • ilanocf,

    Meu amigo da forma que você esta descrevendo o seu cenário, olha a coisa é bem "chatinha" de ser colocado em prática.

    De alguma maneira temos a questão do Aluno que realiza a inscrição, e esta sempre como forma de controle?

    O aluno se matricula em um curso, e de que forma este curso esta estruturado para definir o conteúdo?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    segunda-feira, 15 de fevereiro de 2021 16:25
  • Pois é meu amigo, é bastante chata mesmo.

    De alguma maneira temos a questão do Aluno que realiza a inscrição, e esta sempre como forma de controle?

    É, o aluno faz a inscrição mas a matrícula ocorre dentro do número de vagas. Caso ocorroa desistência dentro de 2 dias, já que o curso é só de 2 semanas, este aluno é cancelado e matriculado um reserva. Mas isto já está resolvido. Logo quando o professor abre a turma dele vem a lista dos alunos matriculados e os reservas assim, quando ele cancelar alguém poderá matricular automaticamente um reserva. Os reservas só poderão ser matriculados se houver desistência ou se houver vaga.

    O aluno se matricula em um curso, e de que forma este curso esta estruturado para definir o conteúdo?

    Tudo fica especificado em edital. Quando é criado um edital já ficam vinculados curso, turno, turma, ... Dentro dos cursos ficam registrados os conteúdos. Mas estes conteúdos são apenas os conteúdos programáticos. Agora, se você se refere aos conteúdos executados pelo professor em sala não, isso não acontece. O que é uma facilidade nesse processo.

    Então, esse processo do diário seria mesmo só para controlar faltas e presenças, nada mais. 
    • Editado ilanocf terça-feira, 16 de fevereiro de 2021 18:05
    terça-feira, 16 de fevereiro de 2021 18:02
  • ilanocf,

    Na verdade as minhas perguntas estão justamente direcionadas a questão dos dados no Banco de Dados ou até mesmo um Sistema que você utiliza para este tipo de controle.

    Você utiliza algo neste momento?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 17 de fevereiro de 2021 20:53
  • Ah, entendi. Por enquanto tudo o que tenho é o seguinte, criei os tipos de avaliações que vão desde frequência a notas. Sei que disse que não haveria notas mas já estão discutindo cursos como Libras e nele não será avaliado apenas frequência mas fluência, configuração das mãos, expressão facial e corpórea, ... Então já vamos ter outras situações aí, dependendo do curso. Até o momento, o que estou fazendo é o seguinte:

    1. Cadastro do Calendário Letivo de todo o ano. O sistema já faz a montagem do calendário do ano inteiro inserindo seus respectivos feriados Nacionais e Estaduais, ficando os feriados Municipais para serem definidos pelos próprios municípios;

    2. Após a matrícula dos alunos, o professor monta sua turma baseada no calendário letivo. Sendo assim, o sistema já lança para cada aluno as datas do calendário de acordo com o período de duração dos cursos. O professor seleciona uma data do ComboBox  e o tipo de avaliação (no caso só temos frequência) e é listado todos os alunos daquela data para que ele faça a frequência. Pronto, isso é tudo o que tenho até agora.

    CALENDÁRIO
      COLUNA TIPO TAM OBRIG. AUTOINC
      6 COMENTARIO text 2147483647 False False
      3 DTCALENDARIO date   True False
      2 FILIALID int 10,0 True False
      5 HABILITAR int 10,0 True False
    PK 1 ID int 10,0 True False
      4 TIPO int 10,0 True False

     

    MATRICULA
      COLUNA TIPO TAM OBRIG. AUTOINC
      7 CANCELADO int 10,0 False False
      6 CONCLUIDO int 10,0 True False
      12 DTALTERACAO datetime   False False
      10 DTCRIACAO datetime   False False
      3 EDITALITEMID int 10,0 True False
      5 FREQUENCIA int 10,0 False False
    PK 1 ID int 10,0 True False
      2 INSCRICAOID int 10,0 True False
      8 MOTIVOID int 10,0 False False
      4 PESSOAID int 10,0 True False
      13 SITUACAO int 10,0 False False
      11 USUARIOIDALTERACAO int 10,0 False False
      9 USUARIOIDCRIACAO int 10,0 False False

     

    FREQUENCIA
      COLUNA TIPO TAM OBRIG. AUTOINC
      5 AVALIACAOID int 10,0 True False
      11 DTALTERACAO date   False False
      9 DTCRIACAO date   True False
      6 DTFREQUENCIA date   True False
      3 EDITALITEMID int 10,0 True False
    PK 1 ID int 10,0 True False
      2 MATRICULAID int 10,0 True False
      4 PESSOAID int 10,0 True False
      10 USUALTERACAO int 10,0 False False
      8 USUCRIACAO int 10,0 True False
      7 VALOR numeric 12,4 False False

    Já minha página ASPX está sendo representada como no formulário abaixo. Após selecionar as opções nos selects é exibida a grid contendo os nomes dos alunos com seus respectivos códigos de matrícula e frequência. Deixei estas colunas visíveis para que fique mais fácil para identificarmos os registros caso ocorra algum problema. Por padrão, todos os alunos já recebem presença, somente quando o professor selecionar algum na coluna FALTAS é que será computado como falta. A última coluna FREQ trará, em percentuais, a frequência deste aluno no curso.

    Tipo de Avaliação:
    <select><option value="FREQ">Frequência</option>
    <option value="NOTA">Nota</option>
    </select>
    Data:
    <select><option value="25/01/2021">25/01/2021</option> <option value="26/01/2021">26/01/2021</option> <option value="27/01/2021">27/01/2021</option> <option value="28/01/2021">28/01/2021</option> </select>
    ITEM IDMAT IDFREQ NOME DO ALUNO FALTAS DATA FREQ
    1 20 1 2021010045 - Raimundo Nonato <input type="checkbox" /> 25/01/2021 0,00 
    2 21 2 2021010046 - Rolando Lero <input type="checkbox" /> 25/01/2021 6,67 
    3 22 3 2021010047 - Dona Catifundia <input type="checkbox" /> 25/01/2021 6,67 
    4 23 4 2021010048 - Seu Boneco <input type="checkbox" /> 25/01/2021 6,67 

    A questão agora é saber como reproduzir tudo isso no relatório Diário de Classe como o mostrado no início do post. E, agora com estes novos cursos, se este modelo poderá ser usado para os outros tipos de lançamentos, estou levando fé que sim, pois quando informar o tipo de avaliação será exibido na coluna FALTAS um campo para lançar a nota.

    Não sei se consegui responder a tudo, mas este é o meu cenário atual.


    • Editado ilanocf sexta-feira, 19 de fevereiro de 2021 11:15
    sexta-feira, 19 de fevereiro de 2021 11:12
  • ilanocf,

    Certo, certo, já ajudou bastante.

    Vamos aos poucos....

    Um ponto que eu acredito que poderá lhe ajudar muito seria tentar adicionar ao seu Calendário, outras colunas como Dia, DiaDaSemana, NumeroDaSemana, Mes, NumeroDoMes.... Enfim, tornar justamente esta tabela calendário algo mais repleto de dados que poderão lhe ajudar no momento para montar o diário.

    Depois podemos justamente utilizar uma CTE para estabelecer alguns dados importantes, para compor o calendário, veja o exemplo abaixo:

    -- Declarando as variáveis utilizadas como parâmetros de Entrada de Valores --
    Declare @Mes TinyInt, @Ano SmallInt, @DataInicial Date
    
    -- Atribuindo os valores para as respectivas variáveis --
    Select @DataInicial = '2021-05-01', @Mes = Month(@DataInicial), @Ano=Year(@DataInicial)
    
    -- Definindo a CTE Recursiva CTECalendarioMensal -- Utilizada para gerar o calendário de datas de acordo com o mês e ano --
    ;With CTECalendarioMensal (DataCorrente) 
    As
    (
      Select DateAdd(Year, @Ano - 1900, DateAdd(Month, @Mes - 1, 0))
      Union All
      Select DataCorrente+1 From CTECalendarioMensal
      Where Month(DataCorrente + 1) = @Mes
    )
    
    -- Definindo a CTEDiasDaSemana -- Utilizada para definir de acordo com o dia da semana os devidos dias --
    ,CTEDiasDaSemana ([Segunda],[Terca],[Quarta],[Quinta],[Sexta], NomeDoMes)
    As
    (
    Select [2] As 'Segunda', 
               [3] As 'Terca', [4] As 'Quarta',
               [5] As 'Quinta',[6] As 'Sexta',
    		   NomeDoMes
    From (
    
    -- Identificando o Dia, Dia da Semana, Número da Semana no Mes e o Nome do Mês --
              Select Day(DataCorrente) As Dia, 
    		             DatePart(WeekDay, DataCorrente) As DiaDaSemana, 
    					 DatePart(Week, DataCorrente) As NumeroDaSemanaNoMes,
    					 DateName(Month,@DataInicial) As NomeDoMes
              From CTECalendarioMensal
             ) As Datas
    Pivot (Max(Dia) For DiaDaSemana In ([2], [3], [4], [5], [6])) As P) -- Estabelecendo o Pivot, transformando os dias da semana em colunas --
    Select * From CTEDiasDaSemana
    Go
    

    No que você apresentou sobre a parte HTML e ASPX, eu não me arrisco nesta parte (kkkkkk)....


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    sexta-feira, 19 de fevereiro de 2021 11:24
  • Não, no momento não.
    sexta-feira, 19 de fevereiro de 2021 14:19
  • Olá!

    Estreando por aqui.

    O que torna este problema complexo são justamente as linhas amarela e verde da tabela, porque têm que apresentar os campos na horizontal, ao passo que os demais campos são apresentados na vertical; problemas como este costumam admitir múltiplas soluções de ordem programáticas.
    Pelo que entendi o curso em questão tem duração de 2 semanas, que podem ser agendadas com antecedência, sendo assim, eu sugiro uma "InsertQuery" que além dos campos de dados do aluno inserisse também os seguintes campos:  

    Seg, Ter, Qua, Qui, Sex, Sab, Seg1, Ter1, Qua1, Qui1, Sex1, Sab1.

    Usando o comando "Date.Day" e mais os respectivos "TextBox" se poderia combinar os dias do mês com os respectivos dias da semana na inserção.

    Ao terminar a inserção dos alunos tabela ficaria mais ou menos assim: 


    MATRÍCULA NOME DO ALUNO SEG TER QUA QUI SEX SÁB SEG TER QUA QUI SEX SÁB FREQ
                               Fevereiro/2021     4 5 6 7 8 9 11 12 13 14 15 16 
    2021010045 Raimundo Nonato 4 5 6 7 8 9 11 12 13 14 15 16 100%
    2021010046 Rolando Lero          4 5 6 7 8 9 11 12 13 14 15 16 50%

    Sendo que na inserção da primeira linha, no campo "NOME DO ALUNO" em vez de inserir o nome do aluno, inserir o nome do mês.
    Depois usando um "GridView" ajuste o "setindex" para a "linha 1" e selecione uma cor para a mesma, bem como uma cor para o "Header".
    Depois o professor registraria a presença do aluno atualizando o "GridView" com "P" ou "F" no lugar dos números, e a tabela ficaria conforme abaixo:

    MATRÍCULA NOME DO ALUNO SEG TER QUA QUI SEX SÁB SEG TER QUA QUI SEX SÁB FREQ
                              Fevereiro/2021         4   5 6 7 8 9 11 12 13 14 15 16      
    2021010045 Raimundo Nonato   P P P P 8 9 11 12 13 14 15 16 100%
    2021010046 Rolando Lero           P P F F 8 9 11 12 13 14 15 16 50%

    Penso que a parte mais difícil seria desenvolver um programa para a atualização do "GridView".

    Espero ter ajudado.

    Saudações. 

    sábado, 20 de fevereiro de 2021 18:14