Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запрос к нескольким таблицам, Помогите правильно написать запрос 
:(
    Опции темы
kulikoff
Дата 30.12.2005, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 5.11.2005
Где: Киев

Репутация: 1
Всего: 1



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

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

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

Это сообщение отредактировал(а) kulikoff - 30.12.2005, 20:57
PM MAIL WWW ICQ Skype   Вверх
SPrograMMer
Дата 30.12.2005, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Спамер :)
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 5.11.2004
Где: Краснодар

Репутация: 1
Всего: 6



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

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

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

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


--------------------
животное = зверь
законченный гентушник
PM MAIL ICQ Jabber   Вверх
kulikoff
Дата 31.12.2005, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 5.11.2005
Где: Киев

Репутация: 1
Всего: 1



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

Это сообщение отредактировал(а) kulikoff - 31.12.2005, 11:17
PM MAIL WWW ICQ Skype   Вверх
Vit
Дата 31.12.2005, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



Не уверен что BDE такое поддерживает, попробуйте другим способом доступа, ADO например


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
kulikoff
Дата 31.12.2005, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 5.11.2005
Где: Киев

Репутация: 1
Всего: 1



Блин, а мне по ТЗ надо всё через BDE реализовать...
PM MAIL WWW ICQ Skype   Вверх
SPrograMMer
Дата 31.12.2005, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Спамер :)
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 5.11.2004
Где: Краснодар

Репутация: 1
Всего: 6



Цитата(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


--------------------
животное = зверь
законченный гентушник
PM MAIL ICQ Jabber   Вверх
kulikoff
Дата 31.12.2005, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 5.11.2005
Где: Киев

Репутация: 1
Всего: 1



а как в paramID впихнуть BANKID? Сорри, может вопрос и глупый, но я не знаю ответа на него... smile
PM MAIL WWW ICQ Skype   Вверх
SPrograMMer
Дата 2.1.2006, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Спамер :)
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 5.11.2004
Где: Краснодар

Репутация: 1
Всего: 6



Код

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



--------------------
животное = зверь
законченный гентушник
PM MAIL ICQ Jabber   Вверх
kulikoff
Дата 2.1.2006, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 5.11.2005
Где: Киев

Репутация: 1
Всего: 1



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

[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;

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

Это сообщение отредактировал(а) kulikoff - 2.1.2006, 18:31
PM MAIL WWW ICQ Skype   Вверх
SPrograMMer
Дата 2.1.2006, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Спамер :)
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 5.11.2004
Где: Краснодар

Репутация: 1
Всего: 6



Цитата(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

Это сообщение отредактировал(а) SPrograMMer - 2.1.2006, 21:56


--------------------
животное = зверь
законченный гентушник
PM MAIL ICQ Jabber   Вверх
kulikoff
Дата 2.1.2006, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 5.11.2005
Где: Киев

Репутация: 1
Всего: 1



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

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

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


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

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

Это сообщение отредактировал(а) kulikoff - 2.1.2006, 22:25
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0820 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.