Питання щодо Debug в Terrasoft 3.4.1 Debug працював в коді десктопного JavaScript. Де у коді стояла команда debug; відчинялося вікно Visual Studio. Там згадувалося якесь Community. І далі можна було налагоджувати програму. Старий комп'ютер вийшов із ладу. На новому терасофт та Visual Studio встановили. Але їх, мабуть, треба якось зв'язати – Debug не працює. Тих, хто встановлював Debug, вже нема. У нас звернутися нема до кого.  Ви можете підказати, як підключити Debug до терасофту? Приклад коду у вкладенні.

Прикрепленные файлы

Нравится

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

Добрий вечір,

 

Теоретично має спрацювати:

 

1) Створити EnableDebugger.reg файл

2) В цьому файлі написати:

Windows Registry Editor Version 5.00

 

[HKEY_CURRENT_USER\Software\Microsoft\Windows Script\Settings]

"JITDebug"=dword:00000001

 

3) Виконати файл (просто відкрити його на пристрої і погодитись з попередженням)

4) Якщо користувач пристрою не адміністратор, то перевірити, що користувач входить в роль "Debugger Users"

5) Для активації Visual studio як відладника треба встановити в Visual studio опцію Script (Tools -> Options -> Debugging -> Just-In-Time)

6) Перезавантажити пристрій

 

Спробуйте, будь ласка, і повідомте про результат.

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

Добрый день. Может кто сталкивался с таким вопросом о применении ES6 в проекте? Думаю, что всем известно о ситуации с поддержкой браузеров новых форматов ES. То, что IE тяжело работает с ES6 и т.д., в связи с чем возникает вопрос о использовании такой штуки, как Babel, который так сказать конвертнет в поддерживаемый синтаксис.

Пытался ли кто прикрутить Babel в проекте?

Или же может есть идеи какие-то, как сделать это?

Нравится

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

Добрый день!

E11 не поддерживает стандарт ES6.

Для того чтобы код написанный с применением фич ES6 работал, выполняются следующие приемы: добавление полифилов и транспайлинг.

Полифилы имитируют классы и дополнительные методы к существующим классам (например добавляют класс Promise).

Транспайлинг - процесс преобразования кода в формате ES6 в формат ES5 (например дает поддержку таких конструкций как лямбды, импорты, экспорты и т.д.)

В ядровой части системы (которая потом собирается в all-combined) используется библиотека полифилов corejs и транспайлинг с помощью инструмента babel. Соответственно в коде для ядра могут использоваться фичи ES6. 

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

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

В IDS Borjomi открыта вакансия Разработчика Terrasoft



Локация: Москва или удаленный формат работы

 

Основные задачи:

✅ Разработка на платформе Creatio (Terrasoft)

✅ Оценка сроков выполнения

✅ Оптимизация и настройка текущего функционала

✅ Диагностика и устранение ошибок на уровне кода

✅ Консультации и обучение пользователей

✅ Кастомизация встроенных решений Sales, Marketing

 

Мы ожидаем:

✅Опыт работы в роли разработчика на платформе Creatio (Terrasoft) от 1 года

✅Знание платформы Creatio (Terrasoft)

✅Знание JavaScript

✅Знание C#

✅Желательно знание SQL, T-SQL (или опыт работы с PostgreSQL или Oracle) на уровне написания сложных запросов, представлений и процедур

✅Умение работать с чужим кодом

✅Опыт работы с Git желателен

✅Настройка интеграции c внешними сервисами

 

Контактное лицо

Анна

Mob.: 8 (906) 098 3145

E-mail: a.mosinyan@ids-borjomi.com 

 

Нравится

Поделиться

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

Коллеги, добрый день. Столкнулись с проблемой переноса данных из системы Terrasoft 3x в Creatio, необходимо перенести данные поля описание из системы Terrasoft 3x, которое имеет тип image, в ленту или примечание в Creatio. Может кто-то сталкивался с подобной проблемой переноса и смог её решить?

Нравится

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

Добрый день

На сколько я помню там html. Тут нужно реализовать утилиту, которая будет читать из 3.х и сохранять в Creatio. Для удобства переноса между базами можно реализовать Clr assembly для SQL сервера

 

Проблема в том, что в Creatio данные хранятся как текст в html, а в Terrasoft 3x, при конвертировании данных из blob выходит непонятный формат. Хотелось бы узнать, что это за формат хранения текста.

Евгений, прямой конвертации не будет. 

Описание типа Image:

https://docs.microsoft.com/ru-ru/sql/t-sql/data-types/ntext-text-and-image-transact-sql?view=sql-server-ver15

Сравнение типов Image и varbinary(max):

https://sqltutorialtips.blogspot.com/2016/11/image-vs-varbinarymax.html

Если грубо, то Image это уже устаревший формат и скоро он будут исключен. Это просто массив байт. И даже сейчас можно без приведения типов сделать insert select из типа Image в varbinary(max).

Другое дело, будет ли корректно отображаться все в Creatio. Поэтому, если данные отображаются неверно, то на этом этапе нужно делать "прослойку"

 

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

Доброго времени суток, коллеги.

Есть ТеррасофтCRM 3.3.2.311. 

Пытаюсь добавить на форму компонент PivotTableControl. В результате получаю ошибку: "Класс не зарегистрирован". Переустановка не помогла, ошибка проявляется и на Windows 7 и на 10. 

Кому-нибудь приходилось работать со сводными таблицами в TerrasoftCRM?

Нравится

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

Добрый день!

Очень похоже на проблему, которую описывали в этом посте:

https://community.terrasoft.ru/articles/podderzka-ms-office-x64-v-terra…



Рекомендую ознакомиться с ним. Вероятно необходимо использовать 32 битный Office или же обновить приложение до  3.4.1.

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

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

Нравится

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

Добрый день, Дмитрий!

 

Для решения возникших ошибок вам стоит обратится в техническую поддержу. 

 

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

Коллеги, добрый день!

 

Вопрос скорее к Террасофт. Скажите, а почему убрали возможность выгрузки печатной формы в pdf? Чем продиктовано такое решение? Было очень удобно формировать счета, например.

Нравится

21 комментарий
Лучший ответ

Добрый вечер.

 

Мне служба поддержки ответила следующее: 

Начиная с версии 7.14.2 из продукта исключена возможность выгрузки печатных форм в формате PDF.

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

В новых версиях будет реализована возможность выгрузки отчетов в PDF для всех клиентов, но уже в рамках другого функционала.

Добрый вечер.

 

Мне служба поддержки ответила следующее: 

Начиная с версии 7.14.2 из продукта исключена возможность выгрузки печатных форм в формате PDF.

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

В новых версиях будет реализована возможность выгрузки отчетов в PDF для всех клиентов, но уже в рамках другого функционала.

 

 

Алла Савельева,

Мда, понять бы какие именно будущие версии подразумеваются. со времен 7.14 достаточно много времени прошло( А пользователям-то вынь, да положь)

 

Сидоров Александр Валерьевич пишет:

со времен 7.14 достаточно много времени прошло

С тех пор добавился механизм отчётов FastReport, они как раз выгружаются в pdf.

Зверев Александр,

fastreport же всегда был. Ну и использовать его для формирования счета - странная идея на мой взгляд. Был простой и понятный инструмент. Зачем тратить силы на то, чтобы его выпилить?)

Сидоров Александр Валерьевич пишет:

fastreport же всегда был.

Только в 3.Х. 

Зверев Александр,

 

Я думаю, что Александр Сидоров имеет ввиду, что механизм настройки отчета в Word в разы проще, чем в FastReport.

 

Опять таки очень мало информации с различными примерами о том, как настраивать отчет в FastReport.

Сидоров Александр Валерьевич,

Это все, чтоб жизнь малиной не казалась)))

Алла, вероятно, всё дело в ограничениях на сторонние компоненты, вроде того же Aspose.

Алла Савельева,

да, с fastreport она точно не шоколад)

Если стандартная выгрузка в Word выводит в нужном виде и не хватает только преобразования в pdf, то можно локально на компьютере преобразовывать, есть виртуальные pdf-принтеры.

 

Также в маркете есть несколько других движков печатных форм, в том числе есть и PDF Generator connector, интегрирующийся со сторонней платформой.

Зверев Александр,

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

Сидоров Александр Валерьевич,

Поделитесь, как решали такую задачу, когда нужно сгенерировать некую печатную форму по шаблону и приложить к письму для отправки?

Зверев Александр пишет:

Если стандартная выгрузка в Word выводит в нужном виде и не хватает только преобразования в pdf, то можно локально на компьютере преобразовывать

Часто стоит именно такая задача, чтобы сразу выгружать в pdf, особенно касается документов с подписями и печатями (чтобы не вносились изменения пользователем непосредственно в документе).

 

Ну, и странно то, что был бесплатный базовый функционал, который это делал, а сейчас ты предлагаешь платную утилиту(

Алла Савельева,

а я, честно говоря, и не помню. Разработчики как-то делали, я не вникал в детали. Но это было давно, еще в 7.12 или около того

Алла Савельева пишет:

бесплатный базовый функционал

Это для конечного пользователя он бесплатный, а сам компонент мог иметь какие-то лицензионные условия. Видимо, потому и убрали. 

Aspose - американская компания, Террасофт - российская, чтобы быть ближе к полностью российской перевели библиотеки на российские. FastReport - российская

Всё оказалось проще, но за отдельную плату (от 99$).

Информация от devlabs:

Мы выпустили маркетплейс пакет, который позволит клиентам конвертировать ПФ в PDF:

Aspose.PDF connector for Creatio

Клиентам с версии 7.16.1 и новым справочником ПФ, кому нужна печать файлов в PDF, можно смело рекомендовать установить пакет.

Сам пакет бесплатный, но использование сервиса конвертации стоит денег. Цены перечислены тут: https://purchase.aspose.cloud/pricing + есть бесплатный триал.

Руслан Хасанов, Украинская компания, просто офис продаж есть в России

Александр Тыра,

Может быть. Я смотрел здесь - 

https://reestr.minsvyaz.ru/request/165716/?sphrase_id=446874

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

Проблема всех таких облачных третьих решений - это отсылка своих данных неизвестно куда. 



Не все клиенты могут себе это позволить, потому хочется иметь инструмент для генерации pdf 100% on-site



И сюда же Preview приложенных файлов (pdf хотя бы) 100% on-site

Владимир, в настоящее время стандартный в системе механизм отчётов FastReport генерирует их в пределах сайта. Вы можете включить в настройках тестовый отчёт «Знаменательные события контакта (пример)» и сгенерировать pdf-файл для любого контакта.

По высказанным в теме предложениям уже есть идеи: о необходимости функции конвертации word в pdf в продукте, о предпросмотре для файлов тех форматов, для которых его ещё нет (pdf, doc, xls, tiff, ...) и заодно о предпросмотре печатных форм в FastReport.

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

Доброго времени суток! Подскажите, пожалуйста, как добавить CheckBox в средства связи. Для средства связи добавил в объекте логическое значение, например с названием "UsrIsMain".

Нравится

4 комментария
Лучший ответ

Мягко говоря не тривиальная задача, посмотрите как в BaseCommunication формируются конфиги для элементов управления для существующих в короюке типов комуникации и по аналогии для своего (добавленного) логического типа создайте конфиг для контрола. 

Мягко говоря не тривиальная задача, посмотрите как в BaseCommunication формируются конфиги для элементов управления для существующих в короюке типов комуникации и по аналогии для своего (добавленного) логического типа создайте конфиг для контрола. 

Григорий Чех,

В принципе мне понятно, как конфиг строится. Добавлял TextEdit поле, Lookup поле. А вот CheckBox не получается, выбрасывает ошибку следующую:

 

message: Cannot read property 'changeEvent' of undefined 

 date: Thu Jun 13 2019 11:01:45 GMT+0300 (Москва, стандартное время)

moduleId: CardModuleV2_########GUID###########_ContactPageV2_detail_ContactCommunication

moduleName: DetailModuleV2



Строил сам CheckBox вот так:

{

                        className: "Terrasoft.CheckBoxEdit",

                        id: "CheckBoxEditId",

                        classes: {

                            wrapClass: ["communication-detail-edit-user-class", "communication-additional-edit-label-wrap"]

                        },

                        value: {

                            bindTo: "UsrIsMain"

                        },

                        change: {

                            bindTo: "changeIsMainFlag"

                        }

  };



Сама функция changeIsMainFlag объявлена в ViewConfig'е.

 

Григорий Чех,

Вообще видел уже два поста в коммьюнити, которые тоже не понимали, как CheckBox вставить в Средства связи. Ответа там так и не было.

В детали средств связи контакта в пакете MarketingCampaign есть такое поле «Не актуальный» (NonActual) у каждого средства связи. Посмотреть на реализацию можно в схеме ContactCommunicationDetail.

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

Приветствую. Проблема с созданием Join'а.

Имеется вот такой SelectQuery.

SELECT
    [tbl_OfferingInMovement].[ID] AS [ID],
    [tbl_OfferingInMovement].[OfferingMovementID] AS [OfferingMovementID],
    [tbl_OfferingInMovement].[OfferingID] AS [OfferingID],
    [Offering].[Name] AS [OfferingName],
    [Offering].[Code] AS [OfferingCode],
    [Unit].[Name] AS [UnitName],
    [OfferingMovement].[StoreID] AS [StoreID],
    [tbl_Store].[Store] AS [Store],
    [tbl_OfferingInMovement].[Quantity] AS [Quantity],
    [tbl_OfferingInMovement].[BasicPrice] AS [BasicPrice],
    [tbl_OfferingInMovement].[BasicAmount] AS [BasicAmount],
    [tbl_OfferingInMovement].[SignedQuantity] AS [SignedQuantity],
    [tbl_OfferingInMovement].[SignedAmount] AS [SignedAmount],
    [tbl_OfferingInMovement].[Description] AS [Description],
    [OfferingMovementType].[ID] AS [OfferingMovementTypeID],
    [OfferingMovementType].[Name] AS [OfferingMovementType],
    [tbl_OfferingInMovement].[PlanQuantity] AS [PlanQuantity],
    [tbl_OfferingInMovement].[PlanAmount] AS [PlanAmount],
    [OfferingMovement].[StatusID] AS [OfferingMovementStatusID],
    [tbl_OfferingInMovement].[Price] AS [Price],
    [tbl_OfferingInMovement].[Amount] AS [Amount],
    [OfferingMovement].[CurrencyID] AS [CurrencyID],
    [tbl_Currency].[Currency] AS [Currency],
    [OfferingMovement].[CurrencyRate] AS [Rate],
    [tbl_OfferingInMovement].[ConsignmentID] AS [ConsignmentID],
    [Consignment].[Number] AS [ConsignmentNumber],
    [Offering].[OfferingChargeMethodID] AS [OfferingChargeMethodID],
    [OfferingMovement].[Number] AS [OfferingMovementNumber],
    [tbl_OfferingInMovement].[TZR] AS [TZR],
    [tbl_OfferingInMovement].[PrimeCost] AS [PrimeCost],
    [tbl_OfferingInMovement].[PrimeAmount] AS [PrimeAmount],
    [Offering].[Volume] AS [Volume],
    [Offering].[Weight] AS [Weight],
    [Offering].[BasicPrice] AS [OfferingBasicPrice],
    [tbl_OfferingInMovement].[TZRAmount] AS [TZRAmount],
    [tbl_OfferingInMovement].[DocumentID] AS [DocumentID],
    [tbl_OfferingInMovement].[ContractID] AS [ContractID],
    [tbl_OfferingInMovement].[InvoiceID] AS [InvoiceID],
    [tbl_Document].[Title] AS [DocumentNumber],
    [tbl_Contract].[Title] AS [ContractNumber],
    [tbl_Invoice].[InvoiceNumber] AS [InvoiceNumber],
    [tbl_OfferingInMovement].[PurchaseID] AS [PurchaseID],
    [tbl_Purchases].[Number] AS [PurchaseNumber],
    [OfferingMovement].[SupplierID] AS [SupplierID],
    [tbl_OfferingInMovement].[Date] AS [Date],
    [OfferingMovement].[ModifiedOn] AS [ModifiedOn],
    [OfferingMovement].[DateOfShipment] AS [DateOfShipment],
    [AccountBillingInfoItelon].[Name] AS [ItelonName],
    [AccountBillingPayerInfo].[Name] AS [PayerName]
FROM
    [dbo].[tbl_OfferingInMovement] AS [tbl_OfferingInMovement]
LEFT OUTER JOIN
    [dbo].[vw_Offering] AS [Offering] ON [Offering].[ID] = [tbl_OfferingInMovement].[OfferingID]
LEFT OUTER JOIN
    [dbo].[tbl_Unit] AS [Unit] ON [Unit].[ID] = [Offering].[DefaultUnitID]
LEFT OUTER JOIN
    [dbo].[vw_OfferingMovement] AS [OfferingMovement] ON [OfferingMovement].[ID] = [tbl_OfferingInMovement].[OfferingMovementID]
LEFT OUTER JOIN
    [dbo].[tbl_OfferingMovementType] AS [OfferingMovementType] ON [OfferingMovementType].[ID] = [OfferingMovement].[TypeID]
LEFT OUTER JOIN
    [dbo].[tbl_Store] AS [tbl_Store] ON [tbl_Store].[ID] = [OfferingMovement].[StoreID]
LEFT OUTER JOIN
    [dbo].[vw_OfferingMovement] AS [Consignment] ON [Consignment].[ID] = [tbl_OfferingInMovement].[ConsignmentID]
LEFT OUTER JOIN
    [dbo].[tbl_Currency] AS [tbl_Currency] ON [tbl_Currency].[ID] = [OfferingMovement].[CurrencyID]
LEFT OUTER JOIN
    [dbo].[vw_Document] AS [tbl_Document] ON [tbl_Document].[ID] = [tbl_OfferingInMovement].[DocumentID]
LEFT OUTER JOIN
    [dbo].[vw_Contract] AS [tbl_Contract] ON [tbl_Contract].[ID] = [tbl_OfferingInMovement].[ContractID]
LEFT OUTER JOIN
    [dbo].[vw_Invoice] AS [tbl_Invoice] ON [tbl_Invoice].[ID] = [tbl_OfferingInMovement].[InvoiceID]
LEFT OUTER JOIN
    [dbo].[vw_Purchases] AS [tbl_Purchases] ON [tbl_Purchases].[ID] = [tbl_OfferingInMovement].[PurchaseID]
LEFT OUTER JOIN
    [dbo].[tbl_AccountBillingInfo] AS [AccountBillingInfoItelon] ON [AccountBillingInfoItelon].[ID] = [OfferingMovement].[InfoItelonID]
LEFT OUTER JOIN
    [dbo].[tbl_AccountBillingInfo] AS [tbl_AccountBillingInfoPayer] ON [tbl_AccountBillingInfoPayer].[ID] = [tbl_OfferingInMovement].[PayerID]

Предпоследний Join(AS [AccountBillingInfoItelon]) создан мною. Работает отлично.

Вот его код. Заранее извиняюсь за синтаксис VBA.

    Set oTable = TSConnector.Services.GetNewItemByUSI(AccountBillingInfoTableName)
    Set oJoin = oSelectQuery.Items(0).Joins.Items(4).CreateCopy
    oJoin.UID = TSConnector.GenGUID
    oJoin.RightField = oJoin.RightField.ParentFields.Items(40)
    oJoin.LeftField = oTable.Fields.ItemsByName("ID")
    oJoin.LeftTableAlias = "AccountBillingInfoItelon"
    oJoin.JoinType = jtLeftOuter
    oSelectQuery.Items(0).Joins.AddItem oJoin
    oSelectQuery.Items(0).Joins.Items(oSelectQuery.Items(0).Joins.Count - 1).CanDisable = False

Последний создаётся не правильно.

    Set oJoin = oInvoiceSelectQuery.Items(0).Joins.Items(0).CreateCopy
    oJoin.UID = TSConnector.GenGUID
    oJoin.LeftField = oTable.Fields.ItemsByName("ID")
    oJoin.LeftTableAlias = "tbl_AccountBillingPayerInfo"
    oJoin.RightField = TSConnector.Services.GetNewItemByUSI(InvoiceTableName).Fields.Items(31)
    oJoin.JoinType = jtLeftOuter
    oSelectQuery.Items(0).Joins.AddItem oJoin
    oSelectQuery.Items(0).Joins.Items(oSelectQuery.Items(0).Joins.Count - 1).CanDisable = False

Проблема с RightField. Поле верное, то что нужно [PayerID]. Но мне надо чтобы оно доставала его именно из [tbl_Invoice]. А она же в SQL подставляет [tbl_OfferingInMoment]. Где можно изменить таблицу в Join'е или ещё где-то в SelectQuery. Целую неделю мучаюсь не могу понять.

Нравится

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

В коробке в скрипте wnd_IWTGraphWizardScript есть функция:

function GetPathByColumn(Column) {
	var Result = Column.Field.ParentFields.ParentTable.UID + snpFields + Column.Field.UID;
	var ParentJoin = Column.ParentJoin;
	while (ParentJoin) {
		Result = ParentJoin.RightField.ParentFields.ParentTable.UID +
			snpFields +
			ParentJoin.RightField.UID +
			jtLeft +
			ParentJoin.LeftField.ParentFields.ParentTable.UID +
			snpFields +
			ParentJoin.LeftField.UID +
			snpSegment +
			Result;
		ParentJoin = ParentJoin.ParentJoin;
	}
	return Result;
}  

Возможно, подобным образом можно не только считывать, но и записывать название таблицы. Если разобраться не получится, можно попробовать подключится в отладчике и посмотреть, как устроены нормально работающие join-ы.

 

О, спасибо Александр! Не думал что достучусь на этот форум. laugh Завтра с утра буду пробовать. Спасибо ещё раз. Отпишу что да как. 

Не получилось записывать название таблицы в Join. Что за связь используется так и не получилось выяснить. Я пользуюсь редактором VBA непосредственно в EXCEL. За Visual Studio еще не садился.

Воспользовался oSubSelectColumn. Отличная штука. Всё что хотел, получилось.

    Set oSubSelectColumn = oSelectQuery.Items(0).Columns.CreateSubSelectColumn
    Set oTable = TSConnector.Services.GetNewItemByUSI(AccountBillingInfoTableName)
 
    Dim oSQLFilter As CustomSQLFilter
    Dim oSelect As TSObjectLibrary.Select
    Set oSelect = oSelectQuery.CreateItem
    oSelect.FromTable = oTable
    oSelect.FromTableAlias = "AccountBillingInfo"
    Set oGeneralColumn = oSelectQuery.Columns.CreateGeneralColumn
    oGeneralColumn.Field = oTable.Fields.ItemsByName("Name")
    oGeneralColumn.ColumnAlias = "Name"
    oSelect.Columns.Add oGeneralColumn
    Set oSQLFilter = oSelect.Filters.CreateCustomSQLFilter
    oSQLFilter.SQLText = "[AccountBillingInfo].[ID] = [OfferingMovement].[InfoItelonID]"
    oSelect.Filters.Add oSQLFilter
    oSubSelectColumn.ColumnSelectQuery.Add oSelect
    oSubSelectColumn.ColumnAlias = "AccountBillingInfoItelon"
    oSelectQuery.Items(0).Columns.Add oSubSelectColumn
    oSelectQuery.Items(0).Columns.Items(oSelectQuery.Items(0).Columns.Count - 1).IsEnabled = True

 

В редакторе VBA тоже есть отладка. Не знаю, показывает ли структуру объектов, но вроде бы должен.

Можно и через SubSelect. Когда-то в базе на Orcacle упирались в лимит Join-ов и приходилось в дизайнере переделывать в sq часть колонок на колонки-подзапросы.

Зверев Александр, есть, да, структура объектов.

Если видно структуру, можно посмотреть, как устроен нормальный join. Ну, или использовать подзапросы.

Зверев Александр, Пользовался более года подзапросами. Сегодня столкнулся с проблемой фильтрации по столбцам от подзапросов. Долго не стал вникать в суть проблемы.

Решил вернуться к Join'ам. smiley

Решение к проблеме в самом низу этого сообщения.

Пошёл по вашему совету, Александр. Решил сравнивать структуры созданного мною нового Join'а и уже готового Join'а из другого готового SelectQuery.

Задача была поставлена аналогична упомянутой выше: прикрепить таблицу(создать join) к запросу(SelectQuery). При этом из прикрепленной таблицы(join'а) должны выбираться те строки, значения ключевых полей которых равны значениям полей не из исходной таблицы, на основе которой сформирован запрос(SelectQuery), а из таблицы, прикрепленной ранее (уже прикрепленного join'а). Всё тоже самое, что и в предыдущей задаче. Выражаясь кратким языком, присоединить join к уже имеющемся join'у в SelectQuery.

На следующей картинке представлен SQL текст уже (упомянутого в первом сообщения топика) готового запроса "sq_OfferingInMovement", сформированный на основе таблицы "tbl_OfferingInMovement" и нескольких прикрепленных таблиц к нему. В этом тексте можно увидеть, что к запросу прикреплена таблица(join), к заранее прикрепленному (join'у). В этом запросе всё правильно.

Синим выделены строки, означающие что к запросу прикреплено представление(если не понятно что такое представление, можно прочесть как "таблица") "[vw_Offering], у которого значение ключевого поля "[ID]" равняется значению поля исходной таблицы  "[tbl_OfferingInMovement].[OfferingID]". Этому присоединенному представлению присвоен псевдоним(alias) "[Offering]".

Красным выделены строки, означающие что к запросу прикреплена таблица "[tbl_Unit]", у которого значение ключевого поля "[ID]" равняется значению поля не исходной таблицы, а значению поля прикрепленного (синим выделено) представления [Offering].[DefaultUnitID].

В этом примере всё отлично.

Проблема заключалась в том, что при создании нового собственного прикрепления (join'а), которое должно было крепиться к уже имеющемуся прикреплению (join'у), в SQL тексте отображалось что новое прикрепление (join) крепиться не к уже имеющемуся прикреплению, а к исходной таблице. То есть, если взять пример выше, и прикрепление, которое выделено красным, было бы создано мною, то там вместо [Offering].[DefaultUnitID] было бы [tbl_OfferingInMovement][DefaultUnitID], что было бы неверным и, естественно, выдавало бы ошибку. Так как в [tbl_OfferingInMovement] нет поля [DefaultUnitID] и вообще это не то что мне нужно.

В ходе сравнения join'ов выяснилось, что у объекта Join, оказывается, есть параметр ParentJoin, которому необходимо присваивать тот Join, к которому будет необходимо прикреплять новый join.

Вот код правильно созданного Join'а и необходимого нам столбца из него.

Создание нового прикрепления (join'а) к исходной таблице запроса.

 
//Таблица, строки которой будем крепить. 
   Set objTSTable = objTSConnector.GetService(strAssemblingInTaskTableName)
 
   Set objTSAssemblingInTaskJoin = objTSSelect.Joins.CreateItem
   objTSAssemblingInTaskJoin.ParentJoins = objTSSelect.Joins
   objTSAssemblingInTaskJoin.LeftField = objTSTable.Fields.ItemsByName("ID")
   objTSAssemblingInTaskJoin.RightField = 
   objTSSelect.FromTable.Fields.ItemsByName("AssemblingInTaskID")
   objTSSelect.Joins.Add objTSAssemblingInTaskJoin

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

    Set objTSColumn = objTSSelect.Columns.CreateGeneralColumn
    objTSColumn.ParentColumns = objTSSelect.Columns
    objTSColumn.ParentJoin = objTSAssemblingInTaskJoin
    objTSColumn.ParentParametriticQuery = objTSSelectQuery
    objTSColumn.Field = objTSTable.Fields.ItemsByName("TaskID")
    objTSColumn.DependsOn.CommaText = objTSTable.SQLName
    objTSSelect.Columns.Add objTSColumn
    objTSColumn.IsEnabled = True

Теперь добавляем ещё одно прикрепление (join) к уже созданному выше прикреплению.

    'Таблица нового прикрепления.
    Set objTSTable = objTSConnector.GetService(strTaskTableName)
 
    Set objTSTaskJoin = objTSSelect.Joins.CreateItem
 
    'Вот здесь обязательно указать то прикрепление, к которому будем крепить это.
    objTSTaskJoin.ParentJoin = objTSAssemblingInTaskJoin
 
    objTSTaskJoin.ParentJoins = objTSSelect.Joins
    objTSTaskJoin.LeftField = objTSTable.Fields.ItemsByName("ID")
    objTSTaskJoin.RightField = objTSAssemblingInTaskJoin.LeftField.ParentFields.ItemsByName("TaskID")
    objTSSelect.Joins.Add objTSTaskJoin

Ну и добавляем обязательно столбец из этого прикрепления. Без него join не включиться, если не указать параметр у Join'а CanDisable = False. Без особой причины CanDisable можно не трогать. Достаточно просто добавить столбец из этого join'а, как его параметр IsEnabled сразу же станет True.

    Set objTSColumn = objTSSelect.Columns.CreateGeneralColumn
    objTSColumn.ParentColumns = objTSSelect.Columns
    objTSColumn.ParentJoin = objTSTaskJoin
    objTSColumn.ParentParametriticQuery = objTSSelectQuery
    objTSColumn.Field = objTSTable.Fields.ItemsByName("StatusID")
    objTSColumn.DependsOn.CommaText = objTSTable.SQLName
    objTSSelect.Columns.Add objTSColumn
    objTSColumn.IsEnabled = True

Всё.

Извините за столь жидкий текст. Думаю, что кто столкнётся или уже столкнулся с данной проблемой, то всё поймёт.

Если есть какие-то замечания, то обязательно напишите.

Можно и так. Всё ли правильно, по коду сказать сложно. Если в результате в профайлере идёт нужный SQL-запрос, то нормально.

По поводу свойства ParentJoin, в SDK о нём есть, но очень кратко. Лучше смотреть примеры использования поиском по скриптам конфигурации.

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

Хочу DataSet, создаваемый SelectQuery, вывести в Excel через VBA. С этим проблем нет. SelectQuery является готовым сервисом, созданным администратором. К админке доступа нету. Всё прекрасно работает. Проблема в одном. Не могу Join по нормальному прикрепить.

Вот SQLText это SelectQuery:

SELECT
    [Offering].[Name] AS [OfferingName],
    [Offering].[Code] AS [OfferingCode],
    [tbl_OfferingInMovement].[Quantity] AS [Quantity],
    [OfferingMovementType].[Name] AS [OfferingMovementType],
    [OfferingMovement].[StatusID] AS [OfferingMovementStatusID],
    [tbl_OfferingInMovement].[InvoiceID] AS [InvoiceID],
    [tbl_Invoice].[InvoiceNumber] AS [InvoiceNumber],
    [tbl_OfferingInMovement].[Date] AS [Date]
FROM
    [dbo].[tbl_OfferingInMovement] AS [tbl_OfferingInMovement]
LEFT OUTER JOIN
    [dbo].[vw_Offering] AS [Offering] ON [Offering].[ID] = [tbl_OfferingInMovement].[OfferingID]
LEFT OUTER JOIN
    [dbo].[vw_OfferingMovement] AS [OfferingMovement] ON [OfferingMovement].[ID] = [tbl_OfferingInMovement].[OfferingMovementID]
LEFT OUTER JOIN
    [dbo].[tbl_OfferingMovementType] AS [OfferingMovementType] ON [OfferingMovementType].[ID] = [OfferingMovement].[TypeID]
LEFT OUTER JOIN
    [dbo].[vw_Invoice] AS [tbl_Invoice] ON [tbl_Invoice].[ID] = [tbl_OfferingInMovement].[InvoiceID]
LEFT OUTER JOIN
    [dbo].[tbl_AccountBillingInfo] AS [AccountBillingInfoItelon] ON [AccountBillingInfoItelon].[ID] = [OfferingMovement].[InfoItelonID]

Последняя строка, добавленный мной JOIN. Он работает на отличненько.

Его код(кстати, скажите насколько он крив):

    Set oTable = TSConnector.Services.GetNewItemByUSI(AccountBillingInfoItelonTableName)
    Set oJoin = oSelectQuery.Items(0).Joins.Items(4).CreateCopy ' создание копии join'а LEFT OUTER JOIN [dbo].[tbl_OfferingMovementType] AS [OfferingMovementType] ON [OfferingMovementType].[ID] = [OfferingMovement].[TypeID]
    oJoin.UID = TSConnector.GenGUID
    oJoin.RightField = oJoin.RightField.ParentFields.Items(40) 'нужное поле из OfferingMovement
    oJoin.LeftField = oTable.Fields.ItemsByName("ID")
    oJoin.LeftTableAlias = "AccountBillingInfoItelon"
    oJoin.JoinType = jtLeftOuter
    oSelectQuery.Items(0).Joins.AddItem oJoin
    oSelectQuery.Items(0).Joins.Items(oSelectQuery.Items(0).Joins.Count - 1).CanDisable = False

А вот этот не хочет:

    Set oTable = TSConnector.Services.GetNewItemByUSI(InvoiceTableName)
    Set oJoin = oSelectQuery.Items(0).Joins.Items(10).CreateCopy
    oJoin.UID = TSConnector.GenGUID
    oJoin.RightField = oSelectQuery.Items(0).Joins.Items(9).LeftField.ParentFields.ItemsByName("PayerID") 'проблема именно здесь. Крепиться Field от tbl_Invoice. Но в SQL_Text ошибка. Крепит Field от не того Table.
    oJoin.LeftField = oTable.Fields.ItemsByName("ID")
    oJoin.LeftTableAlias = "AccountBillingPayerInfo"
    oJoin.JoinType = jtLeftOuter
    oSelectQuery.Items(0).Joins.AddItem oJoin
    oSelectQuery.Items(0).Joins.Items(oSelectQuery.Items(0).Joins.Count - 1).CanDisable = False

После него в SQLText в конце появляется:

LEFT OUTER JOIN
    [dbo].[vw_Invoice] AS [AccountBillingPayerInfo] ON [AccountBillingPayerInfo].[ID] = [tbl_OfferingInMovement].[PayerID]

В результате ошибка. В конце должно быть не [tbl_OfferingInMovement].[PayerID], а [tbl_Invoice].[PayerID]. Ведь креплю то я PayerID именно от tbl_Invoice. А в SQLText он зачем-то подставляет PayerID из tbl_OfferingInMovement, которого там нету. Именно в этом ошибка. Где вообще в SelectQuery эти прикрепленные таблицы?

Я может быть как-то не правильно Field добавляю в Join'ы. И до конца не понимаю суть этих Field'ов. 

Может быть как-то с нуля можно создать этот join. Есть ли какие нибудь статьи?

 

Нравится

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

Вопрос обсудили в соседней Вашей теме.

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