Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Как купить рекламу на форуме


Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме 20000 рублей в месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.09.2009, 10:57   #1
HIC
Пользователь
 
Регистрация: 20.06.2007
Сообщений: 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;
Ошибок он не выдает, но и наименования не вставляет. Поможите, кто чем сможет. Юзаю D7, ADO, таблицы *.dbf
HIC вне форума Ответить с цитированием
Старый 09.09.2009, 13:37   #2
АНК
Пользователь
 
Регистрация: 01.09.2009
Сообщений: 30
По умолчанию

Смотри Query1.FieldByName('code1').AsString
Код:
  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.FieldByName('code1').AsString + '''');
      Query2.SQL.Add('AND code2 LIKE ''' + Query1.FieldByName('code2').AsString + '''');
      Query2.SQL.Add('AND code3 LIKE ''' + Query1.FieldByName('code3').AsString + '''');
      Query2.Open;

      Query1.Edit;
      Query1.FieldByName('name').AsString := Query2.FieldByName('name').AsString;
      Query1.Post;

      Query1.Next;
    end;
А лучше сделать запрос в Query2 с параметрами и не надо будет заморачиваться с кавычками.

Последний раз редактировалось АНК; 09.09.2009 в 13:59.
АНК вне форума Ответить с цитированием
Старый 09.09.2009, 13:44   #3
Crazy_Wolfy
Пользователь
 
Аватар для Crazy_Wolfy
 
Регистрация: 03.07.2008
Сообщений: 34
Смех RE Выборка и подстановка данных.

целесообразнее использовать процедуру
название_таблицы.Locate(перечень_по лей_поиска,перечень_вариантов_соотв етственно_полям,параметры_поиска);
вместо столь частого использования SQL запросов

Код:
ADOTable1.First;
  while not ADOTable1.Eof do
    begin
ADOTable2.Locate('code1;code2;code3',VarArrayOf(ADOTable1.FieldByName('code1').AsInteger,ADOTable1.FieldByName('code2').AsInteger,ADOTable1.FieldByName('code3').AsInteger),[loCaseInsensitive]);
      ADOTable1.Edit;
      ADOTable1.FieldByName('name').AsString := ADOTable2.FieldByName('name').AsString;
     ADOTable1.Post;
          
    ADOTable1.Next;
    end;
что-то вроди этого должно получиться. только нужно в uses добавить DB.
вроди должно работать. точно не могу сказать. писал только тут. делать все в живую нет желания.
совершенство понятие относительное, учеба вещь постоянная...

Последний раз редактировалось Crazy_Wolfy; 09.09.2009 в 13:54.
Crazy_Wolfy вне форума Ответить с цитированием
Старый 09.09.2009, 14:58   #4
HIC
Пользователь
 
Регистрация: 20.06.2007
Сообщений: 39
По умолчанию

АНК, ты прав. Для строковых значений нужны кавычки. Вот я балбес.

Crazy_Wolfy, интересное предложение. Проблема в том, как правильно оформить массив ключевых значений. Поля с кодами строковые. У меня пока твоим способом не получается.

Последний раз редактировалось HIC; 10.09.2009 в 07:43.
HIC вне форума Ответить с цитированием
Старый 09.09.2009, 15:23   #5
Evgeniy26
Форумчанин
 
Аватар для Evgeniy26
 
Регистрация: 29.05.2009
Сообщений: 384
По умолчанию

Код:
 
  ADOTable1.First;
  while not ADOTable1.Eof do
  begin
    ADOTable2.Locate('code1;code2;code3',VarArrayOf([ADOTable1.FieldByName('code1').AsVariant,
      ADOTable1.FieldByName('code2').AsVariant,ADOTable1.FieldByName('code3').AsVariant]),[loCaseInsensitive]);
    ADOTable1.Edit;
    ADOTable1.FieldByName('name').AsString := ADOTable2.FieldByName('name').AsString;
    ADOTable1.Post;
    ADOTable1.Next;
  end;
Что за СУБД?

Последний раз редактировалось Evgeniy26; 09.09.2009 в 15:28.
Evgeniy26 вне форума Ответить с цитированием
Старый 09.09.2009, 16:16   #6
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

ну ваще-то лучше использовать условие
Код:
if ADOTable2.Locate(..) then begin
  //отапдейтить поле name
 .....
end;
потому что даже если локейт не удался, то курсор будет стоять на какой-то записи с каким-то значением name и совсем не той комбинацией ключевых полей

если же рассматривать вариант с морем запросов, то нужно брать строго условие равенства, а не через лайк и, как правильно подметил АНК, не забывать заключать в кавычки
Код:
Query2.SQL.Add('WHERE code1 = ''' + Query1.FieldByName('code1').AsString + '''');

Последний раз редактировалось soleil@mmc; 09.09.2009 в 16:23.
soleil@mmc вне форума Ответить с цитированием
Старый 09.09.2009, 16:27   #7
Evgeniy26
Форумчанин
 
Аватар для Evgeniy26
 
Регистрация: 29.05.2009
Сообщений: 384
По умолчанию

soleil@mmc, вы правы. Я посмотрел на VarArrayOf. Надо быть внимательнее. В T-SQL СУРБД 2005-2008, если я не ошибаюсь можно использавать DML(UPDATE ....JOIN...) точно синтаксис не помню, домой приду посмотрю.

Последний раз редактировалось Evgeniy26; 09.09.2009 в 16:32.
Evgeniy26 вне форума Ответить с цитированием
Старый 09.09.2009, 16:55   #8
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

я так понял, что тут просто DBF-файлы
в нормальных СУБД уже и MERGE есть - так что поставленная задача решается одним запросом
soleil@mmc вне форума Ответить с цитированием
Старый 09.09.2009, 17:06   #9
Evgeniy26
Форумчанин
 
Аватар для Evgeniy26
 
Регистрация: 29.05.2009
Сообщений: 384
По умолчанию

Я не стал говорить про MARGE, т.к. необходимо отредактировать записи существующие и все. А MARGE целесообразней использовать когда нужно использовать несколько операторов DML. Хотя разницы нет. ???
Evgeniy26 вне форума Ответить с цитированием
Старый 10.09.2009, 08:14   #10
HIC
Пользователь
 
Регистрация: 20.06.2007
Сообщений: 39
По умолчанию

Спасибо за помощь, ребят. Все получилось. Locate работает даже немного быстрее запроса, на мой взгляд.
HIC вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выборка данных из таблицы и составление отчета! WildKosha Microsoft Office Excel 20 25.02.2013 15:11
Выборка данных ADRENALIN86 Microsoft Office Excel 1 13.08.2009 14:51
ASP.NET // C# // Выборка данных из MSSQL Veiron ASP.NET 4 15.03.2009 17:43
выборка данных из Мускул Андрей79 PHP 1 02.03.2009 20:08
Выборка данных из StringGrid quqer БД в Delphi 1 14.03.2008 12:56


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS