Как использовать метод active() x++

Хорошо, я сделал это. Это работает нормально. Спасибо за помощь. Вот мой код. Теперь мне нужно только вызвать мою командную кнопку в другой форме, чтобы отключить ее и создать там информацию. Кто-нибудь может посмотреть об этом? В моем коде я получил ссылочные ошибки.

[ExtensionOf(formdatasourcestr(ProdTableListPage, ProdTable))]
final class ProdParmReportFinishedActiveWG_Extension
{

 public int active()
{
    int ret;
    next Active();

    {
        ProdTable tableBuffer = this.cursor();
        ProdTable prodtable;


        if(tableBuffer.ProdId == tableBuffer.CollectRefProdId
             && tableBuffer.ProdStatus != ProdStatus::ReportedFinished)
            {
               select firstonly RecId,ProdId from ProdTable where
            ProdTable.CollectRefProdId == tableBuffer.ProdId
             && ProdTable.Prodstatus != ProdStatus::ReportedFinished
                && tableBuffer.RecId != prodtable.RecId;
            {
                    Global::info(strFmt("%1 , %2",
            prodtable.prodid, prodtable.recid));

                    // FormButtonControl mybutton = this.FormRun().design().controlname(formControlStr(ProdParmReportFinished, Ok)) as FormButtonControl;
                    //  mybutton.enabled(false);
            }

        }
        else
        {

            Global::info(strFmt("%1 , %2, %3, %4",
            tableBuffer.prodid, tableBuffer.CollectRefProdId, tableBuffer.InventRefType, tableBuffer.ProdStatus));
        }

    }
    return ret;
}

}

person Tweene    schedule 04.02.2020    source источник
comment
Можете ли вы поделиться своим полным кодом?   -  person Jonathan Bravetti    schedule 04.02.2020
comment
Добавлен полный код. Но все же мне нужно его переработать.   -  person Tweene    schedule 04.02.2020
comment
Пробовали ли вы в качестве проверки работоспособности добавить что-то вроде info(strfmt("%1", (prodTable.RecId != 0))); в метод, чтобы просто проверить правильность вашего запроса?   -  person Alex Kwitny    schedule 04.02.2020
comment
@AlexKwitny этот код возвращает false для меня.   -  person Tweene    schedule 05.02.2020
comment
Я перестарался здесь. Тем не менее я хотел бы знать, как обновить это значение, но я получил свою цель по-другому. Вместо того, чтобы перезаписать значение по умолчанию и отключить это поле, я просто отключил кнопку отправки в форме, потому что никто не может ее продолжить.   -  person Tweene    schedule 05.02.2020


Ответы (1)


«Я хочу использовать этот код каждый раз, когда пользователь меняет свою фактическую строку, но вместо этого он запускается только один раз и применяется ко всем моим строкам».

Используйте метод selectionChanged() вместо active().

На самом деле, в большинстве случаев, когда вы считаете, что должны использовать active(), вместо этого вы, вероятно, ищете selectionChanged() (или событие OnSelectionChanged для обработчиков).

person rjv    schedule 05.02.2020
comment
Что касается расширения, я должен использовать fromstr или formdatasoucestr в моем последнем классе? И второй вопрос, как я могу использовать эту текущую строку для моего оператора выбора? Мне нужно проверить выбранные строки - person Tweene; 05.02.2020
comment
Всегда используйте функции времени компиляции x++, такие как formdatasourcestr(), чтобы обеспечить проверку времени компиляции для правильного доступа к объектам formrun и formdatasource. Чтобы просмотреть отмеченные записи сетки, используйте этот класс MultiSelectionHelper. Либо MultiSelectionHelper::createfromcaller(), либо MultiSelectionHelper::construct с parmFormDatasource() в зависимости от вашего сценария. - person rjv; 05.02.2020
comment
Не могли бы вы показать мне пример кода? Я новичок в x++, поэтому мне очень сложно кодировать такие новые вещи. Сначала мне нужно проверить, указал ли пользователь строку, что RefID = ProdID, после чего это более просто (я думаю?), Только затем мне нужно проверить все RefID, которые имеют один и тот же ProdID, но имеют разные ProdID (1 RefID всегда имеет 1 тот же ProdID и некоторые другие ProdID) - person Tweene; 05.02.2020
comment
если пользователь указал строку, я предполагаю, что вы имеете в виду запуск события OnSelectionChange. Найдите источник данных сетки и создайте новый обработчик событий для этого события. Затем прокрутите все записи таблицы, которые вам нужно сравнить с текущей записью formdatasource.cursor(). - person rjv; 05.02.2020
comment
Эта сетка источника данных находится в другой форме ProdTableListPage. Итак, мне нужно создать 2 последних класса? Один для этого ListPage и один для ProdParm? Или я могу запустить код из одного последнего класса, который мне нужно проверить в ListPage, но фактическое изменение необходимо сделать в ProdParm (просто отключите кнопку OK и добавьте предупреждающую метку). - person Tweene; 05.02.2020
comment
Я не совсем понимаю ваш сценарий. Окончательный класс - это просто тот, который не может быть далее унаследован/расширен. Вероятно, вам понадобятся классы расширения ИЛИ два класса обработчика для каждой из ваших форм. В selectionChanged дочерней формы вы должны использовать MultiSelectionHelper::createfromCaller(args.caller()) для циклического просмотра отмеченных записей родительской сетки. - person rjv; 05.02.2020
comment
Моя задача — создать расширение для проверки спецификации производственного контроля. Итак (я думаю), сначала мне нужно проверить, является ли текущая выбранная строка в сетке основной задачей (ProdId = RefID), если это правда, проверьте все другие задачи, которые имеют этот RefID, если их ProdStatus сообщается как завершенный. Если это не отключить кнопку «ОК» в ProdParm, чтобы никто не мог продолжить всю спецификацию. Это все потому, что пользователи забывают сменить этот флаг на задачах и пытаются отчитаться о том, что все выполнено. - person Tweene; 05.02.2020