Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Сохранение изменений / 11 сообщений из 11, страница 1 из 1
11.01.2008, 15:21
    #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
11.01.2008, 15:40
    #35056326
lo-pata
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение изменений
Странно, после того как вместо
Код: plaintext
SELECT typeID FROM type WHERE !DELETED()
в инсерте написал
Код: plaintext
SELECT typeID FROM type

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

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

SET DELETED ON

Ведь удаленные записи уже были удалены, значит, сохранять настройку OFF - нет необходимости.
...
Рейтинг: 0 / 0
11.01.2008, 16:13
    #35056469
lo-pata
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение изменений
ВладимирМ , почему-то о таком простом варианте - вернуть настройку после удаления - даже в голову не пришло. Но насчет алиаса - в этих же запросах ставил deleted() с указаниями конкретных алиасов, в которых они должны проверять условие - результат тот же.
...
Рейтинг: 0 / 0
11.01.2008, 16:19
    #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
11.01.2008, 16:23
    #35056508
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение изменений
lo-pataНо насчет алиаса - в этих же запросах ставил deleted() с указаниями конкретных алиасов, в которых они должны проверять условие - результат тот же.
Так нельзя. Это не будет работать.

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

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

Поэтому, функцию Deleted() лучше в запросах вообще не использовать. А если и использовать, то только в самых простых. И ни в коем случае не указывать явно алиас таблицы.
...
Рейтинг: 0 / 0
11.01.2008, 16:28
    #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
11.01.2008, 16:32
    #35056526
lo-pata
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение изменений
Насчет явного указания алиаса запомню. Спасибо.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Сохранение изменений / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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