Обновить после изменения поля таблицы - PullRequest
0 голосов
/ 19 апреля 2011

У меня проблема со старой системой Delphi, эта система вставляет данные в таблицу SQL Server.

Через 10 лет измените поле таблицы длиной от 100 до 255 символов.

Система выбирает все регистры таблицы и помещает их в другую таблицу после преобразования. Это отлично работает.

Проблемы возникают, когда система обновляет поле.

Это показывает мне ошибку

EDBEngineError с сообщением «Не удалось выполнить редактирование, поскольку другой пользователь изменил запись.

sConsulta:='SELECT * FROM cuentas WHERE (WALL= 2) AND (SEND_DATE = '01/01/1970')';
m_oQryLeg.Close;
m_oQryLeg.SQL.Clear;
m_oQryLeg.SQL.Add(sConsulta);
m_oQryLeg.Open;
m_oTblNov.Close;
m_oTblNov.TableName:='des_table';
m_oTblNov.Open;

with m_oTblNov do
begin
  while (not m_oQryLeg.EOF) do
  begin
    Insert;
    FieldbyName('COD_HOME').AsString:= m_oQryLeg.FieldByName('USR_HOME').AsString;
    (...)
    Post;

    m_oQryLeg.Edit;
    m_oQryLeg.FieldByName('SEND_DATE').AsDateTime:= Date; //<-- HERE THE ERROR
    m_oQryLeg.Post;

    m_oQryLeg.First;
    m_oQryLeg.MoveBy(i);
    inc(i);
  end;    
end;
m_oTblNov.Close;
m_oQryLeg.Close;

UpdateMode: upWhereAll

Таблица cuentas:

  • NUM_SOL nvarchar 6 * PK
  • WALL tinyint 1
  • SEND_DATE smalldatetime 4
  • OBS_CRED nvarchar 255
  • FLCC real 4
  • УЛИЦА НВАРЧАР 30

Ответы [ 2 ]

1 голос
/ 20 апреля 2011

Вы пытаетесь обновить запрос, который вы используете для таблицы, которую вы редактируете одновременно, и это не сработает.строка из запроса в m_oTblNov, почему бы просто так не сделать это?

sConsultaSELECT :='SELECT * FROM cuentas';
sConsultaUPDATE := 'UPDATE cuentas SET Send_Date = :New_Date';
// Separate WHERE so you can use it twice. Note the leading space
// between the first ' and WHERE.
sWhere := ' WHERE (WALL = 2) and (SEND_DATE = ''01/01/1970'')';


m_oQryLeg.Close;
m_oQryLeg.SQL.Text := sConsulta + sWhere;
m_oQryLeg.Open;

m_oTblNov.Close;
m_oTblNov.TableName:='des_table';
m_oTblNov.Open;

with m_oTblNov do
begin
  while (not m_oQryLeg.EOF) do
  begin
    Insert;
    FieldbyName('COD_HOME').AsString:= m_oQryLeg.FieldByName('USR_HOME').AsString;
    (...)
    Post;

    // Don't run these any more. See below.
    // m_oQryLeg.Edit;
    // m_oQryLeg.FieldByName('SEND_DATE').AsDateTime:= Date; //<-- HERE THE ERROR
    // m_oQryLeg.Post;

    m_oQryLeg.First;
    m_oQryLeg.MoveBy(i);
    inc(i);
  end;    
end;
m_oTblNov.Close;
m_oQryLeg.Close;
m_oQryLeg.SQL.Text := sConsultaUPDATE + sWHERE;
m_oQryLeg.ParamByName('New_Date').AsDateTime := Date;
try
  m_oQryLeg.ExecSQL;
finally
  m_oQryLeg.Close;
end;
0 голосов
/ 19 апреля 2011

Проблема здесь в том, что ваш объект пытается обновить строку из базы данных, чтобы убедиться, что ничего не изменилось, и, скорее всего, объект урезал или округлил какое-то значение, которое приводит к тому, что обновление не возвращает строк.

Это может быть вызвано усечением значения с плавающей запятой или отключением какого-либо другого значения.

если вы не можете / не можете изменить этот столбец, чтобы устранить эту проблему, я бы посоветовал изменить его на upWhereChanged илиupWhereKeyOnly.

Учитывая, что даты обрабатываются как двойные в большинстве баз данных Windows, я думаю, что upWhereKeyOnly будет лучше.

EDIT:

После просмотра вашей таблицы, онаможет иметь отношение к тому факту, что вы используете одно основанное smalldatetime.Delphi рассматривает все данные DateTime как двойные, и преобразование назад и вперед может вызывать небольшие проблемы с округлением.

...