2017-10-19 75 views
1

테이블에서 데이터를 읽고 데이터를 cxGrid의 열에 복사 한 다음이 데이터를 데이터베이스로 직접 업데이트하려고합니다. 가능합니까?델파이, 컬럼 값을 설정하고 데이터베이스를 업데이트하는 cxGrid

내가 setEditValue를 사용하여 시도했지만 하나는 유형의 매개 변수가 필요합니다

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

합니다. – nil

+0

당신은 정말로 나를 깨운다! 위의 코드를 어떻게 변경했는지 보여주기 위해 위 코드를 변경했습니다. 단순하고 그리드에 데이터를 추가 할 필요가 없었습니다. 감사! – larand

+1

환영합니다. 그건 그렇고, 이제 질문은 더 이상 의심스럽지 않게 바뀌 었습니다. 이 변경 사항을 질문으로 되돌려 놓는 것이 낫습니다. 어떻게 해결했는지 자신의 답변을 게시하는 것은 절대적으로 좋습니다. – nil

답변

1

이것은 내가 그것을 해결하는 방법이다 : 당신의 GridView는 데이터 바인딩 단순히 기본`TDataSet`의 필드를 업데이트 할 수있을 것입니다

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;