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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 10.05.2009, 20:27   #1  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Регистрация: 15.03.2006
MAP в качестве datasource формы
Есть 2 таблицы Т1 и Т2, у них есть с 2 десятка одинаковых полей и с десяток разных.
Есть форма, на ней основной datasource основан на Т1 и в зависимости от текущего значения поля vendAccount записи этого основного DS, нужно в некоторых полях формы показывать данные либо из Т1 или из Т2 .

Допустим, vendAccount = 001 , то в поля формы F1....F20 отображаться значения из Т1 , vendAccount = 002 , то в те же поля формы F1....F20 отображаться уже значения из Т2.

Хочу положить на форму map , в котором замаппены эти 20 полей из T1 и T2. Как это лучше сделать? Просто указать этот map в качестве DS2 формы и на linkActive заполнять присваивать строке map знания из нужной таблицы ? Или умней сделать как-то по-дугому?
Старый 10.05.2009, 21:40   #2  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от IKA Посмотреть сообщение
Есть 2 таблицы Т1 и Т2, у них есть с 2 десятка одинаковых полей и с десяток разных.
Есть форма, на ней основной datasource основан на Т1 и в зависимости от текущего значения поля vendAccount записи этого основного DS, нужно в некоторых полях формы показывать данные либо из Т1 или из Т2 .

Допустим, vendAccount = 001 , то в поля формы F1....F20 отображаться значения из Т1 , vendAccount = 002 , то в те же поля формы F1....F20 отображаться уже значения из Т2.

Хочу положить на форму map , в котором замаппены эти 20 полей из T1 и T2. Как это лучше сделать? Просто указать этот map в качестве DS2 формы и на linkActive заполнять присваивать строке map знания из нужной таблицы ? Или умней сделать как-то по-дугому?
А вы пробовали указать Map в датасорсе формы?
Думаю придётся делать через временню таблицу, или через два табПэйджа (один, для ненужной таблицы, скрывать)..
__________________
Zhirenkov Vitaly
Старый 10.05.2009, 22:21   #3  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
Цитата:
Сообщение от IKA Посмотреть сообщение
Допустим, vendAccount = 001 , то в поля формы F1....F20 отображаться значения из Т1 , vendAccount = 002 , то в те же поля формы F1....F20 отображаться уже значения из Т2.
Вообще говоря, делать такие проверки (значения поля с константой) в коде - моветон. Я бы рекомендовал следующее:
  • создать свой Enum, который будет отвечать за выбор этих двух таблиц. Что-то типа MyVendType::T1 и MyVendType::T2 (с осмысленными названиями, разумеется);
  • добавить в таблицу T1 поле с типом MyVendType и единовременно (job-ом) заполнить это поле на основе поля vendAccount в соответствии с Вашей логикой. При этом не забыть модифицировать код, выполняемый при добавлении записей в таблицу (инициализация поля MyVendType);
  • добавить к таблице T1 два отношения (relation): одно с самой собой, а второе - с таблицей T2. Эти отношения должны иметь тип связи "поле фиксировано" и строиться на поле MyVendType. (В первом случае связь будет MyVendType == 0, во втором - MyVendType == 1);
  • добавить в упомянутые отношения связи по первичным ключам (однозначно идентифицирующие запись);
  • на форме создать три источника данных: родительский T1 и два подчиненных: T1 и T2, и привязать их к разным TabPage, как советовал ZVV выше.
Получилось на первый взгляд громоздко, но зато: 1) не навешиваются доп. действия на linkActive (может я не прав, но имхо, нагружать этот метод - это совсем крайний случай), и 2) используется стандартный механизм динамического выбора источника данных (если это можно так назвать).

PS: если мое описание покажется сумбурным, посмотрите для примера отношения на таблице LedgerJournalTrans
Старый 10.05.2009, 23:34   #4  
denny is offline
denny
Участник
 
93 / 29 (1) +++
Регистрация: 16.11.2003
Адрес: Novosibirsk
Не греть голову, а в зависимости от типа показывать/скрывать соответствующие контролы. Делалось неоднократно именно в таких случаях - надежный и проверенный способ.
__________________
Денис Балуев.
Старый 11.05.2009, 10:40   #5  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Регистрация: 15.03.2006
Цитата:
Сообщение от ZVV Посмотреть сообщение
А вы пробовали указать Map в датасорсе формы?
Думаю придётся делать через временню таблицу, или через два табПэйджа (один, для ненужной таблицы, скрывать)..
AX2009 - можно выбрать map в качестве DS формы.
вопрос - как потом с ним работать...
Старый 11.05.2009, 10:44   #6  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Регистрация: 15.03.2006
Цитата:
Сообщение от Ruff Посмотреть сообщение
Вообще говоря, делать такие проверки (значения поля с константой) в коде - моветон. Я бы рекомендовал следующее:
  • создать свой Enum, который будет отвечать за выбор этих двух таблиц. Что-то типа MyVendType::T1 и MyVendType::T2 (с осмысленными названиями, разумеется);
  • добавить в таблицу T1 поле с типом MyVendType и единовременно (job-ом) заполнить это поле на основе поля vendAccount в соответствии с Вашей логикой. При этом не забыть модифицировать код, выполняемый при добавлении записей в таблицу (инициализация поля MyVendType);
  • добавить к таблице T1 два отношения (relation): одно с самой собой, а второе - с таблицей T2. Эти отношения должны иметь тип связи "поле фиксировано" и строиться на поле MyVendType. (В первом случае связь будет MyVendType == 0, во втором - MyVendType == 1);
  • добавить в упомянутые отношения связи по первичным ключам (однозначно идентифицирующие запись);
  • на форме создать три источника данных: родительский T1 и два подчиненных: T1 и T2, и привязать их к разным TabPage, как советовал ZVV выше.
Получилось на первый взгляд громоздко, но зато: 1) не навешиваются доп. действия на linkActive (может я не прав, но имхо, нагружать этот метод - это совсем крайний случай), и 2) используется стандартный механизм динамического выбора источника данных (если это можно так назвать).

PS: если мое описание покажется сумбурным, посмотрите для примера отношения на таблице LedgerJournalTrans
Спасибо, но логика скорей там такая, что, если данные в T2 есть, то показывать данные для вендора из нее, если нет, то в тех же полях показывать данные из T1.
То есть не от конкретного знаечния вендора зависит, а от того, есть ли в T2 для него записи.
Старый 11.05.2009, 12:09   #7  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от IKA Посмотреть сообщение
Спасибо, но логика скорей там такая, что, если данные в T2 есть, то показывать данные для вендора из нее, если нет, то в тех же полях показывать данные из T1.
То есть не от конкретного знаечния вендора зависит, а от того, есть ли в T2 для него записи.
А чем вам тогда мэп поможет - не совсем понятно?
__________________
Zhirenkov Vitaly
Старый 11.05.2009, 23:17   #8  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Регистрация: 15.03.2006
Цитата:
Сообщение от ZVV Посмотреть сообщение
А чем вам тогда мэп поможет - не совсем понятно?
Смысл - скрыть от пользователя и программиста из какой таблицы берутся поля и в какую таблицу сохраняются и сделать универсальный способ работы с этими данными в системе, чтобы программисту постоянно не писать запросы, проверяющие есть ли данные в одной таблице, и если ли нету, искать в другой таблице, то же с update . Хочу всю логику инкапсулировать в мапе. Можно было бы многое сделать то же с помощью временных таблиц, возможно, но мэп позволит точней работать с полями + универсальность вызовов не зависимо от того с буфером из какой таблицы работаешь.
Какие за/против?
Старый 12.05.2009, 00:15   #9  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от IKA Посмотреть сообщение
Смысл - скрыть от пользователя и программиста из какой таблицы берутся поля и в какую таблицу сохраняются и сделать универсальный способ работы с этими данными в системе, чтобы программисту постоянно не писать запросы, проверяющие есть ли данные в одной таблице, и если ли нету, искать в другой таблице, то же с update . Хочу всю логику инкапсулировать в мапе. Можно было бы многое сделать то же с помощью временных таблиц, возможно, но мэп позволит точней работать с полями + универсальность вызовов не зависимо от того с буфером из какой таблицы работаешь.
Какие за/против?
Да я примерно понимаю для чего обычно используют мэпы...
Но это не совсем ваш случай, мне кажется... Обычно в map-е объединяют однотипные таблицы из разных модулей (типа CustVendTrans). Вы же пытаетесь объединить 2 таблицы одной и той же сущности, которые ещё и каким-то крайне странным образом зависимы ("То есть не от конкретного знаечния вендора зависит, а от того, есть ли в T2 для него записи.")
- А если нет и там, и там?
- А если в Т2 нет, но я хочу добавить?
- ...
Мне кажется Вы пытаетесь лечить последствия неправильного дизайна. Просто забыли вовремя в нужном месте добавить поле "типа записи".
И лечить лучше болезнь, если есть возможность, а не симптом...
__________________
Zhirenkov Vitaly
Старый 12.05.2009, 01:03   #10  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Регистрация: 15.03.2006
Согласна, дизайн извращенный, смысл в том, что есть несколько компаний, и все они должны видеть одни и те же данные про вердора, пока не захотят их изменить в своей конкретной компании. то есть все остальные компании так и будут видеть общие данные, а эта конкретная компания будет видеть свои в соответствующих полях. Поэтому есть запись в shared таблице и есть таблица, которая держит записи переопределенные в конкретной компании, поля могут переопределяться не все, а только около 2 десятков.Записей shared около 300 000, переопределяться будут изредка, поэтому дублировать записи по всем компаниям не вариант. Было несколько дизайнов, по разным причинам остановились на этом, тк позволяет скрыть то, что за мэпом скрыто и можно будет менять нижележащую архитектуру, не меняя каждое место, где используется эта функциональность.
Буду рада, если получу ответ на изначальный вопрос относительно того, как лучше использовать мэп на форме - через link active и заполнение по нему значений или как-ниудь по-другому.
Ну и комментарии предложений по дизайну тоже, может, кто-то делал подобное и знает про достоинства/недостатки разных вариантов. Мэп хорош, как говорилось, тем, что инкапсулирует логику, поэтому девелопить проще, и количсество ошибок меньше и можно нижележащую архитектуру менять, не меняя код по всей системе, но с другой стороны, я думаю, что может оказать влияние на производительность, тк вместо запросов придется в части случаев комбинировать запрос и операции с мэпом(как , например. на форме в изначальном моем вопросе).
Старый 13.05.2009, 17:51   #11  
denny is offline
denny
Участник
 
93 / 29 (1) +++
Регистрация: 16.11.2003
Адрес: Novosibirsk
Цитата:
Сообщение от IKA Посмотреть сообщение
Согласна, дизайн извращенный, смысл в том, что есть несколько компаний, и все они должны видеть одни и те же данные про вердора, пока не захотят их изменить в своей конкретной компании. то есть все остальные компании так и будут видеть общие данные, а эта конкретная компания будет видеть свои в соответствующих полях. Поэтому есть запись в shared таблице и есть таблица, которая держит записи переопределенные в конкретной компании, поля могут переопределяться не все, а только около 2 десятков.Записей shared около 300 000, переопределяться будут изредка, поэтому дублировать записи по всем компаниям не вариант. Было несколько дизайнов, по разным причинам остановились на этом, тк позволяет скрыть то, что за мэпом скрыто и можно будет менять нижележащую архитектуру, не меняя каждое место, где используется эта функциональность.
.
Комментарий по дизайну: вот потом по закону подлости обязательно захочется видеть базовые, неизмененные значения ПЛЮС кастомные (например, для сравнения тех и других). И Map придется выбросить.
Такие поля называются подстановкой. Хотите программисту работу облегчить - напишите в базовой таблице edit-методы, работающие с подстановкой (1 вариант), скрывайте/показывайте контролы, проверяя методом isCustom правомерность того или иного действия (2 вариант)
__________________
Денис Балуев.
Теги
datasource, map

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Обновление DataSource из формы Печать\Новый отчет. Poleax DAX: Программирование 19 13.04.2011 09:28
Types::Record в качестве ключа для класса Map Gad DAX: Программирование 12 11.07.2007 10:54
Как программно добавить DataSource в процессе работы формы Владимир Максимов DAX: Программирование 1 29.11.2006 18:28
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38
Как получить доступ к текущей строке в DataSource формы Maxim Gorbunov DAX: База знаний и проекты 0 28.11.2001 13:46
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 18:21.