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

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

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

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

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

==================
если вас смущает необходимость копировать поля в новую запись, то давно существует метод buf2buf. используйте его.
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 15.09.2017, 19:26   #3  
smailik is offline
smailik
Участник
Аватар для smailik
 
166 / 42 (2) +++
Регистрация: 10.04.2012
Адрес: Москва
Хотелось бы сделать максимально простой способ изменения основного товара для пользователя. Я расчитывал на то, что если один из пользователей уже сменит основной товар и это попробует сделать другой пользователь, то Аксапта бодро отрапортует "Данные на форме не являются текущими".
Старый 15.09.2017, 19:53   #4  
online
mazzy
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,611 / 3396 (171) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Цитата:
Сообщение от smailik Посмотреть сообщение
Я расчитывал на то, что если один из пользователей уже сменит основной товар и это попробует сделать другой пользователь, то Аксапта бодро отрапортует "Данные на форме не являются текущими".
должен ли дополнительный товар со смененным основным отображаться в гриде другого пользователя?
скорее всего, нет. а он отображается, если первый уже изменил, а второй еще не сделал research.

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

впрочем, как хотите
Цитата:
Сообщение от smailik Посмотреть сообщение
есть ли возможность вывести туда edit method который будет отображать внутренний код основного товара и при изменении его прописывать новый RefRecId в строки дополнительного товара?
да, в edit-методе можно изменить любые поля в записи.
но такое поведение будет неожиданным для всех, включая саму аксапту.
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 15.09.2017, 20:17   #5  
smailik is offline
smailik
Участник
Аватар для smailik
 
166 / 42 (2) +++
Регистрация: 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  
online
mazzy
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,611 / 3396 (171) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
давайте я прочитаю ваш код на человеческом языке:
1. игнорировать режим _set = dispaly or edit
2. игнорировать второй параметр - значение которое ввел пользователь
3. найти номенклатуру с каким-то левым itemId
4. возвратить для отображения на экране код OutId_1C для найденной номенклатуры

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

Цитата:
Сообщение от smailik Посмотреть сообщение
Давно не работал с edit методами.
да, думаю, что стоит просто почитать доку по ключевым словам "edit method" и посмотреть примеры.
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.

Последний раз редактировалось mazzy; 15.09.2017 в 20:42.
Старый 15.09.2017, 21:12   #7  
smailik is offline
smailik
Участник
Аватар для smailik
 
166 / 42 (2) +++
Регистрация: 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  
online
mazzy
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,611 / 3396 (171) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Цитата:
Сообщение от 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 можно.
но такое поведение будет неожиданным не только для программистов и для аксапты, но и для пользователей.
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.

Последний раз редактировалось mazzy; 15.09.2017 в 21:54.
Старый 15.09.2017, 22:03   #9  
online
mazzy
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,611 / 3396 (171) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
и видите ли в чем дело...
в заказе может быть несколько строчек с одинаковой номенклатурой.

поэтому сам подход вот с таким поиском - принципиально неверный с точки зрения бизнес-функционала.
Цитата:
Сообщение от smailik Посмотреть сообщение
X++:
        salesLineSlave.SalesLineMaster = SalesLine::findItemId(salesTable.SalesId, inventTableLocal.ItemId).RecId;
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 15.09.2017, 22:20   #10  
smailik is offline
smailik
Участник
Аватар для smailik
 
166 / 42 (2) +++
Регистрация: 10.04.2012
Адрес: Москва
Да метод содержит select, но я пока не говорю про обновление записей. Просто хожу по строкам и вижу в edit методе не то что надо. В моем примере 3 строки с дополнительным товаром. У каждой из строк свой основной товар. На выделенной строке все верно, а на одной из оставшихся такое-же значение как и на первой, на третьей все верно.
Старый 15.09.2017, 22:40   #11  
smailik is offline
smailik
Участник
Аватар для smailik
 
166 / 42 (2) +++
Регистрация: 10.04.2012
Адрес: Москва
Цитата:
поэтому сам подход вот с таким поиском - принципиально неверный с точки зрения бизнес-функционала
Согласен, выглядит очень странно, но в данном случае это имеет право на существование. Такая уж специфика работы организации
Старый 15.09.2017, 22:48   #12  
online
mazzy
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,611 / 3396 (171) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Цитата:
Сообщение от smailik Посмотреть сообщение
На выделенной строке все верно, а на одной из оставшихся такое-же значение как и на первой, на третьей все верно.
не получилось ли так, что на одном гриде у вас присутствуют поля с разными датасорсами? если так, то тип связи между этими датасорсами должен быть равен InnerJoin.

но будет лучше, если все поля в одном гриде будут принадлежать одному датасорсу.
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 16.09.2017, 01:06   #13  
ax_mct is offline
ax_mct
Участник
Аватар для ax_mct
 
1,684 / 531 (21) +++++++
Регистрация: 10.10.2005
Адрес: PHP
Цитата:
Сообщение от 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
 
166 / 42 (2) +++
Регистрация: 10.04.2012
Адрес: Москва
Цитата:
не получилось ли так, что на одном гриде у вас присутствуют поля с разными датасорсами? если так, то тип связи между этими датасорсами должен быть равен InnerJoin.
У меня сейчас вот как
SalesTable
SalesLineMaster (Delayed)
InventTableMaster (InnerJoin)
SalesLineSlave (Delayed)
InventTableSlave
И сейчас в edit методе мне нужно отобразить OutId_1C из InventTableMaster. Получается это в данном случае нереализуемо. Я правильно понял?
Старый 16.09.2017, 11:11   #15  
online
mazzy
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,611 / 3396 (171) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Цитата:
Сообщение от smailik Посмотреть сообщение
У меня сейчас вот как
SalesTable
SalesLineMaster (Delayed)
InventTableMaster (InnerJoin)
SalesLineSlave (Delayed)
InventTableSlave
И сейчас в edit методе мне нужно отобразить OutId_1C из InventTableMaster. Получается это в данном случае нереализуемо. Я правильно понял?
а в гриде и в полях какой датасорс указан?
может вы просто подготовите проект с необходимым минимумом и положите сюда?
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 16.09.2017, 11:57   #16  
smailik is offline
smailik
Участник
Аватар для smailik
 
166 / 42 (2) +++
Регистрация: 10.04.2012
Адрес: Москва
Подготовил проект.
Вложения
Тип файла: xpo CopySalesTable.xpo (63.3 Кб, 10 просмотров)
Старый 18.09.2017, 11:32   #17  
smailik is offline
smailik
Участник
Аватар для smailik
 
166 / 42 (2) +++
Регистрация: 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, время: 22:43.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.