Имя: Пароль:
1C
1C 7.7
v7: Помогите построить прямой UPDATE запрос к регистру
0 Pr0gLamer
 
22.03.12
14:50
Есть регистр партии товаров.В него добавил реквизит "Автор".Нужно этот реквизит обновить записями из этого же регистра.Раньше автора получали так:
Автор = Регистр.ПартииТоваров.ТекущийДокумент.РН.Автор;

UPDATE ПартииТоваров SET
   $ПартииТоваров.Автор[Автор $Справочник.Пользователи] = ...
Вместо троеточия хотелось бы записать это:
Регистр.ПартииТоваров.ТекущийДокумент.РН.Автор;
Как это сделать - мне непонятно.
Помогите пожалуйста дописать этот запрос либо составить новый
1 Mikeware
 
22.03.12
14:52
Напишите за меня?
2 vinogradъ
 
22.03.12
14:53
(0) типизация точно не нужна
3 Pr0gLamer
 
22.03.12
14:53
не пойму как это представить "Регистр.ПартииТоваров.ТекущийДокумент.РН.Автор"
конструктор такого не рисует
4 vinogradъ
 
22.03.12
14:55
соединение с _1sjourn?
5 Ёпрст
 
22.03.12
14:57
(0) с чего вдруг уверенность, что этот регистр заполнен записями, созданными именно РН ?
6 Ёпрст
 
22.03.12
14:58
ну и вот это:
UPDATE ПартииТоваров SET
  $ПартииТоваров.Автор[Автор $Справочник.Пользователи]

точно в топку
7 Pr0gLamer
 
22.03.12
14:58
(5) там много документов,мне бы понять как делать для одного,потом сделаю для всех
8 Кириллка
 
22.03.12
14:58
стрЗапрос = "
|UPDATE РегПартии SET
|    $РегПартии.Автор = Jrn.$ОбщийРеквизит.Автор
|FROM $Регистр.ПартииТоваров as РегПартии
|INNER JOIN _1sjourn as Jrn ON
|    Jrn.iddoc = РегПартии.iddoc
|    AND Jrn.iddocdef = $ВидДокумента.РН
|WHERE
|    $РегПартии.Автор != Jrn.$ОбщийРеквизит.Автор";

Но это если у рбщего реквизита Автор включен отбор. Если не включен - мне лень писать :)
9 Ёпрст
 
22.03.12
14:59
Автор - у тебя общий реквизит документа ?
Если да, то галка отбор на нём включена ?
10 Pr0gLamer
 
22.03.12
14:59
(9) Да,да
11 Pr0gLamer
 
22.03.12
15:01
(8) Спасибо
12 Ёпрст
 
22.03.12
15:01
(10) тогда выкинь из (8) вот это
|    AND Jrn.iddocdef = $ВидДокумента.РН

и усё..
13 Pr0gLamer
 
22.03.12
15:01
Спасибо ВСЕМ!
14 Кириллка
 
22.03.12
15:03
(12)ну хз, у человека явно сказано: Автор = Регистр.ПартииТоваров.ТекущийДокумент.!!!!!РН!!!!!.Автор
15 Ёпрст
 
22.03.12
15:04
(14) ;)
16 Pr0gLamer
 
22.03.12
15:06
Если интересно (14),то это в продолжении предыдущей темы
Неправильно объединяет поля в запросе.
на мысль о прямом запросе в которой (15) и натолкнул =)
17 Кириллка
 
22.03.12
15:08
(16)не, у меня сегодня лимит по добрым делам исчерпан :)
18 Mikeware
 
22.03.12
15:08
(17) а авансом не канает? ;-)
19 Кириллка
 
22.03.12
15:10
(18)нее, Шемякин вчера авансы на год вперед выбрал :)
20 Pr0gLamer
 
22.03.12
15:31
Автор  = Регистр.ПартииТоваров.ТекущийДокумент.Скидка.ДокументОснование.Автор;

стрЗапрос = "
|UPDATE РегПартии SET
|    $РегПартии.Автор = Jrn.$ВидДокумента.Скидка.ДокументОснование.Автор;
|FROM $Регистр.ПартииТоваров as РегПартии
|INNER JOIN _1sjourn as Jrn ON
|    Jrn.iddoc = РегПартии.iddoc
|    AND Jrn.iddocdef = $ВидДокумента.Скидка
|WHERE
|    $РегПартии.Автор != Jrn.$ВидДокумента.Скидка.ДокументОснование.Автор";

Скажите пожалуйста,я правильно преобразовал? Понимаю, что наглость,но всё-же.
21 Ёпрст
 
22.03.12
15:32
(20) блин, смотри (12)

будет для всех видов документов сразу.
Выполнишь 1 раз и всё.
22 Ёпрст
 
22.03.12
15:33
и вот это:

$РегПартии.Автор = Jrn.$ВидДокумента.Скидка.ДокументОснование.Автор;

как бэ помягче сказать - бред сумашедшего
:)
23 Pr0gLamer
 
22.03.12
15:34
(21)в том то и дело,что нужно для всех докумнетов так,а для скидки по-другому
24 МихаилМ
 
22.03.12
15:37
ну и храните автора в документе

зачем же в расчетном объекте.

никчемная денормализация.
25 Ёпрст
 
22.03.12
15:40
(23) воткни

в (8)

|    AND Jrn.iddocdef <> $ВидДокумента.Скидка

будет для всех, окромя скидки
26 acsent
 
22.03.12
15:41
(22) а в 8 можно
27 Pr0gLamer
 
22.03.12
15:43
(25) да,это понятно,но нужно записать в регистр авторов документов,а вместо автора скидки - автора основания для скидки
28 Ёпрст
 
22.03.12
15:43
(26) че можно ?
29 acsent
 
22.03.12
15:44
(28) не  поверишь - все. и даже минет делает ))
30 Ёпрст
 
22.03.12
15:44
(27) какие виды документов могут быть основанием для товей скидки ?
31 Ёпрст
 
22.03.12
15:45
(29) а ёпта, ты про снеговика шо ли ?
це понятно
32 Pr0gLamer
 
22.03.12
15:45
(30) пока только РН,но на данный момент этого будет достаточно
33 Ёпрст
 
22.03.12
15:51
(32) тип ДокОснование - <Документ> без вида ?
34 Pr0gLamer
 
22.03.12
15:52
ДокОснование - РН
35 Pr0gLamer
 
22.03.12
15:53
стрЗапрос = "
|UPDATE РегПартии SET
|    $РегПартии.Автор = Jrn.$ОбщийРеквизит.Автор;
|FROM $Регистр.ПартииТоваров as РегПартии
|INNER JOIN _1sjourn as Jrn ON
|    Jrn.iddoc = РегПартии.iddoc
|    AND Jrn.iddocdef = $ВидДокумента.РН
|    AND Jrn.$ВидДокумента.Скидка.ДокументОнование.iddoc = Jrn.$ВидДокумента.РН.iddoc
|WHERE
|    $РегПартии.Автор != Jrn.$ОбщийРеквизит.Автор;

о5 бред?
36 Ёпрст
 
22.03.12
16:08
тип того:

|UPDATE РегПартии SET
|  
|$РегПартии.Автор = coalesce(
|    case when  Jrn.iddocdef <> $ВидДокумента.Скидка then
|       Jrn.$ОбщийРеквизит.Автор
|    else
|        (select Ж.$ОбщийРеквизит.Автор from _1sjourn as Ж where Ж.iddoc = substring($Д.ДокОснование,5,9))
|    end,$ПустойИД)
|FROM $Регистр.ПартииТоваров as РегПартии
|INNER JOIN _1sjourn as Jrn ON
|    Jrn.iddoc = РегПартии.iddoc
|left join $Документ.Скидка as Д on Д.iddoc = Jrn.iddoc
37 Ёпрст
 
22.03.12
16:12
(34) тогда в (36) выкини substring, оставь так  where Ж.iddoc = $Д.ДокОснование)
38 Ёпрст
 
22.03.12
16:12
в общем, развлекайся
39 МихаилМ
 
22.03.12
16:16
+(38)
на копии
40 Pr0gLamer
 
22.03.12
16:19
Дякую вам,товарищи альтруисты,особенно (Ёпрст4)
41 Pr0gLamer
 
13.04.12
16:57
апаю тему ибо ошибка
 State 23000, native 515, message [Microsoft][ODBC SQL Server Driver][SQL Server]Не удалось вставить значение NULL в столбец "SP7209", таблицы "test_perf.dbo.RA277"; в столбце запрещены значения NULL. Ошибка в UPDATE.

Вот запрос
|UPDATE РегПартии SET
|$РегПартии.Автор =
|        (select Ж.$ОбщийРеквизит.Автор from _1sjourn as Ж where Ж.iddoc = $Д.ДокументОснование)
|FROM $Регистр.ПартииТоваров as РегПартии
|INNER JOIN _1sjourn as Jrn ON
|    Jrn.iddoc = РегПартии.iddoc    
|LEFT JOIN $Документ.Скидка as Д ON
|     Д.iddoc = Jrn.iddoc";

буду признателен,если укажете на ошибку
42 vinogradъ
 
13.04.12
17:04
посмотри сначала что select выберет этим запросом
43 Pr0gLamer
 
13.04.12
17:07
select будет пустой,т.к. поля автор у регистра раньше не было
44 Ёпрст
 
13.04.12
17:08
(43) :)
45 Ёпрст
 
13.04.12
17:10
ээх..
у тя ж запрос не верный..
Как в (36) не судьба была написать ?
46 vinogradъ
 
13.04.12
17:10
(43) выбери не автора из регистра, а то, что записать в него хочешь
47 Ёпрст
 
13.04.12
17:12
с поправкой, что
ДокОснование - реквизит типа "Документ.Скидка", а не "<Документ>" без вида:

|UPDATE РегПартии SET
|  
|$РегПартии.Автор = coalesce(
|    case when  Jrn.iddocdef <> $ВидДокумента.Скидка then
|       Jrn.$ОбщийРеквизит.Автор
|    else
|        (select Ж.$ОбщийРеквизит.Автор from _1sjourn as Ж where Ж.iddoc = $Д.ДокОснование)
|    end,$ПустойИД)
|FROM $Регистр.ПартииТоваров as РегПартии
|INNER JOIN _1sjourn as Jrn ON
|    Jrn.iddoc = РегПартии.iddoc
|left join $Документ.Скидка as Д on Д.iddoc = Jrn.iddoc
48 Pr0gLamer
 
13.04.12
17:17
запрос выполнился,а поле автор не заполнилось
49 Ёпрст
 
13.04.12
17:21
что возвращает это:

|select
|  coalesce(
|    case when  Jrn.iddocdef <> $ВидДокумента.Скидка then
|       Jrn.$ОбщийРеквизит.Автор
|    else
|        (select Ж.$ОбщийРеквизит.Автор from _1sjourn as Ж where Ж.iddoc = $Д.ДокОснование)
|    end,$ПустойИД) Автор
|FROM $Регистр.ПартииТоваров as РегПартии
|INNER JOIN _1sjourn as Jrn ON
|    Jrn.iddoc = РегПартии.iddoc
|left join $Документ.Скидка as Д on Д.iddoc = Jrn.iddoc
50 Pr0gLamer
 
13.04.12
17:21
вру.у документа скидка не заполнилось, у расходных заполнилось
51 Pr0gLamer
 
13.04.12
17:23
(49)
вернуло что-то такое
1R
2M
...
52 Ёпрст
 
13.04.12
17:23
очень хорошо..

Какой тип имеет реквизит ДокОснование в документе Скидка в пофигураторе  ?
53 Ёпрст
 
13.04.12
17:24
усложним, что возвращает это ?
54 Pr0gLamer
 
13.04.12
17:25
(52)
без меня поменяли да "Документ"
была расходная((
сейчас еще раз попробую полную версию
55 Ёпрст
 
13.04.12
17:26
|select
|  (select Ж.$ОбщийРеквизит.Автор from _1sjourn as Ж where Ж.iddoc = $Д.ДокОснование)
|    end,$ПустойИД) Автор1
|  ,(select Ж.$ОбщийРеквизит.Автор from _1sjourn as Ж where Ж.iddoc = substring($Д.ДокОснование,5,9))
|    end,$ПустойИД) Автор2

|FROM $Регистр.ПартииТоваров as РегПартии
|INNER JOIN _1sjourn as Jrn ON
|    Jrn.iddoc = РегПартии.iddoc
|inner join $Документ.Скидка as Д on Д.iddoc = Jrn.iddoc
56 Ёпрст
 
13.04.12
17:26
(54) тогда выполняй (36) и всё
57 Pr0gLamer
 
13.04.12
17:28
(56)сработало.еще раз спасибо.
а можно глупый вопрос?долго ты учился такие запросы писать?
58 Ёпрст
 
13.04.12
17:29
(57) пару дней, наверное..
59 Ёпрст
 
13.04.12
17:29
если не меньше
60 Ёпрст
 
13.04.12
17:30
заходишь сюда
http://www.1cpp.ru/forum/YaBB.pl?board=query

смотришь на FAQ и читаешь статью.. всё собственно.
Всё остальное есть в BOL
61 Pr0gLamer
 
13.04.12
17:30
|$РегПартии.Автор = coalesce(
|    case when  Jrn.iddocdef <> $ВидДокумента.Скидка OR
Jrn.iddocdef <> $ВидДокумента.ПриходнаяВозвратная
then
|       Jrn.$ОбщийРеквизит.Автор


а так будет работать?
62 Ёпрст
 
13.04.12
17:31
(61) будет
63 Ёпрст
 
13.04.12
17:32
можешь и не апдейтить, если сумневаешься, а просто select делать - если усё верно, тогда update