Текущий архив: 2005.02.13;
Скачать: CL | DM;
Вниз
Не полное добавление записей update в цикле. Найти похожие ветки
← →
Orc © (2005-01-17 14:10) [0]Проблема вот какая: организовано чтение из файла (допустим неких идентификаторов, имён, количества и цен) в таблицу. Далее, на основе некоторых других данных (введённого пользователем коэффициента), производится расчёт в поле таблицы. Сделано так:
// 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 14:22) [1]а зачем все тянуть на клиента? можно одним запросом
что-то типа:
UPDATE maintable set newfield=id*id/:PARAM_Q
предварительно заполнив параметр PARAM_Q.
← →
Orc © (2005-01-17 14:25) [2]А значения ранее записанных полей откуда брать? Нет, ну так можно сделать, конечно, но мне просто интересно - это я чего-то не понимаю или что? :)
← →
Danilka © (2005-01-17 14:37) [3][2] Orc © (17.01.05 14:25)
> А значения ранее записанных полей откуда брать?
в смысле? судя по коду - у тебя уже есть в аццессе заполненая таблица maintable, и тебе надо проапдейтить у нее одно поле, все ее записи. это делается одним запросом, а не кучей запросов - по одному на каждую запись+еще один селект.
> Нет, ну так можно сделать, конечно, но мне просто интересно
> - это я чего-то не понимаю или что?
это уже не ко мне, я с аццессом дело имел последний раз где-то в 99 году. :)
← →
Orc © (2005-01-17 14:42) [4]
> это уже не ко мне, я с аццессом дело имел последний раз
> где-то в 99 году. :)
Принципы-то одни и те же :) Я вон вообще MCDBA и MCSD до кучи, с MS SQL - проще имхо :)
← →
Danilka © (2005-01-17 14:49) [5][4] Orc © (17.01.05 14:42)
все равно не ко мне: не помню когда последний раз все записи в цикле перебирал. :) обычно все можно описать sql-запросом.
← →
Orc © (2005-01-17 14:55) [6]
> обычно все можно описать sql-запросом.
Можно, но есть из ряда вон выходящие случаи. Просто заказчик настоял на файл-сервере. Так бы я реализовал всё на SQL - и все дела.
← →
Erik1 © (2005-01-17 15:03) [7]Вопервых непонятно почему делается 2 соеденения? Во вторых ты под отладкой это запускал? На последнею строку формируется SQL команда? Мне кажется, что нет.
← →
Danilka © (2005-01-17 15:07) [8][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;
:))
Страницы: 1 вся ветка
Текущий архив: 2005.02.13;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.065 c