Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
397 / 140 / 39
Регистрация: 16.03.2013
Сообщений: 1,570

Альтернатива для DLookUP для линкованных таблиц

04.09.2023, 06:36. Показов 2195. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем, здравствуйте! Прошу подсказать, почему не работает следующая весщь....

По существу: Много лет назад, когда делал базу не связал справочник материалов с одной из линкованных таблиц, теперь когда возникла необходимость отобразить данные из справочника в таблице решил использовать DlookUP....Но он, естественно, производительность садит в ленточной форме, при прокручивании записей,и процесс просмотра превращается в тормоза.
Пошарил в интернете, нашел такую штуку, пользовательскую функцию, аналог DlookUPа, но с более ,как утверждается, подходящей производительностью... Вставил ее в запрос вместо DlookUP, но она не работает корректно, возможно критерии отбора неправильно указал или с синтакисисом напаартачил, подскажите пожалуйста, чего не правильно?

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Public Function GetRec(NameOfField As String, NameOfTable As String, Optional Where As String = "")
Dim r As Recordset
Dim sql As String
Dim result
On Error GoTo 2
sql = "SELECT " & NameOfField & " FROM " & NameOfTable
If Len(Where) > 0 Then sql = sql & " WHERE (" & Where & ")"
Set r = CurrentDb.OpenRecordset(sql, dbOpenDynaset)
If r.EOF And r.BOF Then GoTo 1
r.MoveFirst
result = r.Fields(NameOfField)
 
1:
r.Close
Set r = Nothing
GetRec = result
 
2:
 GetRec = "Не найдено!"
    Exit Function
End Function


Она в запросе

SQL
1
ВыводМатериал: GetRec("[Материал]";"СправочникДеталей";"[Код1С]=" & [ХранениеСклад].[Код1С])
Спасибо
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.09.2023, 06:36
Ответы с готовыми решениями:

Альтернатива JOIN для вывода связных таблиц
Очень необходимо выводить данные в один датагрид из разных таблиц. Проблема в том что если я буду формировать SQL запрос с использованием...

Dlookup для новичка
Здравствуйте гуру! Подскажите, пожалуйста, как использовать Dlookup в ситуации когда в одной форме используются данные с двух таблиц...

Аналог ColorMatrix для .Net Compact Framework или его альтернатива для создания негатива изображения
Здравствуйте. Интересует следующий вопрос: есть ли аналог ColorMatrix для .Net Compact Framework или его альтернатива для создания негатива...

32
397 / 140 / 39
Регистрация: 16.03.2013
Сообщений: 1,570
04.09.2023, 08:28  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Панург Посмотреть сообщение
притормаживать будет в любом случае
т.е. DlookUP или "SELECT" в данном случае, практически выдадут одно и тоже...?
0
 Аватар для VinniPuh
9147 / 6179 / 594
Регистрация: 27.03.2013
Сообщений: 20,049
04.09.2023, 08:30
Цитата Сообщение от Braser Посмотреть сообщение
...у нас договорняк...
Про договорняк, ты придумал.
Это просто порыв души и - много знаний не бывает.
Пригодится.
Если бы - Панург, ответил, то его бы плюсанул.
Мне не жалко.
1
Мы один, давай на "ты"
3858 / 1400 / 348
Регистрация: 16.06.2016
Сообщений: 3,300
04.09.2023, 08:30
Цитата Сообщение от VinniPuh Посмотреть сообщение
Или ты даже в мыслях не допускаешь, что кто то может не знать, чего знаешь ты?
меня как-то должно это заботить? Я уже сказал - это твои проблемы. Для решения таких вещей существуют поисковые и справочные системы.
Цитата Сообщение от VinniPuh Посмотреть сообщение
Не нужно быть обо мне столь высокого мнения.
да просто ниже уже некуда...
0
397 / 140 / 39
Регистрация: 16.03.2013
Сообщений: 1,570
04.09.2023, 08:36  [ТС]
Цитата Сообщение от Панург Посмотреть сообщение
сделать стандартно - запихать справочник в комбобокс, пусть Access сам реализует показ.
не совсем понимаю, честно говоря, принцип реализации этого метода...
0
 Аватар для VinniPuh
9147 / 6179 / 594
Регистрация: 27.03.2013
Сообщений: 20,049
04.09.2023, 08:45
Цитата Сообщение от Панург Посмотреть сообщение
...да просто ниже уже некуда...
Ты льстишь мне.
Не стоит так лебезить и преклоняться.
Как то даже неудобно.
0
920 / 293 / 58
Регистрация: 01.06.2023
Сообщений: 821
04.09.2023, 08:45
Попробуйте как предложил Панург. Создайте справочник локально, с нормальными индексами. Периодически его обновляйте.
1
Эксперт MS Access
 Аватар для ltv_1953
17536 / 7288 / 1663
Регистрация: 21.06.2012
Сообщений: 13,957
04.09.2023, 09:18
Если
Цитата Сообщение от Braser Посмотреть сообщение
Код1С
индекс, то быстрее всего будет Seek по нему. Нужно открыть базу с данными (глобальная переменная), а в функции открывать табличный набор данных в этой базе, указывать индекс и делать Seek по нему.
0
Мы один, давай на "ты"
3858 / 1400 / 348
Регистрация: 16.06.2016
Сообщений: 3,300
04.09.2023, 09:30
вопросов нет
0
920 / 293 / 58
Регистрация: 01.06.2023
Сообщений: 821
04.09.2023, 09:41
Прикинул еще один вариант с кешированием, даст прирост скорости при повторном открытии формы или значения часто повторяются

в начало модуля добавляем

Visual Basic
1
Dim dicCache
функция поиска заголовка примет вид:

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
Public Function GetRec(NameOfField As String, NameOfTable As String, Optional Where As String = "", Optional Cache As Boolean = True)
  Dim r
  Dim sql As String
  
  If Cache Then
    If IsEmpty(dicCache) Then
      Set dicCache = CreateObject("scripting.dictionary")
      dicCache.CompareMode = 1
    End If
    
    If Not dicCache.Exists(NameOfTable) Then
      Dim dic_Keys
      Set dic_Keys = CreateObject("scripting.dictionary")
      dic_Keys.CompareMode = 1
      dicCache.Add NameOfTable, dic_Keys
    ElseIf dicCache(NameOfTable).Exists(Where) Then
      GetRec = dicCache(NameOfTable)(Where)
      Exit Function
    End If
  End If
  
  sql = "SELECT [" & NameOfField & "] FROM " & NameOfTable
  If Len(Where) > 0 Then sql = sql & " WHERE (" & Where & ")"
 
  On Error GoTo sqlError
 
  Set r = CurrentProject.Connection.Execute(sql)
 
  On Error GoTo noField
 
  If r.EOF Then GetRec = Empty Else GetRec = r.Fields(NameOfField).Value
  r.Close
  Set r = Nothing
  
  If Cache Then dicCache(NameOfTable).Add Where, GetRec    
  
  Exit Function
noField:
  r.Close
  Set r = Nothing
sqlError:
  GetRec = "Ошибка! " & Err.Description
End Function
Пока правда не чувствительна если передать другой NameOfField при том же Where - вернет первый запрошенный вариант.
1
Мы один, давай на "ты"
3858 / 1400 / 348
Регистрация: 16.06.2016
Сообщений: 3,300
04.09.2023, 09:52
Цитата Сообщение от Braser Посмотреть сообщение
не совсем понимаю, честно говоря, принцип реализации этого метода...
чего тут понимать? создал ленточную форму (или любую другую, без разницы), указал источником записей свою линкованую таблицу, накидал как обычно контролов (текстбоксов), а данные поля "Код1С" выводишь в комбобокс, где уже и указываешь свой справочник источником строк. Всё стандартно.
1
598 / 404 / 51
Регистрация: 06.03.2022
Сообщений: 2,129
04.09.2023, 14:02
Цитата Сообщение от Панург Посмотреть сообщение
Всё стандартно.
Braser, а в чем принципиальное отличие этого:
Visual Basic
1
2
3
4
5
sql = "SELECT " & NameOfField & " FROM " & NameOfTable
....
If Len(Where) > 0 Then sql = sql & " WHERE (" & Where & ")"
Set r = CurrentDb.OpenRecordset(sql, dbOpenDynaset)
.....
и этого:
Visual Basic
1
Dlookup("NameOfField","NameOfTable","ctl=" & условие)
и навряд ли причина "тормозов" в функции Dlookup (если в таблице не сотни тысяч записей, то Вы,навряд ли, "на глаз", заметите разницу в скорости этой функции и Seek или RS.Причина "тормозов", наверное, в чем-то другом)
Как,например,истолковать это:WHERE (" & Where & ")", если
.....Where As String = ""
стесняюсь спросить: а КАКОЕ поле запроса\инструкции равно пустой строке (по какому полю отбор и зачем скобки-это не существенно)
Кстати, Dlookup возвращает одну запись а инструкция SQL набор и навряд ли это взаимозаменяемые "вещи", но не зная задачи ничего конкретного сказать невозможно
0
 Аватар для alecko5
885 / 148 / 35
Регистрация: 05.08.2022
Сообщений: 681
04.09.2023, 19:01
Цитата Сообщение от Braser Посмотреть сообщение
не работает корректно,
17 Exit Function
при открытии формы создавайте временную таблицу с нужными данными
SQL
1
SELECT NameOfField  INTO t1 FROM NameOfTable WHERE (" & Where & ");"
потом удаляете
SQL
1
DROP TABLE t1
базу сжимать нужно.
p.s.
Цитата Сообщение от Braser Посмотреть сообщение
не связал справочник материалов с одной из линкованных таблиц
как то причина не вяжется со следствием.
0
4089 / 1469 / 401
Регистрация: 07.08.2013
Сообщений: 3,673
05.09.2023, 04:42
Цитата Сообщение от Панург Посмотреть сообщение
если справочник редко обновляется его можно делать локальным (например, загружать данными при начале работы)
вот я тоже так думаю
или коннектиться на прямую к табле прямо из кода
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.09.2023, 04:42

DLookUp для поля с несколькими значениями
Есть поле в форме, содержимое выведено в поле через DLookUp, в настройках поля в таблице указанно Несколько значений для поля - Да....

Не работает функция DLookUp для автозаполнения данных
Доброго времени суток. Есть Таблица, 3 поля, форматы заданы согласно данным. По таблице создана форма, в источнике данных нескольких полей...

Альтернатива 2d tilemap для 3d
Возможно заезженный вопрос, но есть ли альтернатива тайлмэпов для 3d, то есть чтобы также можно создать 3d карту (соответственно в виде не...

Альтернатива для TabControl
Кто разбирается в XAML, подскажите код для размещения TabControl, среда Visual C++ 2013 Приложения для Windows 8.1. Код TabControl из MSDN...

Альтернатива для parseInt
Здравствуйте, у меня есть код, который берёт значения из базы данных и подставляет их в input, после можно выбрать необходимый input и...


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru