Загрузка данных


Option Compare Database
Option Explicit

' ===== НАСТРОЙКА: имена объектов из вашей базы =====
Private Function GetQueries() As Variant
    GetQueries = Array("sql1_1", "sql1_2", "sql1_4", "sql1_5")
End Function

Private Function GetQueryCaptions() As Variant
    GetQueryCaptions = Array("Список студентов", "Студенты 1 курса", "Средний балл", "Количество студентов по курсам")
End Function

Private Function GetForms() As Variant
    GetForms = Array("Конструктор_Студент", "Мастер_Студент", "Разделённый_Студент", "Студент_Составная")
End Function

Private Function GetReports() As Variant
    GetReports = Array("Студент", "Студент1", "Студент2", "Студент3")
End Function
' ===================================================

Public Sub BuildAllMenus()
    Dim q, qc, f, r
    Dim i As Long
    Dim capsQ(4) As String, actsQ(4) As String
    Dim capsF(4) As String, actsF(4) As String
    Dim capsR(4) As String, actsR(4) As String
    Dim capsM(4) As String, actsM(4) As String
    Dim back As String

    q = GetQueries(): qc = GetQueryCaptions(): f = GetForms(): r = GetReports()
    back = "=OpenF(""Главное меню"")"

    ' 1.1 Четыре макроса
    On Error GoTo MacroErr
    For i = 0 To 3
        MakeMacro "Макрос_Запрос" & (i + 1), CStr(q(i))
    Next i
    On Error GoTo 0

    ' 1.2 Меню запросов (через макросы)
    For i = 0 To 3
        capsQ(i) = CStr(qc(i))
        actsQ(i) = "Макрос_Запрос" & (i + 1)
    Next i
    capsQ(4) = "В главное меню": actsQ(4) = back
    MakeMenu "Меню запросов", capsQ, actsQ

    ' 1.3 Меню форм
    For i = 0 To 3
        capsF(i) = CStr(f(i))
        actsF(i) = "=OpenF(""" & f(i) & """)"
    Next i
    capsF(4) = "В главное меню": actsF(4) = back
    MakeMenu "Меню форм", capsF, actsF

    ' 1.4 Меню отчётов
    For i = 0 To 3
        capsR(i) = CStr(r(i))
        actsR(i) = "=OpenR(""" & r(i) & """)"
    Next i
    capsR(4) = "В главное меню": actsR(4) = back
    MakeMenu "Меню отчётов", capsR, actsR

    ' 1.5 Главное меню
    capsM(0) = "Меню запросов":   actsM(0) = "=OpenF(""Меню запросов"")"
    capsM(1) = "Меню форм":       actsM(1) = "=OpenF(""Меню форм"")"
    capsM(2) = "Меню отчётов":    actsM(2) = "=OpenF(""Меню отчётов"")"
    capsM(3) = "Выход в окно БД": actsM(3) = "=CloseMe()"
    capsM(4) = "Выход из Access": actsM(4) = "=QuitApp()"
    MakeMenu "Главное меню", capsM, actsM

    MsgBox "Готово! Откройте форму ""Главное меню"" и проверьте кнопки.", vbInformation
    Exit Sub

MacroErr:
    MsgBox "Не удалось создать макросы автоматически: " & Err.Description & vbCrLf & _
           "Создайте 4 макроса вручную (действие ОткрытьЗапрос) с именами " & _
           "Макрос_Запрос1 ... Макрос_Запрос4 и запустите BuildAllMenus заново.", vbExclamation
End Sub

' Создание макроса, открывающего запрос
Private Sub MakeMacro(macroName As String, queryName As String)
    Dim fn As String, h As Integer
    fn = Environ("TEMP") & "\tmpmacro.txt"
    h = FreeFile
    Open fn For Output As #h
    Print #h, "Version =196611"
    Print #h, "ColumnsShown =8"
    Print #h, "Begin"
    Print #h, "    Action =""OpenQuery"""
    Print #h, "    Argument =""" & queryName & """"
    Print #h, "    Argument =""Datasheet"""
    Print #h, "    Argument =""Edit"""
    Print #h, "End"
    Close #h
    On Error Resume Next
    DoCmd.DeleteObject acMacro, macroName
    On Error GoTo 0
    Application.LoadFromText acMacro, macroName, fn
    Kill fn
End Sub

' Создание формы-меню с заголовком и кнопками
Private Sub MakeMenu(menuName As String, caps As Variant, acts As Variant)
    Dim frm As Form, ctl As Control, i As Long, n As String

    On Error Resume Next
    DoCmd.Close acForm, menuName
    DoCmd.DeleteObject acForm, menuName
    On Error GoTo 0

    Set frm = CreateForm
    n = frm.Name
    frm.Caption = menuName
    frm.NavigationButtons = False
    frm.RecordSelectors = False
    frm.DividingLines = False
    frm.AutoCenter = True

    Set ctl = CreateControl(n, acLabel, acDetail, , , 600, 300, 6000, 550)
    ctl.Caption = menuName
    ctl.FontSize = 20
    ctl.FontBold = True

    For i = 0 To UBound(caps)
        Set ctl = CreateControl(n, acCommandButton, acDetail, , , 600, 1200 + i * 700, 6000, 550)
        ctl.Name = "btn" & i
        ctl.Caption = caps(i)
        ctl.OnClick = acts(i)
    Next i

    DoCmd.Close acForm, n, acSaveYes
    DoCmd.Rename menuName, acForm, n
End Sub

' ===== Функции, которые вызывают кнопки =====
Public Function OpenF(n As String)
    DoCmd.OpenForm n
End Function

Public Function OpenR(n As String)
    DoCmd.OpenReport n, acViewPreview
End Function

Public Function CloseMe()
    DoCmd.Close acForm, Screen.ActiveForm.Name
End Function

Public Function QuitApp()
    DoCmd.Quit
End Function