Desculpe pela minha falta de clareza
Vou tentar novamente. Ah, obrigado pela paciência.
Tabelas-base são estas:
Apostilas: Onde eu cadastro as apostilas e quantidade de estoque, bem como as quantidades mínima e máxima permitidas. Qtderecebe refere-se a quantidade de apostilas já solicitadas mas que ainda não chegaram.
Cursos: Onde cadastro os cursos e suas informações, como a abreviação de cada curso.
Excel_Temp: Tabela que recebe os cursos que iniciarão. Possui a Coluna "Curso" que é composta da abreviatura do curso mais o número da turma. Por exemplo:
Abreviatura = "EXCEL AV"
Número da turma = "1210S"
Sendo assim, a coluna "Curso" da tabela Excel_Temp será igual a: "EXCEL AV 1210S".
Meu objetivo: Gerar dois relatórios, sendo que um mostrará os cursos que iniciarão em 20 dias (Dia atual + 19). O outro relatório me mostrará as apostilas necessárias (incluindo o nome das apostilas e quantidade) para atender os cursos.
A primeira coisa que faço é:
DoCmd.RunSQL "INSERT INTO Filtro(Curso,Inicio,Status) SELECT Curso,Inicio,Status FROM Excel_Temp WHERE Excel_Temp.Inicio BETWEEN Format (date(), 'DD/MM/YYYY') AND Format (date()+19, 'DD/MM/YYYY') ORDER BY Curso"
Copio os cursos que se iniciarão no dia atual até 19 dias depois, da tabela Excel_Temp para a tabela filtro. Depois eu uso o recorset (linhas de comando abaixo) para descobrir a abreviatura de cada curso na tabela filtro.
Faço isso porque, como mencionei acima, recebo assim os cursos que vão iniciar: "EXCEL AV 1210S". Mas quero saber só a abreviatura (EXCEL AV), sem o número da turma(1210S)Faço da forma abaixo:
Dim rst As DAO.Recordset
Dim Abrev_curso As String
Set rst = CurrentDb.OpenRecordset("SELECT * FROM Filtro")
'Aqui inicio o loop
'Enquanto não chegar no ultimo registro estarei 'percorrendo a tabela
Do While Not rst.EOF
Abrev_curso = rst![Curso]
Dim separa As Variant
Dim Numpal As String
Dim Nome_cursos As String
separa = Split(Abrev_curso)
Nome_cursos = Join(separa)
Numpal = UBound(separa)
separa(Numpal) = ""
Abrev_curso = Join(separa)
No final desta rotina, a string Abrev_curso será igual a abreviatura do curso ( no exemplo que dei, será igual a EXCEL AV)
Depois realizo um update para alimentar a tabela Filtro com as informações da tabela Cursos, utilizando como parâmetro a abreviatura do curso. Olhe, por favor, a tabela no bd em anexo como a tabela fica.
DoCmd.RunSQL "UPDATE Filtro AS F, (SELECT * FROM Cursos) AS C Set F.Nome = C.nome, F.QtdeAlunos = C.QtdeAlunos WHERE C.abreviatura = '" & Abrev_curso & "' AND F.Curso = '" & Nome_cursos & "'"
Depois emito um relatório da tabela Filtro. Não inclui o relatório no arquivo postado, mas eu já o fiz.
Agora vou trabalhar com as apostilas. Na tabela Cursos eu cadastro as apostilas de cada curso. Lembrando que, esta coluna é de múltiplos valores, porque um curso pode usar mais de uma apostila.
Na tabela Cursos_Inic eu insiro a quantidade de aluno de cada curso e o código das apostilas que cada curso usará:
DoCmd.RunSQL "INSERT INTO Cursos_Inic(QtdeAlunos, Apostilas) SELECT QtdeAlunos, Apostilas.Value FROM Cursos WHERE Cursos.Abreviatura = '" & Abrev_curso & "'"
rst.MoveNext
Loop
rst.Close
Meu problema é que, uma apostila pode ser usada por mais de um curso. Vou dar aqui um exemplo, mas olhe por favor a tabela.
Exemplo de como fica a tabela Cursos_Inic.
Tabela Cursos_Inic
-QtdeAlunos-----Apostilas
-----32------------38
-----16------------02
-----16------------38
Neste exemplo nota-se que 2 cursos usam a postila de código 38, um curso de 32 alunos e um de 16 alunos. Quero usar o SUM e GROUP BY para que some a tabela QtdeAlunos, quando apostila for igual. Tipo assim:
DoCmd.RunSQL "SELECT Apostilas, Sum(QtdeAlunos) FROM Cursos_Inic GROUP BY Apostilas"
Para que fique assim:
-QtdeAlunos-----Apostilas
-----48------------38
-----16------------02
Somou-se 32 + 16 porque apostilas era igual ( no caso 38). Não consegui fazer isso, é essa minha grande dúvida. Não sei usar o GROUP BY em uma instrução SELECT. Por isso em minhas primeiras
postagens neste tópico perguntei como fazer isto, pois não consegui. Tentei utilizar um recordset, e no INSERT deste utilizar um SUM e um GROUP BY.
Depois que eu agrupar a tabela Cursos_Inic, vou criar nela mais uma coluna chamada Nome_APO. Vou fazer um update para buscar o nome das apostilas. mais ou menos assim:
DoCmd.RunSQL "UPDATE Cursos_Inic AS C, (SELECT * FROM Apostilas) AS A Set C.Nome_APO = A.Nome WHERE C.Apostilas = Apostilas.Código"
Feito isso vai ficar assim por exemplo:
-QtdeAlunos-----Apostilas--------------Nome_Apo
-----48------------38---------------Apostila avançada de excel
-----16------------02--------------Tecnologia e metrologia
Depois vou gerar um relatório com o nome Solicitação de Apostilas. É isso.