Список форумов Акцент Акцент
официальный форум разработчика программы Акцент
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Немного уличной магии

 
Начать новую тему   Ответить на тему    Список форумов Акцент -> Акцент 7.0
Предыдущая тема :: Следующая тема  
Автор Сообщение
AllexL



Зарегистрирован: 10.03.2005
Сообщения: 434
Откуда: Donetsk

СообщениеДобавлено: Чт Апр 03, 2014 10:05 am    Заголовок сообщения: Немного уличной магии Ответить с цитатой

Часто бывает ситуация, когда необходимо хранить кучу битовых значений. Использовать для такой мелочи по параметру на каждое значение, знаете ли, расточительно. Я помню, что на старом форуме кто-то что-то похожее - предлагал (по-моему, это был Андрей Бутенко). Однако, в поиске - ничего не нашел.
Ну да ладно,
в таблице я создал колонку с типом элемента acCheck, прописал в .dataSourcegetSlicer(op.trans(1,grd.BindRow), bitFlag1).Value и все заработало.

Можно было, конечно, навернуть класс, автоматически присваивать битовые весА, контролировать переполнение, и т.д., но, имхо, в данном случае простота имеет некоторое преимущества

p.s. Проблему производительности этого кода на современных компьютерах считаю незначительной....

Const bitFlag1 = 1, bitFlag2 = 2, bitFlag3 = 4, bitFlag4 = 16, bitFlag5 = 32, bitFlagX = 2^X
Const pnFlags = "Long1"
Class BitSlicer
Private lTr, lBitWeight
Public Sub Init(ByVal tr, ByVal bitWeight)
Set lTr = tr : lBitWeight = bitWeight
End Sub
Public Default Property Get Value
value = CBool(( lTr.Params(pnFlags).value2 And lBitWeight) <>0)
End Property
Public Property Let value(ByVal val)
If CBool(val) Then
lTr.Params(pnFlags).value = lTr.Params(pnFlags).value2 Or lBitWeight
ElseIf CBool ((lTr.Params(pnFlags).value2 And lBitWeight) <> 0) then
lTr.Params(pnFlags).value = lTr.Params(pnFlags).value2 And Not(lBitWeight)
End If
End Property
End Class

Function GetSlicer(ByVal row, bitWeight)
If row>0 Then
Dim key : key = CStr(Row)&"|"&CStr(bitWeight)
If Not sdSlices.Exists(key) Then
Dim obj : Set obj = New BitSlicer : Call obj.Init(Op.trans(1,row), bitWeight)
Call sdSlices.add(key, obj)
End If
Set GetSlicer = sdSlices.Item(key)
End If
End Function
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
kris



Зарегистрирован: 12.01.2006
Сообщения: 371

СообщениеДобавлено: Пт Май 23, 2014 10:45 am    Заголовок сообщения: Ответить с цитатой

Еще немного расширю идею.
Использую такой метод также для хранения мелких значений (заведомо меньше определенного числа) скопом в интовых полях в виде:
поле = X + Y*1000 + Z*1000000 (например)
Если таких параметров дофига и их в запросах надо часто джоинить на параметры документа или проводки, то выигрыш значительный. По крайней мере на базах, где таблицы параметров в разы длиннее джорнала.

Ну и естественно использую такой метод в Op.GetExtraData и Op.SetExtraData, есть много документов, где надо много разных длинных текстовых параметров хранить (типа специфика договора и т.д.)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Alex Zaigraev



Зарегистрирован: 17.03.2005
Сообщения: 60

СообщениеДобавлено: Пн Июн 02, 2014 9:29 pm    Заголовок сообщения: Ответить с цитатой

kris писал(а):
Еще немного расширю идею.
Использую такой метод также для хранения мелких значений (заведомо меньше определенного числа) скопом в интовых полях в виде:
поле = X + Y*1000 + Z*1000000 (например)
Если таких параметров дофига и их в запросах надо часто джоинить на параметры документа или проводки, то выигрыш значительный. По крайней мере на базах, где таблицы параметров в разы длиннее джорнала.

Ну и естественно использую такой метод в Op.GetExtraData и Op.SetExtraData, есть много документов, где надо много разных длинных текстовых параметров хранить (типа специфика договора и т.д.)


Не, не...
Только хардкор! Smile То есть money (и звучит лучше Wink ).
8(!) байт. 4 знака после запятой (для "мелких значений"). На НЕдробной части можно развернуться и легко уместить 2 идентификаторов до 10^7 каждый.
У многих базовые справочники превышают 10 в 7?

GetExtraData/SetExtraData научились работать с более 64К? Ссылку на хелп про 2Гб не приводить!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Акцент -> Акцент 7.0 Часовой пояс: GMT + 2
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group