Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
2 / 2 / 1
Регистрация: 20.07.2017
Сообщений: 218

Автоматическое добавление записей в таблицу. Производительность запросов

25.09.2017, 11:40. Показов 1368. Ответов 8
Метки нет (Все метки)

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

Подскажите, пожалуйста как правильно: есть две таблицы (на скриншоте tblPTO и tblOOKS) не связанные друг с другом. Необходимо при изменении определенных полей в таблице tblPTO добавлять (если строка новая) или изменять (если строка не новая) значения в поля таблицы tblOOKS. Какие есть мысли на этот счет:

1. Написать некий код. Я написал вот так (форма ввода данных в таблицу tblPTO):

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
Private Sub NumberSZ_AfterUpdate()
    
    'Если запись новая - добавим в ООКС
If Me.Form.NewRecord = True Then
 
     Set rst = CurrentDb.OpenRecordset("tblOOKS")
        With rst
            .AddNew
            .Fields("MailNumberControl") = Me.NumberSZ
            .Fields("idChange") = Forms![DesktopPTO].[KodChange]
            .Update
            .Close
        End With
    Me.idOOKSRec = rst.Fields("Код")
'Если запись не новая - найдем в ООКС и отредактируем
ElseIf Me.NewRecord = False Then
    strSQL = "SELECT * From tblOOKS Where tblOOKS.Код =" & Me.idOOKSRec
    Set rst = CurrentDb.OpenRecordset(strSQL)
 
        With rst
            .Edit
            .Fields("MailNumberControl") = Me.NumberSZ
            .Update
            .Close
        End With
End If
    rst.Close
    
    Call SetAudit(Me.NumberSZ)
    Call SetTransfer
End Sub
2. Связать между собой таблицы 1-1. Но так нельзя, ибо в tblOOKS данные добавляются также без привязки к tblPTO. То есть в tblOOKS данных больше и они не всегда зависят от tblPTO.

3. Форма ввода данных tblPTO может быть основана на запросе, в котором соединятся две таблицы. Не понимаю как так сделать. Кроме того, если строить отчет по tblOOKS - мы уже не увидим первоначальных данных.

В связи со всем этим назревает вторая часть вопроса, о производительности запросов. Что-то мне подсказывает, что пока в таблице 1000 записей все будет хорошо. Но как только их станет, скажем, 700 000, тогда...
Интересует конкретно поиск записи:

Visual Basic
1
strSQL = "SELECT * From tblOOKS Where tblOOKS.Код =" & Me.idOOKSRec
Так нормально или есть более быстрые конструкции?
Миниатюры
Автоматическое добавление записей в таблицу. Производительность запросов  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.09.2017, 11:40
Ответы с готовыми решениями:

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

Автоматическое обновление записей в БД при отсутствии запросов некоторое время
Здравствуйте! Подскажите пожалуйста, имеется таблица function в БД с ячейками SW1, SW2 и SW3, в них постоянно обновляются данные. Как...

Автоматическое добавление записей
Добрый Всем день. Есть форма с подчиненной таблицей1.В поле формы нужно внести скидку.При нажатии кнопки эту скидку со всеми данными...

8
Эксперт MS Access
26825 / 14505 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
25.09.2017, 15:17
На все вопросы не отвечу потому что не понимаю их.
А вот на вопрос о скорости: конечно вместо постоянного обращения к БД, надо применить метод Seek к рекордсету уровня формы, определенному в Load формы. Будет в десятки, если не в сотни раз быстрее. Но на поле Код таблицы tblOOKS должен быть индекс. И тогда код такой
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
Dim rst as DAO.Recordset, db as DAO.Database 'Переменные определены в области объявлений модуля формы
 
Private Sub Form_Load()
    set db=currentdb
    set rst=db.OpenRecordset("tblOOKS", dbOpenTable) 'Объявляем рекордсет на загрузке формы
End sub
 
Private Sub NumberSZ_AfterUpdate()
    
    'Если запись новая - добавим в ООКС
If Me.Form.NewRecord Then
        With rst
            .AddNew
            .Fields("MailNumberControl") = Me.NumberSZ
            .Fields("idChange") = Forms![DesktopPTO].[KodChange]
            .Update
        End With
    Me.idOOKSRec = rst.Fields("Код")
'Если запись не новая - найдем в ООКС и отредактируем
Else 
        With rst
            .Index = "ИмяИндексаНаПолеКод" 'Задаем индекс для поиска
            .Seek "=", Me.idOOKSRec         'ищем сиком
            If Not rst.nomath Then
                .Edit
                .Fields("MailNumberControl") = Me.NumberSZ
                .Update
            Else
                'Здесь что делать если значение не найдено в tblOOKS
            End If
        End With
End If
    
    Call SetAudit(Me.NumberSZ)
    Call SetTransfer
End Sub
1
2 / 2 / 1
Регистрация: 20.07.2017
Сообщений: 218
25.09.2017, 15:23  [ТС]
Цитата Сообщение от mobile Посмотреть сообщение
надо применить метод Seek
Если я правильно понял - мы просто перестаем постоянно обращаться к таблице tblOOKS, вместо этого при загрузке формы "подцепляем эту таблицу" в рекордсет и уже закидываем запросами. Верно?
0
Эксперт MS Access
26825 / 14505 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
25.09.2017, 15:30
Да. Рекордсет будет постоянно в памяти, пока открыта форма. Но это первый фактор способствующий быстродействию. Второй это потрясающий метод Seek. Собственно Microsoft и купила FoxBase в том числе для того, чтобы приобрести патент на Seek.

Добавлено через 1 минуту
Цитата Сообщение от Chuvaschow Посмотреть сообщение
и уже закидываем запросами. Верно?
Нет, запросов уже не требуется. Будет работа с рекордсетом в памяти.
1
Модератор
Эксперт MS Access
6231 / 2909 / 707
Регистрация: 12.06.2016
Сообщений: 7,839
25.09.2017, 15:45
Прошу прощения, вижу небольшую опечатку, буковка пропущена:
rst.nomatch
2
2 / 2 / 1
Регистрация: 20.07.2017
Сообщений: 218
25.09.2017, 16:43  [ТС]
А по первому вопросы не подскажите?

Смысл такой: например в таблице tblPTO заполнили поле Дата1,а в таблице tblOOKS должна появится новая строка, в которой полю ДатаЗС будет присвоено значение Дата1. При изменении Дата1 в таблице tblPTO - необходимо, опять-таки, изменить значение ДатаЗС в таблице tblOOKS.
0
2 / 2 / 1
Регистрация: 20.07.2017
Сообщений: 218
27.09.2017, 12:31  [ТС]
Up!
0
Эксперт MS Access
26825 / 14505 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
27.09.2017, 15:15
Цитата Сообщение от Chuvaschow Посмотреть сообщение
Смысл такой: например в таблице tblPTO заполнили поле Дата1,а в таблице tblOOKS должна появится новая строка, в которой полю ДатаЗС будет присвоено значение Дата1. При изменении Дата1 в таблице tblPTO - необходимо, опять-таки, изменить значение ДатаЗС в таблице tblOOKS.
Если Вы хотите желать непосредственно в таблице, то это непросто. А если в форме, то можно. Но есть вопросы: Вы пишете "в таблице tblPTO заполнили поле Дата1,а в таблице tblOOKS должна появится новая строка". Заполнили поле Дата1 это в новой записи? Или в любой где дата пропущена?
Второе: Вы пишете "При изменении Дата1 в таблице tblPTO - необходимо, опять-таки, изменить значение ДатаЗС в таблице tblOOKS". В какой записи таблицы tblOOKS надо поменять дату, как ее найти?

Собственно, если происходит в форме, то все надо делать на событии После обновления (AfterUpdate) поля Дата1. Определяемся, нужна ли вставка новой записи или надо искать по какому-то критерию, создаем новую запись или пишем в имеющейся. Все это удобно делать в рекордсете по таблице tblOOKS. В нем есть поиск, есть вставка и редакция.
1
2 / 2 / 1
Регистрация: 20.07.2017
Сообщений: 218
27.09.2017, 15:21  [ТС]
Всем спасибо!

Сделал вот такую процедурку (можно пинать):

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
Private Sub AddToOOKS(ControlOOKS As String, ControlPTO)
    'Если запись новая - добавим в ООКС
If Me.Form.NewRecord = True Then
     Set rst = CurrentDb.OpenRecordset("tblOOKS")
        With rst
            .AddNew
            .Fields(ControlOOKS) = ControlPTO
            .Fields("idChange") = Forms![DesktopPTO].[KodChange]
            OOKSRec = .Fields("Код")
            .Update
            .Close
        End With
    Me.idOOKSRec = OOKSRec
'Если запись не новая - найдем в ООКС и отредактируем
ElseIf Me.NewRecord = False Then
    strSQL = "SELECT * From tblOOKS Where tblOOKS.Код =" & Me.idOOKSRec
    Set rst = CurrentDb.OpenRecordset(strSQL)
        With rst
            .Edit
            .Fields(ControlOOKS) = ControlPTO
            .Update
            .Close
        End With
End If
End Sub
 
Private Sub DateNumberSZ_AfterUpdate()
    Call AddToOOKS("DateAdmissionControl", Me.DateNumberSZ)
    Call SetAudit(Me.DateNumberSZ)
    Call SetTransfer
End Sub
Только вот позже перепишу на seek, как и рекомендовали.
Удаление записи тоже описал. Проверяется наличие значения в Me.idOOKSRec. Если есть (а значит есть строка в tblOOKS) - разговариваем с администратором БД ))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.09.2017, 15:21
Помогаю со студенческими работами здесь

Добавление записей в таблицу и связанную с ней таблицу, с учётом связи
Имеются 3 таблицы: кабинет id_cab n_cab устройства ...

Автоматическое добавление в таблицу
Доброе утро! Пожалуйста, подскажите, как сделать запрос(или триггер), что бы при добавлении нового заказа (табл.Zakaz) автоматически...

Автоматическое добавление записей по изменению текущей даты
Помогите сделать так чтобы каждый день записи автоматически добавлялись в dbgrid. У меня есть фамилия врача, время приемов, наличие талона...

Автоматическое добавление данных в таблицу
можно ли сделать так чтобы в таблицу данные вносились автоматически если пользователь их не ввел сам? например такая ситуация стоимость...

автоматическое добавление данных в таблицу БД
Добрый день. Есть база данных которая каждый день обновляется, и в ней есть одинаковые значения "заказы" . И столбец...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru