Как можно создать объект с именем удаленного ранее (при этом удалена таблица из базы данных)? Сейчас при публикации такого объекта Oracle ругается что таблица не найдена или ее нет, но ее и правда нет же, ORM по идее должно же ее создать?

Вот ошибка:

ORA-00942: table or view does not exist

Нравится

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

Если объект был удалён и из конфигурации, и из базы полностью, не оставив никаких следов, то разницы с изначальным отсутствием быть не должно.

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

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

А где все это удалить? Как можно узнать в каких таблицах это прописано?

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

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

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

Подскажите, как можно осуществить проверку наличия таблиц и их колонок БД по именам, используя EntitySchemaManager в веб-сервисе? Чтобы проверить перед внесением изменений в БД.

Нравится

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

В Terrasoft 3.Х нет механизма EntitySchemaManager. Там всё устроено иначе.

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

В Terrasoft 3.Х нет механизма EntitySchemaManager. Там всё устроено иначе.


Понял. Спасибо.

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

Добрый день. Как реализовать кликабельную таблицу в BPM? Тобишь, в контейнер нужно выводить таблицу N*N, по клику на ячейку: получать ее индекс в таблице, данные из нее, перерисовывать таблицу.
Для того что бы это реализовать нужно описывать новую модель представления? Или уже есть "что-то" базовое, описанное, что можно использовать как основу?

Нравится

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

Раздел планирование. Смотреть можно в сторону PivotGrid.

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

В случае если Вы столкнулись с проблемой анализа объема таблицы в базе SQL, а так же Вам нужно узнать, сколько в ней записей и какой объём занимают индексы, - Вам необходимо выполнить скрипт из вложения и проанализировать результат в полученной таблице.

Нравится

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

bpm 5.4 on-site

не выполнятся цикл по реестру
имею следующий код, но внутри цикла ничто не выполняется (цикл совершает 0 шагов).
Подскажите, в чём может быть дело.

Page.TreeGrid.DataSource.PageRowsCount = -1;
Page.TreeGrid.DataSource.LoadRows();
foreach (var row in Page.TreeGrid.DataSource.Rows)
{
var name = row.GetTypedColumnValue("email");
try {
                       
var NewRecordId = Guid.NewGuid();
var insert = new Insert(UserConnection).Into("Emailing")
        .Set("Id", Column.Parameter(NewRecordId))
                .Set("EmailAddress", Column.Parameter(name))
                .Set("type", Column.Parameter(1));
insert.Execute();
   
} catch (Exception e) {System.IO.File.AppendAllText("C:\\logs\\email_debug.txt", e.Message);}
}

Нравится

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

1) Посмотрите в отладчике, что возвращает это значение:

Page.TreeGrid.DataSource.Rows

2) В файл лога что-нибудь выводится?

поставил код:

Page.TreeGrid.DataSource.PageRowsCount = -1;
Page.TreeGrid.DataSource.LoadRows();
foreach (var row in Page.TreeGrid.DataSource.Rows)
{
 
	var NewRecordId3 = Guid.NewGuid();
var insert3 = new Insert(UserConnection).Into("Emailing")
        .Set("Id", Column.Parameter(NewRecordId3))
		.Set("email", Column.Parameter("укапу3пуп"))
		.Set("type", Column.Parameter(1));
insert3.Execute();
 
var name = row.GetTypedColumnValue<string>("email");
try {
 
var NewRecordId = Guid.NewGuid();
var insert = new Insert(UserConnection).Into("Emailing")
        .Set("Id", Column.Parameter(NewRecordId))
		.Set("email", Column.Parameter(name))
		.Set("type", Column.Parameter(1));
insert.Execute();
 
} catch (Exception e) {System.IO.File.AppendAllText("C:\\logs\\email_debug.txt", e.Message);}
}

причем код

var NewRecordId3 = Guid.NewGuid();
var insert3 = new Insert(UserConnection).Into("Emailing")
        .Set("Id", Column.Parameter(NewRecordId3))
		.Set("email", Column.Parameter("укапу3пуп"))
		.Set("type", Column.Parameter(1));
insert3.Execute();

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

отладчиком не умею пользоваться (поставил visual studio, что надо нажать в ней, чтобы отладить bpm?)

в файл ничего не выводится

Илья, инструкция по отладке описана здесь:
http://www.community.terrasoft.ru/blogs/8747

После выполнения всех действий включите возможность отлавливать в студии все ошибки, как говорил Максим Кривонос:
http://www.community.terrasoft.ru/blogs/8747#comment-36912

нашел в списке процессов на отладку только http://joxi.ru/6Qj8U4wyTJDAAsoj74o
такой процесс как в инструкции я не нашел

нашлась ошибка, как с этим бороться?
скрин: http://joxi.ru/Ag38U_3JTJBqeXPt1wk

Видимо у вас в базе в этой таблице много записей и при попытке их все одновременно загрузить не хватает памяти. Лучше перебирать их поочерёдно.

Да, 287000 записей. Т.е. мне желательно расширить оперативную память, чтобы загрузить все записи?

А какая бизнес задача? Почему нельзя сделать запросом из MSSQL Management Studio ?

Или так:

var insert = new Insert(userConnection).Into("City")
        .Set("CreatedById",
             new Select(userConnection).Top(1)
                 .Column("Id")
                 .From("Contact")
                 .Where("Name").IsEqual(Column.Parameter("Supervisor")))
        .Set("ModifiedById",
             new Select(userConnection).Top(1)
                 .Column("Id")
                 .From("Contact")
                 .Where("Name").IsEqual(Column.Parameter("User1")));

Илья,

для того, чтобы проходится не по всему множеству записей, можно установить PageRowsCount, например, в 1000. Тогда будут браться первые 1000 записей реестра (по аналогии с SQL - Top 1000).

Page.TreeGrid.DataSource.PageRowsCount = 1000;

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

Илья,

для того, чтобы проходится не по всему множеству записей, можно установить PageRowsCount, например, в 1000. Тогда будут браться первые 1000 записей реестра (по аналогии с SQL - Top 1000).

Page.TreeGrid.DataSource.PageRowsCount = 1000;

можно ли сначала 1000, потом еще 1000 ?

"Соколов Илья Андреевич" написал:А какая бизнес задача?

"Олейник Дмитрий" написал:

задача - в реестре контрагентов отфильтровать контрагентов, например по городу и исключая конкурентов, после чего нажать на кнопку "Отправить КП" и в таблицу отправки КП заносятся все записи являющиеся результатом выборки

например, в городе Н 10000 компаний, всем надо выбрать в реестре и нажать кнопку отправить всем КП

Илья,

как мне кажется, Вам лучше реализовать этот функционал через действие, которое будет запускать бизнес-процесс.

Передавать в него массив можно следующим образом.

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

if (schema.Parameters.ExistsByName("TreeGridSelectedRowsIds")) {
if (schema.Name == 'название Вашего процесса' {
     // здесь Ваш запрос на выборку необходимых контрагентов с помощью EntitySchemaQuery
     // .......
     propValue[i] = idsCollection[i];
     moduleProcess.SetPropertyValue("TreeGridSelectedRowsIds", propValue);
}
else {
		var idsCollection = dataSource.SelectedItemPrimaryColumnValues;
		var selectedRowsCount = idsCollection.Count;
		var propValue = new Guid[selectedRowsCount];
		for(var i = 0; i < selectedRowsCount; i++) 
			propValue[i] = idsCollection[i];
		moduleProcess.SetPropertyValue("TreeGridSelectedRowsIds", propValue);
	}
}
Показать все комментарии

В процессе администрирования базы данных возникла необходимость определить причину возникновения ошибки. Определенный объём информации импортируется в базу данных, с которым далее пользователи работают. В процессе заполнения определенного набора полей автоматически высчитывалась итоговая сумма в поле «Итого». Но в определённый промежуток времени использования продукта начали появляться ошибки, связанные с несоответствием значения поля «Итого» сумме полей из которых оно вычисляется («Сумма покупки», «Наценка», «Сбор» и т.д.). Так как ошибку не получалось явно повторить, необходимо было разработать механизм для решения данной проблемы.

Естественно самой реальной и первой причиной возникновения такой ошибки приходила идея о сбоях в работе событий полей окна редактирования (то есть значения в полях изменялись, а события данных полей(-я) не срабатывали).

В основу решения было положено создание двух таблиц в базе данных для ведения логов, что происходят с записью набора данных. Первая таблица WindowLog, а вторая TriggerLog.

Первая таблица WindowLog включает в себя поля «Дата создания»(CreatedOn), «Идентификатор записи» (RecordID), «Ответственный» (WindowsUser), «Имя поля породившего событие»(FieldName), «Итого» и поля из которых оно вычисляется («Сумма покупки», «Наценка», «Сбор» и т.д.). Для наполнения таблицы было использованы события невизуального компонента окна dlData: dlDataOnDatasetDataChange, dlDataOnDatasetBeforePost и dlDataOnDatasetAfterPost. В скрипте в событиях была создана функция, которая формировала SQL запрос к таблице WindowLog базы данных с фиксацией информации по указанным полям на момент срабатывания события.

Запрос:

INSERT INTO WindowLog (*набор полей*)
SELECT (*набор полей*) -- Dataset('поле1'), Dataset('поле2'), Dataset('поле2')

Вторая таблица TriggerLog включает в себя поля «Дата создания»(CreatedOn), «Идентификатор записи» (RecordID), «Состояние» (до изменения записи и после), «SystemUser», «Итого» и поля из которых оно вычисляется («Сумма покупки», «Наценка», «Сбор» и т.д.). Для заполнения данной таблицы был создан триггер на инструкцию UPDATE проблемной таблицы с двумя запросами вставки значений в таблицу. В одном запросе вставлялись значения до изменений, а во втором после.

Запрос №1:

INSERT INTO TriggerLog (*набор полей*)       
SELECT (*набор полей*)
FROM deleted

Запрос №2:

INSERT INTO TriggerLog (*набор полей*)       
SELECT (*набор полей*)
FROM inserted

Результатом использования данного решения на основе анализа таблицы WindowLog было установлено, что срабатывают все события окна редактирования, влияющие на вычисление значения поля «Итого». В процессе использования окна редактирования и после сохранения записи значения поля «Итого» были корректны.

Проанализировав записи в таблице TriggerLog было установлено, что в результате выполнения инструкции UPDATE было внесено некорректное значение. Сопоставив даты создания записей в таблице TriggerLog и WindowLog было установлено, что инструкция UPDATE была вызвана не в результате манипуляций с окном редактирования, а иным источником. На основании поля «SystemUser» таблицы TriggerLog было установлено что изменения были внесены с помощью импортера данных.

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

PS: Принимаю предложения на доработку вашей конфигурации!!! Для более детальной информации можно связаться по следующему e-mail адресу: providnui@ukr.net !!!

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

Всем удачи в этом не легком процессе!!!

Нравится

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

Можно как то получить данные с таблицы, без датасета. Возможно запросом?

Нравится

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

Возможно, но что Вы предполагаете делать ними дальше?

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

В dataset можно "вытащить" эту дату и получать ее с помощью функции GetDatasetFieldValueByID либо GetDatasetFieldValueFromDatasetByUSI, обе функции находятся в скрипте scr_DB.

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

Добрый день! У меня следующая проблема. Мне нужно скриптом обновить поля "Вид деятельности" и "Отрасль" контрагента. Делаю Следуюшим образом:

function UpdateAccount(AccountID, ActivityName, FieldName) {
        var AccountDS = Services.GetNewItemByUSI('ds_Account');// или
               //GetSingleItemByCode('ds_Account', 'ContactIntegration');
        ApplyDatasetIDFilter(AccountDS, AccountID, true);
        AccountDS.Open();
        var NewActivityID = GetAccountActivityID(ActivityName);
        var NewFieldID = GetAccountFieldID(FieldName);
        AccountDS.Edit();
        if (AccountDS('ActivityID') != NewActivityID) {
                var Message = FormatStr(ConfirmActivityChangeMessage, AccountDS.ValAsStr('ActivityName'), ActivityName, AccountDS('Name'));
                if (ShowConfirmationDialog(Message) == wmrYes) {
                        AccountDS('ActivityID') = NewActivityID;
                }
        }
        if (AccountDS('FieldID') != NewFieldID) {
                var Message = FormatStr(ConfirmFieldChangeMessage, AccountDS.ValAsStr('FieldName'), FieldName, AccountDS('Name'));
                if (ShowConfirmationDialog(Message) == wmrYes) {
                        AccountDS('FieldID') = NewFieldID;
                }
        }
        AccountDS.Post();
        AccountDS.Close();
}

На строке  AccountDS.Post() У меня следующая ошибка:
Ошибка сохранения записи. Оригинальное сообщение об ошибке: The statement has been terminated.
Cannot insert the value NULL into column 'Name', table 'CRM.dbo.tbl_Account'; column does not allow nulls. UPDATE fails.

Посмотрел в профайлере, и, действительно, на сервер посылается запрос на обновление почему то всех полей таблици tbl_Account, а параметры заданы только двух полей, это FieldID и ActivityID.

В чем может быть проблема?

Нравится

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

Михаил, у Вас переменная AccountID содержит значение? После открытия датасет AccountDS содержит записи, или он пустой? Хорошо бы эти вещи проверять перед выполнением. Можете выложить тексты функций GetAccountActivityID и GetAccountFieldID?

Если AccountID пуст, то эта функция даже не выполняется (стоит проверка IsEmptyGUID(AccountID)). Датасет содержит одну запись, как и должно быть (проверял).
Вот тексты функций:

function GetAccountActivityID(ActivityName) {
	if (IsEmptyValue(ActivityName)) {
		return null;
	}
	var ActivityID = GetDatasetIDByFieldValue('ds_Activity', 'Name', ActivityName);
	if (IsEmptyGUID(ActivityID)) {
		var ActivityDS = GetSingleItemByCode('ds_Activity', 'ContactIntegration');
		ActivityDS.Append();
		ActivityID = Connector.GenGUID();
		ActivityDS('ID') = ActivityID;
		ActivityDS('Name') = ActivityName;
		ActivityDS.Post();
	}
	return ActivityID;
}
function GetAccountFieldID(FieldName) {
	if (IsEmptyValue(FieldName)) {
		return null;
	}
	var FieldID = GetDatasetIDByFieldValue('ds_Field', 'Name', FieldName);
	if (IsEmptyGUID(FieldID)) {
		var FieldDS = GetSingleItemByCode('ds_Field', 'ContactIntegration');
		FieldDS.Append();
		FieldID = Connector.GenGUID();
		FieldDS('ID') = FieldID;
		FieldDS('Name') = FieldName;
		FieldDS.Post();
	}
	return ActivityID;
}

Они выполняются нормально и возвращают значения.

Уточните, пожалуйста, версию конфигурации (с точностью до сборки).

P.S. Я так понимаю, в последней функции должно быть return FieldID?

Да, FieldID:smile:. Версия 3.3.0.72.

Михаил, протестировал на Вашей версии. Видимо, Вы вызываете данную функцию в Terrasoft Administrator. Попробуйте выполнять её по какому-то действию из клиентского приложения, должно работать корректно. Данная проблема связана с тем, что во время сохранения сервис датасета находится в режиме редактирования, и в этом состоянии ведёт себя не так, как в рабочем режиме.

Если Вам необходимо обновлять записи именно через Terrasoft Administrator, используйте сервис UpdateQuery.

Да, именно так, я тестирую в Terrasoft Administrator. Спасибо за помощь. Сейчас попробую.

Из клиента все работает. Еще раз спасибо за помощ.

Вот такие неудобные вещи порой приводят в ступор. :confused: И думаешь, ты ли дурак или программа.
Бились два дня пока не нашли этот пост. :smile:

Спасибо участникам в этом посте. :wink:

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

Добрый день! Следующая конструкция успешно работала

ContractDataset.Edit();
ContractDataset.ValAsFloat('Amount') = Amount;
ContractDataset.ValAsFloat('BasicAmount') = BasicAmount;
ContractDataset.Post();

т.е. пытаюсь отредактировать запись датасета договора с уже существующим заголовком (заголовок сформирован при импорте из Excel значением по умолчанию), выдает следующие

[09.05.21 10.35.06.698] (E) Ошибка выполнения метода 'SelfOnDatasetAfterPost'. Ошибка сохранения записи. Оригинальное сообщение об ошибке: validation error for column Title, value "*** null ***"
The insert failed because a column definition includes validation constraints.
Error Code: 27
INSERT INTO "tbl_Contract" ("ID", "ContractTypeID", "ContractStatusID", "OwnerID", "StartDate", "DueDate", "BillingFrequencyID", "Amount", "BasicAmount", "ModifiedOn", "ModifiedByID", "AllUpgr", "DocWeek1", "DocWeek2", "DocWeek3", "DocWeek4", "DocWeek5", "CreatedOn", "CreatedByID")
VALUES (:ID, :ContractTypeID, :ContractStatusID, :OwnerID, :StartDate, :DueDate, :BillingFrequencyID, :Amount, :BasicAmount, CURRENT_TIMESTAMP, '{94EDBC92-596F-4957-BA05-96A682F739E5}', :AllUpgr, :DocWeek1, :DocWeek2, :DocWeek3, :DocWeek4, :DocWeek5, CURRENT_TIMESTAMP, '{94EDBC92-596F-4957-BA05-96A682F739E5}') «Call Stack»

ошибок в скрипте нет, т.к. конструкция

ContractDataset.Edit();
ContractDataset.ValAsFloat('Amount') = Amount;
ContractDataset.ValAsFloat('BasicAmount') = BasicAmount;
ContractDataset('Title') = 'Договор';
ContractDataset.Post();

успешно выполняется.

Насколько я правильно понимаю проблема в кодировке заголовка?

TS X25 3/3/0/42 Firebird

Нравится

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

Добрый день, Павел!

На сколько я могу судить из текста ошибки, она говорит о том, что в БД поле Title NOT NULL, но идет попытка вставить в это поле значение NULL. Нужно или NOT NULL убрать в дизайнере таблицы, или данные откорректировать.

А почему вставка идет, если запись редактируется? И меняются два поля, а вставка идет на все? Вы часом не из администратора этот скрипт выполняете?

Вставка наверное идет потому что датасет пустой.

Да, действительно, поле Title уже заполнено, в скрипте я лишь пытаюсь заполнить поля Amount и BasicAmount, поле Title я вообще не трогаю, оно должно остаться таким как есть

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

ContractDataset.Edit();
ContractDataset.ValAsFloat('Amount') = Amount;
ContractDataset.ValAsFloat('BasicAmount') = BasicAmount;
ContractDataset('Title') = 'Договор';
ContractDataset.Post();

нормально выполняется на нужной записи

А какой запрос идет если использовать такую конструкцию? Посмотрите если можете профайлером (для MSSQL).

Не получится, у меня firebird. А вообще и правда интересно почему идет insert, если я редактирую запись?

если я не ошибаюсь, то в IBExpert пункт меню Tools, подпункт SQL Monitor может вам помочь

Инсерт идет если датасет пустой. Попробуйте у него вызвать PageRecordsCount() перед вызовом Edit(). Если вернет не 0, то... этого не может быть потому что этого не может быть никогда :)
Посмотрите также состояние датасета передвызовом Edit()

Павел, Underscore a.k.a. задал верный вопрос:

"Underscore a.k.a. _" написал:Вы часом не из администратора этот скрипт выполняете?

Вы часом не из администратора этот скрипт выполняете????!!!

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

а событие OnAfterPost - пустое?
Возможно Post вашего Edit'a вызывает какой-то Append?

И что все-таки возвращают PageRecordsCount(), IsActive и State перед вызовом Edit()?

попробуйте заменить строку на

ContractDataset.ValAsStr('Title') = "Договор";

знаю, что отличий почти нет, но попробовать стоит.

Уточние, пожалуйста, в чем отличие ненужно от нужной записи, о которой вы упомянули в посте:

"нормально выполняется на нужной записи"

---Underscore a.k.a.

Перед вызовом edit()

IsActive = False
PageRecordsCount() = 0

"Карло Сергей" написал:Павел, Underscore a.k.a. задал верный вопрос:
"Underscore a.k.a. _" написал:Вы часом не из администратора этот скрипт выполняете?

Коллеги, у меня вчера была похожая проблема... Запускал из администратора (в чем разница, где запускать скрипт?)

Нужно было в CashFlow проставить одинаковое назначение, прописал скрипт:

function Main() {
 
var ds = Services.GetNewItemByUSI('ds_Cashflow');
ds.Open(); 
var R = ds.RecordsCount;
Log.Write(2, R);
while (!ds.IsEOF) {
    ds.Edit();
    ds('Subject') = 'Продажа Товара';
    Log.Write(2, ds('ID'));
    ds.Post();
    ds.GotoNext();
}
ds.Close();
}

Выдало сообщение

Что еще более интересно, количество записей в датасете: 1

Проверил: все фильтры отключены, в MS SMS

select count(ID) from tbl_Cashflow
-----------
9609
 
select count(ID) from tbl_Cashflow where AutocalcAmount is null
-----------
0

Обновил в SQL, но все же интересно - почему в датасете только 1 запись?
TS CRM X25 3.3.0.51

--
www.it-sfera.com.ua
Terrasoft Solution Partner

Всем спасибо! Проблема решена.

Вместо

ContractDataset.Edit();
ContractDataset.ValAsFloat('Amount') = Amount;
ContractDataset.ValAsFloat('BasicAmount') = BasicAmount;
ContractDataset.Post();

Написал:

ContractDataset.Open();
ContractDataset.Edit();
ContractDataset.ValAsFloat('Amount') = Amount;
ContractDataset.ValAsFloat('BasicAmount') = BasicAmount;
ContractDataset.Post();
ContractDataset.Close();

Все заработало.

Но вообще я думал, что перед Dataset.Edit() не нужно писать
Dataset.Open()

"Павел Крышкин" написал:IsActive = False
PageRecordsCount() = 0

Ну вот, я же говорил, что у Вас датасет пустой.
Edit() начинает редактирование текущей записи. Если не было открытия датасета, то записей в нем нет.

"Виталий Ковалишин aka samael" написал:Коллеги, у меня вчера была похожая проблема... Запускал из администратора (в чем разница, где запускать скрипт?)

В администраторе почему-то собираются неправильные запросы. Возможно это сделано для сборки запроса в предпросмотре текста запроса в дизайнере запросов. Но если это так, то автору идеи нужно тоже какую-нибудь каку сделать :)

"Underscore a.k.a. _" написал:В администраторе почему-то собираются неправильные запросы. Возможно это сделано для сборки запроса в предпросмотре текста запроса в дизайнере запросов. Но если это так, то автору идеи нужно тоже какую-нибудь каку сделать :)

С этим понятно, а почему в датасете ода запись?

--
www.it-sfera.com.ua
Terrasoft Solution Partner

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

"Underscore a.k.a. _" написал:RecordsCount шлет запрос запрос в базу. Гляньте что за запрос идет если скрипт выполнять из администратора.

Спасибо за совет!
Кто-то из программеров забыл убрать:

SELECT TOP 1
[tbl_Cashflow].[ID] AS [ID],
...

В фильтры смотрели, а в TOP - все были уверены, что все гуд!
Исправили :)

--
www.it-sfera.com.ua
Terrasoft Solution Partner

Остается баг с update неясен...

--
www.it-sfera.com.ua
Terrasoft Solution Partner

"Виталий Ковалишин aka samael" написал:Остается баг с update неясен...

Похоже это не баг а фича:)

Благо, что SQL пока не подводит:

UPDATE tbl_Cashflow
SET Subject = 'Продажа Товара'

--
www.it-sfera.com.ua
Terrasoft Solution Partner

Эсли датасет закрытый или пустой -- то на Edit отрабатывает Append.

"Александр Кравчук" написал:Эсли датасет закрытый или пустой -- то на Edit отрабатывает Append.

Но в датасете 1 строка была! + я ж его открывал

...
var ds = Services.GetNewItemByUSI('ds_Cashflow');
ds.Open(); 
...

--
www.it-sfera.com.ua
Terrasoft Solution Partner

"Виталий Ковалишин aka samael" написал:Остается баг с update неясен...

Ну ведь написали:
"Underscore a.k.a. _" написал:В администраторе почему-то собираются неправильные запросы. Возможно это сделано для сборки запроса в предпросмотре текста запроса в дизайнере запросов.

Это именно так. Все связано с тем что если в адиминистраторе мы работаем через Main - то у всех обьектов Connector.IsDesigning = true - в таком случае все объекты ведут себя по другому, в частности датасет всегда возвращает все поля.
В этом случае нужно делать окно, запустать это окно через tscrm.exe /wnd=vashe_okno и на кнопочку в нем выполнять Ваше действие. :) Я именно так всегда и делаю.

Спасибо Александр, за детальное объяснение!

--
www.it-sfera.com.ua
Terrasoft Solution Partner

"Александр Кравчук" написал:В этом случае нужно делать окно

Ну или получается что можно с IsDesigning поиграться. У всех сервисов это свойство доступно и на запись.

"Underscore a.k.a. _" написал:Ну или получается что можно с IsDesigning поиграться. У всех сервисов это свойство доступно и на запись.


  Не выйдет, я уже пробовал.  

Точно , изменение этого свойства у датасета и инсертквери никчему не привело. Но у окон оно вроде работает. Ка-то этот IsDesigning через гланды сделан.

Тот IsDesigning который влияет на отображение всех колонок в Dataset'е не вынесен наружу.

А на что влияет IsDesigning , который вынесен? И почему бы его не сделать тем, который влияет?

Так исторически сложилось. Пока до этого руки не дошли. 

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

При построении пользовательского отчета MS Word с использованием детали - эта деталь отображается в самом отчете в виде таблицы. В некоторых отчетах это отображение не совсем удобно, особенно в тех случаях, когда необходимо отображение в виде списка.

Могу предложить скрыть рамки таблицы деталей следующим образом:
в скрипте scr_UseReportCommon после строки
var Table = Selection.Tables.Item(1); прописать следующее:

 
 for (var i = 1; i 8; i++) {
  Table.Borders(-i).LineStyle = 0;
 }
 Table.Borders.Shadow = false;

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

Желаю удачи!

С уважением.
Мельникова Екатерина

 

Нравится

Поделиться

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

У меня строка

var Table = Selection.Tables.Item(1)

встречается дважды. В EvaluateDetailExpression и ProcessDetail. В каком именно месте нужно цикл добавить?

P.S. Писать

Table.Borders(-i).LineStyle = 0;

не очень хорошо. Чтобы облегчить жизнь тому кто придет после нас лучше писать

var wdLineStyleNone = 0;
Table.Borders(-i).LineStyle = wdLineStyleNone;

Кстати вот список стилей линий, может кому сгодится

wdLineStyleDashDot = 5
wdLineStyleDashDotDot = 6
wdLineStyleDashDotStroked = 20
wdLineStyleDashLargeGap = 4
wdLineStyleDashSmallGap = 3
wdLineStyleDot = 2
wdLineStyleDouble = 7
wdLineStyleDoubleWavy = 19
wdLineStyleEmboss3D = 21
wdLineStyleEngrave3D = 22
wdLineStyleInset = 24
wdLineStyleNone = 0
wdLineStyleOutset = 23
wdLineStyleSingle = 1
wdLineStyleSingleWavy = 18
wdLineStyleThickThinLargeGap = 16
wdLineStyleThickThinMedGap = 13
wdLineStyleThickThinSmallGap = 10
wdLineStyleThinThickLargeGap = 15
wdLineStyleThinThickMedGap = 12
wdLineStyleThinThickSmallGap = 9
wdLineStyleThinThickThinLargeGap = 17
wdLineStyleThinThickThinMedGap = 14
wdLineStyleThinThickThinSmallGap = 11
wdLineStyleTriple = 8

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