powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как получить значение ключа от AutoInc при добавлении записи?
9 сообщений из 9, страница 1 из 1
Как получить значение ключа от AutoInc при добавлении записи?
    #33447952
Sgek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
База на VFP 9.0. Клиент на Delphi 7.0
Первичные ключи Integer(AutoInc).
Создается акт выполненных работ insert... Нужно связать существующие работы с этим актом, т.е. добавить ключ акта в работы.
Проблема: как получить значение ключа этого акта

Немного почитал по форуму, понял, что для этого лучше использовать генераторы, а не autoinc. Но вроде как поздно уже :(
В голову пришли 2 варианта:
1. Last
2. select max(rn_ )
Оба вроде кривоватые
...
Рейтинг: 0 / 0
Как получить значение ключа от AutoInc при добавлении записи?
    #33447961
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не уверен, что через ADO это будет работать, но попробуй функцию

GETAUTOINCVALUE()

Возвращает последнее созданное значение AutoIncrement в текущей или указанной DataSession. Правда, не конкретизирует по какой таблице.

А вообще-то, пока в FoxPro нет однозначного способа получить последнее созданное значение текущим пользователем в текущей таблице. Все способы работают с оговорками.

Исключением является прямое чтение в буфере таблицы (т.е. таблица должна находится в каком-либо режиме буферизации). Но сомневаюсь, что это применимо при работе через ADO.
...
Рейтинг: 0 / 0
Как получить значение ключа от AutoInc при добавлении записи?
    #33447969
Sgek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. А как правильно нужно было сделать?
...
Рейтинг: 0 / 0
Как получить значение ключа от AutoInc при добавлении записи?
    #33448665
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SgekА как правильно нужно было сделать?
При работе через ADO, самое правильное - это дополнительная функция вроде NewId(). Т.е. отказ от явного автоинкремента, как свойства поля.

А если работа идет в среде FoxPro, то логика будет примерно такая:

Таблица должна находится в режиме буферизации

После добавления новой записи в буфер таблицы, но до собственно сброса этого буфера, находим физически последнюю запись (Go Bottom) или запись с максимальным значением, но с отрицательным значением физического номера записи (Recno()<0)

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

В принципе, можно еще опираться на тот факт, что команда INSERT-SQL или APPEND BLANK автоматически устанавливает указатель записи на эту самую новую запись. Т.е. можно просто считать новое значение в текущей записи сразу после команды вставки. Но, здесь нет уверенности, что не будет проблем.
...
Рейтинг: 0 / 0
Как получить значение ключа от AutoInc при добавлении записи?
    #33448877
Sgek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо за подробный ответ.
Вспомнил про справку по Visual FoxPro OLE DB Provider. Там в разделе поддерживаемых функций нет ни NewId(), ни GETAUTOINCVALUE(). Или функцию нужно свою написать?
...
Рейтинг: 0 / 0
Как получить значение ключа от AutoInc при добавлении записи?
    #33449277
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SgekБольшое спасибо за подробный ответ.
Вспомнил про справку по Visual FoxPro OLE DB Provider. Там в разделе поддерживаемых функций нет ни NewId(), ни GETAUTOINCVALUE(). Или функцию нужно свою написать?
Я никогда не работал с таблицами FoxPro через OLE DB, поэтому ничего посоветовать не могу. Впрочем, возможно у Вас не самый свежий драйвер OLE DB. Для VFP9 есть свой драйвер.

Обычно, если какая-то функция не поддерживается явно, то пишут хранимую процедуру в базе данных, которая только и делает, что возвращает нужное значение и вызывают эту процедуру. Не знаю, насколько это поддерживается при работе через OLE DB.

NewId() - это не стандартная функция. Такой функции в FoxPro нет. Это просто наиболее распространенное название той функции, которую каждый пишет сам для генерации очередных значений.
...
Рейтинг: 0 / 0
Как получить значение ключа от AutoInc при добавлении записи?
    #33450743
Sgek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Использую драйвер для vfp 9.0

Написал процедурку

procedure last_id
local l_id
l_id=GETAUTOINCVALUE(0)
RETURN l_id

Если вместо функции цифирку пишу то возвращает, а так пишет ошибку "Field Return_value does not accept null values".
...
Рейтинг: 0 / 0
Как получить значение ключа от AutoInc при добавлении записи?
    #33450843
Maltsev Max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У тя функция .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.
...
Рейтинг: 0 / 0
Как получить значение ключа от AutoInc при добавлении записи?
    #33450972
Sgek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Получилось когда просто использовал функцию в запросе.
select * from operat where rn_operat=GETAUTOINCVALUE()
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как получить значение ключа от AutoInc при добавлении записи?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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