2017-10-19 20 views
1

テーブルからデータを読み込み、cxGridの列にデータをコピーした後、これを直接データベースに更新したいと思います。 可能ですか?Delphi、cxGrid列の値を設定してデータベースを更新する

私はsetEditValueを使用してみましたが、その1つの型のパラメータを必要とします。

TcxDataEditValueSource = (evsValue, evsText, evsKey); 

そして、私は」このタイプを見つけることができます。 DeveloperExpressのいくつかの例では、1に設定されていますが、動作しません。間違った型はコンパイラです。

これはデータをグリッドにするために使用したコードですが、データセットを更新できるようにすることはできますか?

var 
    RecIDx, 
    ColIdx, 
    sorNo, 
    RecID, 
    i: integer; 
    AB, 
    AT: double; 

begin 
    try 
    // Get marked row and column 
    RecIDx := grGeneralInfoMallDBTableView1.Controller.SelectedRecords[0] 
     .RecordIndex; 
    ColIdx := grGeneralInfoMallDBTableView1.DataController.GetItemByFieldName 
     ('ID').Index; 

    // Get SortingOrderNo 
    sorNo := grGeneralInfoMallDBTableView1.DataController.Values 
     [RecIDx, ColIdx]; 

    // Get AB and AT from SortingOrderRow with highest priority (lowest number) 
    dmsSortOrder.sq_Get_AB_AT.Active := false; 
    dmsSortOrder.sq_Get_AB_AT.ParamByName('sorNo').AsInteger := sorNo; 
    dmsSortOrder.sq_Get_AB_AT.Active := true; 
    dmsSortOrder.sq_Get_AB_AT.First; 
    if dmsSortOrder.sq_Get_AB_AT.EOF then 
    begin 
     showMessage('ERROR! Could not find record for sortorder: ' + 
     intToStr(sorNo)); 
     exit; 
    end; 
    // Copy AT and BT to the grid. 
AT := dmsSortOrder.sq_Get_AB_AT.FieldByName('AT').AsFloat; 
AB := dmsSortOrder.sq_Get_AB_AT.FieldByName('AB').AsFloat; 


// Set the cell value 
grGeneralInfoMallDBTableView1.DataController.DataSource.DataSet.Edit; 
ColIdx := grGeneralInfoMallDBTableView1.DataController.GetItemByFieldName 
    ('AT').Index; 
grGeneralInfoMallDBTableView1.DataController.SetValue(RecIDx,ColIdx, AT); 
ColIdx := grGeneralInfoMallDBTableView1.DataController.GetItemByFieldName 
    ('AB').Index; 
grGeneralInfoMallDBTableView1.DataController.SetValue(RecIDx,ColIdx, AB); 
grGeneralInfoMallDBTableView1.DataController.DataSource.DataSet.Post; 
    finally 
    end; 

end; 
+2

あなたのGridViewをデータバインドされている場合は、単に基礎となる 'TDataSet'のフィールドを更新することができるはずです。 – nil

+0

あなたは本当に私を起こす!上記のコードを変更して、私がどのようにしたかを示しました。シンプルで、グリッドにデータを追加する必要はありませんでした。ありがとう! – larand

+1

ようこそ。ちなみに、あなたは今質問をもう間違いなく変更しました。この変更を質問に戻す方が良いでしょう。解決した方法で自分の答えを投稿することは絶対に賢明です。 – nil

答えて

1

これは、私はそれを解決する方法である:

var 
    RecIDx, 
    ColIdx, 
    sorNo, 
    RecID, 
    i: integer; 
    AB, 
    AT: double; 

begin 
    try 
    // Get marked row and column 
    RecIDx := grGeneralInfoMallDBTableView1.Controller.SelectedRecords[0] 
     .RecordIndex; 
    ColIdx := grGeneralInfoMallDBTableView1.DataController.GetItemByFieldName 
     ('ID').Index; 

// Get SortingOrderNo 
sorNo := grGeneralInfoMallDBTableView1.DataController.Values 
    [RecIDx, ColIdx]; 

// Get AB and AT from SortingOrderRow with highest priority (lowest number) 
dmsSortOrder.sq_Get_AB_AT.Active := false; 
dmsSortOrder.sq_Get_AB_AT.ParamByName('sorNo').AsInteger := sorNo; 
dmsSortOrder.sq_Get_AB_AT.Active := true; 
dmsSortOrder.sq_Get_AB_AT.First; 
if dmsSortOrder.sq_Get_AB_AT.EOF then 
begin 
    showMessage('ERROR! Could not find record for sortorder: ' + 
    intToStr(sorNo)); 
    exit; 
end; 
// Copy AT and BT to the grid. 
AT := dmsSortOrder.sq_Get_AB_AT.FieldByName('AT').AsFloat; 
AB := dmsSortOrder.sq_Get_AB_AT.FieldByName('AB').AsFloat; 

grGeneralInfoMallDBTableView1.DataController.DataSource.DataSet.Edit; 
grGeneralInfoMallDBTableView1.DataController.DataSource.DataSet.FieldByName('AT').Value := AT; 
grGeneralInfoMallDBTableView1.DataController.DataSource.DataSet.FieldByName('AB').Value := AB; 
grGeneralInfoMallDBTableView1.DataController.DataSource.DataSet.Post; 
    finally 
    end; 

end; 
関連する問題