Advertisement
Kimossab

[BD] Freq 2017

Jul 3rd, 2017
389
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 5.97 KB | None | 0 0
  1. /*p1-a*/
  2. INSERT INTO a_Prova (Ano_letivo, epoca, DATA, Periodo, NPrevistoAlunos, NDisc, Estado)  
  3. SELECT Ano_letivo, 'Normal', dateadd(DAY, 7, DATA), Periodo, NPrevistoAlunos-NAprovados, NDisc, 'Normal' FROM a_Prova
  4. WHERE Ano_letivo LIKE '2016/2017' AND epoca LIKE 'Freq'
  5.  
  6. /*p1-b*/
  7. SELECT Desginacao, Sigla FROM a_Disciplina
  8. INNER JOIN a_Prova ON a_Disciplina.NDisc = a_Prova.Ndisc
  9. INNER JOIN a_SalasProva ON a_Prova.NProva = a_SalasProva.NProva
  10. INNER JOIN a_Sala ON a_SalasProva.NSala = a_Sala.NSala
  11. GROUP BY a_Prova.Nprova, Desginacao, Sigla, a_Prova.NPrevistoAlunos
  12. HAVING SUM (capacidade ) < a_Prova.NPrevistoAlunos
  13.  
  14. /*p1-c*/
  15. /*listar os docentes candidatos (ou seja, disponiveis) para vigiar uma prova, a realizar no dia seguinte
  16. (a data corrente), no periodo da manha. deve ordenar tal lista, em ordem crescente, pelo numero total
  17. de vigilancias ja atribuidas ao docente.*/
  18. SELECT Nome FROM a_Docente
  19.  LEFT  JOIN a_Vigilante ON a_Docente.NDoc = a_Vigilante.NDoc
  20.  LEFT OUTER JOIN a_Prova ON a_Vigilante.Nprova = a_Prova.Nprova
  21. WHERE a_Prova.Periodo IS NULL OR DATA IS NULL OR (a_Prova.Periodo NOT LIKE ' Manha'  AND Datediff(DAY, DATA, getdate())!=1)
  22. GROUP BY a_Docente.Nome
  23. ORDER BY COUNT(a_Vigilante.NProva) ASC
  24.  
  25. /*p2-a*/
  26. /*Viabilizar a remoçao de uma disciplina que deixou de ser lecionada, identificada pela designação unica
  27. @DesignDisc, matendo a informaçao constante e sem violar restriçoes de integridade. para esse efeito, é
  28. necessario remover (primeiro) todos os dados relacionados e pela ordem correta.*/
  29. /*um procedimento para remover a disciplina porque nao vamos devolver nada.
  30. se fosse para devolver entao fariamos uma funçao*/
  31. CREATE proc remover_disciplina
  32. @DesignDisc VARCHAR(50)
  33. AS
  34. BEGIN
  35.     DELETE FROM a_SalasProva WHERE Nprova IN
  36.     (SELECT Nprova FROM a_Prova
  37.     INNER JOIN a_Disciplina ON a_Prova.Ndisc =  a_Disciplina.Ndisc
  38.     WHERE Desginacao LIKE @DesignDisc)
  39.    
  40.     DELETE FROM a_Prova WHERE NDisc IN
  41.     (SELECT NDisc FROM a_Disciplina
  42.     WHERE Desginacao LIKE @DesignDisc)
  43.  
  44.     DELETE FROM a_Lecionar WHERE NDisc IN
  45.     (SELECT NDisc FROM a_Disciplina
  46.     WHERE Desginacao LIKE @DesignDisc)
  47.  
  48.     DELETE FROM a_Disciplina
  49.     WHERE Desginacao LIKE @DesignDisc
  50. END
  51.  
  52. /*p2-b*/
  53. /*testatroca -> funçao*/
  54. /*faztroca -> procedimento*/
  55.  
  56. /*para faztroca*/
  57.  
  58. CREATE proc faztroca
  59. @NDiscA INT,
  60. @NDiscB INT,
  61. @dataProvaA DATE,
  62. @dataProvaB DATE,
  63. @nomeA VARCHAR(50),
  64. @nomeB VARCHAR(50)
  65.  
  66. AS
  67. BEGIN
  68.     DECLARE
  69.         @possivel INT,
  70.         @NprovaA INT,
  71.         @NprovaB INT,
  72.         @NDocA INT,
  73.         @NDocB INT;
  74.  
  75.     /*o set atribui valores à variavel*/  
  76.     SET @NprovaA = (SELECT Nprova FROM a_Prova WHERE DATA = @dataProvaA AND NDisc = @NDiscA);
  77.     SET @NprovaB = (SELECT Nprova FROM a_Prova WHERE DATA = @dataProvaB AND NDisc = @NDiscB);
  78.     SET @NDocA = (SELECT NDoc FROM a_Docente WHERE Nome = @nomeA);
  79.     SET @NDocB = (SELECT NDoc FROM a_Docente WHERE Nome = @nomeB);
  80.     SET @possivel = (SELECT testatroca (@NDocA,@NprovaA, @NDocB, @NprovaB));
  81.  
  82.     /*verifica se é possivel fazer a troca*/
  83.     IF @possivel = 1
  84.     BEGIN
  85.     /*faz a troca*/
  86.         UPDATE a_Vigilante SET NProva = @NProvaB WHERE NDoc = @NDocA
  87.         AND NProva = @NProvaA
  88.  
  89.         UPDATE a_Vigilante SET NProva = @NProvaA WHERE NDoc = @NDocB
  90.         AND NProva = @NProvaB
  91.     END;
  92. END;
  93.  
  94. /*funçao testatroca*/
  95.  
  96. CREATE FUNCTION testatroca(
  97. @NDocA INT,
  98. @NprovaA INT,
  99. @NDocB INT,
  100. @NprovaB INT)
  101. RETURNS INT
  102. AS
  103. BEGIN
  104.     DECLARE @countA INT,
  105.             @countB INT,
  106.             @countAB INT,
  107.             @countBA INT;
  108.            
  109.     SET @countA = (SELECT COUNT(*) FROM a_Vigilante WHERE Ndoc = @NDocA AND NProva = @NprovaA);
  110.     SET @countB = (SELECT COUNT(*) FROM a_Vigilante WHERE Ndoc = @NDocB AND NProva = @NprovaB);
  111.  
  112.     /*conta quantas vigilancias existem com aquele professor e prova*/
  113.     IF(@countA != 1 AND @countB != 1)
  114.         RETURN 0;
  115.    
  116.     /*countAB conta provas do docente A na data da prova b */
  117.     SET @countAB = (SELECT COUNT(*) FROM a_Vigilante JOIN a_prova ON a_Prova.NProva = a_Vigilante.Nprova
  118.             WHERE NDoc = @NDocA AND DATA = (SELECT DATA FROM a_Prova WHERE Nprova = @NprovaB));
  119.     SET @countBA = (SELECT COUNT(*) FROM a_Vigilante JOIN a_prova ON a_Prova.NProva = a_Vigilante.Nprova
  120.             WHERE NDoc = @NDocB AND  DATA = (SELECT DATA FROM a_Prova WHERE Nprova = @NprovaA));
  121.  
  122.    
  123.     IF(@countAB != 0 OR @countBA != 0)
  124.         RETURN 0;
  125.  
  126.     RETURN 1;
  127. END;
  128.  
  129. /*p2-c*/
  130. CREATE FUNCTION estatisticas
  131. RETURNS TABLE
  132. AS
  133. BEGIN
  134. /*o primeiro declare é da tabela*/
  135.      DECLARE @stats TABLE (Disciplina VARCHAR(50), Ano_letivo VARCHAR(50), epoca CHAR(1), n_aprovados INT, pct_aprovados INT, pct_aprovados_anoletivo_anterior VARCHAR(50));
  136.      DECLARE @anoatual VARCHAR(50),
  137.             @anoanterior VARCHAR(50),
  138.             @Design VARCHAR(50),
  139.             @Ndisc INT,
  140.             @Epoca CHAR(1),
  141.             @NAprov INT,
  142.             @Nprev INT,
  143.             @NAprovAnterior INT,
  144.             @NprevAnterior INT;
  145.            
  146.             /*atribui os valores do ano atual e ano anterior*/
  147.     SET @anoatual = (SELECT top 1 ano_letivo FROM a_Prova ORDER BY ano_letivo DESC);
  148.     SET @anoanterior = (SELECT top 1 ano_letivo FROM a_Prova WHERE ano_letivo != @anoatual ORDER BY ano_letivo DESC);
  149.  
  150.    
  151.     DECLARE C_stats CURSOR
  152.     /*select valores necessarios para preencher a tabela*/
  153.     FOR (SELECT designacao, a_Prova.NDisc, epoca, NAprovados, NPrevistoAlunos FROM a_Disciplina
  154.     JOIN a_Prova  ON a_Disciplina.NDisc = a_Prova.Ndisc)
  155.     OPEN C_stats
  156.     /*vai buscar uma linha do cursor e atribui às variaveis*/
  157.     FETCH FIRST FROM C_stats INTO @Design, @Ndisc, @Epoca, @NAprov, @Nprev
  158.     WHILE @@FETCH_STATUS = 0
  159.     BEGIN
  160.     /*vai buscar o numero de aprovados do ano anterior*/
  161.         SELECT @NAprovAnterior = NAprovados, @NprevAnterior = NPrevistoAlunos FROM a_Prova
  162.                 WHERE ano_letivo = @anoanterior AND epoca = @Epoca AND NDisc = @Ndisc;
  163.  
  164.                 /*insere na tabela*/
  165.         INSERT INTO @stats VALUES(@Design, @anoatual, @Epoca, @NAprov, @NAprov * 100 / @Nprev, @NAprovAnterior * 100 / @NprevAnterior);
  166.        
  167.        /*vai buscar a proxima linha do cursor*/
  168.         FETCH NEXT FROM C_stats INTO @Design, @Ndisc, @Epoca, @NAprov, @Nprev
  169.     END;
  170.  
  171.      RETURN SELECT * FROM @stats;
  172. END;
  173.  
  174. /*comando SQL*/
  175. EXEC estatisticas
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement