Примеры кода для работы с ADO

Добрый день. Необходимо использовать ADO(ADOConnection,ADOCommand,ADODataset) из TS, но к сожалению не в SDK не на форуме я не нашел примера кода как работать с данными компонентами. Не могли бы вы предоставить информацию по работе с данными компонентами в TS CRM.

Нравится

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

Добрый день!

Сервис ADODataset взаимодействует со всеми сервисами, которые используются в Terrasoft CRM. Вы можете использовать сервисы окон, для отображения выборок данных.
У данного сервиса все аналогичные свойства, как и у обычного Dataset.
Единственное, что к данному сервису Вы не можете подключать Select Query, вся выборка данных и группировка прописывается в ADOCommand в виде текста SQL.
Вы создаете ADOConnection если у Вас используется несколько компонентов ADO.
ADOCommand и ADODataset настриваете на строку соединения ADOConnection.

ADOCommand используется для обработки комманд и организации запрососв, группировок, реализации Insert, Update, Delete, Exec.

1) InsertSelectQuery - сервис для групповой вставки записей из другой выборки (например, может использоваться при копировании содержимого документа – например счета на продукты, в котором продукты могут копироваться из другого документа). Данная конструкция – одна из стандартных спецификаций SQL запроса и состоит из комбинации InsertQuery и SelectQuery

Пример использования запроса (в MS SQL Server – запустить в SQL Query Analyzer):
Создадим таблицу с двумя полями – ID и Name:
CREATE TABLE [dbo].[tbl_ContactNew] (
[ID] uniqueidentifier ROWGUIDCOL NOT NULL ,
[Name] [nvarchar] (250) COLLATE Cyrillic_General_CI_AS NULL
) ON [PRIMARY]
GO

Скопируем список контактов из таблицы контактов [tbl_Contact] в созданную таблицу [tbl_ContactNew]:
INSERT INTO [dbo].[tbl_ContactNew] (
ID,
Name)
SELECT
ID,
Name
FROM [dbo].[tbl_Contact]

Для совершения операции копирования с помощью сервиса InsertSelectQuery необходимо вызвать его метод Execute.

Пример реализации на сервисах CRM:
InsertSelectQuery.rar – архив с примером использования сервиса InsertSelectQuery (высылаем в прикрепленных файлах).
Содержание:
• tbl_ContactNew.xml – сервис таблицы tbl_ContactNew
• isq_CopyContacts.xml – сервис InsertSelectQuery для копирования всех контактов в новую таблицу
• scr_CopyContacts.xml – сервис скрипта для запуска процесса (встать курсором в область скрипта и нажать F9)

2) По использованию сервисов ADO приведен пример в ADOServices.rar (высылаем в прикрепленных файлах):

Содержание:
• tbl_ContactNew.xml – сервис таблицы tbl_ContactNew
• adc_TestDB.xml – ADOConnection – настройка на соединение с базой данных
• adcmd_ClearNewContacts.xml – пример команды ADOCommand для очистки таблицы tbl_ContactNew
• adcmd_CopyNewContacts.xml – пример команды ADOCommand для копирования контактов из таблицы tbl_Contact в таблицу tbl_ContactNew
• adds_NewContact.xml – пример ADODataset для доступа к данным в таблице tbl_ContactNew
• wnd_NewContacts.xml – окно для отображения данных из таблицы tbl_ContactNew
• wnd_NewContactsScript.xml – скрипт для окна отображения данных из таблицы tbl_ContactNew

Обычно настраивается одно соединение ADOConnection, а остальные сервисы ссылаются на него. В остальном ADODataset работает как обычный Dataset за исключением, что для установки ему соответствующего фильтра необходимо изменить текст запроса и присвоить параметры.

3) RealExample.rar(высылаем в прикрепленных файлах) – пример реальных объектов из рабочего проекта для работы с ADO

4) Принцип работы с ADO компонентами аналогичен соответствующим компонентам в Dephi.
Документация по использованию ADO component в среде Delphi (правда, на английском языке):
http://hramin.narod.ru/Archive/Books/BooksL/ADO_Programming.pdf

Описание интерфейсов компонент (данные интерфейсы были взяты из описания библиотеки типа TSADOEngineLibrary.dll, импортированного в Delphi, серым цветом указаны несущественные для работы с ADO свойства и методы):
// *********************************************************************//
// DispIntf: IADOConnectionDisp
// Flags: (4416) Dual OleAutomation Dispatchable
// GUID: {2FDF4618-C8E7-4BB4-B6B7-E7B224C9C32D}
// *********************************************************************//
IADOConnectionDisp = dispinterface
['{2FDF4618-C8E7-4BB4-B6B7-E7B224C9C32D}']
property ConnectionObject: IDispatch readonly dispid 2000401;
property ConnectionString: WideString dispid 2000402;
property Connected: WordBool dispid 2000403;
property Timeout: Integer dispid 2000404;
property LoginPrompt: WordBool dispid 2000405;
property KeepConnection: WordBool dispid 2000406;
property ID: WideString dispid 100301;
property USI: WideString dispid 100302;
property ServiceTypeCode: WideString dispid 100303;
property Caption: WideString dispid 100304;
property Description: WideString dispid 100305;
property IsDesigning: WordBool dispid 100306;
property Connector: IConnector dispid 100001;
property Stub: IDispatch readonly dispid 100002;
property ObjectState: Integer dispid 100003;
function Equal(const CompareObject: ICoreObject): WordBool; dispid 100004;
procedure AssignObject(const Src: ICoreObject); dispid 100005;
function CreateCopy: ICoreObject; dispid 100006;
property CoClassGUID: WideString readonly dispid 100007;
procedure Serialize(const Node: IXMLStorageNode); dispid 100008;
procedure Deserialize(const Node: IXMLStorageNode); dispid 100009;
end;

// *********************************************************************//
// DispIntf: IADOCommandDisp
// Flags: (4416) Dual OleAutomation Dispatchable
// GUID: {F3CC52C5-6565-45F1-BDAF-2DC1FDDC3E9C}
// *********************************************************************//
IADOCommandDisp = dispinterface
['{F3CC52C5-6565-45F1-BDAF-2DC1FDDC3E9C}']
property CommandObject: IDispatch readonly dispid 2000301;
property Parameters: IParameters readonly dispid 2000302;
function Execute: Integer; dispid 2000303;
property Connection: IADOConnection dispid 2000101;
property ConnectionString: WideString dispid 2000102;
property SQLText: WideString dispid 2000103;
property Timeout: Integer dispid 2000104;
property ID: WideString dispid 100301;
property USI: WideString dispid 100302;
property ServiceTypeCode: WideString dispid 100303;
property Caption: WideString dispid 100304;
property Description: WideString dispid 100305;
property IsDesigning: WordBool dispid 100306;
property Connector: IConnector dispid 100001;
property Stub: IDispatch readonly dispid 100002;
property ObjectState: Integer dispid 100003;
function Equal(const CompareObject: ICoreObject): WordBool; dispid 100004;
procedure AssignObject(const Src: ICoreObject); dispid 100005;
function CreateCopy: ICoreObject; dispid 100006;
property CoClassGUID: WideString readonly dispid 100007;
procedure Serialize(const Node: IXMLStorageNode); dispid 100008;
procedure Deserialize(const Node: IXMLStorageNode); dispid 100009;
end;

// *********************************************************************//
// DispIntf: IADODatasetDisp
// Flags: (4416) Dual OleAutomation Dispatchable
// GUID: {032EA49B-D2E4-480A-B9D3-5EAB020FB92B}
// *********************************************************************//
IADODatasetDisp = dispinterface
['{032EA49B-D2E4-480A-B9D3-5EAB020FB92B}']
property CursorLocation: CursorLocationEnum dispid 2000201;
property CursorType: CursorTypeEnum dispid 2000202;
property Parameters: IParameters readonly dispid 2000203;
property InsertCommand: IADOCommand dispid 2000204;
property UpdateCommand: IADOCommand dispid 2000205;
property DeleteCommand: IADOCommand dispid 2000206;
property RefreshRecordSQLText: WideString dispid 2000207;
procedure SaveToFile(SaveOnlyCurrentPage: WordBool; const FileName: WideString); dispid 2000208;
property DataFields: IDataFields readonly dispid 103401;
property KeyDataField: IDataField dispid 103402;
property Values[const Name: WideString]: OleVariant dispid 0; default;
property ValAsStr[const Name: WideString]: WideString dispid 103403;
property ValAsInt[const Name: WideString]: Integer dispid 103404;
property ValAsFloat[const Name: WideString]: Double dispid 103405;
property ValAsBool[const Name: WideString]: WordBool dispid 103406;
property ValAsDateTime[const Name: WideString]: TDateTime dispid 103407;
property ValAsGUID[const Name: WideString]: WideString dispid 103408;
function GetValAsBlob(const Name: WideString; const Value: IUnknown): IUnknown; dispid 103409;
procedure SetValAsBlob(const Name: WideString; const Value: IUnknown); dispid 103410;
property RecordsCount: Integer readonly dispid 103413;
property RecordNumber: Integer dispid 103414;
property FetchRecordsCount: Integer dispid 103415;
property PageRecordsCount: Integer readonly dispid 103416;
property PageRecordNumber: Integer dispid 103417;
property PageNumber: Integer dispid 103418;
property PagesCount: Integer readonly dispid 103419;
property IsFirstPageRecord[Page: Integer]: WordBool readonly dispid 103420;
property IsLastPageRecord[Page: Integer]: WordBool readonly dispid 103421;
property IsBOF: WordBool readonly dispid 103422;
property IsEOF: WordBool readonly dispid 103423;
property IsEmptyPage: WordBool readonly dispid 103424;
property AutoRefresh: WordBool dispid 103425;
property State: DatasetStateEnum readonly dispid 103426;
property IsActive: WordBool readonly dispid 103427;
procedure Open; dispid 103429;
procedure Close; dispid 103430;
procedure Append; dispid 103431;
procedure Edit; dispid 103432;
function Delete: Integer; dispid 103433;
function Post: Integer; dispid 103434;
procedure Cancel; dispid 103435;
procedure RefreshRecord(KeyValue: OleVariant; AddNewRecordOnPage: WordBool); dispid 103436;
procedure GotoPrior; dispid 103437;
procedure GotoNext; dispid 103438;
procedure GotoFirst; dispid 103439;
procedure GotoLast; dispid 103440;
function Locate(const KeyFields: WideString; KeyValues: OleVariant): WordBool; dispid 103441;
procedure GotoPageFirst; dispid 103442;
procedure GotoPageLast; dispid 103443;
procedure Copy; dispid 103444;
procedure CalcDataFields; dispid 103445;
procedure LoadFromFile(const FileName: WideString); dispid 103446;
procedure LoadFromXML(const Stream: IUnknown); dispid 103447;
procedure SaveToXML(const Stream: IUnknown); dispid 103448;
procedure SetSummaryType(const FieldName: WideString; SummaryType: OleVariant); dispid 103449;
function GetSummary(const FieldName: WideString; SummaryType: SummaryTypeEnum): OleVariant; dispid 103450;
property DisplayValues[const Name: WideString]: WideString readonly dispid 103451;
property ValIsNull[const Name: WideString]: WordBool readonly dispid 103452;
property Script: IScript dispid 107801;
property ScriptControl: IDispatch readonly dispid 107802;
property Attributes: INamedValues readonly dispid 107803;
property AreEventsEnabled: WordBool readonly dispid 107804;
property EventsDispatcher: IEventsDispatcher readonly dispid 107805;
procedure EnableEvents; dispid 107806;
procedure DisableEvents; dispid 107807;
function ExecuteScriptMethod(const MethodName: WideString; Parameters: {??PSafeArray}OleVariant): OleVariant; dispid 107808;
property ID: WideString dispid 100301;
property USI: WideString dispid 100302;
property ServiceTypeCode: WideString dispid 100303;
property Caption: WideString dispid 100304;
property Description: WideString dispid 100305;
property IsDesigning: WordBool dispid 100306;
property Connector: IConnector dispid 100001;
property Stub: IDispatch readonly dispid 100002;
property ObjectState: Integer dispid 100003;
function Equal(const CompareObject: ICoreObject): WordBool; dispid 100004;
procedure AssignObject(const Src: ICoreObject); dispid 100005;
function CreateCopy: ICoreObject; dispid 100006;
property CoClassGUID: WideString readonly dispid 100007;
procedure Serialize(const Node: IXMLStorageNode); dispid 100008;
procedure Deserialize(const Node: IXMLStorageNode); dispid 100009;
end;

ADOCommand
Добавление компонента происходит (как и для других сервисов)при щелчке правой кнопкой мыши выборе его из списка.
Компоненту присваивается осмысленное название, например adc_ExportData.
В окне редактирования сервиса есть такие згачения, как Строка соединения(можно создать строку соединения без использования уществующих
соединений, созданных в компонентах ADOConnection) и Соединение(можно выбрать созданное ранее посредством сервиса ADOConnection соединение).
В поле Текс SQL прописывается команда, например exec ExportData :GroupID, :GroupID - параметр, добавленный в список параметров сервиса.
В скрипте
- получение сервиса
var Command = GetSingleItemByCode('adc_ExportData'); где 'adc_ExportData' - название сервиса ADOCommand
- установка парамтров
SetParameterValue(Command.Parameters, 'GroupID', GroupID);
- запуск на исполнение
Command.Execute();

ADODataset
Он является еаследником от IDataset, документацию по свойствам которого можно найти в SDK по ссылке http://www.terrasoft.com.ua/sdk/

Использовать параметр в ADOCommand можно следующим образом: при создании параметра указываете ему тип «Уникальный идентификатор» и его значение по умолчанию (если необходимо).См.скриншот в прикрепленных файлах (0001).

После этого данный параметр можно использовать в тексте SQL-запроса объекта ADOCommand. Если Вы не будете производить над ним никаких действий, он будет иметь постоянное значение; также значение параметра можно изменить в скрипте.

Использовать параметр в запросе можно так как показано на скриншоте в прикрепленном файле 0002

Прошу прощения, а можно опубликовать всё вышеперечисленное для TSCRM 3.3.1.
Я создал адо подключение,датасет и гридовое окно. Добавил все поля из MySQL в адодатасет. Создал окно DataGrid и определил колонки из адодатасета. Но выбрать adodataset в качестве источника данных для добавляемого справочника, что бы визуально посмотреть чего он там подтягивает из базы сайта, не могу.

Можно где то посмотреть примеры реализации копирования таблицы MySQL в существующую таблицу(датасет) CRM.

P.S. Общее описание желаемого результата:
Есть раздел CRM - Заявки. В него менеджеры заносят заявки от клиентов. Туда же необходимо копировать заявки из онлайн MySQL. Класс для PHP не хотелось бы использовать.

Заранее благодарен.

Прошу прощения, уже разобрался сам как адаптировать сервиcы Х15 к формату TSCRM 3.3.1
Все остальные вопросы отпали сами собой разобрав примеры.

UPD В процессе дальнейшего разбирательства хотелось бы узнать как правильно обратится из команды к базе самого терасофта если подключение команды настроено на базу MySQL?
Цель - перенести логику копирования записей из скрипта на адо-команду, но в примере выше показано как это делать в пределах одной и той же базе, а что делать если базы разные (MySQL и Firebird)?

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