Скрипты
Разработка

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

Есть ли какой-то рабочий пример по сабжу.
Заранее спасибо

С уважением, Павел

Нравится

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

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

Добрый день, Павел!
Похоже, нашел на Community подходящий пример:
http://www.community.terrasoft.ru/blogs/3521
Если что, вот SDK:
http://terrasoft.ru/sdk/index.html?frmname=topic&frmfile=TSObjectLibrar…

Добрый день, Андрей

Спасибо за пример.
Попробовали реализовать, при попытке выполнить код:

<?
ini_set('display_errors',1);
error_reporting(E_ALL);
set_time_limit(0);
include 'itsTerrasoftClass.php';

$ws = new itsTerrasoftWS();
$ws->set_Host('http://192.168.0.4/wsdl/IServer');

$ws->set_Username('ttt');
$ws->set_Password('ttt');

$ws->set_wsClient();

$wsConfigurations = $ws->get_wsConfigurations();

$ws->set_Configuration($wsConfigurations[0]);
$ws->OpenConfiguration();

$SQL = "select top 1 [OfficialAccountName] from [dbo].[tbl_Account]";
$ws->CreateXML($SQL);

$ws->ExecuteSQL();

$xml = DOMDocument::loadXML( $ws->get_XMLResult() );

$params = $xml->getElementsByTagName('R');
$k=0;

foreach ($params as $param)
{
echo $params->item($k)->getAttribute('F0')."
";
$k++;
}
$ws->CloseConfiguration();
?>

Имеем следующую ошибку:

Fatal error: Uncaught SoapFault exception: [SOAP-ENV:Server] No SQL statement provided in C:\srv\www\terrasoft\itsTerrasoftClass.php:159 Stack trace: #0 C:\srv\www\terrasoft\itsTerrasoftClass.php(159): SoapClient->__call('PrepareSendPack...', Array) #1 C:\srv\www\terrasoft\itsTerrasoftClass.php(159): SoapClient->PrepareSendPackages('9064664010F3D1E...', 'PAA/AHgAbQBsACA...', false, -1, 51200000) #2 C:\srv\www\terrasoft\itsTerrasoftClass.php(165): itsTerrasoftWS->PrepareSendPackages() #3 C:\srv\www\terrasoft\index.php(32): itsTerrasoftWS->ExecuteSQL() #4 {main} thrown in C:\srv\www\terrasoft\itsTerrasoftClass.php on line 159

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

Добрый день, Андрей

Код по ссылке посмотрели. Выполняем, собственно, точно такой же код.
Но т.к. пост за 2009 год, боюсь до автора мы не достучимся.
Да и вложения на форуме по ссылке невозможно скачать.

С уважением, Павел

Павел, думаю, все же стоит попробовать написать в ту тему. Также проверьте, подходят ли имя пользователя и пароль и к той ли конфигурации выполняется подключение.
Также можете ознакомиться с примером на SDK:
http://www.terrasoft.ru/sdk/IDatasetExample_js.html
он не на PHP, но, я думаю, что адаптировать не составит Вам большого труда.

Добрый день, Андрей

Пытаемся реализовать аналогичный пример на С#.
Ссылка: http://www.community.terrasoft.ru/blogs/7482
Но служба Terrasoft Web Services HTTP Server, отвечает в кодировке:
HTTP/1.1 200 OK
Connection: close
Content-Type: text/xml; charset=ISO-8859-1
Content-Length: 576

Есть ли возможность каким-то образом настроить ответ в UTF-8?

Полный запрос:

POST http://192.168.0.4/soap/IServer HTTP/1.1
Content-Type: text/xml; charset=utf-8
VsDebuggerCausalityData: uIDPo78/6OVekaNJswdxScc0uIEAAAAA5SP2bc+OeUqw8iMfL1ptLCBS9yGhu+RHod56QvUhwZAACQAA
SOAPAction: "urn:TSWebServicesServerLibraryInternal-IServer#Get_ServerConfigurationNames"
Host: 192.168.0.166
Content-Length: 345
Expect: 100-continue
Connection: Keep-Alive

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><q1:Get_ServerConfigurationNames xmlns:q1="urn:TSWebServicesServerLibraryInternal-IServer"/></s:Body></s:Envelope>

Полный ответ:

HTTP/1.1 200 OK
Connection: close
Content-Type: text/xml; charset=ISO-8859-1
Content-Length: 576

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:NS1="urn:TSWebServicesServerLibraryInternal-IServer"><NS1:Get_ServerConfigurationNamesResponse><return xsi:type="xsd:string">Samo Soft;Demo</return></NS1:Get_ServerConfigurationNamesResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>

Спасибо.

Здравствуйте, Павел!
Проще всего будет уже на Вашем приложении конвертировать ответ, полученный в ISO-8859-1.
Вот несколько ссылок, которые Вам помогут:
http://stackoverflow.com/questions/1922199/c-sharp-convert-string-from-…
http://php.net/manual/en/function.utf8-encode.php

Добрый день, Андрей

Мы используем следующий пример:

ws.IServer sc = new ws.ServerClient();
ws.Get_ServerConfigurationNamesRequest rqGet_ServerConfigurationNames = new ws.Get_ServerConfigurationNamesRequest();
ws.Get_ServerConfigurationNamesResponse rsGet_ServerConfigurationNames = new ws.Get_ServerConfigurationNamesResponse();                        
rsGet_ServerConfigurationNames = sc.Get_ServerConfigurationNames(rqGet_ServerConfigurationNames);

На последней строке он падает, но как нетрудно заметить, доступ к контенту мы еще не получили.
Так что перекодировать просто нечего.

Сообщение об ошибке:

Тип содержимого text/xml; charset=ISO-8859-1 ответного сообщения не соответствует типу содержимого привязки (text/xml; charset=utf-8). При использовании особого кодировщика необходимо правильно реализовать метод IsContentTypeSupported. Первые 562 байтов ответного сообщения: "

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:NS1="urn:TSWebServicesServerLibraryInternal-IServer"><NS1:Get_ServerConfigurationNamesResponse><return xsi:type="xsd:string"></return></NS1:Get_ServerConfigurationNamesResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>

Ждем ваших комментариев.
Спасибо.

Павел, вероятно, класс настроен на работу только с кодировкой charset=ISO-8859-1, в том числе и на приеме сообщений, а Вы посылаете запрос в charset=utf-8. Попробуйте посылать в ISO-8859-1.

Показать все комментарии
e-mail по шаблону
Технические вопросы
Разработка

Здравствуйте.
Появилась проблема при отправке e-mail по шаблону.
При создании шаблона указываем раздел "Контакты" и запрос для макросов "Контакты".
Нажимаем правой кнопкой мыши на физ.лицо. В контекстном меню выбираем: Действия -> Отправить e-mail по шаблону -> "Шаблон". В outlook 2010 открывается два (иногда четыре) одинаковых шаблона для отправки.
Если убрать запрос для макросов открывается один шаблон. Но макросы, по понятным причинам, не работают.
Никто не сталкивался?

Нравится

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

У Вас некорректный запрос для макросов - возвращает не одну, а две (иногда четыре) записи.

Дмитрий, спасибо. Удалил лишние колонки в запросе - все ок.

Показать все комментарии
ds_EmptyChangesLog
Установка и Администрирование
Разработка

Здравствуйте! У нас не открывается Dataset ds_EmptyChangesLog. Нет запроса sq_EmptyChangesLog. Можно ли его восстановить? Версия 3.2.1.62.

Нравится

1 комментарий
Технические вопросы
Разработка

Непонятно почему эта ошибка происходит. В дэбагере контролирую какое значение в данный момент имеет поле, при установленном значении 50 символов в нем их всего пять, но при этом вылетает ошибка "53 значение неверной длины для поля 'ИмяПоля'. Допустимый диапазон от 0 до 50". Вылетает на методе Connector.DBEngine.CheckRowData(Dataset). В чем может быть проблема?
версия 3.0

Нравится

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

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

Что то странное... Можно скрин отладчика в момент ошибки со значением проблемного поля в Watch, а также скрин свойства этого поля в датасете?

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

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

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

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

SSV, провертье длину поля в сервисе таблицы и в сервисе датасета - она (по хорошему) должна совпадать.
Также установите отладчик на OnBeforePost вашего датасета, и проверьте, какая длина в проблемном поле (не превышает ли того числа, указанного как в таблице так и в датасете).

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

Версия террасофт 3.3.0
Сервер 2008R2
MS SQL Server 2012 Express
Клиенты работают в режиме сервера терминалов.
Разместили базу на SSD диске, однако, периодически наблюдается подвисание террасофта, монитор ресурсов показывает, что в этот момент система занимается чтением/записью в папки где находятся пользовательские данные типа %appdata%\Terrasoft\3.3.0\Cash, Profiles. Отсюда вопросы:
1. Если выбрать вариант хранение профиля в БД, там будут храниться все данные из папки с пользовательскими данными, или только данные из папки Profiles? И насколько такой вариант избавит от тормозов, если профили пользователей хранятся не на SSD диске?
2. Есть ли возможность хранить папки с пользовательскими данными где-то кроме %appdata%\Terrasoft\, в более поздних версиях есть настройка в файле runsetting.xml типа UserAppDataDirectory="", моем файле runsetting.xml такой настройки - нет.

Нравится

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

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

Здравствуйте.
1. Если выбрать хранение профиля в базе, то в таком случае туда будет помещаться только содержимое папки Profile. На предмет выигрыша в быстродействии однозначно сказать сложно. Здесь присутствует масса таких аспектов, как мощность клиентской машины, количество пользовательских настроек, фрагментация и скорость HDD, нагрузка на БД, оптимальность её структуры (например индексов) и т. д.. Этот механизм (возможность хранения профиля в разных местах) был создан скорее для возможности более гибких настроек. Например, если хранить профиль в базе, тогда пользователь не "привязан" к рабочему месту, но возрастёт нагрузка на базу.
2. В Вашей версии можно изменить только место хранения файла с настройками параметров подключения к базе (configs.xml). Параметр - UserSettingsDirectory.

Есть параметр UseCash в БД в таблице dbo.tbl_DatabaseInfo который я так понимаю отвечает за наличие кэширования ... так как у нас все работают в терминальном режиме на том же сервере, что и БД, особого смысла в размещении кэша на диске нет, тем более сейчас база находиться на SSD носителе... если я этот параметр обнулю?

Здравствуйте.
Действительно, значение поля "UseCache" определяет возможность кэширования данных. Данные кэша хранятся не в базе данных, а в директории профиля пользователя. Включённое кэширование позволяет сократить время отклика системы при однотипных действиях (например, при первом входе в раздел основная информация сохраняется в кэше и в дальнейшем минимизируется время выборки тех же данных).

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

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

Подскажите, как получить значения при исполнении ADOCommand:

Есть простой ADOCommand для работы с MySQL, с текстом SQL:

SELECT ID,post_date,post_content FROM posts
WHERE ID = :ID

Выполняю в скрипте:

var Command = GetSingleItemByCode('sq_adocmd');
         var ID= 57;
         SetParameterValue(Command.Parameters, 'ID', ID);
         Command.Execute();

Все работает. Только не знаю, как получить (примерно как dataset.Values('post_content')) после выполнения Command значения:
post_date и post_content

Подскажите, как это сделать.

Нравится

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

Не уверен, но попробуйте так:

var ds = Command.Open();
var ID = ds('ID');
var post_date = ds('post_date');
var post_content = ds('post_content');

На

var ds = Command.Open();

Выводит:

 Объект не поддерживает это свойство или метод

Тоже самое, если:

Command.Fields('post_date').Value();

Я так думаю, что ADOCommand предназначена для выполнения команд без получения каких-либо значений (обновление и удаление записей и др.).
Для того, чтобы получить значения, используйте ADODataset.

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

Здравствуйте, возник вопрос по MemoryDataset - есть ли возможность непосредственно в коде добавить в него столбцы для данных? И как (тоже в коде) выводить эти столбцы в грид?

Нравится

3 комментария
var DataField = AddStringDataField(Mds.DataFields, 'Name' + i, 'Заголовок колонки', 100);
DataField.Tag = 'UniversalReport' + i;
AddGridColumnsByDataset(dgvMain, Mds, false);
Mds.Close();
Mds.Open();

Отлично, колонки вроде добавляет.

['Name' + i] - это имя столбца в MemoryDataset-е, который потом можно заполнить на AfterOpen? И как его очистить при очередном изменении числа колонок (ругается что дублируется свойство Name в AddStringDataField)?

Перед каждым выполнением конечно нужно эти столбцы чистить:

Mds.DataFields.Clear();

А в остальном вы правы.
Единственное, на AfterOpen() лично я обращался не по имени, а по порядку:

Dataset.DataFields.Items(k).Value = 'SomeValue';
Показать все комментарии
Технические вопросы
Разработка

А что, в версии 3.0.2.244 указанный функционал для визуальных объектов не работает?

Нравится

2 комментария
LookupControl
Скрипты
Разработка

как осуществить, чтоб, при выборе значения в одном LookupControl - значения в другом LookupControl фильтровались?

Нравится

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

Это называется «фильтрация», вот пример с описанием.

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

и в событие - OnPrepareSelectWindow , я больше не попадаю.

У Вас, вероятно, данные отображаются в виде выпадающего списка.
LookupDataControl, если он отображает данные в виде выпадающего списка, считывает из БД и запоминает перечень показанных значений. Затем использует для показа этот список без обращения в базу.
Чтобы отключить данный механизм, достаточно в нужный момент вызвать метод UnprepareDropDownList().
Этот вопрос уже поднимался, Вы можете ознакомиться с его обсуждением в темах: 1, 2

спасибо. плохо искал.

Показать все комментарии
wnd_BaseFastReportPreview
Разрушительный сбой
Отчёты
Разработка

Всем привет, нужна помощь с разработкой отчета FastReport.

Создал скрипт по вызову FastReport-отчета по кнопке. На клиентском компьютере после 2-3х использований функции вылетает ошибка "разрушительный сбой". Строка на которой все рушится:

var ReportPreviewer = Services.GetNewItemByUSI('wnd_BaseFastReportPreview');

Проблема явно в этой строке, т.к. если скрываю в /* */ весь остальной код ошибка остается, а если наоборот (оставить только неё) я получаю сбой. Debugger-ом пройтись не удастся, на клиентском компьютере нет VS.

Нравится

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

Здравствуйте, Иван!

Как писала Наталья Бондарь в рамках обращения 0210495, попробуйте заменить

Services.GetNewItemByUSI('wnd_BaseFastReportPreview');
на
Services.GetSingleItemByUSI('wnd_BaseFastReportPreview');

Если это не даст результат, направьте по обращению сервисы отчета.

Вроде бы помогло. Спасибо!

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