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

Удобно это сделать (имхо) в виде двоичного числа 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
Посоветуйте с организацией "флажков" (есть идея сделать их binary: 1,2,4,8,16)
    #32853146
Again
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
http://www.msaccess.ru/Files/graphic.zip
Тут вполне нормальная структура под такую же задачу без всяких бинарников
...
Рейтинг: 0 / 0
Посоветуйте с организацией "флажков" (есть идея сделать их binary: 1,2,4,8,16)
    #32853159
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
логические операторы в 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
Посоветуйте с организацией "флажков" (есть идея сделать их binary: 1,2,4,8,16)
    #32853258
Фотография Rafa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот тут еще есть

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

:))


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

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

еще чем будешь убеждать ?
поиском по форуму
обсуждалось не так давно.
...
Рейтинг: 0 / 0
Посоветуйте с организацией "флажков" (есть идея сделать их binary: 1,2,4,8,16)
    #32866056
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в чём проблема скомпилить?
...
Рейтинг: 0 / 0
Посоветуйте с организацией "флажков" (есть идея сделать их binary: 1,2,4,8,16)
    #32866248
dkny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Позвольте внести свою скромную лепту по поводу практических наблюдений работы 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
Посоветуйте с организацией "флажков" (есть идея сделать их binary: 1,2,4,8,16)
    #32866253
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин, ну обсуждалось ведь уже как биты хранятся...

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

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

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


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