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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2016, 12:23   #21
royun
Пользователь
 
Регистрация: 20.05.2011
Сообщений: 67
По умолчанию

Вот сделал такой код, но он ничего не делает.

Код:
procedure TForm1.Button4Click(Sender: TObject);
var
iRow:integer;
Dubls:integer;
begin
AdoDataSet1.Active:=False;
Dubls:=0;
RecCount:=0;
AdoDataSet1.CommandText:='select * from ['+Combobox1.Text+']';
AdoDataSet1.Active:=True;
ADODataSet1.First;
for iRow := StringGrid2.FixedRows to StringGrid2.RowCount - 1 do
begin
  if StringGrid2.Cells[1,iRow] <> '' then
  begin
  
      if ((ADODataSet1['data'])= (StrToDateTime(StringGrid2.Cells[1, iRow]))) and
         ((ADODataSet1['fio'])  = (StringGrid2.Cells[2, iRow])) then Dubls := Dubls + 1         
  end;
end;
ShowMessage('Дублей '+ IntToStr(Dubls) +'!');
end;

Последний раз редактировалось royun; 31.03.2016 в 12:30.
royun вне форума Ответить с цитированием
Старый 31.03.2016, 13:46   #22
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) а где цикл перебора записей в датасете?!
Или Вас, судя по коду
Цитата:
Код:
ADODataSet1.First;
только самая первая интересует? Остальные записи в наборе данных Вы не рассматриваете?


да и по первой записи не всё так однозначно...
Цитата:
Код:
ADODataSet1['data']
datetime такой "хитрый" тип данных, который содержит не только собственно саму дату, но ещё и время (часы,минуты, секунды и миллисекунды).
если хоть на одну миллисекунду не будет совпадать, то равенство ничего не даст.

попробуйте так написать:
Код:
procedure TForm1.Button4Click(Sender: TObject);
var
  iRow:integer;
  Dubls:integer;
  dt:TDateTime;
begin
AdoDataSet1.Active:=False;
Dubls:=0;
RecCount:=0;
AdoDataSet1.CommandText:='select * from ['+Combobox1.Text+']';
AdoDataSet1.Active:=True;
ADODataSet1.First;
for iRow := StringGrid2.FixedRows to StringGrid2.RowCount - 1 do
begin
  if StringGrid2.Cells[1,iRow] <> '' then
  begin
      dt := ADODataSet1['data'].AsDateTime; 
      if ( (Trunc(dt) = Trunc(StrToDateTime(StringGrid2.Cells[1, iRow])) ) and
             (AnsiUpperCase(Trim(ADODataSet1['fio'])) = AnsiUpperCase(Trim(StringGrid2.Cells[2, iRow]))) ) 
             then Inc(Dubls);
  end;
end;
ShowMessage('Дублей '+ IntToStr(Dubls) +'!');
end;
если не поможет, тогда в отладчик и пошагово проходите, смотрите, чему равны значения. Ещё можно кинуть мемо и выводить значения туда
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.04.2016, 05:02   #23
royun
Пользователь
 
Регистрация: 20.05.2011
Сообщений: 67
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
1) а где цикл перебора записей в датасете?!
Или Вас, судя по коду
только самая первая интересует? Остальные записи в наборе данных Вы не рассматриваете?


да и по первой записи не всё так однозначно...

datetime такой "хитрый" тип данных, который содержит не только собственно саму дату, но ещё и время (часы,минуты, секунды и миллисекунды).
если хоть на одну миллисекунду не будет совпадать, то равенство ничего не даст.

попробуйте так написать:
Код:
procedure TForm1.Button4Click(Sender: TObject);
var
  iRow:integer;
  Dubls:integer;
  dt:TDateTime;
begin
AdoDataSet1.Active:=False;
Dubls:=0;
RecCount:=0;
AdoDataSet1.CommandText:='select * from ['+Combobox1.Text+']';
AdoDataSet1.Active:=True;
ADODataSet1.First;
for iRow := StringGrid2.FixedRows to StringGrid2.RowCount - 1 do
begin
  if StringGrid2.Cells[1,iRow] <> '' then
  begin
      dt := ADODataSet1['data'].AsDateTime; 
      if ( (Trunc(dt) = Trunc(StrToDateTime(StringGrid2.Cells[1, iRow])) ) and
             (AnsiUpperCase(Trim(ADODataSet1['fio'])) = AnsiUpperCase(Trim(StringGrid2.Cells[2, iRow]))) ) 
             then Inc(Dubls);
  end;
end;
ShowMessage('Дублей '+ IntToStr(Dubls) +'!');
end;
если не поможет, тогда в отладчик и пошагово проходите, смотрите, чему равны значения. Ещё можно кинуть мемо и выводить значения туда
Спасибо, за терпение и труд.
royun вне форума Ответить с цитированием
Старый 01.04.2016, 09:52   #24
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

всегда пожалуйста.

Так у Вас всё получилось?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.04.2016, 11:38   #25
royun
Пользователь
 
Регистрация: 20.05.2011
Сообщений: 67
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
всегда пожалуйста.

Так у Вас всё получилось?
Вот так получилось.
Код:
procedure TForm1.Button4Click(Sender: TObject);
var
  iRow:integer;
  Dubls:integer;
  dt:TDateTime;
begin
AdoDataSet1.Active:=False;
Dubls:=0;
RecCount:=0;
AdoDataSet1.CommandText:='select * from ['+Combobox1.Text+']';
AdoDataSet1.Active:=True;
ADODataSet1.First;
for iRow := StringGrid2.FixedRows to StringGrid2.RowCount - 1 do
begin
  if StringGrid2.Cells[1,iRow] <> '' then
  begin
      dt := ADODataSet1['data'].AsDateTime; 
      if ( (Trunc(dt) = Trunc(StrToDateTime(StringGrid2.Cells[1, iRow])) ) and
      (AnsiUpperCase(Trim(ADODataSet1['fio'])) = AnsiUpperCase(Trim(StringGrid2.Cells[2, iRow]))) ) 
             then
        begin
          Inc(Dubls);
          AdoDataSet1.Next;
        end;
  end;
end;
ShowMessage('Дублей '+ IntToStr(Dubls) +'!');
end;
Теперь возник еще один вопрос: Мне надо получить только уникальные значения по дате в StringGrid2.Cells[1, iRow], все дубли убрать. Быстрый способ не подскажите?
royun вне форума Ответить с цитированием
Старый 01.04.2016, 12:10   #26
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Вот так получилось.
Код не очень надежный.
Думаю, что это код работает только потому что у Вас и даты в StringGrid2 и даты в запросе ADODataSet упорядочены.
Рискну предположить, что если это будет не так, код может не сработать.
Просто возьмите это себе на заметку.

Цитата:
Мне надо получить только уникальные значения по дате в StringGrid2.Cells[1, iRow], все дубли убрать. Быстрый способ не подскажите?
а откуда взялись данные в StringGrid2 ?
может быть, проще их убрать на этапе заполнения?

и сколько же у Вас записей в StringGrid, что Вы переживаете за скорость? (если я правильно понял вопрос про "быстрый" способ).

Последний раз редактировалось Serge_Bliznykov; 01.04.2016 в 12:15.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.04.2016, 12:16   #27
royun
Пользователь
 
Регистрация: 20.05.2011
Сообщений: 67
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
а откуда взялись данные в StringGrid2 ?
может быть, проще их убрать на этапе заполнения?

и сколько же у Вас записей в StringGrid, что Вы переживаете за скорость? (если я правильно понял вопрос про "быстрый" способ).
Данные загружаются в StringGrid, затем в СУБД MS SQL Server 2000. И перед тем как загружать в БД, проверяю на уникальность, т.е. имеется запись StringGrid в БД.

А теперь понадобилось получить уникальные даты.

Порядка 50 тыс
royun вне форума Ответить с цитированием
Старый 01.04.2016, 12:31   #28
royun
Пользователь
 
Регистрация: 20.05.2011
Сообщений: 67
По умолчанию

Пробовал через memo, долго.
royun вне форума Ответить с цитированием
Старый 01.04.2016, 12:33   #29
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

Цитата:
Сообщение от royun Посмотреть сообщение
Данные загружаются в StringGrid
откуда они загружаются в стринггрид БД, файл?? нужны ли повторяющиеся данный в гриде??
Терпение!Дежурный экстрасенс скоро свяжется с вами!

Последний раз редактировалось Dvoishnik; 01.04.2016 в 12:36.
Dvoishnik вне форума Ответить с цитированием
Старый 01.04.2016, 12:38   #30
royun
Пользователь
 
Регистрация: 20.05.2011
Сообщений: 67
По умолчанию

Цитата:
Сообщение от Dvoishnik Посмотреть сообщение
откуда они загружаются в стринггрид БД, файл?? нужны ли повторяющиеся данный в гриде??
Да через файл. Да
royun вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ошибка ADOQuery:DATAset not in edit or insert mode Novichok95 БД в Delphi 4 05.11.2012 18:00
Чтение данных из ADOQuery rainbow БД в Delphi 1 25.08.2011 10:53
Виснет AdoQuery при INSERT sergey_dmitrievich C/C++ Базы данных 0 01.08.2011 13:17
Сохранить из RichEdit текст и форматирование запросом для ADOQuery через INSERT INTO silent_lab БД в Delphi 0 15.07.2011 16:58
База Данных MySql не выполняется INSERT INTO vasylshvv Java Базы данных (JDBC, JPA, Hibernate) 6 04.08.2009 10:16