Текущий архив: 2003.04.03;
Скачать: CL | DM;
ВнизПосоветуйте решение Найти похожие ветки
← →
Silver_ (2003-03-05 10:18) [0]Ситуация:
В БД есть куча таблиц все записи которых должны иметь поле МЕМО причем этих МЕМО
может быть несколько а может и не быть вовсе
Решение №1:
Сделать 2 таблицы 1-основная(master) 2-подробная(detail) зто решение действительно
если каждой таблицы присобачить по одной подробной :(((
Решение №2:
Сделать ОДНУ подробную(detail) таблицу для ВСЕХ основных(master)
добавив при этом поле с именем(индексом) соответствующей таблицы
Как сделать связи вот это БОЛЬШОЙ вопрос.
Можно конечно поиграть с ФИЛЬТРАМИ но при добавлении новой записи придется РУЧКАМИ
заполнять соответствующее поле с именем(индексом)
Внимание вопрос
КАК БЫТЬ, понимаете :(, может вобще подход неверный
жду советов :))
← →
Style (2003-03-05 10:25) [1]Создай еще одну таблицу в которой будешь хранить как бы поля Memo! Вообще сами поля Memo использовать не рекомендуется, База будет глючить.
Поэтому создаешь такую шапку
MemoID - Номер твоей Мемы
MemoStringID - Номер строки в Мемо
String - Строка
А в главной твоей таблице есть указатель на MemoID
Соответсвенно делаешь
Select * from Memos where MemoID = :ID order by MemoStringID
и Начитываешь данные в TMemo
← →
Johnmen (2003-03-05 10:26) [2]>...придется РУЧКАМИ...
Жалко ручки бить ? :)
← →
MsGuns (2003-03-05 11:14) [3]>Style (05.03.03 10:25)
Торговля медпрепаратами без диагоноза врача чревата последствиями ;)))
Как мы можем советовать что "прикрутить", а что "открутить", не видя в глаза то, к чему все это должно прикручиваться ?
Хотя, ИМХО, большое число Мемо-полей есть нехорошо и говорит о некачественной постановке задачи. Хотя бывают, конечно, исключения
← →
Silver_ (2003-03-05 16:13) [4]
> большое число Мемо-полей есть нехорошо и говорит о некачественной
> постановке задачи. Хотя бывают, конечно, исключения
это как раз исключение и есть
бос иностранец, юзеры разноязычные (2 яз.)
- юзеры добавляют записи и пояснения к ним (если надо)
- некто переводит пояснения
получается одно и тоже на разных языках (выбираешь язык получаешь своё)
бос не хочет ограничения в пояснении (до 255 симв.) приходится мириться (как не как бос)
← →
MsGuns (2003-03-05 17:46) [5]Пояснения сделай как детальную таблицу, привяжи ее к Мастеру по ID мастера. В детале сделай доп.ключ.- "Код языка" (лучше через справочник). Тогда к одной записи может быть сколько хошь пояснений на разных языках. Или можно добавить свой UID-ключ для того, чтобы не завязываться на единственный комментарий на один язык. Сам текст пояснения сделай VARCHAR (длина совсем не 255 - читай хэлп - для разных форматов он разный), а если хочешь сохранить формат ввода (отступы-переносы), то организуй мемо. Только вот в гриде будет несколько неудобно просматривать такие "комментарии". Но опять же к гриду можно прикрутить панель с TDBCtrlGrid`ом, в котором разместить несколько разных пояснений.
← →
Silver_ (2003-03-12 17:30) [6]
> MsGuns ©
наверное неверно выразился и вот...
проблема в том что КУЧА таблиц ВСЕ записи в них могут иметь пояснения (причем без
ограничений - т.е. МЕМО в самый раз)
т.е. по сути получаются МНОГО основных(master) и одна подробная (MemosTable)
устанавливаем связь текущая основная и подробная (MemosTable) и все
MemosTable должна иметь примерно следующую структуру
ID (+)
IDMasterTable (N) - Указатель на таблицу (master) (---???---)
IDMasterField (N) - Указатель на запись в таблице (master)
IDLang (N) - Язык
Memo (Memo) - само пояснение
IDMasterField - может иметь одонаковые значения в рвзных таблицах
(к примеру Т1.ID может быть = T2.ID во всех Т. с 1 начинаются все ведь)
поэтому IDMasterTable обязателен но
откуда его взять (---???---) и как вязку сделать БОЛЬШОЙ ???
← →
Dred2k (2003-03-12 17:54) [7]Предлагаю так.
1. Все прикладные таблицы (записи которых будут иметь описание)
строятся по схеме (нотация вольная, первичные ключи отмечены *):
table_1 {
* RowID Integer; // (уникальный ID записи в рамках таблицы)
// Все, что нужно в таблице ...
}
...
table_n
2. Таблица пояснений к записям таблиц.
OriginalComments {
* CommentID Integer; // Уникальный ID комментария
TableName Char(20); // Имя таблицы, запись которой
// описывается
RowID Integer; // ID записи в рамках этой таблицы
CommentText Memo(255); // Сам оригинальный комментарий (тип -
// по вкусу, в зависимости от шефа) ;)
}
3. Таблица переведенных комметариев
TranslatedComments {
* CommentID Integer; // ID оригинального комментария
* LangID Integer; // ID языка (на будущее)
CommentText Memo(255); // Переведенный комментарий
TranslatorID Integer; // ID переводчика (на будущее)
DateDo DateTime; // Дата и время перевода
// и всякая хрень по вкусу ...
}
Предлагаемая система позволит не хранить лишнее (для записей без комментариев), однозначно получать всю цепочку, не позволять дубляжа переводов для одного языка. Ну и мусор не хранить. ;)
← →
Dred2k (2003-03-12 18:11) [8]Возвращаясь к напечатанному. ;)
Вместо TableName в таблице OriginalComment лучше завести TableID типа Integer и получать его через справочник таблиц типа
Tables {
* TableID Integer
TableName Char(20) // На это уникальный индекс
}
Будет компактнее, по скорости трабла не будет.
И получим мы в итоге:
- для данной записи (RowID) данной таблицы (TableID по имени таблицы из Tables) лезем в OriginalComments за оригинальным комментарием
- по CommentID оригинального комментария (если такой вообще был для этой записи этой таблицы) из TranslatedComments выбираем либо все переводы, либо для языка и т.п. Если они есть ;)
Вот и все.
← →
Silver_ (2003-03-13 14:45) [9]ща внимательно изучу, обещау вердиктом :) поделиться
← →
Silver_ (2003-03-13 15:57) [10]
> Dred2k ©
идея и структура понятна думаю подойдет
вопрос в том как узнавать имя активной (которую щас редактируем) таблицы (основной) дабы связать с ней подробную MemosTable
или как в примере стать на нужную строку в таблице со списком таблиц
и желательно не вешая на каждый DataSet чего-то :)
а то КОРЯВЫЙ выход есть - когда показываем форму тогда и делаем связь и так для каждой формы
при том количестве что у меня + куча фреймов (а у них (фреймов) OnShow/OnHide, OnActivate/OnDeactivate или
ище чего полезного нету) то можно не тока руки но и мозги сломать.
Вот и ищу КАК устроить это в ОДНОМ месте для всех таблиц во всем проекте
...ловим текущую таблицу делаем с нею чего нада и дальше пошли КРАСОТА но КАК???
← →
Dred2k (2003-03-13 16:08) [11]Да очень просто.
procedure TranslateShow(ATable : TTable);
var tmpTableID, tmpRowID : Integer;
begin
if(not Assigned(ATable)) then
raise EKapez.Create(";)");
// Проверяем таблице на открытость ...
// Получаем ID текущей записи в данной таблице
tmpRowID := ATable.FieldByName("RowID").AsInteger;
// Дальше лезем по ATable.TableName (имя таблицы) в справочник
// и получаем TableID
// ... tmpTableID := ... залезли
// Ну вот и все - дальше по TableID и ID текущей записи этой
// таблицы выбираем, анализируем и отображаем все дела ...
// Внимание! В ATable.TableName должно быть имя таблицы,
// без пути (путь можно указывать для paradox, dbase, ...).
// Иначе - не найдем.
end;
Идея ясна?
Успехов.
← →
Silver_ (2003-03-13 16:18) [12]если правельно понал листаем таблицы И проверяем на открытость
а когда, как часто и главное лучше всего это делать :))
уж не обессуть :)
← →
Dred2k (2003-03-13 16:27) [13]Ни фига не так.
Я тебе накидал скелет вызова, с помощью которого ты предоставишь юзеру возможность в любой момент времени вызвать окно с отображениями переводов текущей записи текущей для юзера таблицы. Вот и все. Таблица должна быть открыта (это ясно - иначе как мы получим RowID и вообще зачем она тогда юзеру).
То есть, грубо говоря, юзер жмет кнопку и получет окно с парой там таблиц с чем-то. Смотрит на них и все такое. Вдруг он понял, что лох и ему нужен коммент для текущей записи, погрузившей его в системный ступор ;) Так вот рядом с гридом будет кнопка "Комментарии к записи". Юзер ее нажмет и получит окно отображения комментариев. В Кнопка.OnClick ты напишешь просто и гениально:
begin
TranslateShow(текущая таблица);
end.
Ферштейн?
← →
Silver_ (2003-03-13 16:36) [14]бос желает без лошних действий
где-то (неважно) торчит МЕМО при листания таблицы (лубой) есть пояснение к строке показывает, нет - пусто. Чуть выше список азыков выбирает другой показывается то же пояснение на соответствующем языке
бос не хочет лишних движений
← →
Dred2k (2003-03-13 16:52) [15]Нет проблем. Тогда два варианта.
1. Полюбому некрасивый.
Во всех прикладных таблицах RowID - свозной, т.е. уникальный для любой записи из любой таблицы.
2. Не особо красивый, но надежный.
Во всех прикладных таблицах рябом с RowID сразу лежит TableID (Integer), одинаковый для всех записей одной таблицы, но уникальный для каждой прикладной таблицы.
И все. Рядом с отображением прикладной таблицы молча кладешь отображение комментариев. При этом в лоб мочишь мастер-детал (мастер - эта таблица по TableID и RowID, детал - это OriginalComments по этим полям). Еще можно (и нужно) мастер-детал от OriginalComments к переводам (с навигацей по ним - их ведь может быть несколько). Забомби компонентом (вместе со всей визуальщиной, наследовать лучше от TPanel) - кладешь на форму, ставишь свойства (прикладная таблица - оно одно будет) и арбайтен.
Извини, но более другого реального решения я не вижу. Если есть вопросы по реализации всех предложенных механизмов - помочь не смогу физически. Это надо знать и уметь.
Успехов! :)
Страницы: 1 вся ветка
Текущий архив: 2003.04.03;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.008 c