Понедельник, 07.10.2024, 07:24
Главная Регистрация RSS
Приветствую Вас, Гость
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Консоль запросов. Кодировка в режиме ADO
AnyBodyДата: Среда, 10.09.2014, 10:04 | Сообщение # 1
Рядовой
Группа: Проверенные
Сообщений: 17
Репутация: 3
Статус: Оффлайн
Используя/создавая/отлаживая запросы типа "ADO" часто приходиться получать данные из систем настройка которых обычно не доступна. Возникают проблемы с кодировкой строк. Для себя эту проблему я решил так:
"фиксируем" 2 виртуальных параметра запроса и в форме "Форма" консоли запросов после строк № 840-849
Код
Если ЭлементыФормы.ПанельРезультата.Страницы.РезультатКоллекция.Значение = Null Тогда
СоздатьКоллекциюРезультата();
ЭтаФорма.РезультатКоллекция = ЭлементыФормы.РезультатКоллекция.Значение;
ЭтаФорма.ДлительностьЗагрузки = 0;
ЭтаФорма.СтрокаРазмерКоллекции = 0;
НачалоЗагрузки = мПлатформа.ПолучитьТекущееВремяВМиллисекундах();
Если СпособВыгрузки = 1 Тогда
Если ТипЗнч(мРезультатЗапроса) = Тип("РезультатЗапроса") Тогда
ирОбщий.ЗагрузитьДинамическуюВыборкуВТабличноеПолеПервуюПорциюЛкс(ЭтаФорма, мРезультатЗапроса, мВыборкаРезультата,
ЭлементыФормы.КоманднаяПанельКоллекция, , пЗагружатьЭлементов);


добавил:

Код
//+//<СТ=====№ ======== 22.10.2013 16:50:14
// Здесь реализована возможность перекодировать строковые поля в результате запроса.
// Если в параметрах запроса задать параметр      
// "КонвертироватьИЗ" - тип строка - со значением кодировки, например, "utf-8" или "windows-1251" ...
// то для всех строковых колонок будет произведена перекодировка по умолчанию в "windows-1251" из заданой значением параметра.
// Значение результирующей кодировки можно задать в параметре запроса "КонвертироватьВ".
//      
ПараметрыЗапроса = мТекущаяСтрока.ПараметрыЗапроса;
ПараметрВ      = ПараметрыЗапроса.Найти(НРег("КонвертироватьВ"),      "НИмяПараметра");
ПараметрИз   = ПараметрыЗапроса.Найти(НРег("КонвертироватьИз"),   "НИмяПараметра");
Если НЕ ПараметрИз = Неопределено Тогда
        изКодировки = ПараметрИз.Значение;
        Если НЕ ПараметрВ = Неопределено Тогда    вКодировку = ПараметрВ.Значение;
        Иначе                    вКодировку = Неопределено;
        КонецЕсли;
        ТР = ЭлементыФормы.КоманднаяПанельКоллекция.ИсточникДействий.Значение;        
        стВезде.ПерекодироватьСтроковыеПоляТЗ(ТР, изКодировки, вКодировку);
КонецЕсли;

/////>СТ=====№ ======== 22.10.2013 16:50:14


и еще в общем модуле процедуру

Код
Процедура ПерекодироватьСтроковыеПоляТЗ(изТаблицыЗначений, изКодировки="windows-1251", вКодировку="windows-1251") Экспорт
      Если НЕ изКодировки = вКодировку  Тогда
         СтроковыеКолонки = Новый Массив;
         Для каждого Колонка Из изТаблицыЗначений.Колонки Цикл
            Если Колонка.ТипЗначения.СодержитТип(Тип("Строка")) Тогда
               СтроковыеКолонки.Добавить(Колонка.Имя);
            КонецЕсли;
         КонецЦикла;
         Перекодировщик = Неопределено;      
         Для каждого Строка Из изТаблицыЗначений Цикл
            Для каждого Колонка Из СтроковыеКолонки Цикл
               ъ=Строка[Колонка];
               Если НЕ ПустаяСтрока(ъ) Тогда
                  Попытка
                     Если вКодировку =Неопределено Тогда
                        Строка[Колонка] = Перекодировать(Перекодировщик, ъ, изКодировки);
                     Иначе
                        Строка[Колонка] = Перекодировать(Перекодировщик, ъ, изКодировки, вКодировку);
                     КонецЕсли;
                  Исключение
                     //Сообщить(""+ТР.Индекс(Строка)+":"+Колонка+"="+Строка[Колонка]);
                  КонецПопытки;
               КонецЕсли;
            КонецЦикла;
         КонецЦикла;
      КонецЕсли;
КонецПроцедуры


и функцию

Код
Функция Перекодировать(Стрим =  Неопределено, Стр="", изКодировки="windows-1251", вКодировку="windows-1251") Экспорт
     Результат=Стр;
     Если ((НЕ изКодировки = вКодировку)
           И (НЕ ПустаяСтрока(Стр))) Тогда
        Если Стрим = Неопределено Тогда
           Стрим = Новый COMОбъект("Adodb.Stream");
        КонецЕсли;
        Стрим.Type = 2;
       Стрим.Mode = 3;
       Стрим.charset = вКодировку;
       Стрим.Open();
       Стрим.WriteText(Стр);
       Стрим.Position = 0;
       Стрим.charset = изКодировки;
       Результат = Стрим.ReadText(-1);
       Стрим.Close();
     КонецЕсли;
    Возврат    Результат;
КонецФункции


Предлагаю добавить подобный функционал в "первоисточник". Для работы со сторонними расточниками данных это многим бы пригодилось.


Сообщение отредактировал AnyBody - Среда, 10.09.2014, 10:11
 
tormozitДата: Среда, 10.09.2014, 13:08 | Сообщение # 2
Генералиссимус
Группа: Администраторы
Сообщений: 6386
Репутация: 165
Статус: Оффлайн
Чтобы сделать по-нормальному перекодировку, мне нужен пример для проверки потенциального функционала. Можешь с этим помочь?
 
AnyBodyДата: Среда, 10.09.2014, 13:15 | Сообщение # 3
Рядовой
Группа: Проверенные
Сообщений: 17
Репутация: 3
Статус: Оффлайн
Что есть "пример"?
Дать внешнюю БД? Это вряд ли так с ходу. Такие  БД бизнес - чувствительные.
Я подумаю. Прямо сейчас даже идеи нет.
 
tormozitДата: Среда, 10.09.2014, 13:39 | Сообщение # 4
Генералиссимус
Группа: Администраторы
Сообщений: 6386
Репутация: 165
Статус: Оффлайн
У нас проблем с кодировкой, не решаемых снаружи, пока не возникало. Поэтому сначала хочется понять, насколько оправдано решать проблему в консоли запросов.
 
AnyBodyДата: Пятница, 10.10.2014, 10:41 | Сообщение # 5
Рядовой
Группа: Проверенные
Сообщений: 17
Репутация: 3
Статус: Оффлайн
А может быть, подумать о добавлении закладки "после выполнения запроса". По аналогии с закладкой перед ...
 
tormozitДата: Пятница, 10.10.2014, 11:13 | Сообщение # 6
Генералиссимус
Группа: Администраторы
Сообщений: 6386
Репутация: 165
Статус: Оффлайн
Чем это отличается от обработки результата?
 
AnyBodyДата: Пятница, 10.10.2014, 13:33 | Сообщение # 7
Рядовой
Группа: Проверенные
Сообщений: 17
Репутация: 3
Статус: Оффлайн
  • отрабатывает "перед выполнением запроса"
  • выполняется запрос
  • отрабатывает "после выполнения запроса" (здесь например можно написать код перекодировки, перевод даты/времени из unix'ового формата)
  • отображается результат(запроса обработанный на предыдущем шаге) в форме консоли запросов
  • обработка результата

Это даст возможность "работать" над запросом.


Сообщение отредактировал AnyBody - Пятница, 10.10.2014, 17:46
 
  • Страница 1 из 1
  • 1
Поиск: