AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.09.2017, 19:04   #1  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Edit Method
Ax 4
Всем доброго дня.
Подскажите реально ли сделать следущее.
Есть форма заказов на продажу. На форме три grid. Самый верхний шапка заказа на продажу. Второй строки заказа на продажу с основными товарами. Третий грид тоже отображает строки заказа, но это строки с дополнительными товарами которые относятся в выбранному основному товару (связь через RefRecId на строку основного товара).
В третьем grid есть дисплейный метод который отображает внутренний код основного товара из InventTable.
Появилась потребность изменение основного товара у дополнительного. Чтобы не удалять и заново создавать записи в третьем grid, есть ли возможность вывести туда edit method который будет отображать внутренний код основного товара и при изменении его прописывать новый RefRecId в строки дополнительного товара?
Старый 15.09.2017, 19:19   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от smailik Посмотреть сообщение
Чтобы не удалять и заново создавать записи в третьем grid
во-первых, удаляются и создаются записи не в гриде, а в базе данных. грид всего лишь отображает.

во-вторых, я не очень понимаю смысл и цель условия "не удалять и не создавать заново".

Представьте, что у вас многопользовательская система.
с одним заказом могут работать несколько пользователей одновременно, выполняя разные задачи. каждый видит свой мастер-дитейл. каждый может использовать сложную систему кэширования (простейшая - свойство таблицы CacheLookup=NotInTTS). У каждого может быть включен фильтр на уровне записей.

и вот вы собираетесь изобрести хитрый способ изменить хитрые отношения в мастер-дитейл таблицах, не удаляя и не пересоздавая записи? зачем? чтобы потом героически решать проблемы с кэшами и прочими инструментами? Чтобы потом делать find и обязательно проверять тот ли RecRefId в найденной записи?

==================
если вас смущает необходимость копировать поля в новую запись, то давно существует метод buf2buf. используйте его.
__________________
полезное на axForum, github, vk, coub.
Старый 15.09.2017, 19:26   #3  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Хотелось бы сделать максимально простой способ изменения основного товара для пользователя. Я расчитывал на то, что если один из пользователей уже сменит основной товар и это попробует сделать другой пользователь, то Аксапта бодро отрапортует "Данные на форме не являются текущими".
Старый 15.09.2017, 19:53   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от smailik Посмотреть сообщение
Я расчитывал на то, что если один из пользователей уже сменит основной товар и это попробует сделать другой пользователь, то Аксапта бодро отрапортует "Данные на форме не являются текущими".
должен ли дополнительный товар со смененным основным отображаться в гриде другого пользователя?
скорее всего, нет. а он отображается, если первый уже изменил, а второй еще не сделал research.

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

впрочем, как хотите
Цитата:
Сообщение от smailik Посмотреть сообщение
есть ли возможность вывести туда edit method который будет отображать внутренний код основного товара и при изменении его прописывать новый RefRecId в строки дополнительного товара?
да, в edit-методе можно изменить любые поля в записи.
но такое поведение будет неожиданным для всех, включая саму аксапту.
__________________
полезное на axForum, github, vk, coub.
Старый 15.09.2017, 20:17   #5  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Давно не работал с edit методами. Подскажите что делаю не так
X++:
edit Out_ItemId outId_1CMaster(
    boolean     _set,
    Out_ItemId       _out_itemId)
{
    InventTable inventTableLocal;

    Out_ItemId  ret;
    ;
    
    inventTableLocal = InventTable::find(salesLineSlave.salesLineMaster().ItemId);

    return inventTableLocal.OutId_1C;
}
Пока просто пытаюсь вывести внутренний код товара для каждой строки дополнительного товара. Если в заказе больше одной дополнительной строки, то данные отображаются некорректно.
Старый 15.09.2017, 20:33   #6  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
давайте я прочитаю ваш код на человеческом языке:
1. игнорировать режим _set = dispaly or edit
2. игнорировать второй параметр - значение которое ввел пользователь
3. найти номенклатуру с каким-то левым itemId
4. возвратить для отображения на экране код OutId_1C для найденной номенклатуры

при этом не запоминать никаких значений. ни в датасорсах, ни в таблицах.

Цитата:
Сообщение от smailik Посмотреть сообщение
Давно не работал с edit методами.
да, думаю, что стоит просто почитать доку по ключевым словам "edit method" и посмотреть примеры.
__________________
полезное на axForum, github, vk, coub.

Последний раз редактировалось mazzy; 15.09.2017 в 20:42.
Старый 15.09.2017, 21:12   #7  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Я ведь написал что просто пытаюсь вывести внутренний код
Метод у меня выглядит вот так
X++:
edit Out_ItemId outId_1CMaster(
    boolean     _set,
    Out_ItemId       _out_itemId)
{
    InventTable inventTableLocal;

    Out_ItemId  ret;
    ;

    if (_set)
    {
        inventTableLocal = InventTable::findOut_1C(_out_itemId);
        
        salesLineSlave.SalesLineMaster = SalesLine::findItemId(salesTable.SalesId, inventTableLocal.ItemId).RecId;        
    }

    inventTableLocal = InventTable::find(salesLineSlave.salesLineMaster().ItemId);

    return inventTableLocal.OutId_1C;
}
где salesLineSlave - строки с дополнительных товаров, salesLineMaster, salesLineMaster - строки основных товаров
так как проблема с выводом кода, то в предыдущий раз метод представил в укороченном виде
Старый 15.09.2017, 21:37   #8  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от smailik Посмотреть сообщение
X++:
        salesLineSlave.SalesLineMaster = SalesLine::findItemId(salesTable.SalesId, inventTableLocal.ItemId).RecId;
эта строчка сохраняет в переменной. но не в базе.


Цитата:
Сообщение от smailik Посмотреть сообщение
X++:
    inventTableLocal = InventTable::find(salesLineSlave.salesLineMaster().ItemId);
стопудов, метод salesLineMaster() содержит select и ищет запись в базе, которую вы не обновили.
а что показывает отладчик?

похоже, что в голове нужно уложить две вещи:
1. есть записи в базе (это не грид и не переменные)
2. гриды, датасорсы и переменные могут содержать значения, которые когда-то были прочитаны из базы. эти копии могут не совпадать с актуальными значениями в базе.

любой query/select ищет не в переменных, а в базе.
чтобы из переменных сохранить в базу, нужно вызывать метод insert/update.

=========================
сохранять значения в базу внутри метода edit можно.
но такое поведение будет неожиданным не только для программистов и для аксапты, но и для пользователей.
__________________
полезное на axForum, github, vk, coub.

Последний раз редактировалось mazzy; 15.09.2017 в 21:54.
Старый 15.09.2017, 22:03   #9  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
и видите ли в чем дело...
в заказе может быть несколько строчек с одинаковой номенклатурой.

поэтому сам подход вот с таким поиском - принципиально неверный с точки зрения бизнес-функционала.
Цитата:
Сообщение от smailik Посмотреть сообщение
X++:
        salesLineSlave.SalesLineMaster = SalesLine::findItemId(salesTable.SalesId, inventTableLocal.ItemId).RecId;
__________________
полезное на axForum, github, vk, coub.
Старый 15.09.2017, 22:20   #10  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Да метод содержит select, но я пока не говорю про обновление записей. Просто хожу по строкам и вижу в edit методе не то что надо. В моем примере 3 строки с дополнительным товаром. У каждой из строк свой основной товар. На выделенной строке все верно, а на одной из оставшихся такое-же значение как и на первой, на третьей все верно.
Старый 15.09.2017, 22:40   #11  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Цитата:
поэтому сам подход вот с таким поиском - принципиально неверный с точки зрения бизнес-функционала
Согласен, выглядит очень странно, но в данном случае это имеет право на существование. Такая уж специфика работы организации
Старый 15.09.2017, 22:48   #12  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от smailik Посмотреть сообщение
На выделенной строке все верно, а на одной из оставшихся такое-же значение как и на первой, на третьей все верно.
не получилось ли так, что на одном гриде у вас присутствуют поля с разными датасорсами? если так, то тип связи между этими датасорсами должен быть равен InnerJoin.

но будет лучше, если все поля в одном гриде будут принадлежать одному датасорсу.
__________________
полезное на axForum, github, vk, coub.
Старый 16.09.2017, 01:06   #13  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от smailik Посмотреть сообщение
Согласен, выглядит очень странно, но в данном случае это имеет право на существование. Такая уж специфика работы организации
Забудьте о своём edit методе и связи через ParentRefRecId на сопутствующих товарах.

Сопутствующие товары должны быть представлены в системе как набор со своим ID. Голова набора и строки набора. Ещё одна новая таблица - связующая для связи строки заказа и набора.

Смена основного товара на строке никак не влияет на этот набор.
При изменении строк в наборе сопутствующих товаров менятся значение ID набора в связывающей таблице которая по сути два поля, сама строка заказа не меняется.
P.S. Не обязательно при этом менять ID набора как это делается с InventDimId, можно и тупо держать тот же RecId головы набора в качестве такого ID уникального для строки заказа, так даже проще. Просто на практике сопутствующие товары часто предопределённый набор.

Постановка задачи нормальна. Ненормально буквально её воспринимать и искать техническую логику.

Последний раз редактировалось ax_mct; 16.09.2017 в 01:37. Причина: ps
Старый 16.09.2017, 11:08   #14  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Цитата:
не получилось ли так, что на одном гриде у вас присутствуют поля с разными датасорсами? если так, то тип связи между этими датасорсами должен быть равен InnerJoin.
У меня сейчас вот как
SalesTable
SalesLineMaster (Delayed)
InventTableMaster (InnerJoin)
SalesLineSlave (Delayed)
InventTableSlave
И сейчас в edit методе мне нужно отобразить OutId_1C из InventTableMaster. Получается это в данном случае нереализуемо. Я правильно понял?
Старый 16.09.2017, 11:11   #15  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от smailik Посмотреть сообщение
У меня сейчас вот как
SalesTable
SalesLineMaster (Delayed)
InventTableMaster (InnerJoin)
SalesLineSlave (Delayed)
InventTableSlave
И сейчас в edit методе мне нужно отобразить OutId_1C из InventTableMaster. Получается это в данном случае нереализуемо. Я правильно понял?
а в гриде и в полях какой датасорс указан?
может вы просто подготовите проект с необходимым минимумом и положите сюда?
__________________
полезное на axForum, github, vk, coub.
Старый 16.09.2017, 11:57   #16  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Подготовил проект.
Вложения
Тип файла: xpo CopySalesTable.xpo (63.3 Кб, 461 просмотров)
Старый 18.09.2017, 11:32   #17  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Точно помню что пробовал передавать 3 параметра и это у меня не получалось. Сейчас все норм.
X++:
public edit Out_ItemId outId_1CMaster(
    boolean     _set,
    SalesLine   _salesLineSlave,
    Out_ItemId  _out_itemId)
{
    InventTable inventTableLocal;

    Out_ItemId  ret;
    ;

    if (_set)
    {
        inventTableLocal = InventTable::findOut_1C(_out_itemId);

        salesLineSlave.SalesLineMaster = SalesLine::findItemId(salesTable.SalesId, inventTableLocal.ItemId).RecId;
    }

    inventTableLocal = InventTable::find(_salesLineSlave.salesLineMaster().ItemId);

    return inventTableLocal.OutId_1C;
}
Наверное все-таки вечер пятницы имеет магические свойства.
За это сообщение автора поблагодарили: mazzy (2).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Edit method syl DAX: Программирование 7 11.09.2015 16:51
emeadaxsupport: Error executing code: FormRun (data source) has no valid runable code in method 'new' when trying to edit Project workflow Blog bot DAX Blogs 0 24.06.2015 14:11
emeadaxsupport: Dynamics Ax 2012: How to implement an edit method and use it within Enterprise Portal Blog bot DAX Blogs 0 13.11.2013 22:11
TwC: Validate access to return value from display/edit method. HorrR DAX: Программирование 10 05.03.2008 12:17
TwC: Validate access to return value from display/edit method. алька DAX: Программирование 3 20.04.2007 14:15
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 20:49.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.