Имя: Пароль:
1C
1C 7.7
v7: Прямой запрос
0 Масянька
 
22.10.14
15:05
День добрый!
Наваяла простенький прямой запрос:


НачПериод    = Константа.ДатаСлужебныхДокументов;
КонПериод = Последовательность.ОсновнаяПоследовательность.Получить();
    
RS = СоздатьОбъект("ODBCRecordset");
RS.УстБД1С();
ТекстЗапроса = "//{{ЗАПРОС()
|SELECT
|    Рег.IDDoc as [Док $Документ],
|    Рег.Номенклатура as [Товар $Справочник.Номенклатура],
|    Рег.КодОперации as [КодОперации $Перечисление.КодыОпераций]
|FROM
|   $Регистр.ПартииНаличие(:НачПериод, :КонПериод~,,,
|                            Товар = :ВыбЗнач,
|                            КодОперации = $Перечисление.КодыОпераций.Закупка
|                            OR Рег.КодОперации = $Перечисление.КодыОпераций.ВводОстатков) as Рег";

RS.УстановитьТекстовыйПараметр("ВыбЗнач",     ВыбЗнач);
RS.УстановитьТекстовыйПараметр("НачПериод", НачПериод);
RS.УстановитьТекстовыйПараметр("КонПериод", КонПериод);
    
ТабЗнач = СоздатьОбъект("ТаблицаЗначений");

RS.Отладка(1);

ТабЗнач = RS.ВыполнитьИнструкцию(ТекстЗапроса);

Сообщить("1 - " + ТипЗначенияСтр(ТабЗнач));


Почему ТипЗначенияСтр(ТабЗнач) возвращает число?
1 Масянька
 
22.10.14
15:05
Ногами не ПИНАТЬ!
Я только взялась за эти запросы...
2 Greeen
 
22.10.14
15:20
Так же вроде
Запрос.ВыполнитьИнструкцию(ТекстЗапроса,ТабЗнач,1);

А ВыполнитьИнструкцию - возвращает 1 если выполнилась,  или 0 если не ок
3 Ёпрст
 
гуру
22.10.14
15:22
очень забавный запрос
4 Ёпрст
 
гуру
22.10.14
15:23
Странно, вообще то должен матом ругаться, а тут даже что-то возвратил еще.
5 Serginio1
 
22.10.14
15:23
(2) Зависит от запроса
http://www.1cpp.ru/docum/icpp/html/ODBC.html#executestatement

Возвращает: тип: ТаблицаЗначений, СписокЗначений, ИндексированнаяТаблица или наследник от любого из них, Число. Объект с результатом запроса, или число - количество обработанных строк.

Описание: Выполняет SQL запрос, при ошибке парсинга или при ошибке на ODBC драйвере формируется исключение. Если запрос возвращает набор строк, метод возвращает объект с результатом запроса, если запрос не возвращает набор строк (не select, а DML или прочий) - возвращается количество обработанных строк. Если запрос содержит несколько SQL инструкций (multistatement batch), результаты возвращаются только от первой инструкции. Однако, на драйвер уходит весь текст запроса (По спецификации ODBC, будут ли выполнены остальные инструкции в пакете - зависит от драйвера. Для драйвера SQL Server они выполняются), остальные результаты игнорируются. Если запрос возвращает набор данных, и в наборе данных нет ни одной строки - это не является ошибкой. Если запрос не параметризированный - метод гарантированно закрывает курсор. Если передан ОбъектРезультатов типа ТаблицаЗначений или ИндексированнаяТаблица или наследник и параметр Очишать = 0, то колонки объекта и поля результата совмещаются по порядку. Если передан ОбъектРезультатов типа СписокЗначений, то значения из первого поля результата помещаются в значения списка. Если существует второе поле результата и оно типа Строка, то значения этого поля помещается в представление списка. Если существует третье поле результата и оно типа Число, то значения этого поля помещается в признак пометки значений.
6 Масянька
 
22.10.14
15:25
(3) Просила - НОГАМИ НЕ ПИНАТЬ!

Нужно для заданной номенклатуры вернуть последний док-т прихода.
(2) Попробую.
(4) Почему - ругаться?
7 Ёпрст
 
гуру
22.10.14
15:26
(6) потому, что х.ня написана :)

$Регистр.ПартииНаличие(бляблабла) - это что вообще ?!
8 Масянька
 
22.10.14
15:26
(2) Во... Возвращает таблицу... Но - пустую...
9 Serginio1
 
22.10.14
15:27
10 Ёпрст
 
гуру
22.10.14
15:28
11 Масянька
 
22.10.14
15:28
(7) Есть отчет, который выводит - номенклатуру (код, наименование и т. д.), остаток, себестоимость.
Вперилось увидеть последний приход.
12 Serginio1
 
22.10.14
15:29
Я так понимаю должен быть РегистрОбороты
а не Регистр
13 Ёпрст
 
гуру
22.10.14
15:31
(11) читааааааай!
Потом пробуй... и , консоль запросов пользуй.
Можешь о конструктор использовать, если ручонками тяжко писать
14 Масянька
 
22.10.14
15:31
(12) Я вижу (в окне сообщений) свою таблицу - RA328 (движения это).
15 Масянька
 
22.10.14
15:32
(10) Ту, которую на ночь - уже полдня читаю...

PS Ты чего злой такой сёдня?
16 Ёпрст
 
гуру
22.10.14
15:33
(15) плохо читаешь.

где ты про конструкцию в (7) прочитала ?
:)
17 Ёпрст
 
гуру
22.10.14
15:35
ну и , даже если это будет виртуальная табличка оборотов - один хрен, неправильная установка параметров виртуальной таблички
18 Ёпрст
 
гуру
22.10.14
15:36
+ не верная типизация в селект листе - будет ругаться - не найдено доп. типизирующего поля
19 Масянька
 
22.10.14
15:37
20 Масянька
 
22.10.14
15:39
(17) Мне даже обороты не нужны. Говорю же, нужен последний док-т прихода для заданной номенклатуры.
21 КонецЦикла
 
22.10.14
15:40
(14) Почитай про виртуальные таблицы...
А иначе убери поипень всю что в скобках, если просто нужно отобрать движения регистра
22 Ёпрст
 
гуру
22.10.14
15:40
(19) ну, я и грю- со чтением у тебя проблемы.
Там НИГДЕ нет кода как в (7)..
ибо всего 3 ВТ реализованы в 1cpp, запоминай:

РегистрОстатки
РегистрОбороты
РегистрОстаткиОбороты
23 Ёпрст
 
гуру
22.10.14
15:41
ну и смотри на (21)
24 Масянька
 
22.10.14
15:41
(21) (22) Блин! Вы ваще хотите, чтобы я билась в истерике?!

У меня такая каша в голове...
(21) Дай пример. Пожалуйста.
25 Serginio1
 
22.10.14
15:42
Вот конструктор запросов
http://www.1cpp.ru/forum/YaBB.pl?num=1148127139
26 Ёпрст
 
гуру
22.10.14
15:42
:)

в общем, читать-читать и еще раз читать.. как там у Ильича то было ?
27 Масянька
 
22.10.14
15:43
(25) Спасибо. У меня уже такой есть. Но все равно - СПАСИБО.
28 Ёпрст
 
гуру
22.10.14
15:44
(24) А ты думала, в сказку попала ?

в запросе убери всё что в скобках и сами скобки тоже убери.
Это для начала.
29 Serginio1
 
22.10.14
15:44
Чтобы не было каши почитай 10 там куча примеров.
Используй конструктор запросов. Экономит кучу времени.
30 Serginio1
 
22.10.14
15:45
(27) Тогда зачем делала запрос руками?
31 КонецЦикла
 
22.10.14
15:48
(24) select top 1 from $регистр.партии Партии (nolock)
left join _1sjourn Журнал (nolock)
on Партии.iddoc = Журнал.iddoc
where $Партии.Номенклатура = :ВыбНоменклатура
order by Журнал.date_time_iddoc desc
32 Ёпрст
 
гуру
22.10.14
15:50
ну в селекте нужно что-то выбрать еще, хоть *..
да и, ежели есть галка или отбор на движении, то журнальчик не нужен..но это так, к слову.
33 КонецЦикла
 
22.10.14
15:52
(32) Точняк
В типовых обычно нет быстрых движений
select top 1 iddoc
34 Масянька
 
22.10.14
15:53
(32) Вот про "галку" - мне не понятно: где ее искать?
(31) Спасибо огромное!
35 Serginio1
 
22.10.14
15:54
(29) В конструкторе запроса вкладка Выходная форма - расположение запроса модуль формы
36 Ёпрст
 
гуру
22.10.14
15:56
(34) открыть дерево ментаданных и посмотреть, стоит ли в свойствах регистра галка "быстрая обработка движений" или отбор на одном из измерений
37 Масянька
 
22.10.14
15:57
(36) Спасибо. Не стоит.
38 Ёпрст
 
гуру
22.10.14
15:58
если стоит, то в табличке RA регистра будут до поля и соединение с _1sjourn не требуется. Запрос будет выполнятся еще быстрее
39 Serginio1
 
22.10.14
15:58
(34) в кострукторе запроса можно кучу наваять
SELECT ПартииНаличиеОбороты.Номенклатура [Номенклатура $Справочник.Номенклатура]
    , ПартииНаличиеОбороты.КоличествоПриход
    , ПартииНаличиеОбороты.КоличествоРасход
FROM $РегистрОбороты.ПартииНаличие(:НачДата,
        :КонДата,
        Месяц,,,
        Номенклатура,
        Количество) AS ПартииНаличиеОбороты

Но что бы ваять нужно доки почитать
40 Масянька
 
22.10.14
16:00
(31) Вот что написала:

|select top 1 from $регистр.ПартииНаличие Партии (nolock)
|left join _1sjourn Журнал (nolock)
|on Партии.iddoc = Журнал.iddoc
|where $Партии.Номенклатура = :ВыбЗнач
|order by Журнал.date_time_iddoc desc";


Работает, не ругается, но таблица - пустая. Приход (если что) есть.
41 КонецЦикла
 
22.10.14
16:05
(40) ВыбЗнач - это элемент спр-ка номенклатура на форме?
Уточни этот нюанс...

Ну и select top IDDOC 1 from как правильно засек Епрст
42 КонецЦикла
 
22.10.14
16:07
пилять select top 1 IDDOC from
Про типизацию документа неопр. вида сама читай :)
43 Масянька
 
22.10.14
16:11
(41) Может быть и один элемент справочника (подбор обрабатывается), а может быть все элементы папки. В функцию (которая получает док-т прихода) передается один элемент справочника номенклатура.
44 Масянька
 
22.10.14
16:13
+ (43) Хотелось бы получить таблицу с док-ми. А там уже я выберу последний.
45 Масянька
 
22.10.14
16:18
(42) А тут - нужны только док-и прихода - ПоступлениеТМЦ и ВводОстатков. И куда в запросе их вставлять?
46 Serginio1
 
22.10.14
16:25
SELECT Журнал.IDDOC [Документ $Документ]
    , Журнал.IDDOCDEF Документ_вид
    , Журнал.DOCNO Документ_ном
    , NullIf(Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime), '17530101') Документ_дата
FROM _1SJOURN AS Журнал With (NOLOCK)
WHERE (Журнал.IDDOCDEF = $ВидДокумента.Реализация)
SELECT Журнал.IDDOC [Документ $Документ]
    , Журнал.IDDOCDEF Документ_вид
    , Журнал.DOCNO Документ_ном
    , NullIf(Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime), '17530101') Документ_дата
FROM _1SJOURN AS Журнал With (NOLOCK)
WHERE ((Журнал.IDDOCDEF = $ВидДокумента.ПоступлениеТМЦ )
       OR (Журнал.IDDOCDEF = $ВидДокумента.ВводОстатков))
    AND (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) >= :НачДата)
    AND (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) <= :КонДата)
    AND ((Журнал.CLOSED & 1) = 1)
47 Масянька
 
22.10.14
16:27
(46) Афигеть...
Пойду я... Разбираться...
Огромное спасибо.
48 Serginio1
 
22.10.14
16:28
Либо делай Union All bp lde[ pfghjcjd
SELECT Журнал.IDDOC [Документ $Документ]
    , Журнал.IDDOCDEF Документ_вид
    , Журнал.DOCNO Документ_ном
    , NullIf(Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime), '17530101') Документ_дата
    , $ПоступлениеТМЦСтроки.Номенклатура [Номенклатура $Справочник.Номенклатура]
    , $ПоступлениеТМЦСтроки.Количество Количество
FROM _1SJOURN AS Журнал With (NOLOCK)
    INNER JOIN $ДокументСтроки.ПоступлениеТМЦ AS ПоступлениеТМЦСтроки With (NOLOCK) ON Журнал.IDDOC = ПоступлениеТМЦСтроки.IDDOC
WHERE (Журнал.IDDOCDEF = $ВидДокумента.ПриходнаяТМЦ)
    AND (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) >= :НачДата)
    AND (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) <= :КонДата)
    AND ((Журнал.CLOSED & 1) = 1)
49 Serginio1
 
22.10.14
16:32
SELECT Журнал.IDDOC [Документ $Документ]
    , Журнал.IDDOCDEF Документ_вид
    , Журнал.DOCNO Документ_ном
    , NullIf(Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime), '17530101') Документ_дата
    , $ОстаткиТМЦ.Номенклатура [Номенклатура $Справочник.Номенклатура]
    , $ОстаткиТМЦ.Количество Количество
FROM _1SJOURN AS Журнал With (NOLOCK)
    INNER JOIN $Регистр.ОстаткиТМЦ AS ОстаткиТМЦ With (NOLOCK) ON Журнал.IDDOC = ОстаткиТМЦ.IDDOC
WHERE ((Журнал.IDDOCDEF = $ВидДокумента.ПоступлениеТМЦ )
       OR (Журнал.IDDOCDEF = $ВидДокумента.ВводОстатков))
    AND (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) >= :НачДата)
    AND (Cast(Left(Журнал.DATE_TIME_IDDOC, 8) AS datetime) <= :КонДата)
    AND ((Журнал.CLOSED & 1) = 1)
    AND (ОстаткиТМЦ.DEBKRED = 0)