|
Переменная 1С в sql запросе. | ☑ | ||
---|---|---|---|---|
0
Menjoy
01.09.11
✎
23:09
|
Здравствуйте.
Сегодня столкнулся с проблемой в запросе, сам запрос рабочий. Видимо, проблема в переменной которая в него передается. Такой вот кусок кода есть в цикле: Если ДокТип = "11" Тогда Запрос3 = " |SELECT | DOC.SUMMA AS GOODS_SUM, | HDR.DATE_CREATE AS CR_DATE, | HDR.FULLNUMBER AS FULLNUMBER, | DSD.SUMMA_WORK AS WORKS_SUM, | ORG.FULLNAME AS ORG_NAME, | CL.FULLNAME AS CL_NAME, | CL.SHORTNAME AS CL_SHORTNAME, | CL.INN AS CL_INN, | CL.CLIENT_ID AS CL_ID, | TX.K_NDS AS K_NDS, | SUM(GI.COST1*GO.GOODS_COUNT) as COST |FROM DOCUMENT_OUT DOC | LEFT JOIN DOCUMENT_OUT_HEADER HDR ON (DOC.DOCUMENT_OUT_ID = HDR.DOCUMENT_OUT_ID) AND (HDR.DOCUMENT_TYPE_ID = 11) | LEFT JOIN DOCUMENT_SERVICE_DETAIL DSD ON (HDR.DOCUMENT_OUT_HEADER_ID = DSD.DOCUMENT_OUT_HEADER_ID) | LEFT JOIN ORGANIZATION ORG ON (DOC.ORGANIZATION_ID = ORG.ORGANIZATION_ID) | LEFT JOIN CLIENT CL ON (DOC.CLIENT_ID = CL.CLIENT_ID) | LEFT JOIN TAX TX ON (ORG.TAX_SCHEMES_ID = TX.TAX_SCHEMES_ID) | LEFT JOIN GOODS_OUT GO ON (DOC.DOCUMENT_OUT_ID = GO.DOCUMENT_OUT_ID) | LEFT JOIN GOODS_IN GI ON (GO.GOODS_IN_ID = GI.GOODS_IN_ID) |WHERE (DOC.document_out_id = '" + ДокИд + "') |GROUP BY CR_DATE, GOODS_SUM, FULLNUMBER, WORKS_SUM, ORG_NAME, CL_NAME, CL_SHORTNAME, CL_INN, CL_ID, K_NDS;"; Попытка Заказы = Connection.Execute(Запрос3); Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; Пока Заказы.EOF()=0 Цикл НоваяСтрока = ТЧ.Добавить(); НоваяСтрока.Документ = Заказы.Fields("FULLNUMBER").Value; НоваяСтрока.Клиент = Заказы.Fields("CL_NAME").Value; НоваяСтрока.КлиентНаименование = Заказы.Fields("CL_SHORTNAME").Value; НоваяСтрока.СуммаРабот = Заказы.Fields("WORKS_SUM").Value; НоваяСтрока.СуммаТоваров = Заказы.Fields("GOODS_SUM").Value; НоваяСтрока.Предприятие = Заказы.Fields("ORG_NAME").Value; НоваяСтрока.Дата = Заказы.Fields("CR_DATE").Value; НоваяСтрока.КоэфНДС = Заказы.Fields("K_NDS").Value; НоваяСтрока.Себестоимость = Заказы.Fields("COST").Value; НоваяСтрока.ТипДокумента = "ВКЗН"; НовыйКонтрагент = СписокКонтрагентов.Добавить(); НовыйКонтрагент.ФИО = Заказы.Fields("CL_NAME").Value; НовыйКонтрагент.ИД = Заказы.Fields("CL_ID").Value; НовыйКонтрагент.Наименование = Заказы.Fields("CL_SHORTNAME").Value; Заказы.MoveNext(); КонецЦикла; Заказы.Close(); КонецЕсли; Сам цикл представляет собой перечисление таблицы значений, где один столбец ДокТип, а второй ДокИд. При отладке данного куска кода цикл "Пока Заказы.EOF()=0 Цикл" не выполняется, т.е. Заказы.EOF() почему-то является истиной, хотя должно быть ложью, пока не перечислит все записи извлеченные из запроса. В чем может быть проблема? |
|||
1
Asmody
01.09.11
✎
23:16
|
а поймать отладчиком готовый текст запроса и проверить напрямую на сервере не судьба?
|
|||
2
bazvan
01.09.11
✎
23:18
|
(1) епт так это же ИТС, СП и книжки по снеговику читать надо. ты много го хочешь
|
|||
3
Menjoy
01.09.11
✎
23:19
|
(1) (2)
честно, я просто не знаю, как это можно выловить. И сам не понимаю, почему именно так не работает, ведь должно. |
|||
4
Asmody
01.09.11
✎
23:21
|
(3) точку остановки после Попытка поставить. ну или тупо перед выполнением запроса сделать Сообщить(Запрос3)
|
|||
5
Menjoy
01.09.11
✎
23:22
|
(4) да, уже с этим разобрался.
Вот что получается SELECT DOC.SUMMA AS GOODS_SUM, HDR.DATE_CREATE AS CR_DATE, HDR.FULLNUMBER AS FULLNUMBER, DSD.SUMMA_WORK AS WORKS_SUM, ORG.FULLNAME AS ORG_NAME, CL.FULLNAME AS CL_NAME, CL.SHORTNAME AS CL_SHORTNAME, CL.INN AS CL_INN, CL.CLIENT_ID AS CL_ID, TX.K_NDS AS K_NDS, SUM(GI.COST1*GO.GOODS_COUNT) as COST FROM DOCUMENT_OUT DOC LEFT JOIN DOCUMENT_OUT_HEADER HDR ON (DOC.DOCUMENT_OUT_ID = HDR.DOCUMENT_OUT_ID) AND (HDR.DOCUMENT_TYPE_ID = 11) LEFT JOIN DOCUMENT_SERVICE_DETAIL DSD ON (HDR.DOCUMENT_OUT_HEADER_ID = DSD.DOCUMENT_OUT_HEADER_ID) LEFT JOIN ORGANIZATION ORG ON (DOC.ORGANIZATION_ID = ORG.ORGANIZATION_ID) LEFT JOIN CLIENT CL ON (DOC.CLIENT_ID = CL.CLIENT_ID) LEFT JOIN TAX TX ON (ORG.TAX_SCHEMES_ID = TX.TAX_SCHEMES_ID) LEFT JOIN GOODS_OUT GO ON (DOC.DOCUMENT_OUT_ID = GO.DOCUMENT_OUT_ID) LEFT JOIN GOODS_IN GI ON (GO.GOODS_IN_ID = GI.GOODS_IN_ID) WHERE (DOC.document_out_id = '3 595') GROUP BY CR_DATE, GOODS_SUM, FULLNUMBER, WORKS_SUM, ORG_NAME, CL_NAME, CL_SHORTNAME, CL_INN, CL_ID, K_NDS; Но без этих ' ' запрос не хочет корректно выполняться. |
|||
6
Menjoy
01.09.11
✎
23:23
|
Кажется дело даже не в ' ', а в пробеле после первой цифры.
|
|||
7
Asmody
01.09.11
✎
23:28
|
(6) ДокИд - число? тогда см. Формат() в части разделитель разрядов
|
|||
8
Menjoy
01.09.11
✎
23:40
|
(7) И ДокИд и ДокТип являются числами, в табличной части уже поставил формат числа и разделитель убрал, чтобы число было "сплошное", но все равно в отладчике виден пробел.
Переменные ДокИд и ДокТип убрал и вместо них напрямую СписокДокументов.ДокИд и СписокДокументов.ДокТип поставил. Также в проверке типа документа кавычки у числа убрал. Все равно не то, проверку даже не проходит. |
|||
9
Menjoy
01.09.11
✎
23:44
|
(7) у обоих полей уже поставил значения "Формат" и "Формат редактирования", как ЧЦ=20; ЧГ=0
Т.е. длина 20 символов максимум и без разделителя между разрядами. Все равно пробел вставляет. |
|||
10
Asmody
01.09.11
✎
23:46
|
(9) функция Формат() тебе нужна
|
|||
11
Menjoy
02.09.11
✎
00:01
|
Воспользовался Формат().
Спасибо, теперь по этому все четко, но вод видимо сам запрос не рабочий, из-за: where (DOC.document_out_id = '20037') думаю, почему не работает. |
|||
12
Asmody
02.09.11
✎
00:04
|
(11) а в базе document_out_id какой тип имеет?
|
|||
13
Menjoy
02.09.11
✎
00:10
|
(12) выловил уже ошибку, поставил ЧРГ=0 и сами понимаете, мне начало ID выдавать 5тизначный, вместо 4ехзначного, просто 0 не заметил.
Теперь так: ДокТип = Формат(СписокДокументов.ДокТип, "ЧЦ=20; ЧРД=; ЧРГ=; ЧГ=0" ); ДокИд = Формат(СписокДокументов.ДокИд, "ЧЦ=20; ЧРД=; ЧРГ=; ЧГ=0" ); Вопрос, а почему установки, сделанные для значений колонок табличного поля не применяются к значениям?( Т.е. нужно вручную Формат() прописывать. |
|||
14
Asmody
02.09.11
✎
00:12
|
(13) потому что формат в колонках - это только для вывода. внутре оно как было числом, так числом и осталось
|
|||
15
Asmody
02.09.11
✎
00:13
|
вообще, достаточно было "ЧРГ=;"
|
|||
16
Menjoy
02.09.11
✎
00:14
|
(15) спасибо большое, что помогли.
В результате теперь знаю про Формат() и поправил кучу ошибок, над которых мучился час :) |
|||
17
Asmody
02.09.11
✎
00:17
|
(16) пожалуйста. метод "раздачи удочек" работает. вот сказал бы я сразу про Формат(,"ЧРГ=") - лишил бы удовольствия самостоятельно разобраться в проблеме
|
|||
18
Menjoy
02.09.11
✎
00:18
|
(17) согласен с вами, урок хороший преподали.
Вынужден учиться самостоятельно, потому и на форум обращаюсь. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |