|
v7: SQL запрос.Ошибка в INNER JOIN. | ☑ | ||
---|---|---|---|---|
0
Последняя_
Надежда 30.03.12
✎
10:27
|
Есть вот такой запрос, который формирует sql-запрос на выборку данных о документе Корректировочный счет-фактура, но не работает корректно. Если закомментировать INNER JOIN и поправить select - работает, но в дальнейшем ступорится. Явно что-то не так делаю...
Код: если ВидДокумента="КорректировочныйСчетФактура" тогда тзСтрДок = " |SELECT |"+?(етКоличество=0,"","$ДокС.Количество as Количество,") +" |"+?(етКоличествоДоИзменения=0,"","$ДокС.КоличествоДоИзменения as КоличествоДоИзменения,") +" |"+?(етЦенаДоИзменения=0,"","$ДокС.ЦенаДоИзменения as ЦенаДоИзменения,") +" |"+?(етСуммаДоИзменения=0,"","$ДокС.СуммаДоИзменения as СуммаДоИзменения,") +" |"+?(етСуммаНДСДоИзменения=0,"","$ДокС.СуммаНДСДоИзменения as СуммаНДСДоИзменения,") +" |"+?(етЦена=0,"","$ДокС.Цена as Цена,") +" |"+?(етСумма=0,"","$ДокС.Сумма as Сумма,") +" |"+?(етСтавкаНДС=0,"","$ДокС.СтавкаНДС as СтавкаНДС,") +" |"+?(етСуммаНДС=0,"","$ДокС.СуммаНДС as СуммаНДС,") +" |"+?(етНоменклатура=0,"","СпрНом.Code as Номенклатура,") +" | ДокС.IdDoc |FROM | $ДокументСтроки."+ВидДокумента+ " as ДокС |"+?(етНоменклатура=0,"","INNER JOIN $Справочник.Номенклатура as СпрНом ON СпрНом.ID=$ДокС.Наименование")+" |WHERE ДокС.IDDOC = '"+ИдДок+"' |"; |
|||
1
ДенисЧ
30.03.12
✎
10:29
|
мокажи результирующий запрос, а не эту мешанину условий...
|
|||
2
viktor_vv
30.03.12
✎
10:31
|
И в чем выражается некорректность работы ?
|
|||
3
viktor_vv
30.03.12
✎
10:31
|
И что значит "работает - но в дальнейшем ступорится" поподробнее?
|
|||
4
spock
30.03.12
✎
10:32
|
ну круто, ни чего не выводит чтоли? :)
СпрНом.ID=$ДокС.--->Наименование<--- |
|||
5
andrewks
30.03.12
✎
10:32
|
INNER JOIN $Справочник.Номенклатура as СпрНом ON СпрНом.ID=$ДокС.Наименование
мне одному это кажется странным? |
|||
6
andrewks
30.03.12
✎
10:33
|
(4) о, значит, не одному
|
|||
7
viktor_vv
30.03.12
✎
10:33
|
Все-таки есть вероятность, что там таки ссылка :).
|
|||
8
andrewks
30.03.12
✎
10:34
|
(7) оптимист!
|
|||
9
МихаилМ
30.03.12
✎
10:34
|
замените
СпрНом.ID=$ДокС.Наименование СпрНом.ID=$ДокС.номенклатура |
|||
10
Последняя_
Надежда 30.03.12
✎
10:34
|
SELECT
$ДокС.Количество as Количество, $ДокС.КоличествоДоИзменения as КоличествоДоИзменения, $ДокС.ЦенаДоИзменения as ЦенаДоИзменения, $ДокС.СуммаДоИзменения as СуммаДоИзменения, $ДокС.СуммаНДСДоИзменения as СуммаНДСДоИзменения, $ДокС.Цена as Цена, $ДокС.Сумма as Сумма, $ДокС.СтавкаНДС as СтавкаНДС, $ДокС.СуммаНДС as СуммаНДС, СпрНом.Code as Номенклатура, ДокС.IdDoc FROM $ДокументСтроки.КорректировочныйСчетФактура as ДокС INNER JOIN $Справочник.Номенклатура as СпрНом ON СпрНом.ID=$ДокС.Наименование WHERE ДокС.IDDOC = '"+ИдДок+"' |
|||
11
Последняя_
Надежда 30.03.12
✎
10:35
|
(5)(9) И так тоже не воспринимает. выводит пустую таблицу.
|
|||
12
andrewks
30.03.12
✎
10:35
|
конфа какая?
|
|||
13
Последняя_
Надежда 30.03.12
✎
10:36
|
рс.выполнитьинструкцию(тзСтрДок).ВыбратьСтроку();
{\\ПРЕДПРИНИМАТЕЛЬ\EXTFORMS\ЗАГРУЗКАДАННЫХ.ERT(1382)}: Meta name parser error: поле таблицы не найдено "$ДокС.Номенклатура" |
|||
14
Последняя_
Надежда 30.03.12
✎
10:37
|
+(13) у документа КорректировочныйСчетФактура нету реквизита Номенклатура!
|
|||
15
andrewks
30.03.12
✎
10:39
|
(14) вот именно об этом я и хотел тебе наменкуть
|
|||
16
Последняя_
Надежда 30.03.12
✎
10:39
|
(15) поэтому там и Наименование!
|
|||
17
el-gamberro
30.03.12
✎
10:40
|
откуда запрос взял?
номенклатура видимо в табличной части. так то тебе 2 джойна понадобятся |
|||
18
viktor_vv
30.03.12
✎
10:40
|
(8) Ну я с утра пытаюсь в позитивном русле думать :). Боюсь не получится :).
|
|||
19
el-gamberro
30.03.12
✎
10:41
|
офигеть девочка симпатичная :))
|
|||
20
andrewks
30.03.12
✎
10:43
|
(16) а там точно есть то, что тебе нужно?
|
|||
21
Последняя_
Надежда 30.03.12
✎
10:43
|
(3) без INNER JOIN работает, но передает в процедуру, которая обрабатывает номенклатуру, код из таблицы, а не представление объекта.
|
|||
22
viktor_vv
30.03.12
✎
10:44
|
А так
INNER JOIN $Справочник.Номенклатура as СпрНом ON СпрНом.Descr=$ДокС.Наименование") Правда там длина может не совпадать. Тогда так, потормознее. INNER JOIN $Справочник.Номенклатура as СпрНом ON RTrim(СпрНом.Descr)=RTrim($ДокС.Наименование)") |
|||
23
andrewks
30.03.12
✎
10:45
|
там рекв неопред. типа
|
|||
24
el-gamberro
30.03.12
✎
10:46
|
(23) Тогда INNER JOIN $Справочник.Номенклатура as СпрНом ON СпрНом.id = right($ДокС.Наименование,9)
|
|||
25
viktor_vv
30.03.12
✎
10:46
|
(21) Не может оно без join код номенклатуры выбрать.
|
|||
26
Последняя_
Надежда 30.03.12
✎
10:49
|
(22) пустая таблица
(24) тоже пустая таблица |
|||
27
Последняя_
Надежда 30.03.12
✎
10:51
|
(25) может, если в селекте ему явно задать вместо СпрНом.Code as Номенклатура - $ДокС.Наименование as Наименование,
|
|||
28
el-gamberro
30.03.12
✎
10:52
|
(27) так а в реквизите Наименование товар ставится?
|
|||
29
el-gamberro
30.03.12
✎
10:52
|
(27) это не поможет
|
|||
30
antoneus
30.03.12
✎
10:54
|
у реквизита Наименование тип какой?
|
|||
31
antoneus
30.03.12
✎
10:55
|
а, (23) не увидел
|
|||
32
antoneus
30.03.12
✎
10:56
|
если неопределенного типа тогда
ON СпрНом.id = substring($ДокС.Наименование, 7, 9) |
|||
33
el-gamberro
30.03.12
✎
10:58
|
(32) 1. чем это отличается от right($ДокС.Наименование,9)?
2. твой код работать не будет если тип неопределенный. а если просто справочник то будет |
|||
34
viktor_vv
30.03.12
✎
11:00
|
(33) Тем что так ИД получается для неопределенного типа. А так как в (24) это для Date_Time_IDDOC .
|
|||
35
viktor_vv
30.03.12
✎
11:02
|
Вот как выглядит в базе.
'B1 20 AL8 ' |
|||
36
antoneus
30.03.12
✎
11:02
|
(33)
1. читаем про то, как в таблицах хранятся значения неопределенного типа. 2. ну да, можно и нужно достраивать до полного id, я просто пнул в нужном направлении |
|||
37
el-gamberro
30.03.12
✎
11:03
|
(35) о как. мей би :) уже забыл
|
|||
38
Последняя_
Надежда 30.03.12
✎
11:04
|
(32) табличка заполнилась. показался код номенклатуры. но уже дальше обработка этого кода не пошла, но уже хоть какое-то движение )))
|
|||
39
viktor_vv
30.03.12
✎
11:05
|
Добавь в Select
|СпрНом.ID as [Номенклатура $Справочник.Номенклатура] или какой там вид справочника. |
|||
40
viktor_vv
30.03.12
✎
11:07
|
Теоретически можешь не джойнить, а в селект добавить
substring($ДокС.Наименование, 3, 9) as [Номенклатура $Справочник] |
|||
41
antoneus
30.03.12
✎
11:10
|
(40) а не ubstring($ДокС.Наименование, 3, 13) as [Номенклатура $Справочник] ?
|
|||
42
spock
30.03.12
✎
11:10
|
ну если уж блюсти все приличия, то сабстрингом можно огребстись. С некоторой большой вероятностью может быть, что в этом реквизите могут быть идентификаторы разных видов справочников, но с одним ID.
Отсюда вывод: - заменить inner на left (несколько, так как там наверняка еще ОСы и еще чего-нить); - использовать coalesce или case end для получения ТМЦ в select-листе; |
|||
43
viktor_vv
30.03.12
✎
11:12
|
(41) Да конечно.
|
|||
44
Последняя_
Надежда 30.03.12
✎
11:12
|
Спасибо Вам большое за substring($ДокС.Наименование,7,9) !!! оно как раз то, что нужно берет (вывод в таблице). Теперь дальше буду его отслеживать!
|
|||
45
viktor_vv
30.03.12
✎
11:15
|
(44) Ты таки добей добей вид, а то точно огребешь.
ON ($ВидСправочника39.Номенклатура+СпрНом.id) = substring($ДокС.Наименование, 3, 13) |
|||
46
viktor_vv
30.03.12
✎
11:15
|
(45)+ Это если тебе только номенклатура нужна.
|
|||
47
Последняя_
Надежда 30.03.12
✎
11:32
|
Так, с этим все понятно. Но есть еще одно НО!
Получили мы код Номенклатуры, обработали, так его же теперь еще надо обратно вернуть в неопределенный тип!!! |
|||
48
Последняя_
Надежда 30.03.12
✎
11:33
|
Чтобы в документ он стал
|
|||
49
Z1
30.03.12
✎
11:42
|
(48)
в поле select точно также $ВидСправочника39.Номенклатура+СпрНом.id или тебе надо из языка 1с Если там хранишь только номенклатуру только один спраочник то переходи с char(13) на char(9) и работать быстрее будет и писать легче и памяти меньше занимает |
|||
50
Последняя_
Надежда 30.03.12
✎
11:53
|
(49) не совсем поняла.
|
|||
51
Z1
30.03.12
✎
11:53
|
в 49 надо вместо 39 36 ( скопировал с поста выше)
т.е должно быть так $ВидСправочника36.Номенклатура+СпрНом.id |
|||
52
Z1
30.03.12
✎
11:53
|
(50) что именно ???
|
|||
53
Последняя_
Надежда 30.03.12
✎
11:55
|
это же не к последнему моему вопросу?
|
|||
54
Z1
30.03.12
✎
11:58
|
Tcли есть ТекТовар элемент спр.Номенклатыра то поле из 1с заполнить надо так
meta = СоздатьОбъект("MetaDataWork"); Док1.Наименование = Глоб_meta.ЗначениеВДлиннуюСтрокуБД(ТекТовар); |
|||
55
viktor_vv
30.03.12
✎
11:58
|
(47) Я вот не поймк никак, что вы с этим кодом делаете ? В чем обработка заключается. И что вам надо в документ вернуть ?
|
|||
56
Z1
30.03.12
✎
12:00
|
(55) наверное хранит в поле id справочника
почему нет ? |
|||
57
Последняя_
Надежда 30.03.12
✎
12:05
|
(47) в общем так. обработка по переносу документов из ТиС в Предприниматель. Суть ее: из Пред-ля запускаем обработку, подключаемся к ТиС, выбираем период и типы документов, которые нужно перенести. далее переносятся документы параллельно заполняя справочники позициями из документов, если таковых еще нет в Пред-ле. как-то так. Просто в этих Корр.счет-фактурах не номенклатура, а наименование с неопределенным типом, что портит всю картину.
хотя, сейчас появилась идея обойти это... попробую пока. |
|||
58
viktor_vv
30.03.12
✎
12:08
|
(57) У вас там не наименование с неопределенным типом, а реквизит с идентификатором "Наименование" в котором хранится ссылка на элемент в базе в формате для неопределенного типа значения.
|
|||
59
viktor_vv
30.03.12
✎
12:10
|
А заполнить значение неопределенного типа в документе можно, только сначала назначитьТип() для реквизита Наименование, потом просто присваивате этому реквизиту значение элемента справочника.
|
|||
60
Последняя_
Надежда 30.03.12
✎
12:12
|
(59) Спасибо! Вот этого сейчас как раз и не хватило! сама-то не додумалась бы )))
|
|||
61
viktor_vv
30.03.12
✎
12:16
|
(59) Хотя НазначитьТип() это для элементов формы вроде. Не помню точно сейчас.
|
|||
62
Последняя_
Надежда 30.03.12
✎
12:18
|
(61) да там много для чего эсть такой метод. Но что-то я не соображу куда его воткнуть )))))
|
|||
63
Последняя_
Надежда 30.03.12
✎
12:21
|
а никак по другому нельзя заполнить реквизит неопределенного типа значением неопределенного типа?
|
|||
64
viktor_vv
30.03.12
✎
12:22
|
Покажите где вы присваиваете значение реквизиту "наименование" документа.
|
|||
65
Последняя_
Надежда 30.03.12
✎
12:28
|
Если (Метаданные.Документ(Док.Вид()).РеквизитТабличнойЧасти("Наименование").Выбран()=1) и (спПарам.Получить("етНоменклатура")=1) Тогда
Док.Наименование = СтрДок.Наименование; КонецЕсли; |
|||
66
Последняя_
Надежда 30.03.12
✎
12:29
|
в данном случае в СтрДок.Наименование записан параметр неопределенного типа
|
|||
67
viktor_vv
30.03.12
✎
12:35
|
Док.НазначитьТип("Наименование","Справочник.Номенклатура") ;
Док.Наименование = СтрДок.Наименование; |
|||
68
viktor_vv
30.03.12
✎
12:36
|
И еще что покажет, если
Сообщить(""+СтрДок.Наименование); Док.НазначитьТип("Наименование","Справочник.Номенклатура") ; Док.Наименование = СтрДок.Наименование; |
|||
69
Последняя_
Надежда 30.03.12
✎
12:51
|
сделала 2 варианта:
1. когда в СтрДок.Наименование = "B1 2C L17 " (неопределенный тип) 2. когда в СтрДок.Наименование = "00027259" (код товара) В обоих случаях пусто! |
|||
70
viktor_vv
30.03.12
✎
13:05
|
Ну е мое.
Простой вариант. // только это вынести наверх перед циклом СпрНом = СоздатьОбъект("Справочник.Номенклатура"); // это уже Если СпрНом.НайтиПоКоду(СтрДок.Наименование,0) = 1 Тогда Док.НазначитьТип("Наименование","Справочник.Номенклатура") ; Док.Наименование = СпрНом.ТекущийЭлемент(); КонецЕсли ; |
|||
71
Последняя_
Надежда 30.03.12
✎
13:14
|
Ура! работает! Пойду тестить. (70) Спасибо огромнейшее!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |