2017-10-19 16 views
1

J'ai lu certaines données d'une table et copié les données dans une colonne dans un cxGrid, puis je veux mettre à jour directement à la base de données. Hows that possible?Delphi, cxGrid définir une valeur de colonne et mettre à jour la base de données

J'ai essayé d'utiliser setEditValue mais que l'on a besoin d'un paramètre de type:

TcxDataEditValueSource = (evsValue, evsText, evsKey); 

Et je ne peux trouver ce type. Dans un exemple de DeveloperExpress, ils le définissent sur 1, mais cela ne fonctionne pas. C'est un mauvais type, disons le compilateur.

Ceci est le code que j'ai utilisé pour faire les données dans la grille, mais comment puis-je mettre à jour le jeu de données?

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

Si votre GridView est lié aux données que vous devriez être en mesure de mettre à jour simplement les champs de la 'TDataSet' sous-jacent. – nil

+0

Tu me réveilles vraiment! J'ai changé le code ci-dessus pour montrer comment je l'ai fait. Simple et je n'ai pas besoin d'ajouter des données à la grille de cette façon. Merci! – larand

+1

Votre bienvenue. En passant, vous avez maintenant changé votre question pour ne plus être question. Il vaudrait mieux revenir sur ce changement à la question. Il est absolument bon de poster votre propre réponse avec la façon dont vous l'avez résolu. – nil

Répondre

1

Voici comment je l'ai résolu:

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;