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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 29.03.2013, 12:13   #1  
Predatore is offline
Predatore
Участник
 
163 / 17 (1) ++
Регистрация: 29.09.2010
Доброго времени суток комрады.

Столкнулся вот недавно с задачкой на первый взгляд простой, но как оказалось на деле, не всё так просто, как кажется на первый взгляд.

Итак, есть у нас таблица и столько в ней полей на создавали, что всё уже финита, больше нельзя. Нельзя, но нужно. Что мы для этого делаем? Конечно же создаём ещё одну таблицу, создаём в ней такой же первичный ключ как и в первой и пытаемся как-то связать эти 2 таблицы. Вторя таблица открывается на собственной форме. Если Вы делали это и знаете как решается данная проблема, дальше можете не читать, а просто подсказать решение, если нет, велком в рассуждения ниже.

Вот тут то и начинаются интересности. Ну ладно, для начала мы просто создаём во второй таблицы все записи, которые есть в первой, процедура долгая (если первая таблица большая), но разовая, не страшно.

А вот теперь вопрос: как сделать так, что бы при добавлении записей в первую таблицу, они добавлялись и во вторую? Казалось бы, есть замечательный триггер OnInsert. Был бы замечательным, если бы Нав не считал, что его можно не запускать при вставке новой записи в таблицу. Да, первая таблица, это всем известная Sales Invoice Header, и при учёте продажи, триггер OnInsert у неё не запускается. Можно конечно полазить по коду и везде по вставлять TRUE в вызов INSERT, но этот подход мне не нравится по ряду вполне очевидных причин.

Был бы доступ к SQL, можно было бы простенький запрос на ваять, который вычитал бы из первой таблицы вторую и полученный результат можно было бы использовать на OnOpenForm для добавления записей во вторую таблицу, но доступа к SQL нет. А Нав, насколько мне известно, таких операций делать не умеет, по крайней мере за вменяемое время.

Следующая мысль (у меня она была на самом деле первой), это создавать записи во второй таблице, по мере обращения к ней. Т.е. на формочке мы открываем первую таблицу и на OnAfterGetRecord проверяем, есть ли у нас соответствующая запись во второй таблице? Если нету, то создаём её. И тут мы сталкиваемся с очередной проблемой. Мы не можем в этом триггере написать: Table2.INSERT; получим ошибку: "Внесение изменений в базу данных до начала выполнения транзакции невозможно". Обошёл я это ограничение довольно хитро. И так, на форме у нас Table1, а к ней создаём субформу с Table2. Субформа создаёт записи в Table2 без проблем, если что-нить в ней ввести. И так, прячем куда-нибудь субформу, но только не делаем visble := false, иначе она перестанет работать (такая вот у Нава логика ) и пишем на субформе функции, которые будут просто инициализировать запись в Table2 и функции, которые будут записывать в неё значения. Отображаем то мы всё в одном TableBox, т.е. и Table1 и Table2 у нас отображаюсят в одном TableBox. Table1 отображается в нём на прямую, а Table2 через переменную.

И всё бы хорошо, если бы не флоуфилды. Да, в Table2 у нас есть парочка флоуфилдов. К чему это ведёт? Записи которых проинициализированы в Table2, с ними всё в порядке, а вот которые ещё не проинициализированы, в них отображается последнее что бы вычислено в данном поле. Что в общем-то беда. В данный момент я склоняюсь к тому, что бы отказаться от флоуфилдов, несмотря на то, что значения в них нужно обновлять. Т.е. на OnAfterGetRecord, мы будем каждый раз вычислять значение и записывать его в Table2, если оно изменилось.

Знаю что намудрил, но это от безысходности. Потому и пишу, что может кто-то уже сталкивался с такой проблемой или может окинет её свежим взглядом, да скажет: "Да там же всё просто, сделай вот так и будет тебе счастье"

Ещё раз уточню постановку задачи. Нужно в одной табличной форме отображать данные с двух связанных таблиц и при этом следить, что бы во второй таблице были все записи из первой.
За это сообщение автора поблагодарили: mira (1).
 


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

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

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