Добавлено: Чт Апр 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
Добавлено: Пт Май 23, 2014 10:45 am Заголовок сообщения:
Еще немного расширю идею.
Использую такой метод также для хранения мелких значений (заведомо меньше определенного числа) скопом в интовых полях в виде:
поле = X + Y*1000 + Z*1000000 (например)
Если таких параметров дофига и их в запросах надо часто джоинить на параметры документа или проводки, то выигрыш значительный. По крайней мере на базах, где таблицы параметров в разы длиннее джорнала.
Ну и естественно использую такой метод в Op.GetExtraData и Op.SetExtraData, есть много документов, где надо много разных длинных текстовых параметров хранить (типа специфика договора и т.д.)
Еще немного расширю идею.
Использую такой метод также для хранения мелких значений (заведомо меньше определенного числа) скопом в интовых полях в виде:
поле = X + Y*1000 + Z*1000000 (например)
Если таких параметров дофига и их в запросах надо часто джоинить на параметры документа или проводки, то выигрыш значительный. По крайней мере на базах, где таблицы параметров в разы длиннее джорнала.
Ну и естественно использую такой метод в Op.GetExtraData и Op.SetExtraData, есть много документов, где надо много разных длинных текстовых параметров хранить (типа специфика договора и т.д.)
Не, не...
Только хардкор! То есть money (и звучит лучше ).
8(!) байт. 4 знака после запятой (для "мелких значений"). На НЕдробной части можно развернуться и легко уместить 2 идентификаторов до 10^7 каждый.
У многих базовые справочники превышают 10 в 7?
GetExtraData/SetExtraData научились работать с более 64К? Ссылку на хелп про 2Гб не приводить!
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах