0 / 0 / 0
Регистрация: 05.02.2018
Сообщений: 62
1

Поиск пользователей в разделенной БД не работает

13.03.2018, 20:27. Показов 1110. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, уважаемые форумчане!

Покопавшись на форуме, нашла шикарную интересовавшую меня тему: Выводить имя человека а не компьютера
Положила тамошнюю БД на сервер, попробовала - работает отлично.
Разделила БД, положила _be на сервер, формы отдала пользователям - не работает. Определяет только мой компьютер. Если пытаться внести мое имя в файле-форме, который лежит где-нибудь там же на сервере, а потом через эту же форму внести другого пользователя - вносит. Если потом пытаться определить пользователя в сети, то высветит только тот компьютер, на котором в данный момент нажата кнопка. Т.е. если я на компьютере-1 буду искать пользователей в сети, то будет только компьютер-1. Если при этом открыта БД на компьютере-2 и я ткну поиск на втором, то будет только второй.

Не подскажете, пожалуйста, почему так происходит и как это можно исправить?

п.с. то есть неразделенная БД ищет всех, определяет онлайн-не онлайн отлично, разделенная - нет.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.03.2018, 20:27
Ответы с готовыми решениями:

Поиск в разделенной форме
Можно ли в разделенной форме сделать фильтр или поиск? В верхней части разделенной форме...

Как сохранить настройки(Сервис/Параметры/Правка и поиск/Подтверждение) в разделенной БД(клиент-сервер)
Доброго времени суток! Пользователи БД высказали пожелание убрать всплывающие окна "Запрос на...

Связать группы пользователей из мастер защиты на уровне пользователей с должностями пользователей в БД
Интересный вопрос и интересно как его решить. Изначально условия следующие: один компьютер, ...

Поиск пользователей
Когда нажимаю поиск пользователя по букве, то выдает это Not Found The requested URL...

11
Мы один, давай на "ты"
3421 / 1299 / 312
Регистрация: 16.06.2016
Сообщений: 3,044
14.03.2018, 06:16 2
Цитата Сообщение от anniette Посмотреть сообщение
то есть неразделенная БД ищет всех, определяет онлайн-не онлайн отлично, разделенная - нет.
Пользователей методом OpenSchema спрашиваешь у CurrentProject.Connection? Если да, то не правильно. Нужно организовывать Connection к BackEnd'у (та часть, что _be)
0
0 / 0 / 0
Регистрация: 05.02.2018
Сообщений: 62
14.03.2018, 09:46  [ТС] 3
Панург, я ничего не меняла в этом файле. Можете подробней рассказать, пожалуйста, как организовать соединение с BackEnd?
0
Мы один, давай на "ты"
3421 / 1299 / 312
Регистрация: 16.06.2016
Сообщений: 3,044
14.03.2018, 10:10 4
Цитата Сообщение от anniette Посмотреть сообщение
я ничего не меняла в этом файле.
В каком файле?
Цитата Сообщение от anniette Посмотреть сообщение
Можете подробней рассказать, пожалуйста, как организовать соединение с BackEnd?
В приведённом коде (тот что по ссылке) объект Connection получают у текущего проекта. Естественно, что пользователь использующие данный проект только ты, ведь он лежит у тебя и только ты его открыла. Чтобы узнать какие пользователи используют файл лежащий на сервере нужно и спрашивать у того файла. Для этого нужно создать прямое соединение с тем файлом и уже его использовать.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
...
Dim rst As ADODB.Recordset
Dim cnn As ADODB.Connection
Set cnn = New ADODB.Connection
cnn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\\serverName\shareName\folder\myAccessFile_be.mdb;"'тут свои параметры
'cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\serverName\shareName\folder\myAccessFile_be.mdb;"'строка зависит от используемой версии Access
cnn.Open
Set rst = cnn.OpenSchema(adSchemaProviderSpecific, , SCHEMA_USER)'далее как в примере
...
    If not cnn is nothing then If cnn.State=1 then cnn.Close
Set cnn = nothing
В общем так.

Access connection strings
1
0 / 0 / 0
Регистрация: 05.02.2018
Сообщений: 62
14.03.2018, 10:33  [ТС] 5
Панург, мой косяк. Там в теме есть прикрепленная база с поиском, ее я использовала. Тот ответ еще помечен, как лучший.

А в Вашем коде в пятой строке мне нужно какие-то свои имена прописывать? Server, sharename?
0
Мы один, давай на "ты"
3421 / 1299 / 312
Регистрация: 16.06.2016
Сообщений: 3,044
14.03.2018, 10:57 6
Цитата Сообщение от anniette Посмотреть сообщение
А в Вашем коде в пятой строке мне нужно какие-то свои имена прописывать? Server, sharename?
В данном случае да.

Кроме пользования форумом подразумевается использование встроенной справки. И ссылками которые дают.
1
0 / 0 / 0
Регистрация: 05.02.2018
Сообщений: 62
14.03.2018, 11:26  [ТС] 7
Панург, спасибо) попробую разобраться.
0
0 / 0 / 0
Регистрация: 05.02.2018
Сообщений: 62
15.03.2018, 23:30  [ТС] 8
Панург, все-таки мне не понятно. Смотрите. По приведенной ссылке находится файл (Сообщение 4). В той БД рассмотрены два варианта нахождения пользователей в сети: WinNt и adodb. Как показал эксперимент, первый вариант искал все работающие на предприятии компьютеры, а второй - только пользователей базы. Поэтому рассмотрим его. Ему соответствует этот кусок кода:

Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Sub netuser_SCHEMA_USER()
    Dim rst As Object, rTabl As DAO.Recordset, db As DAO.Database
    Dim s, sw, t
    Set db = CurrentDb
    Set rst = CreateObject("adodb.recordset")
    Set rst = CurrentProject.Connection.OpenSchema(-1, , SCHEMA_USER)
    Set rTabl = db.OpenRecordset("select * from ПК_в_сети")
 
    If Me.grpConnect <> 1 Then
        sw = " where not InConnect is null"
    Else
        sw = ""
    End If
 
    Do Until rst.EOF
        t = Trim(Replace(rst(0), Chr(0), ""))
        rTabl.FindFirst "СетевоеИмя='" & t & "'"
        If rTabl.NoMatch Then
            If MsgBox("В таблице соответствий не найдено сетевое имя '" & t & "'" & vbCrLf _
                & "Добавить '" & t & "' в таблицу?", vbYesNo) = vbYes Then
                DoCmd.OpenForm "frmПК_в_сети", , , , acFormAdd, acDialog, t
                Set rTabl = CurrentDb.OpenRecordset("select * from ПК_в_сети")
                rTabl.FindFirst "СетевоеИмя='" & t & "'"
                If Not rTabl.NoMatch Then
'                        s = s & ";" & oComp.name & ";" & rTabl(1)
                    rTabl.Edit: rTabl!InConnect = "В сети": rTabl.Update
                End If
                Me.lstUsers.Requery
            End If
        Else
'            s = s & ";" & t & ";" & rTabl(1)
            rTabl.Edit: rTabl!InConnect = "В сети": rTabl.Update
        End If
        rst.MoveNext
    Loop
    Me.lstUsers.RowSource = "select * from ПК_в_сети" & sw 'Mid(s, 2)
End Sub


Насколько я Вас поняла, строки где-то с 4 по 7 неверны, потому что current.
Поэтому я изменила начало на такое:

Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
Sub netuser_SCHEMA_USER()
    Dim rst As Object, rTabl As DAO.Recordset, db As DAO.Database
    Dim cnn As ADODB.Connection
    Dim s, sw, t
    cnn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\\O:\ОДС\Закрытая\Заявочник\Заявочник 2018_be.accdb;"
    cnn.Open
    Set rst = cnn.OpenSchema(adSchemaProviderSpecific, , SCHEMA_USER)
    Set rTabl = db.OpenRecordset("select * from ПК_в_сети")

Ошибка компиляции в третьей строке: User-defined type not defined. Как я понимаю, он не знает, что это за метод такой.
Подскажите, пожалуйста, как исправить? Просто я чуточку далека от всего этого.
0
10445 / 5445 / 1374
Регистрация: 05.10.2016
Сообщений: 15,422
16.03.2018, 00:20 9
Цитата Сообщение от anniette Посмотреть сообщение
Ошибка компиляции в третьей строке: User-defined type not defined
Скорее всего отвалилась ссылка на:
Microsoft ActiveX Data Objects X.X Library

Запустите редактор VBE > Меню: Tools > Пункт: References
... и восстановите ссылку на библиотеку
1
10445 / 5445 / 1374
Регистрация: 05.10.2016
Сообщений: 15,422
16.03.2018, 00:21 10
Должно быть примерно так (номер версии не особо важен)
Миниатюры
Поиск пользователей в разделенной БД не работает  
0
Мы один, давай на "ты"
3421 / 1299 / 312
Регистрация: 16.06.2016
Сообщений: 3,044
16.03.2018, 05:43 11
Лучший ответ Сообщение было отмечено anniette как решение

Решение

Цитата Сообщение от anniette Посмотреть сообщение
Насколько я Вас поняла, строки где-то с 4 по 7 неверны, потому что current.
Ну не совсем
4 строка избыточна, т.к. объект практически не используют
5 строка избыточна вообще, т.к. в 6 строке ссылка на полученный объект заменяется на ссылку на новый объект
7 строка вполне нормальная.
Отсюда вывод - не всё что "current" одинаково бесполезно .

Я тут переписал всю процедуру на ADO. Как-то мне не нравится когда намешаны ADO и DAO в одной процедуре. Добавлен простой обработчик ошибок.
Получившееся под катом
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
Sub netuser_SCHEMA_USER()
Dim rst As Object, rstT As Object, cnn As Object
Dim strSQL As String, strName As String
 
Const adOpenKeyset = 1&, adLockOptimistic = 3&, adCmdText = 1&
 
On Error GoTo HandleErrors
 
Set cnn = CreateObject("adodb.Connection")
cnn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=O:\ОДС\Закрытая\Заявочник\Заявочник 2018_be.accdb;"
cnn.Open
    If cnn.State = 1 Then
        Set rst = cnn.OpenSchema(-1, , SCHEMA_USER)
        Set rstT = CreateObject("adodb.recordset")
        strSQL = "select * from ПК_в_сети"
        rstT.Open strSQL, CurrentProject.Connection, adOpenKeyset, adLockOptimistic, adCmdText
            Do Until rst.EOF
                strName = Trim(Replace(rst(0), vbNullChar, vbNullString))
1:
                rstT.Find "[СетевоеИмя]='" & strName & "'", Start:=1
                    If rstT.EOF Then
                        If MsgBox("В таблице соответствий не найдено сетевое имя '" & strName & "'" & vbCrLf _
                            & "Добавить '" & strName & "' в таблицу?", vbYesNo) = vbYes Then
                            
                            DoCmd.OpenForm "frmПК_в_сети", , , , acFormAdd, acDialog, strName
                            rstT.Requery
                            GoTo 1
                        End If
                    Else
                        rstT!InConnect = "В сети"
                        rstT.Update
                    End If
                rst.MoveNext
            Loop
            If Me.grpConnect <> 1 Then strSQL = strSQL & " where not InConnect is null"
        Me.lstUsers.RowSource = strSQL
    End If
ExitHere:
        If Not cnn Is Nothing Then If cnn.State = 1 Then cnn.Close
    Set cnn = Nothing
        If Not rst Is Nothing Then If rst.State = 1 Then rst.Close
    Set rst = Nothing
        If Not rstT Is Nothing Then If rstT.State = 1 Then rstT.Close
    Set rstT = Nothing
    Exit Sub
HandleErrors:
    Debug.Print Err.Number & vbNewLine & Err.Description
    Resume ExitHere
End Sub

ЗЫ. #9 References в данном случае подключать не нужно.
1
0 / 0 / 0
Регистрация: 05.02.2018
Сообщений: 62
16.03.2018, 11:24  [ТС] 12
Панург, работает отлично. Большое спасибо!
0
16.03.2018, 11:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.03.2018, 11:24
Помогаю со студенческими работами здесь

Поиск пользователей на сайте
Здравствуйте Столкнулся с такой проблемой, что не получается сделать поиск пользователей на сайте...

Поиск пользователей ICQ
Скажите пожалуйста, как находясь в клиенте qip найти пользователей ICQ зарегистрированных на...

Поиск и просмотр пользователей
здесь получается только поиск, а вот когда нажимаешь на пользователя проходит по ссылке а там...

Как сделать поиск пользователей
Нужно сделать поиск рефералов для реферера. Чтобы поиск искал из того списка пользователей, которые...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru