детали
продажи
справочник
Технические вопросы
Разработка

У заказчика появилась «хотелка» добавить в детали проекта «Продажи» дубль справочника «Роль в команде» под названием «Статус» с независимым справочником и отдельным столбцом вывода значений в раздел «Детали».
Справочник был создан через настройку справочников.
Как же добавить данный столбец в «Детали» рядом со справочником «Роль в команде»?

Буду благодарен, если кто-то поделится решением.

Нравится

8 комментариев

Здравствуйте, Владимир!

Спасибо за Ваше обращение. Мы зарегистрировали его в Службе технической поддержки и назначили специалиста, который сможет Вас компетентно проконсультировать по данному вопросу.

Владимир, насколько я поняла, Вам необходимо добавить в деталь [Проекты] раздела [Продажи] поле справочного типа "Статус".
Для решения задачи необходимо придерживаться последовательности действий, описанных во вложенной инструкции (по аналогии вносить изменения в сервисы детали).

Наталия, спасибо за ответ
Очень скоро понадобится создание новых справочников

Однако, сейчас необходимо в "Детали:продажи" раздела "Контакты" добавить значение справочника "Роль в команде", который сейчас отражен в разделе "Детали:команда" раздела "Продажи"

Есть ли возможность вывести данную аналитику?
Спасибо

Владимир, Вам нужно создавать справочное поле (алгоритм добавления приведен во вложенном файле выше).
Вносить изменения в сервисы tbl_Opportunity, sq_Opportunity, ds_Opportunity и т.д, в качестве датасета для справочного поля нужно указать ds_OpportunityTeamRole.

Наталия, по тому, что получается, делаю вывод, что это не совсем то

Решил показать графически какого результата пытаюсь достичь


Из раздела "продажи" перенести значение нижнего поля в "контакты"

Прошу прощения за назойливость

Владимир, спасибо за визуализацию, вопрос поняла.

Поскольку Вы хотите отобразить в продажах (насколько я вижу именно датасет продаж является датасетом детали [Участники проекта] в контактах) колонку «Статус» из детали [Участники] продажи, с фильтрацией по контакту раздела [Контакты], потребуется прописывать динамическое наполнение колонки.
Реализовать задачу можно следующими вариантами:
1. Добавив в датасет продаж вычисляемое поле.
Однако важно обратить внимание, что колонка будет текстовой, а не с типом справочник, и не будет возможности обращаться к полю при построении графиков/отчетов.

2. Добавив в датасет продаж стандартное справочное поле. Поле нужно будет автоматически заполнять.
Заполнять поле на начальных событиях датасета (например, на AfterOpen), значением статуса после применения фильтра для датасета участников по продаже и контакту.

Наталия, добрый день!
Спасибо за ответ

А есть ли возможность прислать инструкцию по реализации данных пунктов?

Владимир, инструкций, к сожалению, нет, так как подобная реализация не выполнялась.
Но в качестве помощи обратите внимание на:
1. Тему "Вычисляемые поля".
В ней описан принцип добавления вычисляемых полей.
2. Функцию CreateGridViewColumns сервиса wnd_AnalysisDataScript - в данной функции динамически создаются колонки, если Вы будете по второму варианту реализовывать задачу - Вам может пригодиться.

Показать все комментарии
переименование
переименование меню
переименование разделов
Технические вопросы
Разработка

После запуска системы у заказчика появилась потребность переименования некоторых разделов, а так же пунктов в меню. Немного покопавшись в базе данных были найдены данные значения и заменены на новые. Проблема в том, что в некоторых местах так и остались старые названия.
Помогите полностью переименовать значения:

  • «Продажи» в разделе «Контакты» нижнего окна «Детали» необходимо переименовать в «Участник проекта»
  • Везде «Контрагент» сменить на «Компания», а так же в меню «Добавить контрагента», сменить на «Добавить компанию»
  • Переименовать «Продажи» в «Проекты», как в навигации, так и в сплывающих меню и дополнительных формах
  • Переименовать раздел «Команда» в деталях Продажи на «Участники проекта»

Может быть кто уже сталкивался с такой задачей?
Заранее благодарю за помощь

Нравится

4 комментария

Здравствуйте, Владимир!

Спасибо за Ваше обращение. Мы зарегистрировали его в Службе технической поддержки и назначили специалиста, который сможет Вас компетентно проконсультировать по данному вопросу.

В своё время нашел решение где-то на Community, но сейчас не смог.
Прикрепляю архив с этой утилитой (правда, оно у меня датировано 2009 годом, поэтому гарантий не даю - пробуйте сами)

Владимир, чтобы переименовать перечисленные Вами разделы и пункты меню, необходимо (изменения нужно вносить в Terrasoft Administrator):

1. «Продажи» в разделе «Контакты» нижнего окна «Детали» необходимо переименовать в «Участник проекта.
Изменить заголовок у компонента pgOpportunityDetail в сервисе wnd_ContactsWorkspace.

2. Везде «Контрагент» сменить на «Компания», а так же в меню «Добавить контрагента», сменить на «Добавить компанию»
Переименовать «Продажи» в «Проекты», как в навигации, так и в сплывающих меню и дополнительных формах
Инструкция по переименованию во вложении.

3. Переименовать раздел «Команда» в деталях Продажи на «Участники проекта»
Изменить заголовок у компонента pgTeamDetail в сервисе wnd_OpportunitiesWorkspace.

Наталья, добрый день!
Спасибо, очень помогли!

По аналогии с п. 1 и 3 нашел решение для пункта 2 - строки в меню "Добавить->Общие->Контрагент" переименовываются в сервисе wnd_Main в невизуальных объектах

Показать все комментарии
DataFieldName
Dataset
Невозможно установить имя поля
Скрипты
Разработка

Господа

Сложилась ситуация, когда в карте редактирования надо обеспечить пользователю возможность выбора некоторой сущности из другого набора данных.

В не визуальные компоненты окна - добавил необходимый набор данных, на форме разместил компонент LookupDataControl, для свойства DatasetLink - указал добавленный мной набор данных. Но при установке свойства DataFieldName - в журнал выбрасывается ошибка
"Невозможно установить имя поля "FieldName" для компонента "LookupDataControl""
В наборе данный ключевое поле, и первичное поле для отображения установлены.

В чём может быть причина ошибки?

С уважением
Егор

Нравится

4 комментария

Хотел использовать простой LookupControl, но при открытии окна выходит ошибка иного рода.

0x8000ffff - TSObjectLibrary.DBDataset: Ошибка открытия источника данных "ds_OrderGiftsList".

Оригинальное сообщение об ошибке: All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists

Егор, что представляет собой sq_OrderGiftsList, он содержит union-ы?
Если содержит, проверьте чтобы все union содержали одинаковое количество колонок с одинаковым набором свойств.

SELECT
	[ID],
	[Name],
	[LotID],
	[LotName],
	[IsJewel],
	[IsEvent],
	[GiftID],
	[GiftName],
	[AmountFrom],
	[GiftTypeID],
	[GiftDescription]
FROM
	(
    SELECT
  	  '{00000000-0000-0000-0000-000000000002}' AS [ID],
  	  NULL AS [Name],
  	  [tbl_LotInGift].[LotID] AS [LotID],
  	  [tbl_Lot].[Name] AS [LotName],
  	  [tbl_Lot].[IsJewel] AS [IsJewel],
  	  [tbl_Lot].[IsEvent] AS [IsEvent],
  	  [tbl_Gift].[ID] AS [GiftID],
  	  [tbl_Gift].[Name] AS [GiftName],
  	  [tbl_Gift].[AmountFrom] AS [AmountFrom],
  	  [tbl_Gift].[TypeID] AS [GiftTypeID],
  	  NULL AS [GiftDescription]
    FROM
	    [dbo].[tbl_Gift] AS [tbl_Gift]
    INNER JOIN
	    [dbo].[tbl_LotInGift] AS [tbl_LotInGift] ON [tbl_LotInGift].[GiftID] = [tbl_Gift].[ID]
    LEFT OUTER JOIN
	    [dbo].[tbl_Lot] AS [tbl_Lot] ON [tbl_Lot].[ID] = [tbl_LotInGift].[LotID]
    LEFT OUTER JOIN
	    [dbo].[tbl_SaleSource] AS [tbl_SaleSource] ON [tbl_SaleSource].[ChannelID] = [tbl_Gift].[ChannelID]
    WHERE([tbl_Gift].[TypeID] = :gtOrderNumber AND
	    :Date BETWEEN [tbl_Gift].[DateFrom] AND [tbl_Gift].[DateTo] AND
	    (([tbl_Gift].[SourceID] IS NULL AND
	    [tbl_Gift].[ChannelID] IS NULL) OR
	    ([tbl_Gift].[SourceID] IS NULL AND
	    [tbl_SaleSource].[ID] = :SourceID) OR
	    ([tbl_Gift].[SourceID] = :SourceID)) AND
	    [tbl_Lot].[StatusID] IN (:LotStatusIsOpen) AND
	    [tbl_Gift].[StateID] = :gfstActive AND
	    dbo.tsf_GetIsOrderNumberGiftAppllicable(:OrderNumber, tbl_Gift.OrderNumberPeriod,
      tbl_Gift.OrderNumberMaxCount, tbl_Gift.OrderNumberStartValue, tbl_Gift.OrderNumberCount)   = 1)
UNION ALL
SELECT
	N'{00000000-0000-0000-0000-000000000001}' AS [ID],
	NULL AS [Name],
	[tbl_LotInGift].[LotID] AS [LotID],
	[tbl_Lot].[Name] AS [LotName],
	[tbl_Lot].[IsJewel] AS [IsJewel],
	[tbl_Lot].[IsEvent] AS [IsEvent],
	[tbl_Gift].[ID] AS [GiftID],
	[tbl_Gift].[Name] AS [GiftName],
	[tbl_Gift].[AmountFrom] AS [AmountFrom],
	[tbl_Gift].[TypeID] AS [GiftTypeID],
	SetLot1Code + ';' + SetLot2Code AS [GiftDescription]
FROM
	[dbo].[tbl_Gift] AS [tbl_Gift]
INNER JOIN
	[dbo].[tbl_LotInGift] AS [tbl_LotInGift] ON [tbl_LotInGift].[GiftID] = [tbl_Gift].[ID]
LEFT OUTER JOIN
	[dbo].[tbl_Lot] AS [tbl_Lot] ON [tbl_Lot].[ID] = [tbl_LotInGift].[LotID]
LEFT OUTER JOIN
	[dbo].[tbl_SaleSource] AS [tbl_SaleSource] ON [tbl_SaleSource].[ChannelID] = [tbl_Gift].[ChannelID]
WHERE([tbl_Gift].[TypeID] = :gtLotSet AND
	:Date BETWEEN [tbl_Gift].[DateFrom] AND [tbl_Gift].[DateTo] AND
	(([tbl_Gift].[SourceID] IS NULL AND
	[tbl_Gift].[ChannelID] IS NULL) OR
	([tbl_Gift].[SourceID] IS NULL AND
	[tbl_SaleSource].[ID] = :SourceID) OR
	([tbl_Gift].[SourceID] = :SourceID)) AND
	[tbl_Gift].[StateID] = :gfstActive AND
	dbo.tsf_GetIsLotSetGiftAppllicable(:OrderID, tbl_Gift.ID) = 1 AND
	[tbl_Lot].[StatusID] IN (:LotStatusIsOpen))
UNION ALL
SELECT
	'{00000000-0000-0000-0000-000000000000}' AS [ID],
	NULL AS [Name],
	[tbl_LotInGift].[LotID] AS [LotID],
	[tbl_Lot].[Name] AS [LotName],
	[tbl_Lot].[IsJewel] AS [IsJewel],
	[tbl_Lot].[IsEvent] AS [IsEvent],
	[tbl_Gift].[ID] AS [GiftID],
	[tbl_Gift].[Name] AS [GiftName],
	[tbl_Gift].[AmountFrom] AS [AmountFrom],
	[tbl_Gift].[TypeID] AS [TypeID],
	NULL AS [GiftDescription]
FROM
	[dbo].[tbl_Gift] AS [tbl_Gift]
INNER JOIN
	[dbo].[tbl_LotInGift] AS [tbl_LotInGift] ON [tbl_LotInGift].[GiftID] = [tbl_Gift].[ID]
LEFT OUTER JOIN
	[dbo].[tbl_Lot] AS [tbl_Lot] ON [tbl_Lot].[ID] = [tbl_LotInGift].[LotID]
LEFT OUTER JOIN
	[dbo].[tbl_SaleSource] AS [tbl_SaleSource] ON [tbl_SaleSource].[ChannelID] = [tbl_Gift].[ChannelID]
WHERE([tbl_Gift].[TypeID] = :gtOrderAmount AND
	:Date BETWEEN [tbl_Gift].[DateFrom] AND [tbl_Gift].[DateTo] AND
	(([tbl_Gift].[SourceID] IS NULL AND
	[tbl_Gift].[ChannelID] IS NULL) OR
	([tbl_Gift].[SourceID] IS NULL AND
	[tbl_SaleSource].[ID] = :SourceID) OR
	([tbl_Gift].[SourceID] = :SourceID)) AND
	[tbl_Lot].[StatusID] IN (:LotStatusIsOpen) AND
	[tbl_Gift].[StateID] = :gfstActive AND
 
	(SELECT
		SUM([tbl_Partable].[Amount]) AS [Amount]
	FROM
		[dbo].[tbl_Orders] AS [tbl_Orders]
	LEFT OUTER JOIN
		[dbo].[tbl_Partable] AS [tbl_Partable] ON [tbl_Partable].[OrdersID] = [tbl_Orders].[ID]
	WHERE([tbl_Orders].[ID] = :OrderID AND
		[tbl_Partable].[default] = :TRUE AND
		[tbl_Partable].[IsGift] = :False)) BETWEEN [tbl_Gift].[AmountFrom] AND [tbl_Gift].[AmountTo])
UNION ALL
SELECT
	'{00000000-0000-0000-0000-000000000004}' AS [ID],
	NULL AS [Name],
	[tbl_LotInGift].[LotID] AS [LotID],
	[tbl_Lot].[Name] AS [LotName],
	[tbl_Lot].[IsJewel] AS [IsJewel],
	[tbl_Lot].[IsEvent] AS [IsEvent],
	[tbl_Gift].[ID] AS [GiftID],
	[tbl_Gift].[Name] AS [GiftName],
	[tbl_Gift].[AmountFrom] AS [AmountFrom],
	[tbl_Gift].[TypeID] AS [TypeID],
	NULL AS [GiftDescription]
FROM
	[dbo].[tbl_Gift] AS [tbl_Gift]
INNER JOIN
	[dbo].[tbl_LotInGift] AS [tbl_LotInGift] ON [tbl_LotInGift].[GiftID] = [tbl_Gift].[ID]
LEFT OUTER JOIN
	[dbo].[tbl_Lot] AS [tbl_Lot] ON [tbl_Lot].[ID] = [tbl_LotInGift].[LotID]
LEFT OUTER JOIN
	[dbo].[tbl_SaleSource] AS [tbl_SaleSource] ON [tbl_SaleSource].[ChannelID] = [tbl_Gift].[ChannelID]
WHERE([tbl_Gift].[TypeID] = :gtClientLoyalty AND
	:Date BETWEEN [tbl_Gift].[DateFrom] AND [tbl_Gift].[DateTo] AND
	(([tbl_Gift].[SourceID] IS NULL AND
	[tbl_Gift].[ChannelID] IS NULL) OR
	([tbl_Gift].[SourceID] IS NULL AND
	[tbl_SaleSource].[ID] = :SourceID) OR
	([tbl_Gift].[SourceID] = :SourceID) OR
	[tbl_Lot].[StatusID] IN (:LotStatusIsOpen) OR
	[tbl_Gift].[StateID] = :gfstActive) AND
	[tbl_Gift].[LoyaltyID] = :LoyaltyID)
UNION ALL
SELECT
	[tbl_Partable].[LotsID] AS [ID],
	[ReasonLot].[Name] AS [Name],
	[tbl_LotInGift].[LotID] AS [LotID],
	[tbl_Lot].[Name] AS [LotName],
	[tbl_Lot].[IsJewel] AS [IsJewel],
	[tbl_Lot].[IsEvent] AS [IsEvent],
	[tbl_Gift].[ID] AS [GiftID],
	[tbl_Gift].[Name] AS [GiftName],
	[tbl_Gift].[AmountFrom] AS [AmountFrom],
	[tbl_Gift].[TypeID] AS [TypeID],
	cast([tbl_Partable].[LotsID] as nvarchar(40)) AS [GiftDescription]
FROM
	[dbo].[tbl_Orders] AS [tbl_Orders]
LEFT OUTER JOIN
	[dbo].[tbl_Partable] AS [tbl_Partable] ON [tbl_Partable].[OrdersID] = [tbl_Orders].[ID]
LEFT OUTER JOIN
	[dbo].[tbl_Gift] AS [tbl_Gift] ON [tbl_Gift].[LotID] = [tbl_Partable].[LotsID]
LEFT OUTER JOIN
	[dbo].[tbl_LotInGift] AS [tbl_LotInGift] ON [tbl_LotInGift].[GiftID] = [tbl_Gift].[ID]
LEFT OUTER JOIN
	[dbo].[tbl_Lot] AS [tbl_Lot] ON [tbl_Lot].[ID] = [tbl_LotInGift].[LotID]
LEFT OUTER JOIN
	[dbo].[tbl_SaleSource] AS [tbl_SaleSource] ON [tbl_SaleSource].[ID] = [tbl_Orders].[SourceID]
LEFT OUTER JOIN
	[dbo].[tbl_Lot] AS [ReasonLot] ON [ReasonLot].[ID] = [tbl_Partable].[LotsID]
WHERE([tbl_Gift].[TypeID] = :gtOrderQuantity AND
	:Date BETWEEN [tbl_Gift].[DateFrom] AND [tbl_Gift].[DateTo] AND
	(([tbl_Gift].[SourceID] IS NULL AND
	[tbl_Gift].[ChannelID] IS NULL) OR
	([tbl_Gift].[SourceID] IS NULL AND
	[tbl_Gift].[ChannelID] = [tbl_SaleSource].[ChannelID]) OR
	([tbl_Gift].[SourceID] = :SourceID)) AND
	[tbl_Gift].[StateID] = :gfstActive AND
	[tbl_Orders].[ID] = :OrderID AND
	[tbl_Partable].[default] = :TRUE AND
	[tbl_Partable].[IsGift] = :False AND
	[tbl_Lot].[StatusID] IN (:LotStatusIsOpen) AND
	0 = 0) 
GROUP BY
        [tbl_Gift].[ID],
        [tbl_Gift].[Name],
       	[ReasonLot].[Name],
        [tbl_LotInGift].[ID],        
	[tbl_Partable].[LotsID],
	[tbl_LotInGift].[LotID],
	[tbl_Lot].[Name],
	[tbl_Lot].[IsJewel],
	[tbl_Lot].[IsEvent],
	[tbl_Gift].[QuantityFrom],
	[tbl_Gift].[QuantityTo],
	[tbl_Gift].[TypeID],
	[tbl_Gift].[AmountFrom]
 
HAVING COUNT([tbl_Partable].[ID]) BETWEEN [tbl_Gift].[QuantityFrom]   AND [tbl_Gift].[QuantityTo]
 
) AS [U] ORDER BY [ID] --	)) AS [U]

Вот такая страшная штука.
Этот sq был создан давно, и каким то образом функционирует в системе.
Но как только я захотел получить набор данных на его основании, он выдал ошибку.

Yegor, первое что бросается в глаза - заголовок 10-й колонки в первых 3-х подзапросах (union) GiftTypeID, а в последующих TypeID, что некорректно.
Вам нужно изменить заголовки и свойства колонок в запросе таким образом, чтобы они были одинаковы во всех union-х.

Показать все комментарии
железо
память
процессор
Установка и Администрирование
ЦП
Разработка

Всем доброго дня!
Есть проблема: добавили память на сервер SQL, теперь периодическая загрузка ЦП 99-100%. Раньше памяти не было и проблемы не было. Как выяснить с чем связана проблема?

Нравится

9 комментариев

Здравствуйте!

Необходимо анализировать. Для начала стоит обратить внимание на процессы, которые больше всего занимают ресурс ЦП.

"Резвов Роман" написал:обратить внимание на процессы

Добрый день, Роман! Один процесс занимает ресурс: sqlservr :-)

Не редки случаи, когда 100% загрузка ЦП SQL сервером происходит при блокировках. Ранее у вас узкое место было в системе ввода-вывода, а теперь в обработке самих данных. Внимательно смотрите какие части БД на каких дисках располагаются, например, TEMPDB, по умолчанию находится на диске С, а в этой базе происходят сортировки и создания временных таблиц. Эту базу лучше класть на RAID, а еще лучше на SSD. Так же, не маловажным моментом является сбор статистики и дефрагментация индексов, это нужно делать каждый день.

"Евгений Либин" написал:

какие части БД на каких дисках располагаются, например, TEMPDB

Евгений, добрый день!

Блокировки действительно частое явление, пока не думал что с ними делать.

Я правильно понимаю: что при добавлении оперативной памяти кардинально меняется "узкое место"?
TEMPDB как и лог базы црм реально лежат на c:\ а не на ssd как сама база! Надо всё вместе с логами на ssd закинуть?

Да, обязательно. Это одно из узких мест БД

Но будьте аккуратными, SSD имеет ограниченный ресурс, и если будет утеряна TEMPDB, то вы ничего не потеряете, а вот с файлами данных могут быть проблемы. Лучше саму базу на 10 RAID, а темповую базу на SSD.

А какой то монитор по процессу sqlservr существует, типа профайлера, но чтоб все действия сервера видны были? Чтобы наверняка определить в чем причина периодических (каждые 3-5 мин) уходов процессора в 100%

Есть монитор активности, там видно какие сессии что делают, есть активность по запросам, а вообще это работа для DBA, т.е. настройка и тюнинг БД.

Начните с простого,в 60% это помогает
1. tempdb на ссд
2 ежедневный ребилд индексов и сбор статистики.

Дальше нужно смотреть, может индексов не достаточно, может наоборот, слишком много.

"Евгений Либин" написал:Есть монитор активности, там видно какие сессии

Евгений, спасибо! Именно благодаря этой замечательной функции (подсказал доблестный админ) в mssms и нашел косячную процедуру, которая в джобе часто запускалась. А еще понял (так же благодаря админу), что параллелизм зло, поэтому
Max Degree of Parallelism = 4 (а лучше вооюще 2 поставить)!!!

Показать все комментарии
mds_Dataset
фильтры
Скрипты
Разработка

Господа, прошу руку помощи.

Возможно ли фильтровать mds_Dataset, если да, то каким образом?

С уважением
Егор

Нравится

2 комментария

Егор, добрый день.

Нет, но тут немного другой подход. Дело в том, что mds заполняется каждый раз на OnDatasetAfterOpen(Dataset) теми данными, которые укажите Вы. Соответственно фильтровать нужно именно эти данные. Ну к примеру, в датасете у нас фрукты (яблоки, груши), в реестре добавляем кнопку "показать только яблоки":

function btnShowApplesOnly(Control) {
     var mds = dlData.Dataset;
     mds.Attributes('IsApplesOnly') = true;
     mds.Close();
     mds.Open();
}
 
function OnDatasetAfterOpen(Dataset) {
      if(Dataset.Attributes('IsApplesOnly')) {
             Dataset.Append();
             //только яблоки
             Dataset.Post();
      } else {
             Dataset.Append();
             //все фрукты
             Dataset.Post();
      } 
}

Дмитрий, спасибо огромное! Разобрался.

Показать все комментарии
события окна
фокус
Скрипты
Разработка

Добрый день, коллеги.
Terrasoft XRM 3.3.2.304
Собственно не срабатывает событие OnFocusedControl для окна.
Может кто знает по какой причине и как это починить?
В окне несколько контейнеров.
Событие нужно для изменения элементов окна при смене активного контейнера.
Спасибо.

Нравится

2 комментария

Виктор, вероятно обработка события не вынесена в конфигурацию.
Завтра уточню у департамента разработки и сообщу результат.

Виктор, событие вынесено в конфигурацию, но оно отрабатывает только при программном вызове.
Например:
Self.FocusedControl = edtSubject;
Для Вашей задачи вызов этого события не подойдет, попробуйте использовать события OnExit/OnEnter

Показать все комментарии
excel
excel2013
импорт
Интеграция и импорт данных
Разработка

Добрый день! При импорте отчетов в excel 2013 возникает ошибка (файлы во вложении).

Нравится

4 комментария

Добрый день!
Для устранения ошибки выполните действия, рекомендованные в этой теме.

Сервисы scr_MSOfficeConsts и scr_UserReportCommon отредактированы, ошибка не исчезла=(
Такая ошибка возникает не у всех пользователей с office2013

Олеся, тогда нужно больше информации об ошибке. Активируйте отладчик скриптов и при возникновении ошибки сообщите, в каком скрипте и на какой строке она возникает + текст сообщения об ошибке будет более информативным.

Здравствуйте, Олеся.

Также попробуйте обновить бинарные файлы до последней версии.

Получить актуальные бинарные файлы Вы можете по запросу в техническую поддержку, сделав запрос нам на почту: support@terrasoft.ru

Предварительно почистите папку с временными файлами приложения: %appdata%\Terrasoft\3.3.2\Cache

Показать все комментарии
Скрипты
Разработка

Добрый день
Подскажите на какое событие нужно прописать код , чтобы после окраски строк Grid a выходило сообщение о количестве раскрашенных строк,
пробовал onShow Prepea и тд не могу подобрать.
а если указать здесь grdDataOnGetRowDrawInfo то окно сообщения выходит по количеству строк в Dataset это не устраивает.

Нравится

12 комментариев

Здравствуйте, Евгений.

Как мне кажется, Вам необходимо узнавать количество отображаемых в реестре колонок и умножать на количество раскрашенных записей в датасете, чтобы получить нужное число ячеек.

Как-то так:

function grdDataOnGetRowDrawInfo(DataGrid, Color, TextColor, ImageName, Font) {   
      var Dataset = dlData.Dataset;
      if (DataGrid.ActiveView.Items(Column).IsVisible) { 
      	GridColumnsCount = GridColumnsCount + 1;
      }
      if (Dataset.Values('AccountTypeID') == '{3EAC7195-607B-4DAC-A832-8954E3201031}') {
          TextColor.Value = clBlue;
          RowsDrawCount  = RowsDrawCount + 1;
 
      }
 
	  Column = Column + 1;
	  MessageBox(FormatStr(RowsDrawCount * GridColumnsCount));   
}

"Безродный Андрей" написал:

Здравствуйте, Евгений.

Как мне кажется, Вам необходимо узнавать количество отображаемых в реестре колонок и умножать на количество раскрашенных записей в датасете, чтобы получить нужное число ячеек.

Здравствуйте
Не совсем то.
Как прорисовать и подсчитать кол во записей я разобрался использую function grdDataOnGetRowDrawInfо
вопрос в том в каком месте прописать появления пользователю Окно сообщения ShowConfirmationDialog( Кол во строк") чтобы оно появлялось после открытия реестра и отрисовки строк, потому как если я это окно поставлю в функцию
function grdDataOnGetRowDrawInfo(DataGrid, Color, TextColor, ImageName, Font)
тогда оно появляется после каждой прорисованной строки.

Евгений, попробуйте на OnDatasetAfterOpen.

"Бондарь Наталия" написал:

Евгений, попробуйте на OnDatasetAfterOpen.


Пробовал окно появляется до открытия самого реестра
и потом еще появляется каждый раз при появлении окна редактирования реестра
нажатии на кнопку Изменить.

Боюсь что тогда только по действию или кнопке...

"Бондарь Наталия" написал:

Боюсь что тогда только по действию или кнопке...

а подскажите как тогда можно сообщение на Outlook отправить вместо диалогова окна?

Используйте функцию SendEmail (определена в скрипте scr_MailUtils).
В конфигурации много примеров, вот один из них:

SendEmail({Address: 'support@tscrm.com', 
		Subject: "Запрос в службу поддержки Terrasoft",
		BodyFormat: 1, Attachments: [TempFileName]});

"Бондарь Наталия" написал:

Используйте функцию SendEmail (определена в скрипте scr_MailUtils).

В конфигурации много примеров, вот один из них


Спасибо Наталья почти подходит,
небольшой уточнение , какой параметр делает чтобы письмо отправлялось без открытия шаблона и участия пользователя.
В данном примере открывается шаблон письма и нужно нажимать на кнопку Отправить

Евгений,

развернутый пример есть в теме:
http://www.community.terrasoft.ru/blogs/7911

В качестве примера используется функция SendEmailByTemplate скрипта scr_MailUtils с параметрами AutoSend и Silent.

SendEmailByTemplate(TemplateID, {RecordID: ID, Address: AddressList,
                   AutoSend: true, Silent: true});
}

Андрей спасибо за пример, может пригодиться в будущем отправка по группам и тд,
но в данном случае мне нужно отправить письмо с списком Контрагентов, на один адрес (укажу сразу в скрипте) больше всего подходит функция

SendEmail({Address: 'Evgeniy.Evdokimov@fund.kz',
Subject: "Список контрганетов",
Body: 'Список контрагентов следующий '})

только как заставить чтобы письмо уходило автоматически
может от версии зависит
у меня 3.3.2 . 294

Евгений, установите параметр AutoSend: true (можно посмотреть в примере Андрея).

Все спасибо нашел то что нужно !

SendEmail({Address: 'Evgeniy.Evdokimov@fund.kz',
Subject: 'Список контргентов', BodyFormat: 2,
HTMLBody: 'Список просроченных договоров',
AutoSend: true, SendImmediately: true});

Показать все комментарии
FastReport Export
Скрипты
Разработка

Здравствуйте.

После вызова из террасофта ReportPreviewer.Prepare(); хочется сохранить отчет как то так: ReportPreviewer.Save('C:\rez.xls','xls'); Как то это можно сделать?

         var ReportDataset = fbcFilters.DatasetLink.Dataset;
         var Report = Services.GetNewItemByUSI('fr_IncidentNotCloseOfPeriud');
         var ReportPreviewer = Services.GetNewItemByUSI('wnd_BaseFastReportPreview');
         var mainReportPreviewer = Services.GetNewItemByUSI('wnd_IncidentNotCloseOfPeriud');
         var ReportPreviewerComponent = ReportPreviewer.Attributes('ReportPreviewer');

        FilterEngine.ReportPreviewer = ReportPreviewerComponent;
        FilterEngine.Report = FilterEngine.ReportPreviewer.Report;
         FilterEngine.DateFilterWindow = wndDateFilter.Window;
         var PeriodDataset = FilterEngine.DateFilterWindow.ComponentsByName('dlData').Dataset;

         SetAttribute(ReportPreviewer, 'Report', Report);
         ApplyDatasetFilter(ReportDataset, 'BeginDate', PeriodDataset('DateFrom'), true);
         ApplyDatasetFilter(ReportDataset, 'EndDate', PeriodDataset('DateTo'), true);
         
                 
        fbcFilters.ApplyFilter();
        if (ReportDataset.State != dstInactive) {
        ReportDataset.Close();
         }
        ReportDataset.Open();
         
         Report.Attributes('BeginDate')  = PeriodDataset('DateFrom');
         Report.Attributes('EndDate')     = PeriodDataset('DateTo');
         
         FilterEngine.ReportPreviewer = ReportPreviewerComponent;
        FilterEngine.Report = FilterEngine.ReportPreviewer.Report;
        FilterEngine.DateFilterWindow = wndDateFilter.Window;
               
         ReportPreviewer.Build();
         ReportPreviewer.Prepare();

Нравится

2 комментария
call
HasNotBeenDialedPhoneNumber
Интеграция и импорт данных
Разработка

Иногда появляется это сообщение, причем уже после того когда звонок уже был совершен(трубка была поднята). В коде я дописал только чтоб некоторые поля ставали обязательными когда звонок исходящий.
Скрин:
Скрин

Нравится

1 комментарий

Виталий, по данной информации сложно сказать в чем причина, нужно выполнить отладку.
Поставьте точку останова в функцию function SaveCall() сервиса wnd_CallEditScript и проведите отладку.
Важно понять условия, при которых логика срабатывает некорректно.

Показать все комментарии