Изменить значение справочника и полей связанных с ним по изменению другого справочника
Bpm onsite 5.4
Общая задача: Изменить значение справочника и полей связанных с ним по изменению другого справочника.
Частная задача: изменяется город отправления или прибытия, выполняется SQL запрос к базе и в полю справочника "Конкурентное предложение" присваевается id предложения по аналогичному направлению, отображается название предложения сразу же, в другие поля автоматически отображаются значения названия Конкурента и Ставка конкурента.
в обработчиках полей города отправления и прибытия стоит такой код:
System.IO.File.AppendAllText("C:\\logs\\debug_zayavka.txt", "ид города отправления "+Page.DepartureCityEdit.Value+"\n");
var select1 = new Select(userConnection).Top(1)
.Column("Id")
.Column("Name")
.Column("RateTotal")
.From("PriceExp")
.Where(Column.Const(Page.DepartureCityEdit.Value)).IsEqual("CityFromId");
select1.Execute();
При выполнении кода происходит ошибка:

Как ее исправить?
Так же меня интересует, как после выполнения запроса сохранить данные выборки в определенные переменные?
Так же меня интересует, как после выполнения запроса сохранить данные выборки в определенные переменные?
Нравится
Вот пример запроса
Select selectPhone = (new Select(Page.UserConnection)
.Top(2000)
.Column(Column.Asterisk())
.From(selectPhoneMain).As("sel"))
as Select;
var selectExecute = selectPhone.ExecuteReader(Page.UserConnection.EnsureDBConnection());
var i=0;
while (selectExecute.Read())
{
i++;
var guidFromSelect = selectExecute[0].ToString();
phoneFilters.Add(structure.CreateFilterWithParameters(dataSource.Schema, FilterComparisonType.Equal, "Id", new Guid(guidFromSelect)));
}
Здравствуйте, Илья.
Для исправления измените вхождение userConnection на UserConnection.
Для сохранения результатов работы команды select1 в переменные, необходимо использовать интерфейс IDataReader:
[csharp]
// определяем данные цены конкурента по месту прибытия и отправления груза
System.IO.File.AppendAllText("C:\\logs\\debug_zayavka.txt", "ид города отправления "+Page.DepartureCityEdit.Value+"\n");
var select1 = new Select(UserConnection).Top(1)
.Column("Id")
.Column("Name")
.Column("RateTotal")
.From("PriceExp")
.Where("CityFromId").IsEqual(Column.Const(Page.DepartureCityEdit.Value)) as Select;
Guid idValue;
string nameValue;
int rateValue;
using (var dbExecutor = UserConnection.EnsureDBConnection()) {
using (IDataReader dr = select1.ExecuteReader(dbExecutor)) {
if (dr.Read()) {
idValue = (Guid)dataReader.GetValue(0);
nameValue = (string)dataReader.GetValue(1);
rateValue = (int)dataReader.GetValue(2);
}
}
}
[/csharp]
Чтобы исправить первую ошибку подключите System.Data к скрипту.
Чтобы исправить три другие - измените вхождение dataReader на dr, это я опечатался.
сейчас код:
[code]
using System.Data;
// определяем данные цены конкурента по месту прибытия и отправления груза
System.IO.File.AppendAllText("C:\\logs\\debug_zayavka.txt", "ид города отправления "+Page.DepartureCityEdit.Value+"\n");
var select1 = new Select(UserConnection).Top(1)
.Column("Id")
.Column("Name")
.Column("RateTotal")
.From("PriceExp")
.Where("CityFromId").IsEqual(Column.Const(Page.DepartureCityEdit.Value)) as Select;
Guid idValue;
string nameValue;
int rateValue;
using (var dbExecutor = UserConnection.EnsureDBConnection()) {
using (IDataReader dr = select1.ExecuteReader(dbExecutor)) {
if (dr.Read()) {
idValue = (Guid)dr.GetValue(0);
Page.LookupEdit18.SetValue(idValue);
nameValue = (string)dr.GetValue(1);
Page.LookupEdit25.SetValue(nameValue);
rateValue = (int)dr.GetValue(2);
Page.FloatEdit55.SetValue(rateValue);
}
}
}
[/code]
причем первую строку подчеркивает как с ошибкой:

в результате компиляции вылезает следующая ошибка:

Подключать namespace необходимо не в методе, а в структуре процесса:

Ошибка при компиляции исчезла, но появилась новая ошибка:
http://joxi.ru/qtb2U_3JTJA_eTCk1yI
Илья, ошибка говорит о некорректном преобразовании типов.
Попробуйте переменной rateValue задать значение float, а не int.
В идеале нужна отладка.
