Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.04.2011, 18:52   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
По умолчанию Обновление в цикле

Добрый вечер! Прошу помощи с решением задачи. Задача: выбрать записи из одной таблицы и обновить вторую таблицу. У обоих таблиц есть общее поле. Проблема в том, что не могу сделать, что в коде выбирались из второй таблицы записи, которыми нужно обновить первую таблицу и выполнялось обновление. Сделал для проверки через эдит добавление в Мемо, добавление в него работает. Вот код:
Код:
procedure TForm2.mniN68Click(Sender: TObject);
var
  i,j: Integer;
begin
 Form2.dlgOpen1.Title:='Укажите DBF файл обновления . . .';
 Form2.dlgOpen1.FileName:='*.dbf';
 Form2.dlgOpen1.Filter:='DBF|.dbf';
 if Form2.dlgOpen1.Execute then
 begin
   Form2.sStatusBar4.Panels[3].Text:=Form2.dlgOpen1.FileName;
   Form2.sStatusBar4.Panels[5].Text:=ExtractFileName(ChangeFileExt(Form2.dlgOpen1.FileName,''));

   //подключаю файл обновления 
   Form2.ds1.DataSet:=nil;
   Form2.qry1.Active:=False;
   Form2.qry1.SQL.Clear;
   Form2.qry1.SQL.Text:='select IDU,REGNUMBERU,OGRNU from ' + Form2.sStatusBar4.Panels[5].Text;
   Form2.qry1.Open;
   Form2.sStatusBar5.Panels[1].Text:='[ ' + IntToStr(Form2.qry1.RecordCount) + ' ]';
   Form2.qry1.First;
   while not Form2.qry1.Eof do
   begin
    Form2.sEdit1.Text:=Form2.qry1.FieldByName('REGNUMBERU').AsString;
    Form2.sEdit2.Text:=Form2.qry1.FieldByName('OGRNU').AsString;
//вот тут не могу записать обновление в цикле. 
    Form2.sMemo1.Lines.Add(Form2.sEdit1.Text);
    Form2.sMemo2.Lines.Add(Form2.sEdit2.Text);
    Form2.qry1.Next;
   end;
   //обновляю записи в журнале
   Form2.qry1.Close;
   Form2.qry1.SQL.Clear;
   Form2.qry1.SQL.Text:='update jurnal set REGNUMBER = "'
    + Form2.sEdit1.Text + '" where OGRN="' + Form2.sEdit2.Text + '"';
   Form2.qry1.ExecSQL;
   Form2.qry1.Close;

   //возвращаю все записи из основного журнала
   Form2.qry1.Active:=False;
   Form2.qry1.SQL.Clear;
   Form2.qry1.SQL.Text:='select ID,REGNUMBER,DATAPST,DATAOBR,TIMEOBR,DATASNYT,KATEGORIA,
OGRN, INN,FIOOLD,FIONEW,ST,DATAZAYV,NUMBER,ANSWER from jurnal';
   Form2.qry1.Open;
   Form2.sStatusBar4.Panels[1].Text:='[ ' + IntToStr(Form2.qry1.RecordCount) + ' ]';
   Form2.ds1.DataSet:=Form2.qry1;

 end;
end;
Прошу помочь кодом на основе моего. Заранее спасибо.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось Stilet; 29.04.2011 в 08:40.
artemavd вне форума Ответить с цитированием
Старый 28.04.2011, 20:54   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Попробуй, может этим кодом удастся обновить все, не знаю как провайдер твой скушает. TableIn замени на имя файла обновления, необходимое условие - уникальность OGRNU в TableIn и OGRN в jurnal (второе вообщето не обязательно)
Код:
update jurnal
  set REGNUMBER=T.REGNUMBERU
  from TableIn as T
  where jurnal.OGRN=T.OGRNU
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.04.2011, 05:28   #3
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
По умолчанию

Это не работает.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 29.04.2011, 08:44   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

долно быть ДВА разных объекта Qery
один ( Form2.qry1 ) для получения исходных данных
Код:
     //подключаю файл обновления 
   Form2.ds1.DataSet:=nil;
   Form2.qry1.Active:=False;
   Form2.qry1.SQL.Clear;
   Form2.qry1.SQL.Text:='select IDU,REGNUMBERU,OGRNU from ' +   Form2.sStatusBar4.Panels[5].Text;
   Form2.qry1.Open;
и второй (Form2.qry2 )для обновления
Код:
  //обновляю записи в журнале
   Form2.qry2.Close;
   Form2.qry2.SQL.Clear;
   Form2.qry2.SQL.Text:='update jurnal set REGNUMBER = "' + Form2.sEdit1.Text + '" where OGRN="' + Form2.sEdit2.Text + '"';
   Form2.qry2.ExecSQL;
а теперь код по обновлению вставляешь в цикл причесываешь (убираешь лишнее) и вперед.

P.S. использование параметров для обновления
Код:
   Form2.qry1.First;
// задаем запрос обновления в переметричестом виде
   Form2.qry2.SQL.Text:='update jurnal set REGNUMBER = :num where OGRN=:orgnum';

   while not Form2.qry1.Eof do
   begin
    Form2.sEdit1.Text:=Form2.qry1.FieldByName('REGNUMBERU').AsString;
    Form2.sEdit2.Text:=Form2.qry1.FieldByName('OGRNU').AsString;
//вот тут не могу записать обновление в цикле. 
// задаем значения пареметров и выполняем обновление
  From2.qry2.params.parambyname('num').asstring:=Form2.qry1.FieldByName('REGNUMBERU').AsString;
   From2.qry2.params.parambyname('orgnum').asstring:=Form2.qry1.FieldByName('OGRNU').AsString;
   Form2.qry2.ExecSQL;

    Form2.sMemo1.Lines.Add(Form2.sEdit1.Text);
    Form2.sMemo2.Lines.Add(Form2.sEdit2.Text);
    Form2.qry1.Next;
   end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 29.04.2011 в 08:57.
evg_m на форуме Ответить с цитированием
Старый 30.04.2011, 09:57   #5
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
По умолчанию

Вообщем, надо было сделать так:
Код:
procedure TForm2.mniN68Click(Sender: TObject);
begin
 Form2.dlgOpen1.Title:='Укажите DBF файл обновления . . .';
 Form2.dlgOpen1.FileName:='*.dbf';
 Form2.dlgOpen1.Filter:='DBF|.dbf';
 if Form2.dlgOpen1.Execute then
 begin
   Form2.sStatusBar4.Panels[3].Text:=Form2.dlgOpen1.FileName;
   Form2.sStatusBar4.Panels[5].Text:=ExtractFileName(ChangeFileExt(Form2.dlgOpen1.FileName,''));

   //подключаю файл обновления
   Form2.con3.Close;
   Form2.con3.ConnectionString:='Provider=VFPOLEDB.1;Data Source=' + ExtractFilePath(Form2.sStatusBar4.Panels[3].Text) + ';Password="";Collating Sequence=MACHINE;DSN=""';
   Form2.con3.Open;
   Form2.sEdit3.Text:=ExtractFilePath(Form2.sStatusBar4.Panels[3].Text);

   Form2.qry3.Active:=False;
   Form2.qry3.SQL.Clear;
   Form2.qry3.SQL.Text:='select IDU,REGNUMBERU,OGRNU from ' + Form2.sStatusBar4.Panels[5].Text;
   Form2.qry3.Open;
   Form2.sStatusBar5.Panels[1].Text:='[ ' + IntToStr(Form2.qry3.RecordCount) + ' ]';

   Form2.qry1.Active:=False;
   Form2.qry1.SQL.Clear;
   Form2.qry1.SQL.Text:='select ID,REGNUMBER,DATAPST,DATAOBR,TIMEOBR,DATASNYT,KATEGORIA,OGRN,INN,FIOOLD,FIONEW,ST,DATAZAYV,NUMBER,ANSWER from jurnal';
   Form2.qry1.Open;
   Form2.sStatusBar4.Panels[1].Text:='[ ' + IntToStr(Form2.qry1.RecordCount) + ' ]';
   Form2.qry3.First;
   Form2.qry4.SQL.Text:='update jurnal set REGNUMBER=:num where OGRN=:ogrnum';
   while not Form2.qry3.Eof do
   begin
    Form2.sEdit1.Text:=Form2.qry3.FieldByName('REGNUMBERU').AsString;
    Form2.sEdit2.Text:=Form2.qry3.FieldByName('OGRNU').AsString;
    Form2.qry4.Parameters.ParamByName('num').Value:=Form2.sEdit1.Text;
    Form2.qry4.Parameters.ParamByName('ogrnum').Value:=Form2.sEdit2.Text;
    Form2.qry4.ExecSQL;
    Form2.qry3.Next;
   end;

   Form2.qry1.Active:=False;
   Form2.qry1.SQL.Clear;
   Form2.qry1.SQL.Text:='select ID,REGNUMBER,DATAPST,DATAOBR,TIMEOBR,DATASNYT,KATEGORIA,OGRN,INN,FIOOLD,FIONEW,ST,DATAZAYV,NUMBER,ANSWER from jurnal';
   Form2.qry1.Open;
   Form2.sStatusBar4.Panels[1].Text:='[ ' + IntToStr(Form2.qry1.RecordCount) + ' ]';
 end;
end;
Вроде работает. Может кому пригодится
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Цикл в цикле drNabla Microsoft Office Excel 7 02.12.2010 23:01
Цикл в цикле... Davlet M Помощь студентам 6 25.01.2010 01:42
График в цикле FastDead Общие вопросы C/C++ 2 26.12.2009 01:42
условие в цикле Николай Сергеевич Общие вопросы C/C++ 8 24.12.2009 14:25
Проблема в цикле Fekla Общие вопросы C/C++ 4 28.06.2009 12:50