Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.09.2010, 15:33
VINCENT VINCENT вне форума
Прохожий
 
Регистрация: 03.09.2010
Сообщения: 16
Репутация: 12
По умолчанию запрос к разным таблицам

Подскажите кто уже это проходил.
Можно ли выполнить запрос к таблицам разных бд.
есть база данных VFXP (*.dbf) и временна база данных на PARADOX (*.db)нужно обратится запросом к полям этих таблиц и получить разность.

запрос примерно такой
ADOQuery1.SQL.Add('select j from base.db,base.dbf where j<>keyforbank and datepay='''+dateform+'''')
Ответить с цитированием
  #2  
Старый 14.09.2010, 16:15
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
По умолчанию

да, такие вещи выполнимы.
запрос примерно такой:
Код:
ADOQuery1.SQL.Text:='select j from base.db b1,base.dbf b2 where b1.j<>keyforbank and b2.datepay='''+dateform+''' and b1.key=b2.key'
где b1.key=b2.key будет связующим звеном по какому-то уникальному полю между двумя твоими таблицами
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
Ответить с цитированием
  #3  
Старый 14.09.2010, 22:33
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Курите поиск по "гетерогенные запросы".
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #4  
Старый 17.09.2010, 09:22
VINCENT VINCENT вне форума
Прохожий
 
Регистрация: 03.09.2010
Сообщения: 16
Репутация: 12
По умолчанию

Цитата:
Сообщение от Yurk@
запрос примерно такой:
Код:
ADOQuery1.SQL.Text:='select j from base.db b1,base.dbf b2 where b1.j<>keyforbank and b2.datepay='''+dateform+''' and b1.key=b2.key'
а если к одной базе идет обращение через ADOconnection a к другой через BDE как вы сабираетесь это таким образом выразить? если можно то хотелось бы пример посмотреть.
Ответить с цитированием
  #5  
Старый 17.09.2010, 09:34
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

VINCENT, если через разные драйверы обращаетесь к базам - то нельзя одновременно.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #6  
Старый 17.09.2010, 10:31
VINCENT VINCENT вне форума
Прохожий
 
Регистрация: 03.09.2010
Сообщения: 16
Репутация: 12
По умолчанию

В том то и вопрос как сравнить таблицы используя разное подключение к ним.
Ответить с цитированием
  #7  
Старый 17.09.2010, 11:52
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Создать 2 временные таблицы (подключенных через 1 (один) драйвер), по очереди залить из них данные из имеющихся, потом сделать запрос.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #8  
Старый 17.09.2010, 12:56
VINCENT VINCENT вне форума
Прохожий
 
Регистрация: 03.09.2010
Сообщения: 16
Репутация: 12
По умолчанию

НУ так то понятно что можно выгрузить даныые или перечитать с запроса по записям . Тут хотелось бы грамотно подойти к вопросу и оптимально решить задачу без ущерба к производительности.
Ищу методы так как опыта программирования 2 недели.
А нельза сравнить данные не создавая ничего лишнего например из хранимаого курсора в памяти.
допустим
Код:
query1.sql.add('sect j from ":test:te.db"');
              query1.open
              ADOQuery1.sql.add('slect keyforbank from testdb where datepay=:dats');
              ADOQuery1.Open;
ну а потом каким небудь методом сравнить данные из хранимого курсора.
Ответить с цитированием
  #9  
Старый 17.09.2010, 14:17
Asinkrit Asinkrit вне форума
Местный
 
Регистрация: 29.10.2009
Сообщения: 446
Репутация: 271
По умолчанию

Цитата:
Сообщение от VINCENT
...идет обращение через ADOconnection a к другой через BDE...
Во первых, ADOConnection - это компонент, где ADO - это интерфейс программирования приложений для доступа к данным, а BDE - это технология доступа к данным, имеющая набор драйверов баз данных и позваляющая единообразный доступ к ним. То есть, предполагается возможность настроить подключения к обоим базам данных через один механизм, то есть через BDE. Это так для справки к понимаю терминов.
Цитата:
Сообщение от VINCENT
В том то и вопрос как сравнить таблицы используя разное подключение к ним.
А в чем проблема сравнить две таблицы на уровне дельфей, если интересует именно разность таблиц, то открываем два датасета, по одному к каждой базе, и сравниваем вручную, а результат выводим либо в программе, либо пишем в одну из баз.
Ответить с цитированием
  #10  
Старый 18.09.2010, 04:55
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Немного добавлю к предыдущему оратору и напомню что я говорил ранее.
Сама среда Delphi не работает с базами данных, за нее это делают так называемые "движки", и если один движок не умеет цепляться к другому (BDE - точно не умеет, с ADO я не уверен на 100%) то ты никак, повторяю НИКАК не получишь гетерогенного запроса.
Теперь о том что я говорил выше. Сливать данные можно и в таблицу в памяти, сейчас много всяких MemTable по сети валяется, юзай их. Ну это если записей в таблице разумное количество.

ЗЫЖ А вообще-то хотелось бы узнать задачу более полнее, чтоль. Может быть есть решение совсем другим способом.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #11  
Старый 21.09.2010, 08:53
VINCENT VINCENT вне форума
Прохожий
 
Регистрация: 03.09.2010
Сообщения: 16
Репутация: 12
По умолчанию

чето долго думал.... решил привести все к общему знаминателю, а именно выбрал запросом данные из dbf и записал их во временную таблицу, птом сравнил с первой каторя db
сам запрос получился такого характере может кому пригодится хотя во многих местах уже описан этот метод.
Код:
Query2.close;
      Query2.SQL.clear;
      Query2.SQL.Add('select j from ":bank:te.db" AS T1 LEFT JOIN ":bank:temp.db" AS T2 ON T1.j=T2.kluch WHERE T2.kluch IS NULL');
      Query2.Open;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:19.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025