0

計算フィールド列を持つデータ シート フォームがあります。ただし、フィールドに正しい値が含まれていても、フィールドは表示されません。問題のフィールドは「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

また、行を循環するより効率的な方法はありますか? これは非常に遅いように見えるので、各行が処理されるたびに行ポインターがテーブルを下に移動するのがわかります。

4

1 に答える 1

0

私の理解が正しければ、テーブルグリッド コントロールの列の各セルに個々の値を入力しようとしているのですか? それが可能だとは思いません。

テーブル グリッド コントロール内では、すべての値は基になるクエリから取得する必要があります。これらの計算を行うためのクエリを作成し、そのクエリをフォームの基礎として使用することをお勧めします。これにより、計算結果の表示の問題とフォームの読み込み速度の両方が解決されます (クエリ結果を決定する際のデータベース ロジックのため)。ほとんどの場合、行ごとに実行するマクロよりも効率的です)。

または、計算フィールドをスタンドアロンにして、tablegrid コントロールの現在選択されている行の計算結果のみを表示することもできます。このシナリオでは、「フォームの読み込み」イベントは最初の行の計算のみを行い、行の選択が変更されるたびに計算マクロがトリガーされます。

于 2015-11-12T19:32:45.903 に答える