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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.01.2005, 15:48   #1  
lego_99 is offline
lego_99
Участник
 
10 / 10 (1) +
Регистрация: 21.11.2004
Адрес: Moscow
? Проверка подчиненных записей
Уважаемые коллеги!

Такое дело...

Форма. На форме два датасорса D1 и D2.
D2.JoinSource = D1
D2.LinkType = Delayed

Соотвественно два Grid:
Grid1 - на D1
Grid2 - на D2

Создаем новую запись...

Вопрос:
как запретить сохранять запись, если в D2 нет ни одной соответствующей записи?

Буду рад..
Старый 14.01.2005, 16:24   #2  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Неправильная какая-то постановка задачи. Запись в D1 (родительская таблица) должна быть сохранена раньше, чем будут создаваться связанные с ней записи в дочерней таблице.
__________________
Андрей.
Старый 14.01.2005, 16:51   #3  
maxsmirnov is offline
maxsmirnov
экс-модератор
 
268 / 25 (1) +++
Регистрация: 08.07.2003
Адрес: Москва
а вам зачем вообще?
Старый 14.01.2005, 16:54   #4  
lego_99 is offline
lego_99
Участник
 
10 / 10 (1) +
Регистрация: 21.11.2004
Адрес: Moscow
Согласен, неправильная.

В том-то все и дело..

Неужели нет никакого способа?

Ведь с точки зрения заказчика вполне понятное требование -
"хочу, чтобы Запись Персона нельзя было сохранить, пока для нее не указан
хотя бы один контактный Телефон и телефонов может быть несколько"


C++ + SQL позволяют легко решить эту задачу через хранимые процедуры.

И вообще, если обобщить, то задача сводится к
"проверить данные на форме до попытки сохранить"
Старый 14.01.2005, 17:21   #5  
maxsmirnov is offline
maxsmirnov
экс-модератор
 
268 / 25 (1) +++
Регистрация: 08.07.2003
Адрес: Москва
не, в аксапте строка всегда сохраняется при переходе фокуса из одного грида в другой.
можете, например, в методе close() формы удалять ненужные вам строки.
Старый 14.01.2005, 17:26   #6  
Gad is offline
Gad
Участник
 
136 / 18 (1) ++
Регистрация: 21.05.2003
Адрес: Москва
Сделайте для Персоны некий статус, при выставлении которого персона становится доступна для выбора и прочего использования. А статус устанавливайте в коде, вызываемом по кнопке с формы. В этом коде и сделайте проверку на существование записей в подчиненной таблице.
Старый 14.01.2005, 17:51   #7  
lego_99 is offline
lego_99
Участник
 
10 / 10 (1) +
Регистрация: 21.11.2004
Адрес: Moscow
2 maxsmirnov

Все бы хорошо, да только

если
закрыть Аксапту целиком (самый-самый главный крестик, например),
то
close() на форме не вызовется

Соответственно... запись останется сохраненной без
подчиненных.

И еще минус с удалением - ном.серия нарушится.

2 Gad

Т.е. ... э-э-э ...
не совсем понял
Про статус и проверку вроде понял,
а вот про то,
как это позволит избежать write()
при переходе с D1 на D2 для внесения записи в D2 - не понял - ?
Старый 14.01.2005, 17:56   #8  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Цитата:
если
закрыть Аксапту целиком (самый-самый главный крестик, например),
то
close() на форме не вызовется
Неправда ваша, вызовется (AX3.0 CIS SP2).

А по поводу решения - можно попробовать использовать некий временный буфер (временную таблицу, список), редактируя его в отдельной форме, а при сохранении записи основной таблицы проверять заполненность этого буфера.
__________________
Андрей.
Старый 14.01.2005, 17:57   #9  
Gad is offline
Gad
Участник
 
136 / 18 (1) ++
Регистрация: 21.05.2003
Адрес: Москва
2 lego_99
Никак не поможет. Я просто предлагаю слегка изменить постановку задачи и в местах использования Персоны ввести запрет на использование записей с неактивным статусом. От хранения записей без подчиненных это конечно не спасет.
Старый 14.01.2005, 18:30   #10  
lego_99 is offline
lego_99
Участник
 
10 / 10 (1) +
Регистрация: 21.11.2004
Адрес: Moscow
2 maxsmirnov
Виноват, был не прав.
На SP2 при закрытии Аксапты close() будет вызываться.
На SP1 - нет.

2 Dron AKA andy

У, блин, везука.
На AX3.0 SP1 этим похвастацца, как бы ни хотел, никак не могу

Буфер - временная таблица то бишь?
Если да, то ведь синхронизировать придется... с таблицей на сервере.

Cравнить две таблицы - и обновить серверную до
состояния временной?

Хотя, с другой стороны, если открываем Персону, а у нее
уже есть хотя бы один Телефон, то и временная таблица
нам, по идее, не нужна..
Т.е. синхронизировать придется только в первый раз.
А дальше - запретить удалять все записи (оставлять хотя бы одну).

Есть ли способ малой кровью (читай "меньше кода") синхронизировать Временную Таблицу и Серверную? Может быть, как-нибудь Map можно прибить к этому делу
или метод какой хитрый есть? Навскидку.


2 Gad

Это поможет,
но ведь "мест использования" может быть больше одного .. или больше десяти, например.
Хотя в таком случае действительно будет все работать, особенно если отфильтровать
записи в Персоне, так, чтобы не было видно тех, что без подчиненных. Мысль.

_________________________________________
Метод с буфером кажется мне предпочтительнее.
Старый 14.01.2005, 19:01   #11  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Может в персоне добавить обязательное поле "primary контакт"... а после сохранения автоматом вливать первую запись в контакты...
а, кстати при удалении всех контактов, персона должна грохнуться?
Старый 14.01.2005, 20:15   #12  
lego_99 is offline
lego_99
Участник
 
10 / 10 (1) +
Регистрация: 21.11.2004
Адрес: Moscow
2 Wamr

Если ввести Primary Contact, то это будет даже удобно.
(Контакт же обязательно должен быть, почему бы
первым Контактом и не быть Контактом в виде поля?)

По-моему, это лучшая идея из всех.
Понятно, как делать и много времени не займет.

P.S.:
Интересно, а реально ли реализовать механизм
что-то типа наподобие - указал при init() главного датасорса
без записей в каком / каких подчиненных датасорсе/ах нельзя сохранять
главный
и этот механизм бы все корректно делал ?

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

Так, для разминки.
Старый 14.01.2005, 22:34   #13  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Конечно реально - просто не надо подчинять датасоурсы друг другу по джойну, а пользоваться фильтрами (т.е. range-ами) инициализируемыми в active / linkActive.
Это даёт свободу дейтствий, но обязывает к хард-кодингу.

В общем согласен что постановка задачи неправильная - подчинённая запись не может быть сохранёна в реляционной СУБД раньше мастер-записи. Не может и точка. Это идеологическая концепция которую можно обойти только отказом от реляционности - т.е. отказом от join-ов, т.е. см. выше.
Старый 15.01.2005, 00:02   #14  
lego_99 is offline
lego_99
Участник
 
10 / 10 (1) +
Регистрация: 21.11.2004
Адрес: Moscow
Thumbs up
2 Alks

Ага. Убрать join и "косить" под них.
Тут без hard-programming точно не обойтись.
Хотя, если уж зашли в такие вещи, то дальше уж нам точно
без программинга никак.
Попробую, че получится - выложу. Как-нибудь.

Цитата:
подчинённая запись не может быть сохранёна в реляционной СУБД раньше мастер-записи
Дык, это я согласен абсолютно.

Вопрос же в том, чтобы не сохранить подчиненный датасоурс раньше
главного, а проверить подчиненный (и ... главный ... все что угодно), а
потом сохранить.

И то, что постановка неправильная, я тоже согласен.
Сам не рад, слю-у-у-шай..

У-у-ффффф.
Ща вааще серьезный вопрос задам.. Ж
REM: Открыли по банке пива и приготовились открыть по второй.

2 All !!!
действительно ли противоречит реляционности БД, например, такая вещь:

А)
проверить Контакты
проверить Персоны
сохранить Персоны
сохранить Контакты

и чем она "хуже", чем:

Б)
проверить Персоны
сохранить Персоны
проверить Контакты
сохранить Контакты
?

Т.е., я имею ввиду не сохранение подчиненной до того,
как был сохранен главный датасоурс,
а проверку датасоурсов до сохранения.

Чем последовательность, которая сейчас есть в Аксапте,
лучше последовательности, при которой бы
все связанные датасоурсы сначала заполнялись (без write() при
переходе от одного датасоурс к другому), потом проверялись,
а потом бы в одной транзакции сохранялись?

P.S.:
Не особо люблю грить за всех , но
Думаю, все (ну или многие) были бы благодарны, если бы вдруг в этой ветке появился
пример, который бы показывал различия между А) и Б)
Автору дельного примера, думаю, был бы большой respect.
Ну и .. это.. тему можно было бы закрыть заодно на мажорной ноте..
(Либо я че-то недопонял хде-то и давайте все сначала )
Старый 16.01.2005, 07:45   #15  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
Вопрос же в том, чтобы не сохранить подчиненный датасоурс раньше
главного, а проверить подчиненный (и ... главный ... все что угодно), а
потом сохранить.
Гхм... ЭТО ЖЕ ЭЛЕМЕНТАРНО, ВАТСОН!

Проверяйте содержимое подчинённого датасоурса из validateWrite подчиняющего, а не из его собственного validateWrite. (а в собственном validateWrite вообще ничего не делайте). Тут нужно определить:
а) есть ли уже в базе хотя бы одна запись подчинённая master-записи
б) если нет, то находятся ли в подчинённом датасоурсе данные которые форма намеревается сохранять в БД
в) если находятся, то проверить заранее являются ли они корректными (потому как в дальнейшем возможно им будет отказано во внесении в БД например по причине дублирования уникального индекса)

Тут вся сложность в последних двух пунктах - как проверить есть ли в datasource запись которую форма будет сохранять в БД я прямо сейчас не знаю, но способ этот просто обязан быть, т.к. самой форме тоже нужно как то определять этот момент.
Ну и последний пункт думаю тоже не будет большой проблемой.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Настройка прав доступа на уровне записей Pan DAX: Администрирование 19 12.11.2006 11:10
Проверка целостности coja DAX: Администрирование 6 06.09.2006 13:14
вывод количества записей в таблице на web форме и указание текущей страницы таблицы bambuk1960 DAX: Программирование 1 06.07.2006 13:27
Определённая последовательность записей Dymm DAX: Программирование 4 31.08.2005 14:47
Хранение отмеченных записей Pavel Pustovalov DAX: Программирование 9 17.05.2005 21:56

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

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

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