powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / заблокировать запись VFPOLEDB
3 сообщений из 3, страница 1 из 1
заблокировать запись VFPOLEDB
    #36905062
помогите. есть таблица tables в которой для каждой таблицы базы хранится последний использованный id записи, потому что в таблицах ключ не автоинкрементный.
мне нужно в одну из таблиц добавить запись, назовем эту таблицу "Z".
для этого надо:

- получить последний использованный id из tables для таблицы Z
- увеличить этот полученный id на 1
- добавить запись в Z с новым id
- записать новый id в tables

и вот чтобы это сделать, мне ж надо заблокировать запись в tables. на фокспро это сделано через RLOCK(), а в делфи через vfpoledb как мне поступить?

или как то можно в рамках одного обращения к бд сделать?
может так пойдет:
adoquery1.sql.add('SELECT gen_id FROM tables WHERE tablename="Z"');
adoquery1.sql.add('вот тут как то увеличить gen_id и записать его например в переменную new_gen_id');
adoquery1.sql.add('INSERT INTO Z (id) VALUES (new_gen_id)');
adoquery1.sql.add('UPDATE tables SET gen_id = new_gen_id WHERE tablename = "Z"');
adoquery1.sql.execsql;

как правильно сделать? структуру бд менять не могу.
...
Рейтинг: 0 / 0
заблокировать запись VFPOLEDB
    #36905116
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно и без блокировок. Идея заключается в том, что ты сначала считываешь текущее значение у нужной записи, а потом выполняешь модификацию у записи, которая имеет найденное значение.

Ну, в синтаксис Delphi сам переведешь, а в псевдо-коде это будет выглядеть так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
* Начинаем "бесконечный" цикл
do while  1 = 1 

    * Получаем текущее значение счетчика
    SELECT gen_id FROM tables WHERE tablename="Z" INTO CURSOR curLastValue

    * Запоминаем это значение в переменной
    old_gen_id = curLastValue.gen_id

    * Формируем новое значение
    new_gen_id = old_gen_id +  1 

    * Пытаемся увеличить значение счетчика
    UPDATE tables SET gen_id = new_gen_id WHERE tablename = "Z" and gen_id = old_gen_id

    * Если команда UPDATE обновила одну запись, завершем цикл
    * Если же нет, то повторяем цикл сначала
    IF _TALLY =  1 
        EXIT
    ENDIF

    * Перед уходом на следующий шаг цикла желательно сделать небольшую задержку
    =Inkey( 0 . 1 )
enddo

* Присваиваем новое значение создаваемой записи
INSERT INTO Z (id) VALUES (new_gen_id)

Основная "фишка" в небольшом "довеске" в команде UPDATE. Если за время между первым Select и командой Update другой пользователь успел изменить значение счетчика, то Update не найдет ту запись, которую надо изменить и мы уйдем на следующий шаг цикла
...
Рейтинг: 0 / 0
заблокировать запись VFPOLEDB
    #36905522
ВладимирМ,
спасибо, интересное решение, попробую
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / заблокировать запись VFPOLEDB
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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