Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выборка и подстановка данных. Delphi7, ADO, dbf  
:(
    Опции темы
huminclouds
Дата 9.9.2009, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Существуют две таблицы tbl1 и tbl2. Обе таблицы содержат идентичные поля с кодами продукции: code1, code2, code3 и поле с наименованиями продукции: name. tbl2 является справочником и содержит все коды и наименования продукции. tbl1 содержит несколько строк с кодами, а поле name пустое. Нужно в tbl1 в соответствии с кодами подставить наименования из tbl2.

У меня код такой:
Код
Query1.First;
  while not Query1.Eof do
    begin
      Query2.Close;
      Query2.SQL.Clear;
      Query2.SQL.Add('SELECT name');
      Query2.SQL.Add('FROM tbl2');
      Query2.SQL.Add('WHERE code1 LIKE ' + Query1['code1']);
      Query2.SQL.Add('AND code2 LIKE ' + Query1['code2']);
      Query2.SQL.Add('AND code3 LIKE ' + Query1['code3']);
      Query2.Open;

      Query1.Edit;
      Query1['name'] := Query2['name'];
      Query1.Post;
          
      Query1.Next;
    end;

Ошибок он не выдает, но и наименования не вставляет. Поможите, кто чем сможет.
PM MAIL   Вверх
Данкинг
Дата 9.9.2009, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

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



С .dbf так (.edit - .post) работать и не будет (странно, что вообще ошибок не выдаёт). Вставляй запросом (insert..), или же используй TDbf.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
huminclouds
Дата 9.9.2009, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Запросом не получится, т.к. НД подсоединены к разным БД, не спрашивайте почему, это не в моей власти. С dbf edit...post прекрасно работает, по крайней мере у меня smile. Например, если запрос выборки заменить циклом, то все прекрасно работает, только вот скорость выполнения конечно изрядно хромает. Вот проверенный рабочий код:
Код
Query2.Close;
Query2.SQL.Clear;
Query2.SQL.Add('SELECT code1, code2, code3, name');
Query2.SQL.Add('FROM tbl2');
Query2.Open;

Query1.First;
  while not Query1.Eof do
    begin
      Query2.First;
  
      while not Query2.Eof do
         if (Query2['code1'] := Query1['code1']) and
            (Query2['code2'] := Query1['code2']) and
            (Query2['code3'] := Query1['code3']) then
           begin 
             Query1.Edit;
             Query1['name'] := Query2['name'];
             Query1.Post;
             Break;
           end
         else
           Query2.Next;

      Query1.Next;
    end;

Попытался ускорить это дело используя вместо цикла запрос выборки. Но запрос выдает пустую строку.
PM MAIL   Вверх
huminclouds
Дата 9.9.2009, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Мне тут предложили воспользоваться методами Locate или Lookup. Только как правильно оформить не знаю. А конкретно, как вписать массив ключевых значений.
Код
Query2.Lookup('code1;code2;code3', ???, 'name');


PM MAIL   Вверх
Vas
Дата 9.9.2009, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Locate('code1;code2;code3',VarArrayOf([Query1['code1'], Query1['code1'], Query1['code1']]) , []);
А зачем в запросе используешь Like, а не знак "="?
code- число или строка? 
Если строка то в запросе еще апострофы отсутсвуют.


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
huminclouds
Дата 10.9.2009, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Vas спасибо. С кавычками я здорово скосячил, аж стыдно стало. Переделал like на =. Все работает. Спасибо. Locate тоже работает, даже, на мой взгляд, быстрее.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

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

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


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

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

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


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

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


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

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


 




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


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

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