Имя: Пароль:
1C
1C 7.7
v7: 1с++. Код от Fez-а, возвращет пустую таблицу
0 palpetrovich
 
13.02.14
11:25
Код от Fez-а, возвращет пустую таблицу. 1CPP.dll - в БИН-е и в КаталогеИБ. Ошибок не выдает

Перем RecordSet;

Процедура ПриОткрытии()
    ЗагрузитьВнешнююКомпоненту("1CPP.dll");
    DataBase = СоздатьОбъект("ODBCDatabase");
    DataBase.Attach1C();
    RecordSet = СоздатьОбъект("ODBCRecordSet");
    RecordSet.SetDatabase(DataBase);
КонецПроцедуры // ПриОткрытии

Функция глПолучитьВыборку(ODBCRecordset = "",Текст, Отладка=0, Очищать = 1, ТЗ2 = "")
    Если ПустоеЗначение(ODBCRecordset) = 1 Тогда
        ODBCRecordset = Recordset;
    КонецЕсли;
    ODBCRecordset.Отладка(Отладка);
    Если ODBCRecordset.Открыть(Текст) = 0 Тогда
        Ошибка = ODBCRecordset.ПолучитьОписаниеОшибки();
        Если ПустоеЗначение(Ошибка) = 0 Тогда
            Сообщить(Ошибка);
        КонецЕсли;
    КонецЕсли;
    Если ПустоеЗначение(ТЗ2) = 1 Тогда
        ТЗ2 = СоздатьОбъект("ТаблицаЗначений");
    КонецЕсли;
    ODBCRecordset.ПолучитьРезультатыВ_ТЗ(ТЗ2, Очищать);
    ODBCRecordset.Закрыть();
    Возврат ТЗ2;
КонецФункции

//======================================================================
Процедура Сформировать()
    Текст = "
    |SELECT * FROM $Справочник.Номенклатура";
    ТЗ = глПолучитьВыборку(, Текст);
    ТЗ.ВыбратьСтроку();    
КонецПроцедуры
1 Avganec
 
13.02.14
11:27
(0) это точно v8?
2 Ёпрст
 
13.02.14
11:27
(0)
выкинуть ПолучитьРезультатыВ_ТЗ, пользовать
ВыполнитьИнструкцию, наслаждаться.
3 palpetrovich
 
13.02.14
11:31
прошу прощения, конечно это в7
(2) пробую
4 Ёпрст
 
13.02.14
11:33
на вот, развлекайся

Процедура Сформировать()
   Попытка
       Запрос= СоздатьОбъект("ODBCRecordSet");
   Исключение
     Если   ЗагрузитьВнешнююКомпоненту("1CPP.dll")=0 Тогда
           Предупреждение("1cpp арбайтен");
           Возврат;
     КонецЕсли;
     Запрос= СоздатьОбъект("ODBCRecordSet");
   КонецПопытки
    ТекстЗапроса = "
    |SELECT * FROM $Справочник.Номенклатура";
    ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
    ТЗ.ВыбратьСтроку();    
КонецПроцедуры
5 palpetrovich
 
13.02.14
11:36
(2) не получается наслаждаться - Значение не представляет агрегатный объект (ВыбратьСтроку)
(4)  База данных не установлена
6 Ёпрст
 
13.02.14
11:38
(5) 1cpp какой версии хоть ?
У тя хоть скуль ?
7 palpetrovich
 
13.02.14
11:39
(6) не, файловая :(
.наплевать и забыть?
8 palpetrovich
 
13.02.14
11:40
+(7) смотреть в сторону  1sqlite ?
9 palpetrovich
 
13.02.14
11:42
версия 1cPP - 3.2.2.0
10 Ёпрст
 
13.02.14
11:43
(7) :))
а че ты хочешь тогда ?
ODBCRecordSet предназначен для скуля..
Тебе, либо смотреть в сторону оледб либо в сторону 1sqlite
11 Ёпрст
 
13.02.14
11:45
+10
первое работает шустрее при правильном тексте запроса с включением индексов + позволяет делать инсерт/апдейт/делете + запрос к сторонней базе

второе, позволяет писать более простой текст запроса (не надо писать огромные выражения для попадания в индекс) + имеет удобные методы для укладки ТЗ + свои специфические функции + есть поставщик данных для табличного поля.
12 Ёпрст
 
13.02.14
11:47
+ запрос к оледб в монопольном режиме будет работать, только с заплаткой от hogik, либо с правленным провайдером от ужаста,

второе работает и так + позволяет хранить данные в своей базе sqlite..
13 palpetrovich
 
13.02.14
11:50
(12) спасибо!
14 Ёпрст
 
13.02.14
12:07
пример нннннннада ?
15 palpetrovich
 
13.02.14
16:18
(14) таки нннннннада! :)
...че-т Номенклатура не отбирается, видть УложитьОбъекты я не так пользую

Перем базаДанных, запрос;

Процедура ПриОткрытии()
    
    Попытка
        базаДанных = СоздатьОбъект("SQLiteBase");
    Исключение
        ЗагрузитьВнешнююКомпоненту("1sqlite.dll");
        базаДанных = СоздатьОбъект("SQLiteBase");
    КонецПопытки;
    
КонецПроцедуры

Процедура Сформировать()
    
    СписокТоваров = СоздатьОбъект("СписокЗначений");
    СпрТовары = СоздатьОбъект("Справочник.Номенклатура");
    СпрТовары.ИспользоватьРодителя(ВыбТовар);
    СпрТовары.ВыбратьЭлементы();
    Пока СпрТовары.ПолучитьЭлемент() = 1 Цикл
        Если СпрТовары.ПометкаУдаления()=1 Тогда
            Продолжить;
        КонецЕсли;
        Если СпрТовары.ЭтоГруппа()=1 Тогда
            Продолжить;
        КонецЕсли;
        СписокТоваров.ДобавитьЗначение(СпрТовары.ТекущийЭлемент());
    КонецЦикла;
    
    базаДанных.Открыть(":memory:");
    //базаДанных.УложитьОбъекты(ВыбТовар,"ТаблицаТоваров",0,"Номенклатура");
    базаДанных.УложитьОбъекты(СписокТоваров,"ТаблицаТоваров");
    
    Запрос = базаДанных.НовыйЗапрос();
    запрос.ВыполнитьЗапрос("PRAGMA journal_mode = OFF");    
    ТекстЗапроса="
    |Select
    |   Рег.Товар [Товар :Справочник.Номенклатура]
    |   ,SUM(Рег.НачОст) [НачОст :Число]
    |   ,SUM(Рег.Приход) [Приход :Число]
    |   ,SUM(Рег.Расход) [Расход :Число]
    |   ,SUM(Рег.НачОст+Рег.Приход-Рег.Расход) [КонОст :Число]
    |From
    |      (
    |      SELECT
    |             Итоги.Товар Товар
    |            ,Итоги.ОстатокТовара НачОст
    |            ,0 Приход
    |            ,0 Расход
    |      FROM
    |            [РегистрИтоги.ПартииТоваров] Итоги
    |
    |      WHERE
    |            Итоги.period = @ПредПериод  
    |           AND Итоги.Товар in (select val from ТаблицаТоваров)
    |
    |   UNION ALL
    |      SELECT
    |             Движения.Товар
    |            ,Движения.ОстатокТовара * (1 - Движения.debkred * 2)
    |            ,0
    |            ,0
    |      FROM
    |            [Регистр.ПартииТоваров] Движения
    |   INNER Join [Журнал] Жур ON Жур.iddoc = Движения.iddoc and Жур.date BETWEEN @НачПериод And @КонПериод
    |      UNION ALL
    |      SELECT
    |             Движения2.Товар
    |            ,0
    |            ,Движения2.ОстатокТовара * (1 - Движения2.Debkred)
    |            ,Движения2.ОстатокТовара * Движения2.Debkred
    |      FROM
    |            [Регистр.ПартииТоваров] Движения2
    |   INNER Join [Журнал] Жур2 ON Жур2.iddoc = Движения2.iddoc and Жур2.date BETWEEN @Дата1 And @Дата2
    |) Рег
    |Inner join [Справочник.Номенклатура] Номенклатура on Рег.Товар = Номенклатура.id
    |Group by
    |      Рег.Товар
    |";
    
    НачПериод = НачМесяца(ВыбНачПериода);
    ПредПериод = НачМесяца(НачПериод-1);
    
    Запрос.Подготовить(ТекстЗапроса);
    
    Запрос.УстановитьПараметр("@ПредПериод",ПредПериод);
    Запрос.УстановитьПараметр("@НачПериод", НачПериод);
    Запрос.УстановитьПараметр("@КонПериод", ВыбНачПериода-1); //для вычисления НачОст
    Запрос.УстановитьПараметр("@Дата1",     ВыбНачПериода);
    Запрос.УстановитьПараметр("@Дата2",     ВыбКонПериода);  
    
    тз = Запрос.Выполнить();
    тз.ВыбратьСтроку();  
    
КонецПроцедуры
16 Ёпрст
 
13.02.14
16:22
(15) конечно не отбираются.. ты же фильтр только на итоги поставил, а на движения болт забил..
17 Ёпрст
 
13.02.14
16:23
+ нафига делаешь параметизированный запрос ?
Ты этот код многократно шо ле выполнять собираешься, с разными параметрами ?
18 Ёпрст
 
13.02.14
16:25
+ писать НачПериод = НачМесяца(ВыбНачПериода);  не совсем верно.. лучше привязываться к ПолучитьНачПериода объекта метадаворк, чтоб не зависеть от периодичности хранения останков
19 palpetrovich
 
13.02.14
16:30
(16) эт не болт, эт отсутсвие знаний
(17) ну как, как ользователь тыцнет на кнопку - так и долежн выполниться
(18) спасиб
20 Ёпрст
 
13.02.14
16:32
(19)

2. для этого используй обычный запрос, не надо там Подготовить, собаки-амперсанды и УстановитьПараметр, просто имя параметра через двоеточие и Запрос.Подставлять
21 Ёпрст
 
13.02.14
16:33
+20 на регистр воткни галку быстрая обработка движений и выкини соедиение с журналом  - будет быстрее.
22 palpetrovich
 
13.02.14
16:34
(20) а УстановитьПараметр -тогда как? или вообще не нужен?
23 Salimbek
 
13.02.14
16:42
(22) Не нужен
24 Ёпрст
 
13.02.14
16:57
(22) заместо него - подставлять ()
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший