powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Обновление курора
6 сообщений из 6, страница 1 из 1
Обновление курора
    #33015446
@Ken
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При добавлении записи в курсор, предыдущая запись исчезает, наверное это связано, с тем что курсор по умолчанию стоит в 3 буферизации, как перевести в 5 буферизацию, или это связано с др. причиной?
...
Рейтинг: 0 / 0
Обновление курора
    #33015586
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приведите код добавления записи.
...
Рейтинг: 0 / 0
Обновление курора
    #33015644
@Ken
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Local _t,_I_s,_II_s,_III_s,_dr,_bal,_lind_kol,_lind_kol_
_t=Val(Alltrim(This.Parent.oName.Text))
_I_s=Val(Alltrim(This.Parent.oName1.Text))
_II_s=Val(Alltrim(This.Parent.oName2.Text))
_III_s=Val(Alltrim(This.Parent.oName3.Text))
_dr=Val(Alltrim(This.Parent.oName4.Text))
_bal=Val(Alltrim(This.Parent.oName5.Text))
If This.Parent.lRI Then
Select "tcur_uch_kol"
Go Bottom
If Not Eof()
Calculate Max(tcur_uch_kol.ind_kol) To _lind_kol_
_lind_kol_=_lind_kol_+1
Else
_lind_kol_=1
Endif
Insert Into tcur_uch_kol (T,I_s,II_s,III_s,dr,bal,ind_kol) Values (_t,_I_s,_II_s,_III_s,_dr,_bal,_lind_kol_)
Else
_lind_kol=tcur_uch_kol.lind_kol
Update tcur_uch_kol Set tcur_uch_kol.T=_t,tcur_uch_kol.I_s=_I_s,tcur_uch_kol.II_s=_II_s,;
tcur_uch_kol.III_s=_III_s,tcur_uch_kol.dr=_dr, tcur_uch_kol.bal=_bal Where tcur_uch_kol.ind_kol=_lind_kol
Endif
Thisform.oParent.allrecgrid()
This.Parent.Release()
...
Рейтинг: 0 / 0
Обновление курора
    #33016119
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя лишний оператор ELSE после команды INSERT. Ты что-то пропустил в своем примере.

Но вообще-то, расчет MAX()+1 можно сократить до такого кода

Код: plaintext
1.
2.
Select tcur_uch_kol
Calculate Max(tcur_uch_kol.ind_kol) To _lind_kol_
_lind_kol_=_lind_kol_+ 1 
Дело в том, что если в таблице нет ни одной записи, то результат CALCULATE даст 0. Что тебе и нужно.

Впрочем, если tcur_uch_kol - это курсор, то можно еще проще

Код: plaintext
1.
2.
3.
Select tcur_uch_kol
SET ORDER TO  0  && если курсор имеет индекс
GO BOTTOM
_lind_kol_= tcur_uch_kol.ind_kol +  1 
Ведь команда INSERT вставляет записи физически в конец таблицы. А курсор может модифицировать только один клиент. Значит, последняя (физически) запись и будет содержать максимальное значение.
...
Рейтинг: 0 / 0
Обновление курора
    #33017759
@Ken
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ, спасибо за пояснения, для меня оказались весьма познавательными, А оператор ELSE после команды INSERT - для режима редактирования ( в зависимости от значения This.Parent.lRI .t. или .f.)
Но проблема все равно осталась.
Забыл дополнить, что курсор формируется после этой команды
SQLExec(Thisform.oSQL.nDescr,"{CALL procGetFullRow_uch_kol}","tCur_uch_kol")
В него необходимо добавлять записи. В книге Базияна прочитал что курсор после такой функции является немодифицируемым. Написал даже такую строчку
Select * From "tcur_uch_kol" Into Cursor "tcur_uch_kol" Readwrite NOFILTER
результат тот же, как быть?
...
Рейтинг: 0 / 0
Обновление курора
    #33018733
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
@KenВладимирМ, спасибо за пояснения, для меня оказались весьма познавательными, А оператор ELSE после команды INSERT - для режима редактирования ( в зависимости от значения This.Parent.lRI .t. или .f.)
Ты не понял, под словом "лишний" я подразумевал то, что у этого ELSE нет ни открывающего IF, ни закрывающего ENDIF. Синтаксическая ошибка.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
If This.Parent.lRI Then
	Select "tcur_uch_kol"
	Go Bottom
	If Not Eof()
		Calculate Max(tcur_uch_kol.ind_kol) To _lind_kol_
		_lind_kol_=_lind_kol_+ 1 
	Else
		_lind_kol_= 1 
	Endif
		Insert Into tcur_uch_kol ...
* Вот здесь "потерявшийся" ELSE
	Else
		_lind_kol=tcur_uch_kol.lind_kol
		Update tcur_uch_kol Set ...
Endif


@Ken
Забыл дополнить, что курсор формируется после этой команды
SQLExec(Thisform.oSQL.nDescr,"{CALL procGetFullRow_uch_kol}","tCur_uch_kol")
В него необходимо добавлять записи. В книге Базияна прочитал что курсор после такой функции является немодифицируемым.
Такой курсор всегда модифицируемый. Переоткрывать его не надо.

Правда, тут следует иметь в виду возможность совпадения имен и следить за текущей сессией данных.

Если таблица (курсор) уже открыта, то в команде INSERT будет использоваться алиас рабочей области. Если же таблица еще НЕ открыта, то команда INSERT попытается найти файл DBF с таким именем и сделать вставку в него.

Все это работает в пределах одной DataSession. Если у тебя происходит вызов в разных формах, которые имеют Private DataSession, то курсор, созданный в одной DataSession будет не видет в другой. Т.е. вполне возможно, что ты открыл 2 разных курсора с одним именем в разных DataSession и добавление ведется в разные курсоры.

Буферизация здесь не при чем. Ищи копию курсора. Или команду переоткрытия (повторный SQLExec() уничтожает предыдущий курсор и создает новый с тем же именем)

PS: Переключить режим буферизации можно так:
Код: plaintext
CursorSetProp("buffering", 5 ,"tcur_uch_kol")
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Обновление курора
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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