2016-05-16 2 views
1

J'utilise DBGrid, dbf et DataSource juste compris comment faire lors de la suppression d'un certain livre que l'ammount supprime par 1. J'ai été coincé sur une tâche pour faire 2 lignes fusionner si theyre fait identique par exemple si le nom de livres est "Test" et j'ajouterais une autre rangée avec des livres anem "Test" il fusionnerait et changerait l'ammount du livre de 1 à 2 ou 2 à 3 etc.DBGrid, dbf fusionnant 2 mêmes lignes

procedure TForm1.Button1Click(Sender: TObject); 

begin 
    with dbgrid1.DataSource.DataSet do begin 
    Insert; 
    Edit; 
    DBGrid1.DataSource.DataSet.FieldByName('Nr.').AsInteger; 
    Fields.fieldbyname('Year').value := Edit1.Text; 
    Fields.fieldbyname('Author').value := Edit2.Text; 
    Fields.fieldbyname('Name').value := Edit3.Text; 
    Fields.fieldbyname('Ammount').value := Edit4.Text; 
    Post; 
    Next; 

    end; 
end; 

ici vous pouvez voir comment regarder enter image description here

Gads - Année Autos - auteur Nosaukums - BooksName Kopijas- ammount

Répondre

3

Vous pourriez le faire faire quelque chose comme ceci:

procedure TForm1.AddBook; 
var 
    ADataSet : TDataSet; 
begin 
    // Note: you need to complete this by filling in the DBGrid1.DataSource.DataSet.FieldByName('Nr.').AsInteger; 
    // Also, I'm assuming that the field which stores the number of copies is called "Amount" - change if necessary 
    ADataSet := dbgrid1.DataSource.DataSet; 
    if ADataSet.Locate('Name', Edit3.Text, []) then begin 
    ADataSet.Edit; 
    ADataSet.FieldByName('Amount').AsInteger := ADataSet.FieldByName('Amount').AsInteger + 1; 
    end 
    else begin 
    ADataSet.Insert; 
    ADataSet.fieldbyname('Year').value := Edit1.Text; 
    ADataSet.fieldbyname('Author').value := Edit2.Text; 
    ADataSet.fieldbyname('Name').value := Edit3.Text; 
    ADataSet.fieldbyname('Amount').value := Edit4.Text; 
    end; 
    ADataSet.Post; 
end; 

De cette façon, évite d'avoir deux lignes dans la base de données avec la même valeur de champ Nom, ce qui est préférable d'avoir des doublons, puis de les fusionner ensemble en mettant à jour un et en supprimant l'autre.

Notez également que j'ai évité d'utiliser la construction "with". Lorsque vous utilisez "avec", ce que vous économisez en tapant est souvent dépassé par la quantité de débogage que vous avez à faire pour corriger les erreurs qui se glissent en raison de son utilisation. Cependant, s'il s'agit d'une base de données multi-utilisateurs avec un RDMS back-end qui prend en charge Sql, il serait préférable de faire l'insertion ou la mise à jour en utilisant des instructions Sql exécutées sur le serveur, par ex. en utilisant une procédure stockée paramétrée (pour éviter le risque Sql-Injection), puis actualisez les données dans l'application cliente.