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


Автор: huminclouds 9.9.2009, 11:39
Существуют две таблицы 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;

Ошибок он не выдает, но и наименования не вставляет. Поможите, кто чем сможет.

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

Автор: huminclouds 9.9.2009, 13:15
Запросом не получится, т.к. НД подсоединены к разным БД, не спрашивайте почему, это не в моей власти. С 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;

Попытался ускорить это дело используя вместо цикла запрос выборки. Но запрос выдает пустую строку.

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


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

Автор: huminclouds 10.9.2009, 07:56
Vas спасибо. С кавычками я здорово скосячил, аж стыдно стало. Переделал like на =. Все работает. Спасибо. Locate тоже работает, даже, на мой взгляд, быстрее.

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