20.10.2006, 15:50 | #1 |
Участник
|
Как попроще решить такую задачу.
Пусть есть таблица Т1 с полями a1, a2, ... , an заполненная данными. Нужно сождать таблицу Т2 напимер с полями a1, a2 и a3 так, чтобы туда сразу внеслись сооветствующие данные из T1. При этом, если эти данные менялись бы в T1, то они автоматически менялись бы и в T2. Можно ли это реализовать без codunit ? А если надо писать codeunit то как его получше написать? |
|
20.10.2006, 16:40 | #2 |
Участник
|
Таблицы находятся в одной и той же базе? Самое милое дело залезть на сервак и ручкам поставить соответствующие триггера в табл. Т1, правда придётся раздать права на обе таблицы. Если не через сервак, то - писать кодеюнит. В его теле прописать процедуры инсерта/апдейта и всё это добро поставить на таймер.
|
|
20.10.2006, 16:45 | #3 |
Участник
|
Цитата:
Сообщение от сНЕЖНЫЙ_бес
Как попроще решить такую задачу.
Пусть есть таблица Т1 с полями a1, a2, ... , an заполненная данными. Нужно сождать таблицу Т2 напимер с полями a1, a2 и a3 так, чтобы туда сразу внеслись сооветствующие данные из T1. При этом, если эти данные менялись бы в T1, то они автоматически менялись бы и в T2. Можно ли это реализовать без codunit ? А если надо писать codeunit то как его получше написать? Перенос данных таблицы, если в ней уже есть данные, можно поручить либо отчету типа "Processing Only", либо написать Codeunit, который выполнит перенос данных. А для синхронизации (односторонней, насколько я понял из описания задачи) необходимо модифицировать триггеры OnInsert, OnModify и OnDelete исходной таблицы T1 и выполнять соответствующие измения в таблице Т2. А по поводу "получше написать": 1. Цикл по перебору записей таблицы Т1 с вставкой записей в Т2 2. Подумать каким образом решить конфликт, если в таблице Т1 поля а1, а2, и а3 не являются альтернативным ключом таблицы, то есть можно найти две записи Т1, где значения полей а1, а2 и а3 совпадают. Это также относится и к синхронизации. Могу ошибаться, но с версии 3.70 в Codeunit1 есть Триггер-функции, которые позволяют отслеживать именения данных в таблицах. Если в разных: строить репликацию. Вариантов много. ЗЫ: хорошая на тестовая задачка для начала предметного разговора на обеседовании |
|
20.10.2006, 20:32 | #4 |
Участник
|
Цитата:
Сообщение от Neovision
Таблицы находятся в одной и той же базе? Самое милое дело залезть на сервак и ручкам поставить соответствующие триггера в табл. Т1, правда придётся раздать права на обе таблицы. Если не через сервак, то - писать кодеюнит. В его теле прописать процедуры инсерта/апдейта и всё это добро поставить на таймер.
|
|
21.10.2006, 00:57 | #5 |
Участник
|
Цитата:
Не знаю как в 3.70, а вот в 4-ке точно есть триггер-функции OnGlobalInsert, OnGlobalModify, OnGlobalDelete, OnGlobalRename в Codeunit1, которым передается RecordRef, при помощи которого,в свою очередь, можно определить какая запись в какой таблице добавилась/изменилась/удалилась/переименовалась. На этих триггерах по умолчанию построены системные журналы изменений. В принципе, если лицензия позволяет, можно поиграться с этими триггерами. Только надо понимать, что они вызваются достаточно часто и если туда встроить нетривиальную логику, которая будет недостаточно быстро работать, то затормозит это всю систему. ЗЫ: а про один из триггеров я-таки забыл - OnRename. В нем тоже необходимо вставить процедуру синхронизации значений, если одно из полей, которое необходимо сохранять в Т2, находится в главном ключе таблицы Т1. |
|
06.11.2007, 06:59 | #6 |
Участник
|
|
|
06.11.2007, 10:41 | #7 |
Участник
|
Цитата:
Если эти поля в первичных ключах (тоесть создаваемые записи уникальные), то вообще прописать тригеры как было указано ранее (только с проверкой на не существование уникальности) и проблем не будет. При этом: 1. В свойствах полей Т2 (a1, a2 и a3) прописать ссылки на соответсвующие поля Т1 2. Написать единоразово отчет по перебору записей таблицы Т1 с вставкой записей в Т2 3. будут работать вышеописанные тригеры |
|
07.11.2007, 10:20 | #8 |
Участник
|
Вариант с триггером на сервере плох из-за того, что навиженовский судя по всему функционал реализуется не в навижене. Не обязательно создавать объект типа юнита. Ничто не мешает в триггера ведущей таблицы вписать код в триггера OnInsert, OnModify, OnDelete по синхронизации данных в связанной таблице. Зачем усложнять себе жизнь и лезть на сервер.
Писать кодеюнит не обязательно. Это отвечая на второе ваше предложение. Вешать все это дело на таймер ЕЩЕ хуже. Попробуйте подебажить какую-нить форму, с написанным триггером OnTimer. А открывать ее все время в конструкторе, комментить триггер и пускать не сохраняя каждый раз руки отсохнут. С моей точки зрения стандартные триггера OnInsert, OnModify, OnDelete ведущей таблицы вполне подойдут и это будет лучшим решением задачи. И самым естественным. |
|
07.11.2007, 11:43 | #9 |
Участник
|
To romeo
Хоть предложений и было 2, вопрос по сути был только один: чем плох триггер на сервере? Про кодюнит я не спрашивал Но вот по поводу триггера... извините, но Ваш аргумент нельзя назвать серьезным. Хотя бы потому, что не факт, что это функционал именно нивиженовский. Вобще часто встречаю такие моменты, когда то, что должно быть реализовано в структуре самой БД делается через навиковский код. Этот случай еще туда-сюда, не совсем ясный, можно в принципе и так и так (имхо), но вот, скажем, когда ссылочная целостность в таблицах master-detail поддерживается на уровне навиковских триггеров... Кошмар! Ну это лирика. Вы можете другие аргументы привести, почему не стоит поставленную автором топика задачу решать через серверные триггеры? Потому что даже если это действительно навиженовский функционал, не вижу ничего плохого в решении через сервер. To RedFox Да тема давняя, проблему наверняка уже решили Я ее поднял только чтобы прояснить интерисующий меня вопрос про триггеры... |
|
07.11.2007, 12:00 | #10 |
Участник
|
Цитата:
Цитата:
Потому что можно решить навиженовскими методами. Причем не самыми замороченными. Форум навиженовский, я предлагаю варианты реализации в навижене. |
|
08.11.2007, 05:28 | #11 |
Участник
|
|
|