Форма базовой таблицы данных не будет отображать вычисленное поле

У меня есть форма таблицы данных, в которой есть столбец вычисляемого поля. Однако поле не будет отображаться, даже если оно имеет правильное значение. Рассматриваемое поле - "numRisk":

Sub Calculate_Risk (Form As Object)
    Dim OrderPrice, IfDonePrice, TotBrSymComm, BrComm, Risk As Double
    Dim Symbol As String
    Dim IntRateMult, noContracts As Integer
    If MinTick = 0 OR Rate = 0 Then
       Exit Sub
    End If
    Symbol = RTrim(Form.getByName("txtSymbol").CurrentValue)
    If Symbol = "" Then
       Exit Sub
    End If
    OrderPrice = Form.getByName("fmtOrder_Price").CurrentValue
    IfDonePrice = Form.getByName("fmtIf_Done_Price").CurrentValue
    noContracts = Form.getByName("fmtNo_Contracts").CurrentValue
    If NOT USIntRates Then
       Risk = ABS(OrderPrice - IfDonePrice) / MinTick
    Else
       Risk = ABS(OrderPrice\1 - IfDonePrice\1) * MinTick
       IntRateMult = IIf(Symbol = "FV" OR Symbol = "TU",400, 200)
       Risk = ABS(Risk - IntRateMult * ABS(OrderPrice - OrderPrice\1
       IfDonePrice + IfDonePrice\1)) 
    End If
    Risk = Risk * MinTickVal / Rate
    TotBrSymComm = BrSymComm + BrSymCommAud
    BrComm = IIf(TotBrSymComm = 0, BrCommission, BrSymCommAud + BrSymComm/Rate)
    Risk = noContracts*(Risk + BrComm * 2)
    Form.getByName("numRisk").Value = Risk
 End Sub

Подпрограмма вызывается из следующей процедуры, которая запускается при загрузке формы:

Sub FromListForm(Event as Object)
     Dim Form As Object
     Dim TodaysDate As New com.sun.star.util.Date
     Dim CurrDate As Date
     Form=Event.Source.getByName("MainForm_Grid")
     Form.RowSet.first()
     Do Until Form.RowSet.isAfterLast()
        Get_Contract(Form)
        Get_Broker_Comm(Form)
        Calculate_Risk(Form)
        If isEmpty(Form.getByName("OrderDate").Date) Then
           CurrDate = Date()
           TodaysDate.Day = Day(CurrDate)
           TodaysDate.Month = Month(CurrDate)
           TodaysDate.Year = Year(CurrDate)
           Form.getByName("OrderDate").CurrentValue = TodaysDate
        End If
        Form.RowSet.next()
     Loop
     Form.RowSet.last()
End Sub

Также есть более эффективный способ циклического перебора строк? Поскольку это кажется таким медленным, я вижу, как указатель строки движется вниз по таблице при обработке каждой строки.


person user1897830    schedule 10.11.2015    source источник


Ответы (1)


Если я правильно понимаю, вы пытаетесь ввести отдельные значения в каждую ячейку столбца элемента управления tablegrid? Я не верю, что это возможно.

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

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

person Lyrl    schedule 12.11.2015
comment
Спасибо за это, Lyrl. Я сделал вычисляемое поле (оно изначально рассчитывается на другом экране в 99% случаев) полем в таблице futures_orders. Теперь все работает отлично. Я знаю, что ты не должен этого делать, но эй - чего бы это ни стоило. - person user1897830; 13.11.2015