To make the changes permanent, use , for example, can be used exactly the same way as for cached updates to identify records according to whether they have been inserted, updated, deleted, or unmodified.
This approach is particularly useful for highlighting records in different colors in a grid or showing their status on a status bar.
From their point of view, when users delete a row in the grid, I would wager that 99 percent of them intend to delete just the product—not both the product and the supplier.
Fortunately, you can achieve this result using another dynamic property—in this case, the Unique Table dynamic property.
Some differences between the syntaxes are slight, such as changing procedure TForm1.
Form Close Query( Sender: TObject; var Can Close: Boolean); begin Can Close := True; if ADOData Set1. Free; end; end; property and saw how pessimistic locking works.
However, in this section you won't need them to solve the problem of updating a join, because in ADO, joins are naturally updatable.
For example, the Join Data example is built around an ADODataset component that uses the previous SQL join.
If you run it, you can edit one of the fields and save the changes (by moving off the record).
The effect you will see is that the fields are left blank, which is not very helpful because you don't know which record has been deleted. This means there are no controls to prevent two users from editing the same record at the same time.
(This was not the behavior in the first version of ADOExpress, which displayed the field values of deleted records.) The ingenuity you need in order to solve the function ADOUpdates Pending(ADOData Set: TCustom ADOData Set): boolean; var Clone: TADOData Set; begin Clone := TADOData Set. The first user to save their changes will succeed; the second user's attempt to update the same record might fail.