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


Private Sub btn_Login_Click()
    On Error GoTo Err_Handler
    
    Dim db As Object
    Dim td As Object
    Dim fld As Object
    Dim rs As Object
    Dim strSQL As String
    Dim tName As String
    Dim fLogin As String
    Dim fPass As String
    Dim fRole As String
    Dim fMgr As String
    
    Set db = CurrentDb
    
    ' Перебираем ВСЕ таблицы
    For Each td In db.TableDefs
        ' Пропускаем системные
        If Left(td.Name, 4) = "MSys" Or Left(td.Name, 4) = "~TMP" Then GoTo NextTable
        
        fLogin = "": fPass = "": fRole = "": fMgr = ""
        
        ' Ищем поля внутри таблицы
        For Each fld In td.Fields
            fName = fld.Name
            ' Ищем Логин в любом виде
            If InStr(1, fName, "огин", vbTextCompare) > 0 Or InStr(1, fName, "ogin", vbTextCompare) > 0 Then fLogin = fName
            ' Ищем Пароль в любом виде
            If InStr(1, fName, "арол", vbTextCompare) > 0 Or InStr(1, fName, "assw", vbTextCompare) > 0 Then fPass = fName
            ' Ищем Роль
            If InStr(1, fName, "ол", vbTextCompare) > 0 And Len(fName) <= 5 Then fRole = fName
            If InStr(1, fName, "ole", vbTextCompare) > 0 And Len(fName) <= 5 Then fRole = fName
            ' Ищем КодМенеджера или ManagerID
            If InStr(1, fName, "енеджер", vbTextCompare) > 0 Or InStr(1, fName, "anager", vbTextCompare) > 0 Then fMgr = fName
        Next
        
        ' Если нашли и логин и пароль — это наша таблица
        If fLogin <> "" And fPass <> "" Then
            tName = td.Name
            Exit For
        End If
NextTable:
    Next
    
    If tName = "" Then
        MsgBox "Таблица с полями Логин/Пароль не найдена!", vbCritical
        Exit Sub
    End If
    
    ' Строим SQL
    strSQL = "SELECT * FROM [" & tName & "] WHERE [" & fLogin & "] = '" & Me.txt_Login & "' AND [" & fPass & "] = '" & Me.txt_Password & "'"
    
    Set rs = db.OpenRecordset(strSQL)
    
    If rs.EOF Then
        MsgBox "Неверный логин или пароль!", vbCritical
        Me.txt_Password = Null
        Me.txt_Password.SetFocus
        rs.Close
        Exit Sub
    End If
    
    ' Сохраняем роль
    If fRole <> "" Then TempVars!CurrentRole = rs(fRole)
    If fMgr <> "" Then TempVars!CurrentMgrID = Nz(rs(fMgr), 0)
    
    rs.Close
    Set rs = Nothing
    Set db = Nothing
    
    DoCmd.Close acForm, "frm_Login"
    
    ' Проверяем, есть ли frm_MainMenu
    On Error Resume Next
    DoCmd.OpenForm "frm_MainMenu"
    If Err.Number <> 0 Then
        MsgBox "Форма frm_MainMenu не найдена! Вход выполнен.", vbExclamation
    End If
    Exit Sub
    
Err_Handler:
    MsgBox "Ошибка: " & Err.Number & " - " & Err.Description & vbCrLf & "SQL: " & strSQL, vbCritical
End Sub