powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / new idob sql
11 сообщений из 11, страница 1 из 1
new idob sql
    #32548074
lesha_spb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Такой вопрос, заранее извиняюсь что кого то отвлекаю, понимаю что и сам мог бы разобраться:)
есть функция на фоксе
*************************
FUNCTION NewIdobSQL()
*************************
LOCAL r1
r1=""
SQLExe(handle,"SELECT NEXTID FROM STATES","a1")
GO TOP IN a1
r1=STR(VAL(a1->NEXTID) + 1,10)
SQLExec(handle,"UPDATE STATES SET STATES.NEXTID=?r1")

RETURN r1

Смысл я думаю понятен получаю уникальный id по всей БД. Но по моему здесь не все в порядке с блокировками. Нашел много чего чисто для фокса, но как то все громоздко:( Может можно отделаться малой кровью?
Сам пока склоняюсь к "sp_getapplock"
...
Рейтинг: 0 / 0
new idob sql
    #32548153
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это код к какой базе данных? Если речь идет о MS SQL, то можно все в одном "флаконе"

SQLExec(handle,"UPDATE STATES SET STATES.NEXTID= 1 + "+;
"(SELECT TOP 1 NextID FROM STATE ORDER BY NextID)")

Вообще, в команде SQLExec можно в качестве строки передать сформированную хранимую процедуру. В качестве разделителя команд выступает пробел.
...
Рейтинг: 0 / 0
new idob sql
    #32548187
lesha_spb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да речь о MS SQL
Все ок только немного не соображу как из такого составного sqlexec мне получить nextid(см. SQLExe(handle,"SELECT NEXTID FROM STATES","a1"))?
А если делать 2 sqlexec то как гарантировать что ничто не влезет между ними?
М.б. транзакция?
...
Рейтинг: 0 / 0
new idob sql
    #32548234
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, я же написал. В синтаксисе MS SQL это будет что-то вроде такого

Код: plaintext
1.
2.
UPDATE STATES 
	SET STATES.NEXTID=  1  +
	(SELECT TOP  1  NextID FROM STATE ORDER BY NextID DSEC)

Это я просто переписал в синтаксисе MS SQL то, что написано у тебя. Хотя, конечно, совершенно бессмысленная операция. Но ты уж сам адаптируй к тому, что тебе реально надо.
...
Рейтинг: 0 / 0
new idob sql
    #32548292
lesha_spb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
по моему мы говорим о разных вещах. в моем коде первый SQLExec возвращает текущий свободный id, с которым я потом работаю в фоксе(его возвращет функция), следующий exec обновляет значение на sql server, то что ты написал просто обновляет значение и как из такой составной команды получить значение в фокс ума не приложу. Если я что-то не понял поясни
...
Рейтинг: 0 / 0
new idob sql
    #32548317
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я переписал один-в-один твой исходный код одной командой. Смотри, что ты просишь выполнить MS SQL

SELECT NEXTID FROM STATES
NEXTID = NEXTID+1
UPDATE STATES SET STATES.NEXTID = NEXTID

Я не вижу здесь никаких функций. Ты просто считываешь значение поля NEXTID из первой попавшейся записи таблицы STATE, увеличиваешь его на 1 и присваиваешь полученное значение ВСЕМ записям таблицы STATE.

Ну, ладно, возможно, ты просто не все скопировал. Тогда делаешь примерно так:

Код: plaintext
1.
2.
3.
4.
DECLARE @NextID integer
SELECT @NextID = ...  -- как его получать, тебе видней
 
SET @Next = @NextID +  1 
UPDATE STATES SET STATES.NEXTID = @NextID

В FoxPro это все загоняешь в символьную переменную и отправляешь на сервер через SQLExec(). Фактически создаешь динамическую хранимую процедуру
...
Рейтинг: 0 / 0
new idob sql
    #32548375
lesha_spb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так по порядку в states всегда только одна запись(так задумано)
Делать все через ХП не хотел, т.к. функция NewIdobSql() находится НА ФОКСЕ и вызывается в нем же. И повторяюсь значение states->nextid мне НУЖНО получить в фокс!!!
В принципе можно работать с sql view states и использовать фоксовские блокировки, как я понимаю с remote view они работают также как с dbf
Ни один твой код не возвращает занчение states->nextid в фокс(в какую-нибудь переменную) Если конечно не считать перенос всего кода в ХП, но повторюсь такой вариант в дальнейшем предвещает кучу неудобств.
Не знаю как можно еще пояснить:)
...
Рейтинг: 0 / 0
new idob sql
    #32548678
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А какие тогда у тебя проблемы с блокировками? Тебе надо заблокировать таблицу State от момента чтения (SELECT), до момента обновления (UPDATE)? Тогда используй хинты в команде SELECT и все это дело окружи транзакцией.
...
Рейтинг: 0 / 0
new idob sql
    #32549399
lesha_spb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я и спрашивал как это поизящней сделать.
>Тогда используй хинты в команде SELECT и все это дело окружи транзакцией.
1)транзакция д.б. в фоксе или на sql server(т.е. sqlexec)?
2)что за хинты?
...
Рейтинг: 0 / 0
new idob sql
    #32549400
lesha_spb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я и спрашивал как это поизящней сделать.
>Тогда используй хинты в команде SELECT и все это дело окружи транзакцией.
1)транзакция д.б. в фоксе или на sql server(т.е. sqlexec)?
2)что за хинты?
...
Рейтинг: 0 / 0
new idob sql
    #32549404
Sjfx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
В принципе можно работать с sql view states и использовать фоксовские блокировки, как я понимаю с remote view они работают также как с dbf

Фоксовские блокировки для SQLServer-ных таблиц глубоко безразличны.

автор
Если конечно не считать перенос всего кода в ХП, но повторюсь такой вариант в дальнейшем предвещает кучу неудобств.

Интересно, где ты здесь ХП увидел ?

В твоём случае выйдет, что блокировка серверных объектов будет завязана на клиента, чего лучше избегать.
Пользуйся SQLServer-ным автоинкрементом (identity) и @@identity, либо:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
text to lcSqlCmd noshow
declare @rv int 
update states SET @rv=nextid= 1 +(SELECT nextid FROM states)
select @rv as rv
endtext
if SQLExec( 1 , lcSqlCmd, 'nId') # - 1 
  return nId.rv
else
...
endif
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / new idob sql
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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