Переключение на Главную Страницу Страницы: [1] 2 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Вычисляемые колонки в ТП (число прочтений - 17816 )
AlexF
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 29
Зарегистрирован: 02. Июня 2006
Вычисляемые колонки в ТП
22. Мая 2007 :: 06:45
Печать  
В форме списка справочника или журнала документов можно вставлять в таблицу текстовое поле как колонку и, прописав в ней формулу, получить динамически вычисляемое значение в колонке, которое будет вычисляться только при отображении строки на экране. ТЗ почему то такой возможности лишена, поэтому необходимо вычислять значения всех колонок еще на стадии формирования таблицы. Вопрос - можно ли динамическое вычисление организовать с помощью ТП? Или еще как то?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Вычисляемые колонки в ТП
Ответ #1 - 22. Мая 2007 :: 06:59
Печать  
в ТП - можно.
смотри событие ПриВыводеСтроки.
пример:
Код
Выбрать все
Процедура ТаблПолеПриВыводеСтроки(ТП, ОформлениеСтроки, Данные)
    Если ТП.Колонки.КолонкаРаз.Видимость = 1 Тогда
	  ОформлениеСтроки.Ячеки.КолонкаРаз.УстановитьТекст("sfgerwdwqvr");
    КонецЕсли
    Если ТП.Колонки.Сумма.Видимость = 1 Тогда
	  ОформлениеСтроки.Ячеки.Сумма.УстановитьТекст(Формат(Данные.Цена * Данные.Количество,"Ч015.2"));
    КонецЕсли
КонецПроцедуры 

  

1&&2&&3
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вычисляемые колонки в ТП
Ответ #2 - 22. Мая 2007 :: 07:11
Печать  
Если вычисляемые выражения не сложны, или используют несложные запросы к базе, то делать вычисления можно делать прямо в скульном запросе.
Например
Код
Выбрать все
Select
Table.Товар AS Товар,
Table.Цена AS Цена,
Table.Цена * 1.18 AS ЦенасНДС
From Table
 


  
Наверх
 
IP записан
 
AlexF
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 29
Зарегистрирован: 02. Июня 2006
Re: Вычисляемые колонки в ТП
Ответ #3 - 22. Мая 2007 :: 07:24
Печать  
Спасибо. ПриВыводеСтроки - как раз то, что нужно.
  
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Вычисляемые колонки в ТП
Ответ #4 - 22. Мая 2007 :: 08:07
Печать  
Arta писал(а) 22. Мая 2007 :: 07:11:
Если вычисляемые выражения не сложны, или используют несложные запросы к базе, то делать вычисления можно делать прямо в скульном запросе.
Например
Код
Выбрать все
Select
Table.Товар AS Товар,
Table.Цена AS Цена,
Table.Цена * 1.18 AS ЦенасНДС
From Table
 



Почему именно только в том случае, если "не сложны или используют несложные запросы к базе".
Веруешь что интерпретатор V7 быстере T-SQL?
Это ты напрасно.. Улыбка Имхо какраз таки наоборот.
Плюс при отключении видимости колонки ТП искючит это поле из запроса автоматически. Меньше кода - меньше ошибок.
  
Наверх
ICQ  
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вычисляемые колонки в ТП
Ответ #5 - 22. Мая 2007 :: 08:20
Печать  
Как раз не думаю, и у меня практически все возложено на SQL. Тем более что возможностей сервера SQL у меня в разы больше чем у TS.
Только вот столкнулся с тем, что запрос к файловой системе проще делать в привыводестроки. SQL при этом тормознее.
например мне надо в ТП было ставить галку, если существует файл по определенной маске.
  
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Вычисляемые колонки в ТП
Ответ #6 - 22. Мая 2007 :: 08:25
Печать  
Ну, ясен пень.. Потому что эта задача не связана с данными, которыми управляет сам сервер.
  
Наверх
ICQ  
IP записан
 
AlexF
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 29
Зарегистрирован: 02. Июня 2006
Re: Вычисляемые колонки в ТП
Ответ #7 - 22. Мая 2007 :: 08:57
Печать  
Тогда продолжение: журнал документов, в документах есть реквизит Номенклатура, у которого в свою очередь есть реквизит Производитель. В этом журнале колонка, в которой для каждого документа показываются производители номенклатуры этого документа (строка, через запятую). Это можно впихнуть в запрос?
  
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Вычисляемые колонки в ТП
Ответ #8 - 22. Мая 2007 :: 09:03
Печать  
Можно. "(строка, через запятую)" - требуется алгоритмический SQL, необходимо функцию написать.
Написать?
- Строка не может быть больше 8к.
  
Наверх
ICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Вычисляемые колонки в ТП
Ответ #9 - 22. Мая 2007 :: 09:23
Печать  
если функцию на стороне сервера писать нет желания, то можно на стороне клиента выполнять, например, параметризированный запрос.
Схема примерно такая:
Код
Выбрать все
Перем гРС_Производители;
//
Процедура ПриОткрытии()
  гРС_Производители=СоздатьОбъект("ODBCRecordset");
  гРС_Производители.Подготовить("
  |select distinct rtrim(Производители.descr) Производитель
  |from $ДокументСтроки.ВидДокумена ДокСтроки (nolock)
  |join $Справочник.Номенклатура Номенклатура (nolock) on Номенклатура.id = $ДокСтроки.Номенклатура
  |join $Справочник.Производители Производители (nolock) on Производители.id = $Номенклатура.Производитель
  |where ДокСтроки.iddoc = ?
  |");
  гРС_Производители.ДобПараметр(1,14,9,0);
КонецПроцедуры
//
Процедура ФормаПриСоздании(_Форма)
  ТП=_Форма.СоздатьЭлементУправления("ТабличноеПоле",Форма.ТаблПоле);
  Колонка=ТП.Колонки.Добавить("Производители");
  Колонка.Данные="ИДДокДляПолученияПроизводителей";

  ТекстЗапроса="
  |select
  |/*разные другие поля*/
  |j.idddoc ИДДокДляПолученияПроизводителей
  |from ...
  |";
  Поставщик=СоздатьОбъект...
  ТП.ПоставщикДанных=Поставщик;
КонецПроцедуры
//
Процедура ТаблПолеПриВыводеСтроки(ТП, ОформлениеСтроки, Данные)
  Если ТП.Колонки.Производители.Видимость = 1 Тогда
    гРС_Производители.УстПараметр(1,Данные.ИДДокДляПолученияПроизводителей);
    Рез=гРС_Производители.ВыполнитьИнструкцию();
    Стр="";
    Рез.ВыбратьСтроки();
    Пока Рез.ПоллучитьСтроку()=1 Цикл
	Стр=Стр+","+Рез.Производитель;
    КонецЦикла
    ОформлениеСтроки.Ячеки.Производители.УстановитьТекст(Сред(Стр,2));
  КонецЕсли
КонецПроцедуры  

  

1&&2&&3
Наверх
 
IP записан
 
AlexF
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 29
Зарегистрирован: 02. Июня 2006
Re: Вычисляемые колонки в ТП
Ответ #10 - 22. Мая 2007 :: 10:45
Печать  
DmitrO писал(а) 22. Мая 2007 :: 09:03:
Можно. "(строка, через запятую)" - требуется алгоритмический SQL, необходимо функцию написать.
Написать?
- Строка не может быть больше 8к.


База dbf - следовательно этот вариант отпадает?
  
Наверх
 
IP записан
 
AlexF
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 29
Зарегистрирован: 02. Июня 2006
Re: Вычисляемые колонки в ТП
Ответ #11 - 22. Мая 2007 :: 10:46
Печать  
trad писал(а) 22. Мая 2007 :: 09:23:
если функцию на стороне сервера писать нет желания, то можно на стороне клиента выполнять, например, параметризированный запрос.
Схема примерно такая:
Код
Выбрать все
Перем гРС_Производители;
//
Процедура ПриОткрытии()
  гРС_Производители=СоздатьОбъект("ODBCRecordset");
  гРС_Производители.Подготовить("
  |select distinct rtrim(Производители.descr) Производитель
  |from $ДокументСтроки.ВидДокумена ДокСтроки (nolock)
  |join $Справочник.Номенклатура Номенклатура (nolock) on Номенклатура.id = $ДокСтроки.Номенклатура
  |join $Справочник.Производители Производители (nolock) on Производители.id = $Номенклатура.Производитель
  |where ДокСтроки.iddoc = ?
  |");
  гРС_Производители.ДобПараметр(1,14,9,0);
КонецПроцедуры
//
Процедура ФормаПриСоздании(_Форма)
  ТП=_Форма.СоздатьЭлементУправления("ТабличноеПоле",Форма.ТаблПоле);
  Колонка=ТП.Колонки.Добавить("Производители");
  Колонка.Данные="ИДДокДляПолученияПроизводителей";

  ТекстЗапроса="
  |select
  |/*разные другие поля*/
  |j.idddoc ИДДокДляПолученияПроизводителей
  |from ...
  |";
  Поставщик=СоздатьОбъект...
  ТП.ПоставщикДанных=Поставщик;
КонецПроцедуры
//
Процедура ТаблПолеПриВыводеСтроки(ТП, ОформлениеСтроки, Данные)
  Если ТП.Колонки.Производители.Видимость = 1 Тогда
    гРС_Производители.УстПараметр(1,Данные.ИДДокДляПолученияПроизводителей);
    Рез=гРС_Производители.ВыполнитьИнструкцию();
    Стр="";
    Рез.ВыбратьСтроки();
    Пока Рез.ПоллучитьСтроку()=1 Цикл
	Стр=Стр+","+Рез.Производитель;
    КонецЦикла
    ОформлениеСтроки.Ячеки.Производители.УстановитьТекст(Сред(Стр,2));
  КонецЕсли
КонецПроцедуры  




Да, я так и собирался делать, вопрос только в том, не слишком ли долго будет выполняться запрос для каждой строки.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Вычисляемые колонки в ТП
Ответ #12 - 22. Мая 2007 :: 11:23
Печать  
AlexF писал(а) 22. Мая 2007 :: 10:46:
не слишком ли долго будет выполняться запрос для каждой строки.

какова задача - таково и решение
запрос этот будет выполняться не дольше чем udf
  

1&&2&&3
Наверх
 
IP записан
 
DmitrO
1c++ power user
Отсутствует


ex developer

Сообщений: 579
Местоположение: г. Киров
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Вычисляемые колонки в ТП
Ответ #13 - 22. Мая 2007 :: 11:45
Печать  
AlexF писал(а) 22. Мая 2007 :: 10:45:
DmitrO писал(а) 22. Мая 2007 :: 09:03:
Можно. "(строка, через запятую)" - требуется алгоритмический SQL, необходимо функцию написать.
Написать?
- Строка не может быть больше 8к.


База dbf - следовательно этот вариант отпадает?

Нуууу, тогда много чо отпадает..
1)Поставщик данных ODBC с VFP драйвером работает не эффективно;
2)через VFP драйвер UDF не выполнить;
3)параметризированные запросы через драйвер VFP не имеют выигрыша по скорости относительно обычных.
детский сад этот dbf.. хотя на самом деле из него можно выжать еще немного, только средств для этого в 1с++ нет - не написано.
  
Наверх
ICQ  
IP записан
 
AlexF
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 29
Зарегистрирован: 02. Июня 2006
Re: Вычисляемые колонки в ТП
Ответ #14 - 22. Мая 2007 :: 14:25
Печать  
Цитата:
детский сад этот dbf.. хотя на самом деле из него можно выжать еще немного, только средств для этого в 1с++ нет - не написано.


А что делать - MS SQL сервер стоит слишком много... Вот и приходится на dbf делать
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 
ОтправитьПечать