Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.09.2009, 11: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, 14: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 в 14:59.
АНК вне форума Ответить с цитированием
Старый 09.09.2009, 14: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 в 14:54.
Crazy_Wolfy вне форума Ответить с цитированием
Старый 09.09.2009, 15:58   #4
HIC
Пользователь
 
Регистрация: 20.06.2007
Сообщений: 39
По умолчанию

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

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

Последний раз редактировалось HIC; 10.09.2009 в 08:43.
HIC вне форума Ответить с цитированием
Старый 09.09.2009, 16: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 в 16:28.
Evgeniy26 вне форума Ответить с цитированием
Старый 09.09.2009, 17: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 в 17:23.
soleil@mmc вне форума Ответить с цитированием
Старый 09.09.2009, 17:27   #7
Evgeniy26
Форумчанин
 
Аватар для Evgeniy26
 
Регистрация: 29.05.2009
Сообщений: 384
По умолчанию

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

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

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

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

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


Купить рекламу на форуме - 42 тыс руб за месяц

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выборка данных из таблицы и составление отчета! WildKosha Microsoft Office Excel 20 25.02.2013 16:11
Выборка данных ADRENALIN86 Microsoft Office Excel 1 13.08.2009 15: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