Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.04.03;
Скачать: [xml.tar.bz2];

Вниз

Посоветуйте решение   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.009 c
14-6702
Мазут Береговой
2003-03-19 04:14
2003.04.03
Вроде тут были люди, которые знакомы с .NET.


1-6601
pet
2003-03-22 20:15
2003.04.03
проблема с созданием


1-6544
DelphiN!
2003-03-21 12:13
2003.04.03
Как узнать handl текущего компонента и окна


1-6457
Intell
2003-03-24 11:00
2003.04.03
Как привязать одну форму к другой?


8-6612
demonastarot
2002-12-27 10:11
2003.04.03
MediaPlayer





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский