2016-08-15 3 views
0

Disable/EnableControls()을 사용하면서 데이터 세트를 반복하는 동안, 즉 필드를 업데이트 할 때 몇 가지 문제가있었습니다.disablecontrols를 사용하여 올바른 데이터 게시 문제

업데이트 된 두 필드에 어떤 현상이 발생하는지는 모두 동일한 데이터를 사용하고있는 것입니다. 모든 행에 대해 게시물의 마지막 값을 입력하는 것처럼 보입니다. 그래서 우리가 1, 2, 3의 업데이트 된 값을 가지고있는 3 개의 레코드를 가지고 있다고 가정 해 봅시다. (제 경우에는 3이 모든 필드에 대해 게시됩니다) 마지막 필드에 대해 1, 2, 3을 기대했습니다.

예를 들어, 내 데이터 집합에 10 개의 레코드가 있습니다. 그리드를 볼 때이 함수를 실행하고 데이터를 지속하면 Cost 열 값이 각 행에 대해 동일하지만 getNewDataValue 함수에 시계를 넣었지만 값이 다릅니다.

NumberSelected = 0; 
dataSourceItems.DataSet.DisableControls; //it this be my problem, accessing the dataset via the datasource? – I tried this and it didn’t make a difference. 
while (NumberSelected < cxGridDBTableView1.Controller.SelectedRowCount) do 
begin 
    Id = cxGridDBTableView1.Controller.SelectedRows[NoSelected]).Values[0]; 
    if dataSourceItems.DataSet.locate('PK', Id, []) then 
    begin 
    dataSourceItems.DataSet.edit; 
    dataSourceItems.DataSet.fieldbyname('Cost').asfloat := getNewDataValue; 
    dataSourceItems.DataSet.Post; 
    inc(NumberSelected) 
    end; 

    dataSourceItems.DataSet.EnableControls; 
end; 

저는 Firebird 데이터베이스에 액세스하는 Delphi 2010, DevExpress Quantum Grid 및 FIBPlus 데이터 세트를 사용하고 있습니다.

설명서를 살펴보면, DisableControls()이 호출 될 때 TDataSet.DataEvent은 이벤트를 데이터 소스에 전달하지 않으며 EnableControls()이 호출 될 때까지 모든 마스터 세부 관계가 깨졌습니다. DataSource를 통해 DataModule의 DataSet에 액세스 할 수 있습니까? 나는 이것을 시도하고 차이를 만들지 않는다.

Disable/EnableControls()을 사용하지 않으면 속도를 사용할 수 없습니다. 대형 데이터 세트를 반복적으로 반복하는 방법에 대한 조언이나 도움이 될 것입니다. 대신 외부 루프되어야 할 때

+0

는 데이터 세트에 게시되고 해당 행 커서가 이동하기 전에 . fieldbyname() 지정 바로 뒤에 dataSourceItems.DataSet.Post를 명시 적으로 호출하십시오. 시도해보십시오 - 문제가 해결 될 수도 있지만 어쨌든해야합니다. – MartynA

+0

실제로 명시 적으로 게시하도록 호출하지 않았으므로 명확하게하기 위해 내 질문을 편집했습니다. 당신의 권리, 나는 지금 변화하고 시험 할 것입니다. – MrRobot

+0

fieldbyname() 지정 직후에 게시 한 후에도 동일한 결과를 얻습니다. – MrRobot

답변

4

넌 루프 내부 EnableControls()에서 호출된다 (바람직 try..finally 블록).

하지만 더 중요한 것은 NoSelected이 증가하지 않으므로 편집 할 때마다 항상 동일한 선택된 ID에 액세스한다는 것입니다. 하나의 변수가 단독으로 수행해야하는 작업을 수행하기 위해 두 가지 변수가 있습니다.

대신보십시오 : 또는

NumberSelected = 0; 
dataSourceItems.DataSet.DisableControls; 
try 
    while (NumberSelected < cxGridDBTableView1.Controller.SelectedRowCount) do 
    begin 
    Id = cxGridDBTableView1.Controller.SelectedRows[NumberSelected]).Values[0]; 
    if dataSourceItems.DataSet.Locate('PK', Id, []) then 
    begin 
     dataSourceItems.DataSet.Edit; 
     dataSourceItems.DataSet.FieldByName('Cost').AsFloat := getNewDataValue; 
     dataSourceItems.DataSet.Post; 
    end; 
    Inc(NumberSelected); 
    end; 
finally 
    dataSourceItems.DataSet.EnableControls; 
end; 

:

는 는
dataSourceItems.DataSet.DisableControls; 
try 
    for NumberSelected = 0 to cxGridDBTableView1.Controller.SelectedRowCount-1 do 
    begin 
    Id = cxGridDBTableView1.Controller.SelectedRows[NumberSelected]).Values[0]; 
    if dataSourceItems.DataSet.Locate('PK', Id, []) then 
    begin 
     dataSourceItems.DataSet.Edit; 
     dataSourceItems.DataSet.FieldByName('Cost').AsFloat := getNewDataValue; 
     dataSourceItems.DataSet.Post; 
    end; 
    end; 
finally 
    dataSourceItems.DataSet.EnableControls; 
end; 
당신은 변화에 (당신이 순간만큼) 의존해서는 안