Среда, 15.05.2024, 20:25
Главная Регистрация RSS
Приветствую Вас, Гость
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Основной » Проблемные ситуации » 2.97 Консоль запросов. Помещение во временную таблицу
2.97 Консоль запросов. Помещение во временную таблицу
SimolДата: Четверг, 17.10.2013, 13:42 | Сообщение # 1
Полковник
Группа: Проверенные
Сообщений: 237
Репутация: 27
Статус: Оффлайн
Умею таблицу, загруженную из екселя с помощью запроса ADO.
Помещаю результат запроса во временную таблицу, в результате во временной таблице не все колонки.
В результате анализа

Получается в функции ПолучитьТаблицуЗначенийСМинимальнымиТипамиКолонокЛкс() общего модуля ирНеглобальный генерится ТЗ с колонками, для которых тип небыл задан (КолонкаДанных.ТипЗначения.Типы().Количество() > 0). Остальные колонки с типами в ТЗ не попадают.

Запустил следующим образом:
1) В консоли запроса в процедуре ПоместитьДанныеСтрокиЗапросаВоВременнуюТаблицу в вызове ПолучитьТаблицуЗначенийСМинимальнымиТипамиКолонокЛкс убрал второй параметр
2) в ПолучитьТаблицуЗначенийСМинимальнымиТипамиКолонокЛкс() внес следующие изменения для того, чтобы колонок с типом Null небыло:
Цитата
Функция ПолучитьТаблицуЗначенийСМинимальнымиТипамиКолонокЛкс(Знач ТаблицаДанных, СужатьТолькоПроизвольныеКолонки = Ложь) Экспорт
    
    ТипизированнаяТаблица = Новый ТаблицаЗначений;
    //Состояние("Оптимизация типов колонок");
    МетаданныеТаблицыИзменены = Ложь;
    Для Каждого КолонкаДанных Из ТаблицаДанных.Колонки Цикл
        Если Истина
            И СужатьТолькоПроизвольныеКолонки
            И КолонкаДанных.ТипЗначения.Типы().Количество() > 0
        Тогда
            Продолжить;
        КонецЕсли;
        Типы = Новый Массив;
        ТаблицаКолонки = ТаблицаДанных.Скопировать(, КолонкаДанных.Имя);
        ТаблицаКолонки.Свернуть(КолонкаДанных.Имя);
        //Индикатор = УФ(сПолучитьИндикаторПроцесса, ТаблицаКолонки.Количество(), "Оптимизация типов колонки """ + КолонкаДанных.Имя + """");
        Для Каждого СтрокаДанных Из ТаблицаКолонки Цикл
            //ЛксОбработатьИндикатор(Индикатор);
            ТипЗначения = ТипЗнч(СтрокаДанных[КолонкаДанных.Имя]);
            
            //Симашкевич Начало 17.10.2013 12:13
            Если ТипЗначения = ТипЗнч(Null) Тогда
                Продолжить;
            КонецЕсли;    
            //Симашкевич Окончание 17.10.2013 12:13
            
            Если Типы.Найти(ТипЗначения) = Неопределено Тогда
                Типы.Добавить(ТипЗначения);
            КонецЕсли;
        КонецЦикла;
        
        //Симашкевич Начало 17.10.2013 12:13
        Если Типы.Количество() = 0 Тогда
            Типы.Добавить(Тип("Строка"));
            МетаданныеТаблицыИзменены = Истина;
        КонецЕсли;    
        //Симашкевич Окончание 17.10.2013 12:13
        
        Если Типы.Количество() <> КолонкаДанных.ТипЗначения.Типы().Количество() Тогда
            МетаданныеТаблицыИзменены = Истина;
        КонецЕсли;
        ТипизированнаяТаблица.Колонки.Добавить(КолонкаДанных.Имя, Новый ОписаниеТипов(Типы), КолонкаДанных.Заголовок);
    КонецЦикла;
    
    Если МетаданныеТаблицыИзменены Тогда
        //Состояние("Загрузка таблицы данных");
        ЛксЗагрузитьВТаблицуЗначений(ТаблицаДанных, ТипизированнаяТаблица);
        //Состояние("");
    Иначе
        ТипизированнаяТаблица = ТаблицаДанных.Скопировать();
    КонецЕсли;
    Результат = ТипизированнаяТаблица;
    Возврат Результат;
    
КонецФункции

Добавлено (17.10.2013, 13:42)
---------------------------------------------
3) Так как строка неограниченной длины в типе колоник временной таблицы неудобна при последующих соединениях и группировках сделал вот так:

Цитата
Функция ПолучитьТаблицуЗначенийСМинимальнымиТипамиКолонокЛкс(Знач ТаблицаДанных, СужатьТолькоПроизвольныеКолонки = Ложь) Экспорт
    
    ТипизированнаяТаблица = Новый ТаблицаЗначений;
    //Состояние("Оптимизация типов колонок");
    МетаданныеТаблицыИзменены = Ложь;
    Для Каждого КолонкаДанных Из ТаблицаДанных.Колонки Цикл
        Если Истина
            И СужатьТолькоПроизвольныеКолонки
            И КолонкаДанных.ТипЗначения.Типы().Количество() > 0
        Тогда
            Продолжить;
        КонецЕсли;
        Типы = Новый Массив;
        ТаблицаКолонки = ТаблицаДанных.Скопировать(, КолонкаДанных.Имя);
        ТаблицаКолонки.Свернуть(КолонкаДанных.Имя);
        //Индикатор = УФ(сПолучитьИндикаторПроцесса, ТаблицаКолонки.Количество(), "Оптимизация типов колонки """ + КолонкаДанных.Имя + """");
        
        //Симашкевич Начало 17.10.2013 12:29
        ДлинаСтроки = 1;
        //Симашкевич Окончание 17.10.2013 12:29
        
        Для Каждого СтрокаДанных Из ТаблицаКолонки Цикл
            //ЛксОбработатьИндикатор(Индикатор);
            ТипЗначения = ТипЗнч(СтрокаДанных[КолонкаДанных.Имя]);
            
            //Симашкевич Начало 17.10.2013 12:13
            Если ТипЗначения = ТипЗнч(Null) Тогда
                Продолжить;
            ИначеЕсли ТипЗначения = Тип("Строка") Тогда
                ДлинаСтроки = Макс(ДлинаСтроки, СтрДлина(СтрокаДанных[КолонкаДанных.Имя]));    
            КонецЕсли;    
            //Симашкевич Окончание 17.10.2013 12:13
            
            Если Типы.Найти(ТипЗначения) = Неопределено Тогда
                Типы.Добавить(ТипЗначения);
            КонецЕсли;
        КонецЦикла;
        
        //Симашкевич Начало 17.10.2013 12:13
        Если Типы.Количество() = 0 Тогда
            Типы.Добавить(Тип("Строка"));
            МетаданныеТаблицыИзменены = Истина;
        КонецЕсли;    
        //Симашкевич Окончание 17.10.2013 12:13
        
        Если Типы.Количество() <> КолонкаДанных.ТипЗначения.Типы().Количество() Тогда
            МетаданныеТаблицыИзменены = Истина;
        КонецЕсли;
        ТипизированнаяТаблица.Колонки.Добавить(КолонкаДанных.Имя, Новый ОписаниеТипов(Типы, , Новый КвалификаторыСтроки(ДлинаСтроки)), КолонкаДанных.Заголовок); //Симашкевич Изменил 17.10.2013 12:32
    КонецЦикла;
    
    Если МетаданныеТаблицыИзменены Тогда
        //Состояние("Загрузка таблицы данных");
        ЛксЗагрузитьВТаблицуЗначений(ТаблицаДанных, ТипизированнаяТаблица);
        //Состояние("");
    Иначе
        ТипизированнаяТаблица = ТаблицаДанных.Скопировать();
    КонецЕсли;
    Результат = ТипизированнаяТаблица;
    Возврат Результат;
    
КонецФункции
 
tormozitДата: Воскресенье, 24.11.2013, 19:45 | Сообщение # 2
Генералиссимус
Группа: Администраторы
Сообщений: 6200
Репутация: 159
Статус: Оффлайн
Исправлено в 2.98
 
Форум » Основной » Проблемные ситуации » 2.97 Консоль запросов. Помещение во временную таблицу
  • Страница 1 из 1
  • 1
Поиск: