|
|
|
Как получить значение ключа от AutoInc при добавлении записи?
|
|||
|---|---|---|---|
|
#18+
База на VFP 9.0. Клиент на Delphi 7.0 Первичные ключи Integer(AutoInc). Создается акт выполненных работ insert... Нужно связать существующие работы с этим актом, т.е. добавить ключ акта в работы. Проблема: как получить значение ключа этого акта Немного почитал по форуму, понял, что для этого лучше использовать генераторы, а не autoinc. Но вроде как поздно уже :( В голову пришли 2 варианта: 1. Last 2. select max(rn_ ) Оба вроде кривоватые ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2005, 00:12 |
|
||
|
Как получить значение ключа от AutoInc при добавлении записи?
|
|||
|---|---|---|---|
|
#18+
Не уверен, что через ADO это будет работать, но попробуй функцию GETAUTOINCVALUE() Возвращает последнее созданное значение AutoIncrement в текущей или указанной DataSession. Правда, не конкретизирует по какой таблице. А вообще-то, пока в FoxPro нет однозначного способа получить последнее созданное значение текущим пользователем в текущей таблице. Все способы работают с оговорками. Исключением является прямое чтение в буфере таблицы (т.е. таблица должна находится в каком-либо режиме буферизации). Но сомневаюсь, что это применимо при работе через ADO. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2005, 00:24 |
|
||
|
Как получить значение ключа от AutoInc при добавлении записи?
|
|||
|---|---|---|---|
|
#18+
Спасибо. А как правильно нужно было сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2005, 00:38 |
|
||
|
Как получить значение ключа от AutoInc при добавлении записи?
|
|||
|---|---|---|---|
|
#18+
SgekА как правильно нужно было сделать? При работе через ADO, самое правильное - это дополнительная функция вроде NewId(). Т.е. отказ от явного автоинкремента, как свойства поля. А если работа идет в среде FoxPro, то логика будет примерно такая: Таблица должна находится в режиме буферизации После добавления новой записи в буфер таблицы, но до собственно сброса этого буфера, находим физически последнюю запись (Go Bottom) или запись с максимальным значением, но с отрицательным значением физического номера записи (Recno()<0) Принципиальное отличие заключается в том, что поиск происходит в буфере таблицы. А буфер, по самой своей природе - это объект существующий только и исключительно у данного клиента. Т.е. просто физически невозможно "увидеть" записи созданные другим пользователем. Значит, нет возможных конфликтов совместного доступа. В принципе, можно еще опираться на тот факт, что команда INSERT-SQL или APPEND BLANK автоматически устанавливает указатель записи на эту самую новую запись. Т.е. можно просто считать новое значение в текущей записи сразу после команды вставки. Но, здесь нет уверенности, что не будет проблем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2005, 11:36 |
|
||
|
Как получить значение ключа от AutoInc при добавлении записи?
|
|||
|---|---|---|---|
|
#18+
Большое спасибо за подробный ответ. Вспомнил про справку по Visual FoxPro OLE DB Provider. Там в разделе поддерживаемых функций нет ни NewId(), ни GETAUTOINCVALUE(). Или функцию нужно свою написать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2005, 12:18 |
|
||
|
Как получить значение ключа от AutoInc при добавлении записи?
|
|||
|---|---|---|---|
|
#18+
SgekБольшое спасибо за подробный ответ. Вспомнил про справку по Visual FoxPro OLE DB Provider. Там в разделе поддерживаемых функций нет ни NewId(), ни GETAUTOINCVALUE(). Или функцию нужно свою написать? Я никогда не работал с таблицами FoxPro через OLE DB, поэтому ничего посоветовать не могу. Впрочем, возможно у Вас не самый свежий драйвер OLE DB. Для VFP9 есть свой драйвер. Обычно, если какая-то функция не поддерживается явно, то пишут хранимую процедуру в базе данных, которая только и делает, что возвращает нужное значение и вызывают эту процедуру. Не знаю, насколько это поддерживается при работе через OLE DB. NewId() - это не стандартная функция. Такой функции в FoxPro нет. Это просто наиболее распространенное название той функции, которую каждый пишет сам для генерации очередных значений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2005, 13:58 |
|
||
|
Как получить значение ключа от AutoInc при добавлении записи?
|
|||
|---|---|---|---|
|
#18+
Использую драйвер для vfp 9.0 Написал процедурку procedure last_id local l_id l_id=GETAUTOINCVALUE(0) RETURN l_id Если вместо функции цифирку пишу то возвращает, а так пишет ошибку "Field Return_value does not accept null values". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2005, 01:16 |
|
||
|
Как получить значение ключа от AutoInc при добавлении записи?
|
|||
|---|---|---|---|
|
#18+
У тя функция .NULL. возвращает. Попробуй функцию вызвать без параметра. Из Хелпа: 0 Specifies that the last autoincremented field value returned is derived from the current scope (function, method, procedure). Use this to prevent events outside of that current code block, such as ON KEY LABEL, from executing code that could alter the value unexpectedly. Return Value Numeric data type. The value returned by GETAUTOINCVALUE( ) is the last autoincrement value generated, even if a field was not successfully updated with the autoincrement value. .NULL. is returned if an autoincrement value hasn't yet been generated for a data session. For example, .NULL. is returned if a data session is opened and no updates have occurred. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2005, 07:34 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33450972&tid=1592731]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
146ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 456ms |

| 0 / 0 |
