![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать "автономер" сохраняемой записи?
КирилЛ © (2009-02-06 15:07:00)Сделал ключевым полем в таблице - автономер. Как узнать его после сохранения записи в базе? (ADO + Access)
palva (2009-02-08 16:43:00) [1]
> а, так ты оказывается отвечал на чисто частный вопрос о конструкции...
Вообще-то да. С основным вопросом автор, как я понял уже, разобрался. Он задал дополнительный вопрос о некоей конструкции, которая меня самого привела в недоумение. Я и написал, что у меня это не работает. Я написал свой вариант. Может быть, можно было бы написать лучше, раз этот вариант является извращением. Мне было бы интересно об этом узнать. Вариант с COALESCE у меня тоже не заработал.
sniknik (2009-02-08 16:26:00) [2]> так как работает и выдает ровно то, что попросил программист.
т.е. если оно будет выдавать одну и ту же цифру там где ожидаются разные (коннекты то разные) и эта цифра даже не будет равна той, что ожидается по сути запроса (max+1, т.е. от последнего инсерта) то это именно то что попросил программист?
может лучше тогда сразу все программирование на генератор случайных чисел перевести?
> А то что вы написали, это не ответ на вопрос, заданный в конце [10].
а, так ты оказывается отвечал на чисто частный вопрос о конструкции, а пример запроса выбрал в соответствии с ответом на основной, и ничего не сказал об этом, это чисто так, чтобы побольше запутать...
> если до вас плохо доходит.
теперь дошло. больше путаницы у начинающих = меньше конкуренции в будущем.
молодец. все правильно сделал. (© из какой то глупой рекламы)
palva (2009-02-08 15:42:00) [3]
> это не рабочая конструкция. т.к. результат непредсказуем.
Еще одно определение не рабочей конструкции? Конструкция рабочая, так как работает и выдает ровно то, что попросил программист.
> SELECT @@IDENTITY
> и все одно "никто"?
Никто, значит никто. Могу еще раз написать, если до вас плохо доходит. А то что вы написали, это не ответ на вопрос, заданный в конце [10].
sniknik (2009-02-08 15:05:00) [4]> В Access это работает.
компилируется? - да. выдает результат? - а как же. но это не рабочая конструкция. т.к. результат непредсказуем.
сделай 2 коннекта (ADOConnect) к одной базе, подцепи туда все что полагается (ADOCommand с инсертом, ADODataSet с твоим запросом) и попробуй погонять в разных вариантах, типа
инсерт1
инсерт2
получитьID1
получитьID2
ну и показать ID1/2
будешь удивлен результатами, особенно если попытаеш предсказать что там должно получится.
> да и в ветке никто не предложил.
???
сколько раз повторялось
SELECT @@IDENTITY
и все одно "никто"?
palva (2009-02-08 14:22:00) [5]
> это тоже нерабочая для ассесс конструкция
В Access это работает. А другой работающей конструкции для этой цели я не смог придумать, да и в ветке никто не предложил.
sniknik (2009-02-08 12:55:00) [6]и кстати до ссылки можно бы и не доходить...
смотрю Anatoly Podgoretsky © (06.02.09 15:28) [1] и тут дал правильный совет, особенно что касается документации... т.к. именно из за нее ты похоже все понимаешь через кривую призму своих представлений... читал бы доку, понял бы сразу.
sniknik (2009-02-08 12:33:00) [7]> подскажите - что я должен был там увидеть?
Palladin © (18.07.08 13:56) [2]
sniknik © (18.07.08 14:09) [4]
sniknik © (18.07.08 16:30) [10]
ну и вообще все обсуждение, чтобы понять access <> mssql <> oracle и т.д. (верно и обратное), и начать относится с осторожностью к постам где написано "это не аксесс(/...) но ..." такие требуют проверок и доработок по месту (возможно требуют конечно...)
> - это что за конструкция?
еще одна конструкция никакого отношения к аксессу не имеющая.
> Я бы предложил такой вариант:
> SELECT IIF(MAX(id) IS NULL, 0, MAX(id)) + 1 FROM Table1
на форуме извращенцев он бы занял призовое место... и к тому же это тоже нерабочая для ассесс конструкция.
palva (2009-02-08 11:59:00) [8]
> Select IsNull(max([id])+1, 1) FROM [SomeTable]
У меня такое не работает. Функция IsNull требует один аргумент и возвращает истину, если этот аргумент NULL. Я бы предложил такой вариант:
SELECT IIF(MAX(id) IS NULL, 0, MAX(id)) + 1 FROM Table1
КирилЛ (2009-02-08 09:44:00) [9]> sniknik © (07.02.09 13:14) [9]
реально, что я ещё там смог там найти:
Select IsNull(max([id])+1, 1) FROM [SomeTable]
остальное как-то абстрактно:
> написать универсальную функцию и подключить ее
> синхронное выполнение запросов
> RETURNING. Это правда тоже не в Access-е, но какая нахрен разница
подскажите - что я должен был там увидеть?
И вотmax([id])+1мне понятен, аIsNull(max([id])+1, 1)- это что за конструкция?
sniknik (2009-02-07 13:14:00) [10]> Да меня самого запутали! Правильно я думал:
миллион записей из таблицы ради одного значения это правильно? ...
> Почему ADOQuery.RecordCount после @@IDENTITY > 1?
вот и я про то же, и Palladin в [3] наверняка это же имел в виду когда ссылку приводил, а ты выбрал оттуда не пойми что.
КирилЛ (2009-02-07 10:07:00) [11]> access (jet) не позволяет пакеты комманд, только по одной.
Спасибо!
> и кстати, почему из всех ответов выбран такой неудачный?
Да меня самого запутали! Правильно я думал:
> ... //создаю новую запись с помощью INSERT
> ADOQuery.Close;
> ADOQuery.SQL.Text:='SELECT @@IDENTITY FROM TableMain';
> ADOQuery.Open;
> num:=ADOQuery.Fields[0].AsInteger;
Вопросик на последок:
Почему ADOQuery.RecordCount после @@IDENTITY > 1?
Я так понял, что он должен возвращать только значение поля "автосчётчик"!
sniknik (2009-02-07 09:38:00) [12]> В чём ошибка?
access (jet) не позволяет пакеты комманд, только по одной.
и кстати, почему из всех ответов выбран такой неудачный? выбор не по содержанию, а по количеству кода в нем?
КирилЛ (2009-02-07 08:41:00) [13]> Anatoly Podgoretsky © (06.02.09 18:37) [5]
Проверил: ошибка - "Пропущен символ (;) в конструкции SQL"!
INSERT INTO MainTable (FIO, Nazv) VALUES (:FIO, :Nazv) Select @@indentity
пробовал разные варианты...
В чём ошибка?
Anatoly Podgoretsky (2009-02-06 18:37:00) [14]> КирилЛ (06.02.2009 16:12:02) [2]
А советы на практике проверять умеешь?
КирилЛ (2009-02-06 18:20:00) [15]> Palladin © (06.02.09 16:21) [3]
var
cm: TADOCommand;
ds: TADOQuery;
..
cm := TADOCommand.Create(nil);
cm.Connecton := ..
cm.CommandText := 'Insert ... '+' Select @@indentity';
ds := TADOQuery.Create(nil);
ds.recordset := cm.execute;
NewID := ds.recordset.Fields[0].AsInteger;
ds.Free;
cm.Free;
Вы про это? Обязательно нужен TADOCommand?
Или можно решить всё с одним ADOQuery?
Palladin (2009-02-06 16:21:00) [16]
> КирилЛ (06.02.09 16:12) [2]
почти
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1216374027&n=1
КирилЛ (2009-02-06 16:12:00) [17]> Anatoly Podgoretsky © (06.02.09 15:28) [1]
правильно ли я Вас понимаю:
... //создаю новую запись с помощью INSERT
ADOQuery.Close;
ADOQuery.SQL.Text:='SELECT @@IDENTITY FROM TableMain';
ADOQuery.Open;
num:=ADOQuery.Field[0].AsInteger;
так?
Anatoly Podgoretsky (2009-02-06 15:28:00) [18]> КирилЛ (06.02.2009 15:07:00) [0]
Иногда надо и документацию читать, а в ней сказано SELECT @@IDENTITY