Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Посоветуйте с организацией "флажков" (есть идея сделать их binary: 1,2,4,8,16) / 25 сообщений из 26, страница 1 из 2
03.01.2005, 13:46:32
    #32853139
dkny
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте с организацией "флажков" (есть идея сделать их binary: 1,2,4,8,16)
Конкретная идея: организация ввода и выбора графика сотрудника. Например, есть Вася, он работает по понедельникам и средам, Петя: вторник, четверг и т.д.

Удобно это сделать (имхо) в виде двоичного числа 00000000, где каждый знак будет означать конкретный день недели, скажем, 01001000 - вторник, пятница (слева направо). Естественно, что в десятичной системе это числа 1,2,4,8,16,32,64,128 и их суммы.

Только я не знаю как это сделать в Access :) Если программировать где-то еще, то для проверки значений нужно всего лишь _логически_ перемножить имеющееся число (кстати, ведь до этого его нужно в базу вставить именно как бинари, или же можно обычным?) на условие проверки: If A = Const * A then ... Т.е. при проверке на вторник получим:

Код: plaintext
1.
2.
3.
4.
01001000
x
01000000
--------
01000000

Вот. Может быть, что-то похожее уже кто-нибудь реализовывал? (посмотрел форум, но не нашел)

That's all folks...
...
Рейтинг: 0 / 0
03.01.2005, 14:08:45
    #32853146
Again
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте с организацией "флажков" (есть идея сделать их binary: 1,2,4,8,16)
http://www.msaccess.ru/Files/graphic.zip
Тут вполне нормальная структура под такую же задачу без всяких бинарников
...
Рейтинг: 0 / 0
03.01.2005, 14:52:43
    #32853159
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте с организацией "флажков" (есть идея сделать их binary: 1,2,4,8,16)
логические операторы в VBA, примененные к целочисленным переменным работают как битовые.
Устанавливать, всё-же лучше "справа-налево".

установка бита производится выражением вида

числоВкоторомУстанавливаемЗначение OR 2^НомерПозиции

проверка, что бит установлен выражением вида

числоВкоторомУстанавливаемЗначение AND 2^НомерПозиции

очистка бита -
числоВкоторомУстанавливаемЗначение AND NOT 2^НомерПозиции


вариант оформления setBit есть здесь
http://www.sql.ru/forum/actualthread.aspx?tid=144537&hl=setbit#1175904


получение значение бита и очистка добавляются так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Function getBit(ByVal lngValue As Long, iBitPos As Integer) As Boolean
'счет битов от нуля
  getBit = lngValue And Power2(iBitPos)
End Function

Function clearBit(ByVal lngValue As Long, iBitPos As Integer) As Long
  If getBit(lngValue, iBitPos) Then
    clearBit = lngValue And (Not Power2(iBitPos))
  Else
    clearBit = lngValue
  End If
End Function
поиска в базе по битовым маскам :
http://www.sql.ru/forum/actualtopics.aspx?search=band&bid=4

в частности
http://www.sql.ru/forum/actualthread.aspx?tid=145742&hl=band

(с выражением лица)
...
Рейтинг: 0 / 0
03.01.2005, 18:05:28
    #32853258
Rafa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте с организацией "флажков" (есть идея сделать их binary: 1,2,4,8,16)
Вот тут еще есть

http://access.boom.ru/Library/Tables/ManyBooleanIntoSingleField.htm
...
Рейтинг: 0 / 0
04.01.2005, 00:52:02
    #32853350
Rafa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте с организацией "флажков" (есть идея сделать их binary: 1,2,4,8,16)
Вот еще накропал

http://access.boom.ru/Library/Algoritms/BitsAndBitMAsk.htm
...
Рейтинг: 0 / 0
13.01.2005, 10:37:23
    #32862590
dkny
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте с организацией "флажков" (есть идея сделать их binary: 1,2,4,8,16)
Ознакомился с темой, большое спасибо Again , Victosha и Rafa .

Возникает вопрос, а стоит ли игра свеч? Я хочу сказать, что для работы с битами в качестве булевых значений придется писать свои обработчики для составления запросов SQL, а также для каждой формы/модуля свои процедуры "упаковки" данных в одно поле (в смысле оптимизировать все формы под такую работу).

Не проще ли просто сделать семь логических полей для дней недели и не мучится ни с занесением этих значений, ни с выборкой по ним?

При сложившихся обстоятельствах, а именно намечающийся в самое ближайшее время переход от MDB к ADP + MSSQL, а также не очень большая интенсивность работы (менее 10.000 записей в сутки от 15 пользователей), мне хочется ознакомиться с методом, попробовать его, но внедрять в проект с потерей времени и возможными (лишними) проблемами в будущем - нет. В конце концов, 8 байт или 1 для современных машин объем не критичный.

P.S. Если бы кто-нибудь сказал свое мнение, как если бы сам выбирал себе, что мол, мужик, дело того стоит или не стоит, я был бы очень признателен.

That's all folks...
...
Рейтинг: 0 / 0
13.01.2005, 10:39:49
    #32862598
1 байт
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте с организацией "флажков" (есть идея сделать их binary: 1,2,4,8,16)
8 битовых (булевых) полей займут 1 байт
...
Рейтинг: 0 / 0
13.01.2005, 10:43:04
    #32862613
1 байт
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте с организацией "флажков" (есть идея сделать их binary: 1,2,4,8,16)
то есть - из экономии пространства - этим заниматься НЕ НАДО НИ ПРИ КАКИХ обстоятельствах. (даже если бы булевы поля занимали по байту каждое)

Если задача сама ясно не говорит, что это тебе надо, - не морочь голову себе людям.
...
Рейтинг: 0 / 0
13.01.2005, 12:36:20
    #32862973
Dmitry Biryukov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте с организацией "флажков" (есть идея сделать их binary: 1,2,4,8,16)
где-то в инете была статья по этому поводу. автор всяческими способами отговаривал хранить в байтовом поле биты. во-первых, это противоречит нормальной форме БД, во вторых даже битовые поля всё равно занимают один байт, в-третьих, что делать если для каждого дня будет больше вариантов, не "работает/не работает", а "работает полдня, работает в первую смену, вторую и т.д."

однозначно 7 полей (и не битовых, а байтовых или более)
...
Рейтинг: 0 / 0
13.01.2005, 13:33:27
    #32863123
ы
ы
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте с организацией "флажков" (есть идея сделать их binary: 1,2,4,8,16)
Dmitry Biryukovбитовые поля всё равно занимают один байт
вранье

Dmitry Biryukovчто делать если для каждого дня будет больше вариантов, не "работает/не работает", а "работает полдня, работает в первую смену, вторую и т.д."
не делать битовых полей

Dmitry Biryukovи не битовых, а байтовых или более
а лучше по подчиненной таблице вместо поля
...
Рейтинг: 0 / 0
13.01.2005, 14:34:56
    #32863317
dkny
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте с организацией "флажков" (есть идея сделать их binary: 1,2,4,8,16)
Ну, не знаю, если дискуссия по поводу места, то лично мне кажется, что никакая база данных не сможет отдельно хранить один бит информации. В смысле на носителе или памяти, разве что каким-то хитрым образом она на низком уровне упаковываются в один байт (во чушь несу, аж самому интересно).

Машина же не может думать битами, но как нас давно учили на информатике, машинными словами, а это даже не байт. Впрочем, тут мои познания ограничиваются словами Аксемблер и Сиу (взято из анкет соискателей на должность системного администратора :)

Я сейчас делаю небольшую тестовую базку только для того, чтобы выяснить удобство работы с такими вещами. Пока все идет гладко: вставлять значения по набору checkbox'ов легко, правильно отображать их в зависимости от аккумулированного битового значения тоже легко, делать запрос по определенным битам опять легко. Кроме того, это просто интересно :)

P.S. Но работать с отдельными битовыми полями в таблице еще легче! :)

That's all folks...
...
Рейтинг: 0 / 0
13.01.2005, 15:58:04
    #32863543
1 байт
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте с организацией "флажков" (есть идея сделать их binary: 1,2,4,8,16)
авторМашина же не может думать битами

пока что - достаточно уверенно - можно сказать, что машина вообще не может думать – ни битами, ни чем другим.

Кроме Вас, никто не сможет решить – надо это Вам применять, или нет…


Еще раз в смысле экономии места хранения – это почти всегда бессмыслица и
неоправданное усложнение задачи.
Возможные смыслы идут от планируемой обработки полученного числа как единой комбинации.
Прямое использование как упакованного массива булевых значений, безусловно, возможно, но применяется, как мне кажется, реже всего.
Чаще возникает вариант, когда некая маска (числовое значение) определяет вариант обработки.
Иногда это может быть полезно для позиционных комбинаций в случае организации циклов, когда номер выставленной позиции фактически определяет индекс массива, к которому может (должно) произойти обращение.
Непосредственно связанное с предыдущим – перечислитель целочисленных значений .

Еще раз - кроме Вас, никто не сможет решить – надо это Вам применять, или нет…
(или переформулировать задачу)
:))
...
Рейтинг: 0 / 0
13.01.2005, 18:21:20
    #32863939
dkny
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте с организацией "флажков" (есть идея сделать их binary: 1,2,4,8,16)
1 байт ,

Мы не о том говорим :)

Я доделал тестовую базу с одной таблицей (2 поля: id, и число) и формой для работы. У формы меняется рекордсет по условию, составленному из семи чекбоксов (дни недели), а именно запросом через предлагаемую здесь функцию из модуля (a And b).

Все работает великолепно, но связываться я не буду - нет смысла городить такое для простого графика. Так что будет в таблице еще 7 булинов и все (правда, выглядит сильно громоздко :о).

P.S. Но метод взят на вооружение и при случае будет, вашими стараниями, использован.
...
Рейтинг: 0 / 0
13.01.2005, 21:00:50
    #32864104
Alexey Sh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте с организацией "флажков" (есть идея сделать их binary: 1,2,4,8,16)
2 dkny :
Иллюзии. В аксессе (mdb) поле Yes/No занимает ровно один бит, 8 полей - 1 байт.
...
Рейтинг: 0 / 0
14.01.2005, 00:01:36
    #32864167
Rafa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте с организацией "флажков" (есть идея сделать их binary: 1,2,4,8,16)
Alexey Sh2 dkny :
Иллюзии. В аксессе (mdb) поле Yes/No занимает ровно один бит, 8 полей - 1 байт.

НЕ ВЕРЮ ! использует оно ровно один бит, а хранится в байте все равно.....
...
Рейтинг: 0 / 0
14.01.2005, 00:03:35
    #32864168
Rafa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте с организацией "флажков" (есть идея сделать их binary: 1,2,4,8,16)
dknyНо работать с отдельными битовыми полями в таблице еще легче! :)

легче пока еще еще новичок, потом будет легче и удобнее работать с битами
...
Рейтинг: 0 / 0
14.01.2005, 00:34:09
    #32864182
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте с организацией "флажков" (есть идея сделать их binary: 1,2,4,8,16)
2 Rafa

прямо Станиславский практически.
Вот тут театр, а там зеркало.
где бы вешалку найти...

:))


(с добрым выражением лица)
...
Рейтинг: 0 / 0
14.01.2005, 12:06:42
    #32864748
Alexey Sh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте с организацией "флажков" (есть идея сделать их binary: 1,2,4,8,16)
Для особеенно неверующих:
...
Рейтинг: 0 / 0
14.01.2005, 12:09:27
    #32864759
Alexey Sh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте с организацией "флажков" (есть идея сделать их binary: 1,2,4,8,16)
...
Рейтинг: 0 / 0
15.01.2005, 00:20:42
    #32866048
Rafa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте с организацией "флажков" (есть идея сделать их binary: 1,2,4,8,16)
Скомпилируй сам свой набор по чтению баз Access ;)

еще чем будешь убеждать ?
...
Рейтинг: 0 / 0
15.01.2005, 00:27:21
    #32866051
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте с организацией "флажков" (есть идея сделать их binary: 1,2,4,8,16)
RafaСкомпилируй сам свой набор по чтению баз Access ;)

еще чем будешь убеждать ?
поиском по форуму
обсуждалось не так давно.
...
Рейтинг: 0 / 0
15.01.2005, 00:36:50
    #32866056
Alexey Sh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте с организацией "флажков" (есть идея сделать их binary: 1,2,4,8,16)
А в чём проблема скомпилить?
...
Рейтинг: 0 / 0
15.01.2005, 12:38:23
    #32866248
dkny
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте с организацией "флажков" (есть идея сделать их binary: 1,2,4,8,16)
Позвольте внести свою скромную лепту по поводу практических наблюдений работы Access 2003. Мне действительно стало интересно как Access хранит информацию в таблицах при вводе булиновских полей в одно поле типа байт и отдельно для каждого логического поля.

Дабы разобраться, что все таки происходит с MDB в плане размера, в случае разных полей в таблицах, провел такое исследование: добавление в базу 100 000 и 1 000 000 записей программным путем с засечением времени и сравнением получившегося размера баз. При этом интерес представляли три случая:

1. База с таблицей из поля типа byte .
2. База с таблицей из поля типа boolean .
3. База с таблицей из восьми полей типа boolean (в сумме это должно было быть похоже на байт :).

Итак результаты размера:


Код: plaintext
1.
2.
3.
4.
5.
6.
Количество записей | Получившийся размер базы данных (байт)
                   |
                   |        Byte        Boolean      8 Boolean
-------------------|----------------------------------------------
        0 записей  |     151 552        155 648        155 648
  100 000 записей  |   2 445 312      2 461 696      2 461 696
1 000 000 записей  |  23 072 768     23 076 864     23 076 864

* база с байтом изначально была меньше на ровно 4КБ, так и осталась!
* количество кода для вставки через CurrentDb.Execute ("INSERT INTO..., естественно, было разным во всех случаях.


Разница - 0, 0%, нуль!!!

Размер итоговой базы во всех трех случаях одинаков!


ВЫВОД:

Поправьте меня, если я ошибаюсь, но получается, что Access постоянно резервирует пространство базы под абсолютно все объекты, будь то, код, кнопки, таблицы, поля и т.д. Я думаю, что для кода VBA минимальный объем "кластера" - те самые 4 КБ (кстати, по-моему довольно удачное сравнение с файловой системой). Но что при этом происходит при резервировании места под данные? Один миллион записей по одному байту это, грубо, один мегабайт. Счетчик (ключевое поле) длинной в 4 байта это еще 4 МБ. Но в итоге то у нас 23 МБ! Куда оно пошло? Скорее всего, на резервирование.

Если Access (говоря про Access я здесь все время имею в виду JET :) работает страницами-кластерами, т.е., если предположить, что запись в любой таблице из любого количества полей не может быть меньше определенного объема, то этот объем легко посчитать - 23 МБ / 1 млн. = 23 байт, вместо нужных пяти! Какое расточительство! :)

К сожалению, я не знаю механики работы Access/JET, поэтому эти измышления могут являться лишь банальной истиной, которую все давно знают (или быть полным бредом :).




Ну, наконец, скорость добавления этих записей (AthlonXP 3200+):


Код: plaintext
1.
2.
3.
4.
5.
Количество записей | Время, затраченное на добавление (секунд)
                   |
                   |        Byte        Boolean      8 Boolean
-------------------|----------------------------------------------
  100 000 записей  |         128           165             191
1 000 000 записей  |        1459          1713            1946

Поле (число) типа байт добавляется быстрее логического! А 8 логических полей дают перекур аж на 25 процентов длиннее!

Вполне может быть, что работа с записями, в которых логические поля "упакованы", даже с учетом затрат на обработку кодом, будет идти быстрее native режима Access.

P.S. 25 минут на 1 000 000 записей... Долго же еще нам не будет хватать мощности "железа" :)

That's all folks...
...
Рейтинг: 0 / 0
15.01.2005, 12:49:07
    #32866253
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте с организацией "флажков" (есть идея сделать их binary: 1,2,4,8,16)
блин, ну обсуждалось ведь уже как биты хранятся...

/topic/118602&pg=1
...
Рейтинг: 0 / 0
15.01.2005, 12:52:17
    #32866255
Alexey Sh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Посоветуйте с организацией "флажков" (есть идея сделать их binary: 1,2,4,8,16)
Поясняю. В mdb файле для каждого небулевского поля в записи имеется дополнительный флажок, признак NULL/не NULL. Для булевских полей это флажок используется для хранаения значений TRUE/FALSE. Поэтому булевские в Аксессе не могут быть NULL. флажки естественно пакуются. Никакой мистики.

Кластеров в mdb нет, есть 4K страницы (jet4)
на каждой странице данных имеется заголовок фиксированной длины и таблица смещений каждой записи внутри страницы .
Индексы занимают место.

P.S. Зачем фантазировать, если имеется описание структуры?
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Посоветуйте с организацией "флажков" (есть идея сделать их binary: 1,2,4,8,16) / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]