AXForum  
Zurück   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Kennwort vergessen?
Registrieren Forum Rules Hilfe Benutzerliste Heutige Beiträge Suchen

 
 
Themen-Optionen Thema durchsuchen Ansicht
Alt 14.01.2005, 15:48   #1  
lego_99 ist offline
lego_99
Участник
 
10 / 10 (1) +
Registriert seit: 21.11.2004
Ort: Moscow
? Проверка подчиненных записей
Уважаемые коллеги!

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

2 Gad

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

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

2 Dron AKA andy

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

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

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

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

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


2 Gad

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

_________________________________________
Метод с буфером кажется мне предпочтительнее.
Alt 14.01.2005, 19:01   #11  
Wamr ist offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1.737 / 868 (32) +++++++
Registriert seit: 15.01.2002
Ort: Москва
Blog-Einträge: 7
Может в персоне добавить обязательное поле "primary контакт"... а после сохранения автоматом вливать первую запись в контакты...
а, кстати при удалении всех контактов, персона должна грохнуться?
Alt 14.01.2005, 20:15   #12  
lego_99 ist offline
lego_99
Участник
 
10 / 10 (1) +
Registriert seit: 21.11.2004
Ort: Moscow
2 Wamr

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Настройка прав доступа на уровне записей 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

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Gehe zu

Рейтинг@Mail.ru
Alle Zeitangaben in WEZ +3. Es ist jetzt 09:06 Uhr.
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.