powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Оптимизация приложения
9 сообщений из 9, страница 1 из 1
Оптимизация приложения
    #32214852
Чумаков А.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть 2 таблицы: Inv, InvRow (счета и, соответственно строки счета)
Связаны по полю ID

Задача: добавление счетов из VBA

Делаю примерно так:
1. rstInv.Open "SELECT Inv.* FROM Inv"
rstInv.AddNew
....
....
rstInv.Update
ID_Inv = rstInv![ID]

2. rstInvRow.Open "SELECT InvRow.* FROM InvRow WHERE InvRow.ID = " & CStr(ID_Inv)
rstInvRow.AddNew
....
....
rstInvRow.Update

Собственно вопрос: что можно сделать чтобы не тянуть всю таблицу в 1 пункте для добавления? Согласен, можно запросом на добавление, но как потом узнать ID ?
...
Рейтинг: 0 / 0
Оптимизация приложения
    #32214860
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
select ... where false
...
Рейтинг: 0 / 0
Оптимизация приложения
    #32214870
sasha_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну да
или TOP 0
...
Рейтинг: 0 / 0
Оптимизация приложения
    #32214882
Чумаков А.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не совсем понял куда приладить
select ... where false

И будет ли конструкция
INSERT - запросом
select ... where false - для вычисления ID

работать быстрее ?
...
Рейтинг: 0 / 0
Оптимизация приложения
    #32214908
sasha_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Не совсем понял куда приладить select ... where false
сюда приладить
1. rstInv.Open "SELECT Inv.* FROM Inv where false"
проще говоря вытаскиваешь таблу без записей
...
Рейтинг: 0 / 0
Оптимизация приложения
    #32214917
VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А какая база mdb или adp?
Система многопользовательская или однопользовательская?
Могут ли в быть в таблице Inv записи без соответствующих записей в таблице
InvRow
Дальнейшие рекомендации зависят от ответов
...
Рейтинг: 0 / 0
Оптимизация приложения
    #32215070
Чумаков А.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2VIG:

В данный момент ADP.
Система, соответственно, многопользовательская.
В принципе могут, но это ни к чему.
...
Рейтинг: 0 / 0
Оптимизация приложения
    #32215129
VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Чумаков.А
Забыл спросить. Поле ID_Inv в таблице Inv имеет тип IDENITY?
Судя по коду-это так.Буду исходить из этого.
Я бы сделал так
1.На сервере создать 2 хранимые процедуры для внесения данных в Inv, InvRow соответственно.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE PROCEDURE  proc_Insert2Inv  список_входных_параметров	
AS
set nocount on
Declare @ Id_inv int
set id_inv= 0   /* код ошибки*/ 
insert Inv (...) values(...)
 /*если Id_inv в  inv  не IDENITY ,то д.б
 select @Id_inv=max(Id_inv) from inv  
 select @Id_inv= @Id_inv+1
 insert Inv (...) values(...)
*/ 
if @@Error= 0   /*ошибок при инсерте не было */ 
    select @Id_inv=max(Id_inv) from inv 
 --можно и  select @Id_inv=@@IDENITY  
 
return @id_inv

Эта ХР возвращает значение id_inv после внесения данных в inv или 0 в случае
ошибки.
Код: plaintext
1.
2.
3.
4.
5.
6.
CREATE PROCEDURE  proc_Insert2InvRow  список_входных_параметров	
AS
set nocount on
insert InvRow (...) values(...)

if @@Error != 0  /*ошибкa /
     raiserror('Error_message', 16 , 1 )

2.На клиенте :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
sub Insert2inv ()
 Dim cmd As ADODB.Command
 Dim prm As ADODB.Parameter
 dim Id_inv as integer
On Error GoTo ErrorHandler
Set cmd = New ADODB.Command
With cmd
    .ActiveConnection = 
    .CommandText =  "proc_Insert2Inv" 
    .CommandType = adCmdStoredProc
    Set prm = .CreateParameter( "ID_inv" , adInteger, adParamReturnValue)
    .Parameters.Append prm
    Set prm = .CreateParameter(...)
    .Parameters.Append prm
'таким образом создаются все параметры для proc_Insert2Inv
...........................
    .Execute , , adExecuteNoRecords
     Id_inv  = .Parameters("ID_inv") 'получаем значение возвращаемое ХР
End With
Set prm = Nothing
Set cmd = Nothing
insert2InvRow Id_inv  'вызываем подпрограмму для внесения записей в InvRow
end sub

пп insert2InvRow создается аналогично
Естественно в обе подпрограмы д.б вставлен код для обработки ошибок
...
Рейтинг: 0 / 0
Оптимизация приложения
    #32215186
Чумаков А.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем то логично все. Спасибо. Попробую так.

Не сообразил сразу, что можно ID вставленной записи так выяснить.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Оптимизация приложения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]