Страница 1 из 2

Update по таблице из подцепки

Добавлено: 13 янв 2003, 18:31
Frodo
Кто знает как сделать UPDATE по таблице при наложении ограничений из другой табл.

Например: Модифицируем BaseFin при условии, что тип платежного документа (бух.справки) PlPor.TIdK=10019

При формировании в Update подцепки как в Selec, а именно:

where ((plpor.nrec/==basefin.cplpor and 10019==plpor.tidk))

изменяются записи с BaseFin.cPlPor = 0, а не те которые есть в базе.

В LOT на конвертор нашел запись вида:
UPDATE SPSTEP
WHERE (( SPSTEP.cStepDoc == StepDoc.nRec AND
StepDoc.cBaseDoc == BaseDoc.nRec AND
WORD(1000)+BaseDoc.VidDoc == SpDocNal.TipDoc AND
SPSTEP.nRec /== SpDocNal.cSpDoc ))
SET SPSTEP.cGrNal := SpDocNal.cGrNal;

которая одним своим видом приводит в замешательство и полностью перечеркивает Гал.доку по формированию подцепок...

Не-е, так не выйдет

Добавлено: 13 янв 2003, 21:06
Den
Из Lot так не получится.Я с этим давным давно столкнулся.Нельзя так проапдейтить таблицу, нее являющейся корневой в подцепках.Обрати внимание, что в галактическом lot-е именно spstep - корневая.
По всей видимости это особенности галактического SQL.
Вот такие дела.Есть два выхода.
1.Бежать по basefin-у с таким же tidkgal.Что у plpor,что у basefin - tidkgal д.б. одинаковы.Иначе - проверку таблиц запускай.

2.Такой простенький update можно организовать c помощью VIp или fcom

В третьих если кто скажет как это из lot можно организовать буду сильно удивлен :o

Re: Не-е, так не выйдет

Добавлено: 14 янв 2003, 12:27
sth
точно.
запросом можно проапдейтить только корневую таблицу.

только вот я не понял почему запрос в конверторном лоте приводит в замешательство?

Re: Не-е, так не выйдет

Добавлено: 14 янв 2003, 13:37
Vitas
а так не получится?:
where ((basefin.cplpor/==plpor.nrec and 10019==plpor.tidk))

Re: Не-е, так не выйдет

Добавлено: 14 янв 2003, 14:12
Frodo
О замешательстве...
Не в плане дискуссии о док-ции, которая по моему мнению составленна таким образом, что не способствует нахождению ответов, а есть "отмазкой" для ее составителей.
Итак из нее самой:
п.2.5 Операторы модификации данных
...
Если CURRENT отсутствует, то модификация производится для всех записей, удовлетворяющих ограничениям из WHERE.
...
Однако ни слова про то, что WHERE не соответствует описанию приведенному выше в разделе 2.4.4.

Re: Не-е, так не выйдет

Добавлено: 14 янв 2003, 14:20
Frodo
where ((basefin.cplpor/==plpor.nrec and 10019==plpor.tidk))
хочет индекс NREC+TIDK.

Может здесь как-то ROOT прикрутить или сделать в 2-а этапа через PICKи?

VIP и FCOM конечно помогут. Но если такие действия нужно вставить в скрипт?

Re: Не-е, так не выйдет

Добавлено: 14 янв 2003, 14:39
peterGunn
а чем вас такой вариант не устраивает:
where(( 10019 == basefin.tipDoc and basefin.cplpor /== plpor.nRec )) ?

basefin.tipDoc = plpor.tidk в данном случае, на сколько я помню...

Re: Не-е, так не выйдет

Добавлено: 14 янв 2003, 14:39
Den
при использвании update Root во Where не прокатывает.

Re: Не-е, так не выйдет

Добавлено: 14 янв 2003, 14:47
Den
Так то оно пройдет, но все-таки, Peter Gunn, вопрос первоночальный не в этом состоял - как в lot умудриться проапдейтить некорневую таблицу ;)

Re: Не-е, так не выйдет

Добавлено: 14 янв 2003, 15:05
Deinis
Народ, а что может помешать выйти за рамки двойных скобок и попробовать:
update basefin where ((plpor.nrec/==basefin.cplpor))and plpor.tidk = 10019 set basefin.TidkGal:=___;

Re: Не-е, так не выйдет

Добавлено: 14 янв 2003, 15:27
Den
Да вообщем-то ничего...тока так тоже не будет работать

Re: Не-е, так не выйдет

Добавлено: 14 янв 2003, 16:17
Deinis
Нда.., действительно не выходит. Выходит только так:
update
basefin
where ((basefin.cplpor == plpor.nrec))and plpor.tidk = WORD('10')
set basefin.TidkGal:=10;

Re: Не-е, так не выйдет

Добавлено: 14 янв 2003, 17:32
Frodo
С BaseFin получилось хотя и медленно за счет перебора всего PlPor.
А вот как быть с SoprHoz, где нет прямой ссылки на PlPor, а только в нагрузку справа с TIPDOC (индекс SOPRHOZ02).

И вообще предлагаю обсудить возможность выработки общего метода...

Re: Не-е, так не выйдет

Добавлено: 14 янв 2003, 17:33
Vitas
where ((basefin.cplpor/==plpor.nrec and 10019==plpor.tidk))
хочет индекс NREC+TIDK.

ну это совсем просто:
where ((basefin.cplpor/==plpor.nrec and 10019==plpor.tidk (NoIndex)))

просто по таблицам индексы не поню, а лазить ломает :)

Re: Не-е, так не выйдет

Добавлено: 14 янв 2003, 18:49
Frodo
Проверил...

where ((basefin.cplpor/==plpor.nrec and 10019==plpor.tidk(NoIndex)))

Работает, но медленее чем

where ((basefin.cplpor/==plpor.nrec and (plpor.tidk=10019))

Предлагаю вернуться к вопросу о SoprHoz
;)