powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Сохранение изменений
11 сообщений из 11, страница 1 из 1
Сохранение изменений
    #35056224
lo-pata
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Столкнулся с одной граблей. Запускаю элементарный справочник с парой полей всего. См. приложенную таблицу. Редактируется/удаляется/ добавляется все нормально и рузультаты изменений сохраняются нормально, кроме единственного случая. Про этот случай ниже. В чем прикол понять не могу.

При загрузке справочника создается локальная таблица идентичная той, кот. в базе:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SET DELETED ON
IF !USED('type')
	USE type IN  0  ORDER shortname
	CURSORSETPROP('buffering', 5 ,'type')
ENDIF 

SELECT * FROM type ORDER BY typename, shortname INTO TABLE tmpType

При выходе из справочника идет сохранение результатов:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SET DELETED OFF 
&&	delete 
SELECT typeID FROM tmpType WHERE DELETED() INTO CURSOR crsTD
DELETE FROM type WHERE typeID in (SELECT typeID FROM crsTD)
TABLEUPDATE(.t.,.t.,'type')

&&	insert 
INSERT INTO type (typename, shortname, dataadd, dataedit, uaddid, ueditid) ;
	SELECT typename, shortname, dataadd, dataedit, uaddid, ueditid FROM tmpType as TD ;
		WHERE !DELETED() AND TD.typeID NOT in (SELECT typeID FROM type WHERE !DELETED())
TABLEUPDATE(.t.,.t.,'type')

&&	update
UPDATE type SET type.typename=tmpType.typename, type.shortname=tmpType.shortname ;
	FROM tmpType ;
	WHERE type.typeid = tmpType.typeid AND !DELETED() AND ;
		(type.shortname#tmpType.shortname	OR type.typename#tmpType.typename)
TABLEUPDATE(.t.,.t.,'type')

USE IN crsTD

SET DELETED ON 

Если в таблице физически нет ни одной записи или есть хоть одна без пометки deleted - сохранение проходит на ура. В случае, если в таблице есть только удаленные записи - записи в базу не добавляются. Т.е. во временной локальной таблице они есть, но insert-ом не вставляются.

Чтобы понять, отбираются ли записи для вставки смотрел часть insert-а, где отбираются записи для вставки:
Код: plaintext
1.
SELECT typename, shortname, dataadd, dataedit, uaddid, ueditid FROM tmpType as TD ;
		WHERE !DELETED() AND TD.typeID NOT in (SELECT typeID FROM type WHERE !DELETED())

Данные выбираются правильно. Но не вставляются. Подозреваю, что дело может быть в этих !DELETED().

Где собака порылась, подскажите?
...
Рейтинг: 0 / 0
Сохранение изменений
    #35056326
lo-pata
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Странно, после того как вместо
Код: plaintext
SELECT typeID FROM type WHERE !DELETED()
в инсерте написал
Код: plaintext
SELECT typeID FROM type

Все заработало. Немного непонятно для меня.
...
Рейтинг: 0 / 0
Сохранение изменений
    #35056350
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фокс какой?
...
Рейтинг: 0 / 0
Сохранение изменений
    #35056357
lo-pata
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
9 sp1
...
Рейтинг: 0 / 0
Сохранение изменений
    #35056364
lo-pata
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот, кстати и сама таблица - не заметил, что сразу не прикрепилась.
...
Рейтинг: 0 / 0
Сохранение изменений
    #35056442
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При использовании нескольких таблиц-источников, как поведет себя функция Deleted() внутри команды Select-SQL заранее предсказать невозможно. Точнее, невозможно сказать, в каком алиасе он будет выполнять проверку признака удаленной записи.

Поэтому, в команде INSERT-SQL я бы посоветовал выбросить все условия по !Deleted(), а перед исполнением запроса просто вернуть настройку

SET DELETED ON

Ведь удаленные записи уже были удалены, значит, сохранять настройку OFF - нет необходимости.
...
Рейтинг: 0 / 0
Сохранение изменений
    #35056469
lo-pata
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ , почему-то о таком простом варианте - вернуть настройку после удаления - даже в голову не пришло. Но насчет алиаса - в этих же запросах ставил deleted() с указаниями конкретных алиасов, в которых они должны проверять условие - результат тот же.
...
Рейтинг: 0 / 0
Сохранение изменений
    #35056490
lo-pata
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мои рассуждения: пусть пока остается
Код: plaintext
SELECT typeID FROM type WHERE !DELETED('type')
Дальше три варианта:
1. В таблице вообще нет записей - возвращается 0 записей
2. В таблице только удаленные записи - результат тоже 0
3. Есть неудаленные записи - непустой набор

Но при этом какая разница между вариантами 1 и 2? В первом случае insert проходит, во втором нет?

Убираем условие:
Код: plaintext
SELECT typeID FROM type
Снова три варианта:
1. получаем 0 записей
2. получаем непустой набор
3. тоже непустой набор

Работает во всех трех случаях.

Почему?
...
Рейтинг: 0 / 0
Сохранение изменений
    #35056508
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lo-pataНо насчет алиаса - в этих же запросах ставил deleted() с указаниями конкретных алиасов, в которых они должны проверять условие - результат тот же.
Так нельзя. Это не будет работать.

Дело в том, что внутри команды Select-SQL таблицы открываются в других, скрытых, рабочих областях. Отличных от тех, которые видны разработчику.

Это значит, что функция Deleted() при явном указании алиаса будет всегда ссылаться только на одну запись указанной рабочей области. Вот на какую запись попали, в указанной рабочей области, то значение Deleted() и вернет для ВСЕХ записей выборки.

Поэтому, функцию Deleted() лучше в запросах вообще не использовать. А если и использовать, то только в самых простых. И ни в коем случае не указывать явно алиас таблицы.
...
Рейтинг: 0 / 0
Сохранение изменений
    #35056517
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE CURSOR test (f1 I)
APPEND BLANK
DELETE
APPEND BLANK

* Встаем на запись, помеченную как удаленная
select test
go  1 

* В выборке ничего нет
SELECT * FROM test WHERE !DELETED("test")

* Встаем на запись, НЕ помеченную как удаленная
select test
go  2 

* В выборке две записи
SELECT * FROM test WHERE !DELETED("test")
...
Рейтинг: 0 / 0
Сохранение изменений
    #35056526
lo-pata
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Насчет явного указания алиаса запомню. Спасибо.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Сохранение изменений
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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