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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 19.12.2013, 10:43
Kis Kis вне форума
Новичок
 
Регистрация: 02.09.2011
Сообщения: 76
Репутация: 11
По умолчанию 2 Adoquery

Всем добра! Проблема такая...есть 2 adoquery. в обоих есть столбец с данными "ГН". Нужно сделать так чтобы в адо2 выгрузилось время которое соответсвует "ГН" в адо1. в адо2 "ГН" в 4 столбце, в адо1 "ГН" во 2 столбце, "время" указано в 4 столбце. Нужно данные из столбца 4 адо1 соответствующие "ГН" записать в столбец 5 адо2. С циклами у меня туго, поогите пожалуйста написать код
Ответить с цитированием
  #2  
Старый 19.12.2013, 11:01
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Kis
Всем добра! Проблема такая...есть 2 adoquery. в обоих есть столбец с данными "ГН". Нужно сделать так чтобы в адо2 выгрузилось время которое соответсвует "ГН" в адо1. в адо2 "ГН" в 4 столбце, в адо1 "ГН" во 2 столбце, "время" указано в 4 столбце. Нужно данные из столбца 4 адо1 соответствующие "ГН" записать в столбец 5 адо2. С циклами у меня туго, поогите пожалуйста написать код
Такое лучше делать не циклами, а SQL запросом.

Циклами так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  ADOQuery1.First;
  while not ADOQuery1.Eof do
  begin
    if ADOQuery2.Locate('ГН', ADOQuery1['ГН'], []) then
    begin
      ADOQuery2.Edit;
      ADOQuery2['Время'] := ADOQuery1['Время'];
      ADOQuery2.Post;
    end;
    ADOQuery1.Next;
  end;
end;
Ответить с цитированием
  #3  
Старый 19.12.2013, 13:18
Kis Kis вне форума
Новичок
 
Регистрация: 02.09.2011
Сообщения: 76
Репутация: 11
По умолчанию

сделал как ты посоветовал, но он у меня не находит идентичные гаражные...проверял через точку остановы. у меня запрос из базы организуется с обрезанием имени "ГН"
Код:
ADOQuery1.SQL.Add('select * from (SELECT *, IIF(unit = "Ñ÷èòûâàòåëü 2-2", "çàåçä", "âûåçä") as new_str, mid(name,10) as new_str1 FROM events where events.message = "ïðîõîä ñîâåðøåí")order by new_str1');
т.е. в оригинале имя выглядит "987\77676 876", а в кверике "876". может быть в этом проблема?
Ответить с цитированием
  #4  
Старый 19.12.2013, 13:42
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Kis
сделал как ты посоветовал, но он у меня не находит идентичные гаражные...проверял через точку остановы. у меня запрос из базы организуется с обрезанием имени "ГН"
Код:
ADOQuery1.SQL.Add('select * from (SELECT *, IIF(unit = "Считыватель 2-2", "заезд", "выезд") as new_str, mid(name,10) as new_str1 FROM events where events.message = "проход совершен")order by new_str1');
т.е. в оригинале имя выглядит "987\77676 876", а в кверике "876". может быть в этом проблема?
Да. Сопоставление производи по идентичным полям в обоих ADOQuery.

И ещё у метода Locate есть параметр loPartialKey который позволяет искать по частичному совпадению:
Код:
ADOQuery2.Locate('ГН', ADOQuery1['ГН'], [loPartialKey]);
Ответить с цитированием
  #5  
Старый 19.12.2013, 14:05
Kis Kis вне форума
Новичок
 
Регистрация: 02.09.2011
Сообщения: 76
Репутация: 11
По умолчанию

для проверки ввел две переменные, в отладчике смотрю, они обе равны "103". Но все равно пробегает мимо бегина с эдитом

Код:
 begin
  ADOQuery2.First;
  while not ADOQuery1.Eof do
  begin
  d:= ADOQuery1['new_str1'];
  f:= ADOQuery2['garn'];
    if ADOQuery2.Locate('garn', ADOQuery1['new_str1'], []) then
    begin
      ADOQuery2.Edit;
      k := ADOQuery1['datetime'];
      ADOQuery2.Post;
    end;
    ADOQuery2.Next;
  end;
  end;

вставил поиск по части имени, тоже не помогло
Ответить с цитированием
  #6  
Старый 19.12.2013, 14:10
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Kis
для проверки ввел две переменные, в отладчике смотрю, они обе равны "103". Но все равно пробегает мимо бегина с эдитом
Эти поля целочисленного типа?
Попробуй так:
Код:
    if ADOQuery2.Locate('garn', ADOQuery1.FieldByName('new_str1').AsInteger, []) then
Ответить с цитированием
  #7  
Старый 19.12.2013, 15:08
Kis Kis вне форума
Новичок
 
Регистрация: 02.09.2011
Сообщения: 76
Репутация: 11
По умолчанию

данные текстового типа. не помогает
Ответить с цитированием
  #8  
Старый 19.12.2013, 15:18
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Kis
данные текстового типа. не помогает
Если текстового то AsString вместо AsInteger.
Ответить с цитированием
  #9  
Старый 19.12.2013, 15:23
Kis Kis вне форума
Новичок
 
Регистрация: 02.09.2011
Сообщения: 76
Репутация: 11
По умолчанию

если пишу так
Код:
  begin
  ADOQuery2.First;
  while not ADOQuery1.Eof do
  begin
  d:= ADOQuery1['new_str1'];
  f:= ADOQuery2['garn'];
    if ADOQuery2.Locate('garn', ADOQuery1.FieldByName('new_str1').AsString, [loPartialKey]) then
    begin
      ADOQuery2.Edit;
      k := ADOQuery1['datetime'];
      ADOQuery2.Post;
    end;
    ADOQuery2.Next;
  end;
  end;
то он теперь каждый раз заходит в бегин....если так
Код:
  begin
  ADOQuery2.First;
  while not ADOQuery1.Eof do
  begin
  d:= ADOQuery1['new_str1'];
  f:= ADOQuery2['garn'];
    if ADOQuery2.Locate(adoquery2.fieldbyname('garn').AsString, ADOQuery1.FieldByName('new_str1').AsString, [loPartialKey]) then
    begin
      ADOQuery2.Edit;
      k := ADOQuery1['datetime'];
      ADOQuery2.Post;
    end;
    ADOQuery2.Next;
  end;
  end;
то опять пролетает...
Ответить с цитированием
  #10  
Старый 19.12.2013, 15:41
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Kis
если пишу так
Код:
.....
    if ADOQuery2.Locate('garn', ADOQuery1.FieldByName('new_str1').AsString, [loPartialKey]) then
    begin
.....
то он теперь каждый раз заходит в бегин....
Не каждый раз, а только пи частичном совпадении с "эталонным" полем 'garn'. Если в какой-то записи это поле пустое, то очевидно что частичное совпадение будет для любой строки и тогда действительно будет заходить каждый раз
Цитата:
Сообщение от Kis
если так
Код:
.....
    if ADOQuery2.Locate(adoquery2.fieldbyname('garn').AsString, ADOQuery1.FieldByName('new_str1').AsString, [loPartialKey]) then
    begin
.....
то опять пролетает...
Первым параметром в методе Locate должны быть перечислены через ';' имена полей по которым нужно искать, поэтому второй вариант однозначно неправильный.
Ответить с цитированием
  #11  
Старый 19.12.2013, 16:05
Kis Kis вне форума
Новичок
 
Регистрация: 02.09.2011
Сообщения: 76
Репутация: 11
По умолчанию

т.е. если я правильно понимаю то правильно будет так?
Код:
 if ADOQuery2.Locate('garn', ADOQuery1.FieldByName('new_str1').AsString, []) then

в этом случае он постоянно заходит в бегин. поля garn и new_str1 точно не пустые!
Ответить с цитированием
  #12  
Старый 19.12.2013, 16:09
Kis Kis вне форума
Новичок
 
Регистрация: 02.09.2011
Сообщения: 76
Репутация: 11
По умолчанию

причем навожу курсор на asstring в этой строке
Код:
  if ADOQuery2.Locate(adoquery2.fieldbyname('garn').AsString, ADOQuery1.FieldByName('new_str1').AsString, [loPartialKey]) then
, показывает одинаковые значения у полей...но не заходит в бегин
Ответить с цитированием
  #13  
Старый 19.12.2013, 18:26
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Kis
т.е. если я правильно понимаю то правильно будет так?
Код:
 if ADOQuery2.Locate('garn', ADOQuery1.FieldByName('new_str1').AsString, []) then

в этом случае он постоянно заходит в бегин. поля garn и new_str1 точно не пустые!
Вставь проверку:
Код:
if ADOQuery2.Locate('garn', ADOQuery1.FieldByName('new_str1').AsString, []) then
begin
  ShowMessageFmt('Я зашёл сюда, потому что в ADOQuery2 в записи №%d поле garn имеет значение "%s"'+
    ' и в ADOQuery1 в записи №%d поле new_str1 тоже имеет значение "%s"', [
    ADOQuery2.RecNo,
    ADOQuery2.FieldByName('garn').AsString,
    ADOQuery1.RecNo,
    ADOQuery1.FieldByName('new_str1').AsString
  ]);
.....

Цитата:
Сообщение от Kis
причем навожу курсор на asstring в этой строке
Код:
  if ADOQuery2.Locate(adoquery2.fieldbyname('garn').AsString, ADOQuery1.FieldByName('new_str1').AsString, [loPartialKey]) then
, показывает одинаковые значения у полей...но не заходит в бегин
Ещё раз повторю: первым параметром метода Locate должны быть имена полей, а не их содержимое.
Ответить с цитированием
  #14  
Старый 20.12.2013, 08:36
Kis Kis вне форума
Новичок
 
Регистрация: 02.09.2011
Сообщения: 76
Репутация: 11
По умолчанию

Решил не использовать локейт...написал такой код
Код:
begin
  adoquery1.First;
  while not adoquery2.Eof do
    begin
    ADOQuery2.First;
    while not ADOQuery1.Eof do
      begin
      d:= ADOQuery1['new_str1'];
      f:= ADOQuery2['garn'];
      if f=d then
          begin
          ADOQuery2.Edit;
          adoquery2['fio2'] := ADOQuery1['datetime'];
          ADOQuery2.Post;
          end;
    ADOQuery2.Next;
      end;
    adoquery1.Next;
    end;
end;
теперь прога виснет...как я понял, я написал "вечный цикл"? помогите исправить, а то не пойму где ошибка
Ответить с цитированием
  #15  
Старый 20.12.2013, 09:07
Kis Kis вне форума
Новичок
 
Регистрация: 02.09.2011
Сообщения: 76
Репутация: 11
По умолчанию

все решил, всем спасибо за помощь!
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter