Страница 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 можно организовать буду сильно удивлен
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