![enter image description here](https://i.stack.imgur.com/Zypel.png)
Я разрабатываю приложение в Delphi-2010 с использованием SQL Server 2008 R2 в сетевом режиме.
Моя проблема в том, что в некоторых случаях несколько клиентов открывают одну и ту же запись для обновления.
Первый клиент может обновить запись, но другие не могут, потому что SQL SERVER не может найти соответствующую запись, потому что она была изменена. Приложение должно разрешить 2 обновления без уведомления клиента.
Таблица содержит много полей, и «клиент может обновить любое из них, поскольку я не использую оператор SQL, а использую UPDATEBATCH ().
// Press UPDATE
procedure TarticleEditForm.saveButtonClick(Sender: TObject);
begin
if (articleCode.Text <> '') AND (counter.Text <> '') AND (articleLabel.Text <> '') AND (tbCombo.Text <> '') AND (griffeCombo.Text <> '') then begin
ADOArticleFind.SQL.Text := 'SELECT * FROM article WHERE ID<>''' + ADOArticle.FieldByName('ID').Value + ''' AND article=''' + articleCode.Text + ''' AND mode=''' + modeCombo.Text + ''' AND counter=''' + counter.Text + '''';
ADOArticleFind.Open;
// UPDATE
if ADOArticleFind.RecordCount = 0 then begin
// SET Date Modification
ADOArticle.FieldByName('dateModification').Value := Now;
ADOArticle.FieldByName('modifiePar').Value := mainForm.user;
ADOArticle.UpdateBatch();
// Update ArticleColor/ArticleTissu tables
ADOArticleColor.SQL.Text := 'UPDATE articleColor SET article=''' + articleCode.Text + ''', mode=''' + modeCombo.Text + ''', counter=''' + counter.Text + ''' WHERE article=''' + tmpArticleCode + ''' AND mode=''' + tmpMode + ''' AND counter=''' + tmpCounter + '''';
ADOArticleColor.ExecSQL;
ADOArticleTissu.SQL.Text := 'UPDATE articleTissu SET article=''' + articleCode.Text + ''', mode=''' + modeCombo.Text + ''', counter=''' + counter.Text + ''' WHERE article=''' + tmpArticleCode + ''' AND mode=''' + tmpMode + ''' AND counter=''' + tmpCounter + '''';
ADOArticleTissu.ExecSQL;
// create event log
mainForm.ADOUser.SQL.Text := 'SELECT * FROM users WHERE online=1 AND editArticleEvent=1 AND username<>''' + mainForm.user + '''';
mainForm.ADOUser.Open;
while not mainForm.ADOUser.Recordset.EOF do begin
mainForm.ADOMainEventLog.Insert;
mainForm.ADOMainEventLog.FieldByName('event').Value := 'Article modifié: ' + designationCombo.Text + ' ' + saisonCombo.Text + ' ' + articleCode.Text + '-' + modeCombo.Text + counter.Text + ' de ' + griffeCombo.Text;
mainForm.ADOMainEventLog.FieldByName('eventFrom').Value := mainForm.user;
mainForm.ADOMainEventLog.FieldByName('eventTo').Value := mainForm.ADOUser.FieldByName('username').Value;
mainForm.ADOMainEventLog.FieldByName('eventType').Value := 'editArticleEvent';
mainForm.ADOMainEventLog.UpdateBatch();
mainForm.ADOUser.Next;
end;
// Finish
Self.Close;
end
else begin
MessageBox(Application.Handle, 'Cet article existe déja.', 'GET© Driver', MB_ICONWARNING);
articleCode.SetFocus;
end;
end
else
MessageBox(Application.Handle, 'Champs obligatoire(s) manquant(s).', 'GET© Driver', MB_ICONWARNING);
end;