Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Microsoft Access 2000, помогите решить проблему! (http://forum.oszone.net/showthread.php?t=95961)

LiXiQing 11-12-2007 23:31 695468

Microsoft Access 2000, помогите решить проблему!
 
Существует таблица содержащая три поля: КОД (ключевое поле), ПОНЯТИЕ (adVarWChar), ТОЛКОВАНИЕ (adVarWChar).

в ListBox находящийся во всплывающей форме FORM1 требуется поместить только повторяющиеся элементы поля ПОНЯТИЕ и соответствующие им значения в поле ТОЛКОВАНИЕ, сортировка по полю КОД, которое не должно отображаться в ListBox.
И это еще цветочки!
Хотелось бы, чтобы в ListBox'е было бы три колонки, одна для ПОНЯТИЕ, вторая ТОЛКОВАНИЕ, а третья указывала бы состояние, которое с помощью группы переключателей задает пользователь. В группе три переключателя: + (объединить две текущую и корневую строки в одну), - (удалить текущую строку) и 0 оставить без изменений. Четвертый вариант: пустая ячейка обозначающая корневую строку с которой пользователь ничего сделать не может.
Хотелось бы, чтобы в правой крайней колонке динамически(!) отображались бы выбранные пользователем действия для данной повторяющейся строки. Например:

ПОНЯТИЕ ТОЛКОВАНИЕ СОСТОЯНИЕ
-------------------------------------
ДУРАК |Стакан (турецк.) | | (корневая строка)
ДУРАК |Глупый человек | 0 | (пользователь оставил эту строку без изменений
ДУРАК |Карточная игра | - | (эту строку он захотел удалить)
ДУРАК |Придворный шут | + | (эту слить с корневой)
НОСОК |Перед ступни | | (корневая строка)
НОСОК |Элемент одежды | - | (эту строку пользователь захотел удалить)
-------------------------------------

и т.д.
Я знаю, что проще было бы организовать новую таблицу с которой и работать через LisBox, а потом ее удалить изменив данные в таблице источнике, но это некрасиво, да и говорят, что при коллективном доступе будут возникать ошибки и некорректное отображение данных.
Вариант с Value List (RowSourceType) тоже не проходит: данных очень много от 700 строк до 2000, и когда строка RowSource переполняется (на моем компьютере это 56кбайт) возникает ошибка runtime error 2176 "Слишком болшое значение для заданного свойства".
Как решить задачу изящно и без багов?

kim-aa 14-12-2007 09:43 697038

Цитата:

Цитата LiXiQing
Я знаю, что проще было бы организовать новую таблицу с которой и работать через LisBox, а потом ее удалить изменив данные в таблице источнике, но это некрасиво, да и говорят, что при коллективном доступе будут возникать ошибки и некорректное отображение данных. »

С какого перепугу это не красиво?
Это наоборот правильно и единственно верно в многопользовательской среде, иначе куча пользователей нафиг заблокируют
вашу таблицу.

Гм. я с Access как с базой никогда не работал, обычно использовал его как генератор консолидированных отчетов для MS SQL.
Пара вопросов, по текущему состоянию дел в MS Access:
- там временные таблицы существуют?
- View?

Вобще с точки зрения платформенной независимости приложения и разделения данных, правильно решать данную задачу через временные таблицы.

LiXiQing 14-12-2007 12:21 697139

Цитата:

Цитата kim-aa
- там временные таблицы существуют?
- View? »

Да объекты типа view есть, насчет временных таблиц не знаю, я вообще за Access за DB взялся недавно, месяца не прошло. У меня есть пара мануалов для чайников, но читать их с начала и до конца терпения не хватает, к тому же я что-то не уверен, что там есть такие тонкости. Почитаю про view в хэлпе по VB. Организую какую нибудь временную adox коллекцию, что-то должно быть кроме таблиц и списка значений в качестве источника строк. Буду искать. Спасибо за указанное направление.

И еще я знаю как указать вывод всех значений SELECT ALL, знаю как отсечь повторяющиеся SELECT DISTINCT, но вот как выбрать только повторяющиеся элементы? Нет, я могу решить эту задачку в VB модуле, но как ее решить через sql запрос, вот в чем вопрос!

kim-aa 14-12-2007 14:20 697247

В MS SQL 6.x это было бы так

SELECT понятие, COUNT(*)
FROM таблица
GROUP BY понятие
HAVING COUNT(*)>1

Dyvne Nihto 02-02-2008 21:01 731671

Цитата:

Цитата kim-aa
С какого перепугу это не красиво?
Это наоборот правильно и единственно верно в многопользовательской среде, иначе куча пользователей нафиг заблокируют
вашу таблицу. »

Ну, чтобы прям "единственно" верно - не соглашусь. Верный, но не единственный же.

Как вариант, можно создать форму для отображения таблицы, а в ней - свободные (т.е. не ссылающиеся ни на какое конкретное поле данных) элементы, изменения которых обрабатывать сразу как были сделаны.
Еще разумней - по двойному щелчку на понятии открыть отдельную диалоговую форму, в которой только одно понятие со всеми его толкованиями отобразить, дать пользователю возможность изменить что хочет, просмотреть результат и принять окончательное решение сохранять ли такие изменения или откатить к исходному состоянию.

Но если так уж требуется именно пакетная обработка всего словаря сразу, а не понятия за понятием - то создать временно дополнительную таблицу программно, причем свою для каждого пользователя, а процесс применения изменений объединить с процессом удаления этой таблицы в одну транзакцию.


Время: 23:24.

Время: 23:24.
© OSzone.net 2001-