![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не полное добавление записей update в цикле. [D7, Access]
Orc © (2005-01-17 14:10:00)Проблема вот какая: организовано чтение из файла (допустим неких идентификаторов, имён, количества и цен) в таблицу. Далее, на основе некоторых других данных (введённого пользователем коэффициента), производится расчёт в поле таблицы. Сделано так:
// q - введённый кэффициент.
adoquery1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+extractfilepath(application.ExeName)+'mainbase.mdb;Mode=ReadWrite;Persist Security Info=False;Jet OLEDB:Database Password=12345678';
adoquery2.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+extractfilepath(application.ExeName)+'mainbase.mdb;Mode=ReadWrite;Persist Security Info=False;Jet OLEDB:Database Password=12345678';
adoQuery1.Active := false;
adoQuery1.SQL.Text := 'select * from maintable';
adoQuery1.Active := true;
while not adoquery1.Eof do
begin
ADOQuery2.SQL.Text:='UPDATE maintable set newfield="'+ADOQuery1.FieldValues['id']*ADOQuery1.FieldValues['id']/q+'" where id="'+ADOQuery1.FieldValues['id']+'"';
adoQuery2.ExecSQL;
adoquery1.Next;
end;
А проблема заключается в том, что остаётся необработанная последняя запись в таблице, т.е. на неё не срабатывает update, хотя данными эта запись ничем не отличается от ей предшествующих. В чём может быть загвоздка? Заранее благодарен за ответы!
Danilka (2005-01-17 15:07:00) [1][6] Orc © (17.01.05 14:55)
при чем здесь сервер? аццесс тоже понимает скуль. я написал тебе пример запроса, которые делает то-же самое, что и ты в приведенном тобой примере.
если тебе нада пример полного кода на, держи:
adoquery1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+extractfilepath(application.ExeName)+'mainbase.mdb;Mode=ReadWrite;Persist Security Info=False;Jet OLEDB:Database Password=12345678';
adoQuery1.SQL.Text := 'UPDATE maintable set newfield=id*id/:PARAM_Q';
adoQuery1.Parameters[0].Value := q;
adoQuery1.ExecSQL;
:))
Erik1 (2005-01-17 15:03:00) [2]Вопервых непонятно почему делается 2 соеденения? Во вторых ты под отладкой это запускал? На последнею строку формируется SQL команда? Мне кажется, что нет.
Orc (2005-01-17 14:55:00) [3]
> обычно все можно описать sql-запросом.
Можно, но есть из ряда вон выходящие случаи. Просто заказчик настоял на файл-сервере. Так бы я реализовал всё на SQL - и все дела.
Danilka (2005-01-17 14:49:00) [4][4] Orc © (17.01.05 14:42)
все равно не ко мне: не помню когда последний раз все записи в цикле перебирал. :) обычно все можно описать sql-запросом.
Orc (2005-01-17 14:42:00) [5]
> это уже не ко мне, я с аццессом дело имел последний раз
> где-то в 99 году. :)
Принципы-то одни и те же :) Я вон вообще MCDBA и MCSD до кучи, с MS SQL - проще имхо :)
Danilka (2005-01-17 14:37:00) [6][2] Orc © (17.01.05 14:25)
> А значения ранее записанных полей откуда брать?
в смысле? судя по коду - у тебя уже есть в аццессе заполненая таблица maintable, и тебе надо проапдейтить у нее одно поле, все ее записи. это делается одним запросом, а не кучей запросов - по одному на каждую запись+еще один селект.
> Нет, ну так можно сделать, конечно, но мне просто интересно
> - это я чего-то не понимаю или что?
это уже не ко мне, я с аццессом дело имел последний раз где-то в 99 году. :)
Orc (2005-01-17 14:25:00) [7]А значения ранее записанных полей откуда брать? Нет, ну так можно сделать, конечно, но мне просто интересно - это я чего-то не понимаю или что? :)
Danilka (2005-01-17 14:22:00) [8]а зачем все тянуть на клиента? можно одним запросом
что-то типа:
UPDATE maintable set newfield=id*id/:PARAM_Q
предварительно заполнив параметр PARAM_Q.