Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.52 MB
Время: 0.016 c
14-6661
SergeN
2003-03-18 08:42
2003.04.03
Какой самый эффективный способ качания Пресса?


1-6509
LyzD
2003-03-24 15:51
2003.04.03
Траблы с иконкой в трее


1-6467
MortalScorpion
2003-03-20 19:14
2003.04.03
Существует альтернатива ProcessMessages в ядре?


3-6336
Gregory
2003-03-14 00:39
2003.04.03
Компонент работы с БД DegysiDB


1-6451
Sliski Slimak
2003-03-21 16:45
2003.04.03
Плагины