Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Оптимизация приложения / 9 сообщений из 9, страница 1 из 1
22.07.2003, 17:27
    #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
22.07.2003, 17:36
    #32214860
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация приложения
select ... where false
...
Рейтинг: 0 / 0
22.07.2003, 17:42
    #32214870
sasha_1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация приложения
ну да
или TOP 0
...
Рейтинг: 0 / 0
22.07.2003, 17:51
    #32214882
Чумаков А.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация приложения
Не совсем понял куда приладить
select ... where false

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

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

В данный момент ADP.
Система, соответственно, многопользовательская.
В принципе могут, но это ни к чему.
...
Рейтинг: 0 / 0
23.07.2003, 09:36
    #32215129
VIG
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
23.07.2003, 10:19
    #32215186
Чумаков А.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация приложения
В общем то логично все. Спасибо. Попробую так.

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


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