Имя: Пароль:
1C
1С v8
1C и ACCESS
,
0 mnail1979
 
26.04.12
09:17
Получаю из аксеса данные таким образом:


СтрокаПодключения = "Driver={Microsoft Access Driver (*.mdb)};Dbq=" + Файл + ";""";
 

   Connection = Новый COMОбъект("ADODB.Connection");
   
   Попытка
      Connection.Open(СтрокаПодключения);
   Исключение
      Сообщить(ОписаниеОшибки());
      Возврат;
   КонецПопытки;
      Command = Новый COMОбъект("ADODB.Command");

   Command.ActiveConnection = Connection;
   Command.CommandText = "SELECT * FROM SALES_RETURNS";
   Command.CommandType = 1;
   RecordSet = Новый COMОбъект("ADODB.RecordSet");
   RecordSet = Command.Execute();

Мне нужно получить данные типа Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Как это сделать. Может вначале получить данные в менеджер ВТ, а потом оттуда запрос по группировкам делать?
Но учтите, в таблице полтора миллиона строк.
1 vde69
 
26.04.12
09:17
//
// Функция получает таблицу из базы аксесса
//
Функция ПолучитьТаблицуАкцесса (Подключение, ИмяТаблици)
   Результат = СоздатьОбъект("ТаблицаЗначений");
   Результат.Очистить();

   Команда = СоздатьОбъект("ADODB.Command");
   Команда.ActiveConnection=Подключение;
   ТекстСелект = "SELECT * FROM " +  ИмяТаблици;
   НаборЗаписей = СоздатьОбъект("ADODB.RecordSet");
   Команда.CommandText=ТекстСелект;
   Попытка
       НаборЗаписей=Команда.Execute();
   Исключение
       Сообщить(ОписаниеОшибки());
       Возврат -1;
   КонецПопытки;
   
   // надо создать колонки
   Для е = 0 по (НаборЗаписей.Fields.Count - 1) Цикл
       Результат.НоваяКолонка(СокрЛП(НаборЗаписей.Fields(е).Name));
   КонецЦикла;
   
   Попытка
       НаборЗаписей.MoveFirst();
   Исключение //нет записей в рекордсете
       НаборЗаписей.Close();
       Возврат Результат;
   КонецПопытки;
   
   НаборЗаписей.MoveFirst();
   Пока НаборЗаписей.EOF() = 0 Цикл
       // тут имеем строку записи
       //ОбработкаПрерыванияПользователя();  
       Состояние("Идет чтение таблицы <" + ИмяТаблици + "> - " + Обмен_Индикатор(Счетчик, МаксСчетчик));

       Результат.НоваяСтрока();
       Стр = "";
       Для е = 0 по (НаборЗаписей.Fields.Count - 1) Цикл
           Результат.УстановитьЗначение(Результат.КоличествоСтрок(), СокрЛП(НаборЗаписей.Fields(е).Name), НаборЗаписей.Fields(е).Value);
           Если ВыводитьДанныеВСтрокуСообщений=1 Тогда
               Стр = Стр + "; " + НаборЗаписей.Fields(е).Name + "=" + НаборЗаписей.Fields(е).Value;
           КонецЕсли;
       КонецЦикла;
       
       Если ВыводитьДанныеВСтрокуСообщений=1 Тогда
           Сообщить (Стр);
       КонецЕсли;
               
       НаборЗаписей.MoveNext();
   КонецЦикла;
           
   НаборЗаписей.Close();
   
   Возврат Результат;
КонецФункции

// *******************************
// пример вызова
//


//
// подключаемся
//
СтрокаПод="Driver={Microsoft Access Driver (*.mdb)};Dbq=" + ИмяФайла + ";";
Акцесс = СоздатьОбъект("ADODB.CONNECTION");
Попытка
   Акцесс.Open(СтрокаПод);
Исключение
   Сообщить(ОписаниеОшибки());
   Возврат;
КонецПопытки;

//
// получем таблицу с именем "Номенклатура"
//
ТабСпр = ПолучитьТаблицуАкцесса (Акцесс, """Номенклатура""");
2 mnail1979
 
26.04.12
09:45
я хотел обойти промежуточную базу(таблица значений), так как записей слишком много
3 mnail1979
 
26.04.12
09:48
у меня ситуация такая.
В аксесе есть поля типа дата, контрагент, номенклатура, количество
Я хочу получить эти данные, и на каждую дату создать документ "корректировка регистров". Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам)очень бы помог. А так приходится делать запрос к аксесу, потом выгружать все в таблицу значений, а потом уже оттуда пытаться сделать запрос с обходом по группировкам
4 vde69
 
26.04.12
09:49
(3) ну сделай запрос в цикле, итератором пусть будет дата....
5 mnail1979
 
26.04.12
09:50
можете привести пример?
6 kotletka
 
26.04.12
09:52
выбери все даты сначала тз, сверни и потом циклом вытягивай по датам
7 vde69
 
26.04.12
09:54
"SELECT * FROM SALES_RETURNS whele SALES_RETURNS.dddd = '#01/01/2000#'"

за точность синтаксиса не отвечаю :)
8 mnail1979
 
26.04.12
09:54
т.е. опять таки сначала надо все загнать в таблицу значений
9 vde69
 
26.04.12
09:56
>>>т.е. опять таки сначала надо все загнать в таблицу значений

зачем? выбори только РАЗЛИЧНЫЕ даты...
10 mnail1979
 
26.04.12
09:58
ааа, стоп. У меня практически на каждый день есть движения
Можно сделать так:
Для дата="01.01.2010" по "01.01.2012" Цикл
"SELECT * FROM SALES_RETURNS whele SALES_RETURNS.dddd = "+дата;

КонецЦикла;
11 mnail1979
 
26.04.12
09:58
интересно, дата будет в цикле прибавляться на один день?
12 Маленький Вопросик
 
26.04.12
09:58
(7) а запись и удаление есть?
13 vde69
 
26.04.12
09:59
(10) только про символ # не забудь (хотя может и так прокатит)
14 mnail1979
 
26.04.12
10:47
(13) а что это за символ. Для чего он?