Не удается получить Delphi ADOQuery для обновления или вставки в рабочую таблицу Excel - PullRequest
0 голосов
/ 16 мая 2018

В настоящее время я работаю над программой, функция которой заключается в считывании данных из электронной таблицы 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, если вы сможете связать его со мной, который может иметь отношение к моей текущей программе

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

1 Ответ

0 голосов
/ 16 мая 2018

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

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

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

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

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

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

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

Чтобы убедиться, что это не проблема с FieldName столбца Value, я добавил это в 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.

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

...