Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Запрос к нескольким таблицам


Автор: kulikoff 30.12.2005, 20:56
Мне необходимо в приложении, которое через BDE подключается к СУБД Oracle, выполнить следующий запрос на обновление информации:
Код

update BANKVUP
set BANKVUP.BANKID=(
                                    select BANK.BANKID 
                                    from  BANK 
                                    where BANKVUP.MFO=BANK.BANKMFO)

алиас подключения к БД - ren4ora.
Запрос набросал в PL/SQL Developere - он работает отлично...
Пожалуйста, напишите, как правильно этот запрос описать в программе на Делфи, как быть со вложенными запросами? Очень рассчитываю на помощь....

Автор: SPrograMMer 30.12.2005, 23:01
Цитата(kulikoff @ 30.12.2005, 20:56)
как правильно этот запрос описать в программе на Делфи

Цитата(kulikoff @ 30.12.2005, 20:56)
которое через BDE подключается

компонента TQuery тогда....только не метод(ы) Open/Close, а ExecSQL.
Цитата(kulikoff @ 30.12.2005, 20:56)
как быть со вложенными запросами

а чего с ними не так?

Автор: kulikoff 31.12.2005, 11:08
Ругается на скобки (перед select'ом и после вложенного запроса)... Или там кавычки ещё какие нужно расставлять....
Или лучше на два запроса этот разбить? Сначала SELECT, потом построчно UPDATE выполнять? Или это гланды через попу удалять? smile

Автор: Vit 31.12.2005, 15:32
Не уверен что BDE такое поддерживает, попробуйте другим способом доступа, ADO например

Автор: kulikoff 31.12.2005, 15:58
Блин, а мне по ТЗ надо всё через BDE реализовать...

Автор: SPrograMMer 31.12.2005, 22:34
Цитата(Vit @ 31.12.2005, 15:32)
Не уверен что BDE такое поддерживает,

Ну тогда придется запрос разбивать на два:
Код

select BANKID 
from  BANK 
where BANKVUP.MFO=BANK.BANKMFO

..... так стоп....
kulikoff, у тебя в этом запросе ведь две таблицы: BANKVUP и BANK, в предложении from указывается только одна....
ладно это мы отвлеклись....
значит надо так:
Код

select BANK.BANKID 
from  BANK, BANKVUP
where BANKVUP.MFO=BANK.BANKMFO

выполняем этот запрос запрос, получаем BANKID
а потом в
Код

update BANKVUP
set BANKID=:paramID
и в параметр пихаем BANKID....


...получается два запроса... smile

Автор: kulikoff 31.12.2005, 22:44
а как в paramID впихнуть BANKID? Сорри, может вопрос и глупый, но я не знаю ответа на него... smile

Автор: SPrograMMer 2.1.2006, 00:14
Код

...
SQLUpdate.ParamByName('paramID').AsInteger:=SelectSQL.FieldByName('BANKID').AsInteger;
...

Автор: kulikoff 2.1.2006, 12:35
Написал через два запроса - первый запрос работает, второй - нет. Не ругается, ничего!!! Просто нажал на кнопку, оно подумало и всё, тишина.
Привожу код:
Код

[b]procedure TForm1.Button2Click(Sender: TObject);
var a,i: integer;
begin
  Query1.Close;
  Query1.SQL.Clear;
  Query1.SQL.Text:='select BANKID from BANK, BANKVUP where BANK.BANKMFO=BANKVUP.BANKMFO';
  Query1.Prepare;
  Query1.Open;
  Query2.Close;
  Query2.SQL.Clear;
  Query2.SQL.Text:='update BANKVUP set BANKID=:param1';
  Label3.Caption:=IntToStr(Query1.RecordCount);
  a:=Query1.RecordCount;
  for i:=1 to a do
    begin
      Query2.ParamByName('param1').AsFloat:=Query1.Fields[0].AsFloat;
      Query2.Prepare;
      Query2.ExecSQL;
      Query1.Next;
    end;

end;

Что тут неправильно? Чего он не хочет работать? Вроде всё работает, но не хочет записывать новые данные в поле...

Автор: SPrograMMer 2.1.2006, 21:53
Цитата(kulikoff @ 2.1.2006, 12:35)
Что тут неправильно

smile .....значит стиль такой... раз юзаешь DSQL тогда параметры можно не использовать...
значит можно переписать вот так наверное:
Код

procedure TForm1.Button2Click(Sender: TObject);
 var a,i: integer;
begin
  Query1.Active:=False;
  Query1.SQL.Clear;
  Query1.SQL.Text:='select BANKID from BANK, BANKVUP where BANK.BANKMFO=BANKVUP.BANKMFO';
  //Query1.Prepare;  // люди добрые объясните мне что эта штука делает
  // всю жизнь без него обходился....
  Query1.Active:=True;
  Label3.Caption:=IntToStr(Query1.RecordCount);
  a:=Query1.RecordCount;
  for i:=1 to a do begin
    Query2.Active:=False;
    Query2.SQL.Clear;
    Query2.SQL.Text:='update BANKVUP set BANKID='+FloatToStr(Query1.Fields[0].AsFloat);
    //Query2.Prepare;
    Query2.ExecSQL;
    Query1.Next;
   end;
end;
еще вот это
Цитата
Query1.Fields[0].AsFloat
можно переписать как
Цитата
Query1.FieldByName('BANKID').AsFloat
Последнее более надежно...


хотя
Цитата(kulikoff @ 2.1.2006, 12:35)
Чего он не хочет работать? Вроде всё работает, но не хочет записывать новые данные в поле...

kulikoff, у тебя второй запрос правильно сформулирован?!... Ты случайно не забыл, что в UpDate то же может присутствовать предложение Where? smile А то получается, что твой запрос (тот который без Where) обнавляет все записи, сначала первым значением, потом вторым, потом тритьим... и т д.. а потом последним... вот и кажется что твой запрос ничего не делает... smile smile

Автор: kulikoff 2.1.2006, 22:17
Да я сначала хотел, чтоб все делалось одним запросом, со вложенным, но что-то не так... А как лучше записать тогда, чтоб было where? Я надеюсь, идея запроса/ов понятна, просто не могу найти более рационального решения... Помоги, плиз...

Попробывал код, приведенный SPrograMMer - тот же самый эффект, не хочет он обновлять, хоть стреляйся smile
Попробывал строку запроса перезаписать следующим образом:
Код

Query2.SQL.Text:='update BANKVUP set BANKID='+FloatToStr(Query1.FieldByName('BANKID').AsFloat)+'where BANK.BANKMFO=BANKVUP.BANKMFO';


ругается, что
Цитата
Invalid field name BANKMFO

И чего он такой?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)