Не удается получить Delphi ADOQuery для обновления или вставки в рабочую таблицу Excel

В настоящее время я работаю над программой, функция которой заключается в считывании данных из электронной таблицы Excel, где пользователь должен иметь возможность редактировать количество запаса и создавать отдельный отчет только об использованном запасе, что я и сделал. Моя проблема возникает при попытке обновить исходную электронную таблицу, чтобы показать, что запас становится меньше / больше, когда пользователь добавляет / удаляет программу.

Мне удалось показать изменения в запасе в DBGrid, но в реальной электронной таблице не было внесено никаких изменений, поэтому при перезапуске программы будут отображаться неизменные числа (это было сделано с помощью DBEdits).

** Я создал уменьшенную версию этого кода, чтобы сделать мою проблему, надеюсь, более понятной и удобной для чтения. Использование запросов для обновления и обновления таблицы Excel. Первая строка в таблице имеет значение 17, которое пытается программа чтобы перейти к 5. Каждый раз, когда я запускаю этот код, я получаю "Синтаксическая ошибка в операторе обновления", я вполне уверен, что это не так. Я играл с кодом, добавляя такие вещи, как

ADOQuery.open ADOQuery.Enabled:= false ADOQuery.Enabled:= true

и т.д., каждый из которых дает мне разные ошибки.**

Код следующим образом:

procedure TForm1.FormCreate(Sender: TObject);
begin

  //Building Connection string as well as recieving filename of excel document
  OpenDialog1.Execute;
  ADOQuery1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;' + 'Data Source=' + OpenDialog1.FileName + ';' + 'Extended Properties="Excel 8.0;IMEX=2"';

  //Working SQL statement to display records in DBGrid
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('SELECT * FROM [Sheet1$];');
  ADOQuery1.Active := true;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   //Broken code, purpose is to replace the first row value with a new value
   ADOQuery1.SQL.Clear;

   ADOQuery1.SQL.Add('UPDATE [Sheet1$]');
   ADOQuery1.SQL.Add('SET Value = 5');
   ADOQuery1.SQL.Add('WHERE Value = 17;');

   ADOQuery1.ExecSQL;


end;

end.

Пример таблицы: образец таблицы, использованной в приведенном выше коде

У меня есть исследования по этой проблеме в течение последних двух дней, но каким-то образом ответ, кажется, постоянно ускользает от меня, спрашивать всегда последний шаг. Если вы не знаете решения, мы будем благодарны за любые рекомендации и даже предложения по другим языкам программирования /IDE, которые дадут мне более плодотворные результаты. Я даже соглашусь на учебник по сценариям Excel, если вы сможете связать его со мной, который может иметь отношение к моей текущей программе

PS Извините за такой длинный пост, довольно новый для этого сайта. Вся помощь очень ценится.

1 ответ

Решение

Я могу воспроизвести вашу проблему и получить

Синтаксическая ошибка в выражении UPDATE.

Обновленный ответ Я еще не полностью исследовал это, но я думаю, что ваша проблема возникает из-за вашего выбора Value как имя столбца. Я думаю, что это имя может конфликтовать с тем, как оператор UPDATE интерпретируется уровнем ADO. Я думаю, потому что, если я использую это заявление Sql

'Обновить [Лист1$] Установить [Значение] = 88, где [Значение] = 5'

запрос выполняется правильно и обновляет значение ячейки, содержащей 5 правильно.

Я собираюсь оставить свой оригинальный ответ на месте, если он поможет другим.

Оригинальный ответ:

Чтобы убедиться, что это не проблема с Value FieldName столбца, я добавил это в TForm1.Create:

  Caption := AdoQuery1.Fields[0].FieldName;

и это подтвердило, что FieldName действительно Value,

Затем я добавил TDBNavigator и TDBEdit в форму и обнаружил, что могу редактировать Value значение в TDBEdit без проблем.

Это дало мне идею:

procedure TForm1.Button2Click(Sender: TObject);
begin
  if AdoQuery1.Locate('Value', '5', []) then begin
    AdoQuery1.Edit;
    AdoQuery1.FieldByName('Value').AsString := '99';
    AdoQuery1.Post;
  end;
end;

и это прекрасно работает. Очевидно, что это не совсем то, что вам нужно, потому что он не полностью повторяет то, что сделал бы оператор UPDATE, если бы было несколько строк, соответствующих предложению WHERE, но есть разные способы, которыми вы могли бы достичь этого, например, используя AdoQuery Seek метод.

Если я добьюсь прогресса в получении ОБНОВЛЕНИЯ для работы, я опубликую обновление к этому ответу.

Другие вопросы по тегам