11.05.2012, 15:55 | #1 |
Участник
|
Активность Field
Всем добрый день. Есть форма, у формы есть DataSource, он выводится в Grid. Мне надо если в одном поле нужное мне значение, то другое поля нельзя редактировать. Я перекрыл метод active у моего DataSource
X++: public int active() { int ret; FormDataObject fld; ; ret = super(); fld = rContractTable_ds.object(fieldNum(RContractTable,PrimaryContract)); if (rContractTable.ContractType == Agreement::PrimaryContract) { fld.allowEdit(false); } return ret; } |
|
11.05.2012, 16:07 | #2 |
Участник
|
Как минимум нужна ветка else, возвращающая возможность редактирования, если пользователь вернулся на доступную к редактированию строку.
X++: if (rContractTable.ContractType == Agreement::PrimaryContract) { fld.allowEdit(false); } // -->> else { fld.allowEdit(true); } // <<-- X++: // -->> // if (rContractTable.ContractType == Agreement::PrimaryContract) // { // fld.allowEdit(false); // } // else // { // fld.allowEdit(true); // } fld.allowEdit(rContractTable.ContractType != Agreement::PrimaryContract); // <<-- |
|
11.05.2012, 16:10 | #3 |
Участник
|
за else спасибо. Но почему то не работает. Поле доступно для редактирования.
|
|
11.05.2012, 16:15 | #4 |
Участник
|
Код в ветке if выполняется? Проверьте дебагером, либо просто выведите отладочое сообщение через info или print.
|
|
11.05.2012, 16:16 | #5 |
Молодой, подающий надежды
|
А вы после изменения кода форму перезапускали? В крайнем случае попробуйте перезапустить клиент Ax.
|
|
11.05.2012, 16:30 | #6 |
Участник
|
Спасибо. нашел в чем ошибка была. На Grid'е в свойствах поля слетел DataSource и DataField. Поставил и все заработало. Всем спасибо за ответы.
|
|
05.03.2013, 12:53 | #7 |
Участник
|
Не стал создавать новую тему, запостю здесь.
Стоит почти такая же задача, как и у топикастера: необходимо при изменении одного из полей, в данном случае Статус оплаты ( Расчёты с поставщиками\клиентами -> Журнал платежей - Строки) закрывать для редактирования определённые поля. Сделал метод, в котором выполняется проверка на статус оплаты, если он равен нужному - поля закрываются для редактирования. Этот метод вызываю в ините формы, active датасоурса и modified поля Статус оплаты датасоурса. При изменении всё замечаетельно отрабатывает, поля закрываются, НО, стоит перейти на другую строку или сохранить текущую строку - значения снова доступны для редактирования, хотя не должны. Искал корни в методе leaveRecord датасоурса, но там нет ничего связанного с этим, так же искал в методе write, тоже ничего не нашёл. Метод проверки: X++: //Если стоит статус Утверждено - закрывать для редактирования поля void AllowEditCollums() { LedgerJournalTrans LJT; ; //выбираю те строки, где статус журнала стоит Утверждено select firstonly * from LJT where LJT.PaymentStatus == CustVendPaymStatus::Confirmed; if (LJT.PaymentStatus == CustVendPaymStatus::Confirmed) { LedgerJournalTrans_ds.object(fieldnum(LedgerJournalTrans,TransDate)).allowEdit(false); // LedgerJournalTrans_ds.object(fieldnum(LedgerJournalTrans,TransDate)).visible(false); LedgerJournalTrans_ds.object(fieldnum(LedgerJournalTrans, Txt)).allowEdit(false); LedgerJournalTrans_ds.object(fieldnum(LedgerJournalTrans,TransDate)).allowEdit(false); allowEdit(false); // Global::allowEditFieldsOnFormDS_W(LedgerJournalTrans_ds, false); } else { LedgerJournalTrans_ds.object(fieldnum(LedgerJournalTrans,TransDate)).allowEdit(true); } } X++: void AllowEditFields()
{
element.lock();
LedgerJournalTrans_ds.AllowEditCollums();
element.unLock();
} X++: element.AllowEditFields() Подскажите, пожалуйста, в какую сторону копать? |
|
05.03.2013, 14:25 | #8 |
Участник
|
Цитата:
Вместо выборки в переменную LJT нового курсора (причём непонятно по каким критериям) нужно использовать курсор LedgerJournalTrans, связанный с источником данных формы X++: //if (LJT.PaymentStatus == CustVendPaymStatus::Confirmed) if (LedgerJournalTrans.PaymentStatus == CustVendPaymStatus::Confirmed) Последний раз редактировалось S.Kuskov; 05.03.2013 в 14:30. |
|
05.03.2013, 14:48 | #9 |
Участник
|
Да, это я ступил что-то, вы правы.
Но, как оказалось, нужно было опустить вызов моего метода в самый низ метода active, ибо в средине вызывается метод класса LedgerJournalEngine, который ставит все свойства create,edit,delete в true и это конфликтовало с моим условием. Опустил вызов своего метода в самый низ и работает корректно. Спасибо вам за ответ =) |
|
|
|