Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

проблема при фильтрации [D7, XP]


Страницы:   1 2 3

gvozdkoff ©   (2012-01-05 19:40:00) 

Есть csv файл,
нужно отфильтровать в этом файле записи по дате (формат записи даты 160811 ), либо по интервалу дат, следовательно нужно будет делать группировку по дате, чтобы найти неповторяющиеся значения

нашел процедуру , которая выводит этот файл в stringgrid


procedure ReadTabFile(FN: TFileName; FieldSeparator:
Char; SG: TStringGrid);
var
 i: Integer;
 S: string;
 T: string;
 Colonne, ligne: Integer;
 Les_Strings: TStringList;
 CountCols: Integer;
 CountLines: Integer;
 TabPos: Integer;
 StartPos: Integer;
 InitialCol: Integer;
begin
 Les_Strings := TStringList.Create;
 try
   // Load the file, Datei laden
   Les_Strings.LoadFromFile(FN);

   // Get the number of rows, Anzahl der Zeilen ermitteln
   CountLines := Les_Strings.Count + SG.FixedRows;

   // Get the number of columns, Anzahl der Spalten ermitteln
   T := Les_Strings[0];
   for i := 0 to Length(T) - 1 do Inc(CountCols,
   Ord(IsDelimiter(FieldSeparator, T, i)));
   Inc(CountCols, 1 + SG.FixedCols);

   // Adjust Grid dimensions, Anpassung der Grid-Gro?e
   if CountLines > SG.RowCount then SG.RowCount := CountLines;
   if CountCols > SG.ColCount then SG.ColCount := CountCols;

   // Initialisierung
   InitialCol := SG.FixedCols - 1;
   Ligne := SG.FixedRows - 1;

   // Iterate through all rows of the table
   // Schleife durch allen Zeilen der Tabelle
   for i := 0 to Les_Strings.Count - 1 do
   begin
     Colonne := InitialCol;
     Inc(Ligne);
     StartPos := 1;
     S := Les_Strings[i];
     TabPos := Pos(FieldSeparator, S);
     repeat
       Inc(Colonne);
       SG.Cells[Colonne, Ligne] := Copy(S, StartPos, TabPos - 1);
       S := Copy(S, TabPos + 1, 999);
       TabPos := Pos(FieldSeparator, S);
     until TabPos = 0;
   end;
 finally
   Les_Strings.Free;
 end;
end;


Далее использую VirtualTable из компонента MyDAC.
Это чтобы отфильтровать по дате
При создании формы создаю поля для VirtualTable
Тип поля STRING

procedure TForm1.FormCreate(Sender: TObject);
begin
  VirtualTable1.Open;
VirtualTable1.Clear;

VirtualTable1.AddField('1', ftString, 20, false);
VirtualTable1.AddField('2', ftString, 20, false);
VirtualTable1.AddField('3', ftString, 20, false);
VirtualTable1.AddField('4', ftString, 20, false);
VirtualTable1.AddField('5', ftString, 20, false);
VirtualTable1.AddField('6', ftString, 20, false);
VirtualTable1.AddField('7', ftString, 20, false);
VirtualTable1.AddField('8', ftString, 20, false);
VirtualTable1.AddField('9', ftString, 20, false);
VirtualTable1.AddField('10', ftString, 20, false); //  это поле будет отображать дату

Ну  и начинаю заполнять VirtualTable из StringGrid

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
ReadTabFile('log.csv', ',', StringGrid1); // заполняю StringGrid1 из csv файла
VirtualTable1.Clear;
virtualtable1.Active:=true;
  for i:=1 to form1.StringGrid1.RowCount-1  do
begin
  VirtualTable1.Append;
 VirtualTable1.Edit;
 VirtualTable1.FieldByName('1').AsString:=stringgrid1.cells[1,i];
 VirtualTable1.FieldByName('2').AsString:=stringgrid1.cells[2,i];
 VirtualTable1.FieldByName('3').AsString:=stringgrid1.cells[3,i];
 VirtualTable1.FieldByName('4').AsString:=stringgrid1.cells[4,i];
 VirtualTable1.FieldByName('5').AsString:=stringgrid1.cells[5,i];
 VirtualTable1.FieldByName('6').AsString:=stringgrid1.cells[6,i];
 VirtualTable1.FieldByName('7').AsString:=stringgrid1.cells[7,i];
 VirtualTable1.FieldByName('8').AsString:=stringgrid1.cells[8,i];
 VirtualTable1.FieldByName('9').AsString:=stringgrid1.cells[9,i];
 VirtualTable1.FieldByName('10').AsString:=stringgrid1.cells[10,i]; //  это поле будет отображать дату
 VirtualTable1.post;
VirtualTable1.Refresh;
 end;

Результат отображается в DbGRID
DBGrid1.DataSource:=DataSource1
DataSource1.DataSet:=VirtualTable1
До это момента ошибок пока не наблюдалась, а сейчас сортирую по полю

VirtualTable1.Filter:='10="inttostr(160811)"';
VirtualTable1.Filtered := True;

И вот здесь выдает ошибку  " could not convert variant of type string into type double "
Подскажите как это решить, пожалуйста


Sha   (2012-01-06 12:42:00) [21]

Удалено модератором
Примечание: дубль


gvozdkoff   (2012-01-06 12:35:00) [22]


> sniknik ©   (06.01.12 12:31) [29]
> > Кстати dBgrid отображает дату в формате 16.08.2011, то
> есть полностью год добавляется.
> кстати это зависит от локальных настроек системы, вполне
> может быть и так 08.16.2011 и так 08.16.11. закладываться
> на изменяемый формат строкового представления нельзя...
>  если конечно прога не "одного компьютера". тогда пофигу.
>

вообще прога пишется не для массового распространения , а как вы и сказали для "одного компьютера", и честно говоря с датами вот не тестировал


sniknik   (2012-01-06 12:31:00) [23]

> Кстати dBgrid отображает дату в формате 16.08.2011, то есть полностью год добавляется.
кстати это зависит от локальных настроек системы, вполне может быть и так 08.16.2011 и так 08.16.11. закладываться на изменяемый формат строкового представления нельзя...  если конечно прога не "одного компьютера". тогда пофигу.


gvozdkoff   (2012-01-06 12:31:00) [24]

пользователь  не будет проверять есть ли ошибки в программе,  в дальнейшем для пользователя dbgrid будет visible:=false;
dbgrid я использую для себя , чтобы проверить например фильтрацию, и если отфильтровано по дате правильно, то пользователь получит координаты GPS за этот интервал  дат либо за дату.
А координаты будут либо в текстовом файле, а хотя можно и в гриде, сделав columns[i].visible:=fasle;


Sha   (2012-01-06 12:15:00) [25]

Я правильно понял, пользователь будет проверять, нет ли в программе ошибок?


gvozdkoff   (2012-01-06 12:07:00) [26]


> Sha ©   (06.01.12 09:06) [25]
> я первый спросил
))
в первый stringlist я загружаю данные из csv, а в dbgride вывожу результат чтобы было видно что у меня получается а что нет, и сравниваю гриды, где у меня произошло искажение данных. вот например как с датой, было 160811 а стало 13.04.2340


Sha   (2012-01-06 09:06:00) [27]

я первый спросил


gvozdkoff   (2012-01-06 03:41:00) [28]

И еще вопросик, не могу додумать до конца как сделать выборку в интервале дат, варианты
либо с еdit.text вводить в ручную, но опять же нужно знать какие даты есть
либо с ComboBox1, в который загружаются значения из файла с датами.
Тут снова не все хорошо, так как одна и таже дата может повторятся десятки и сотни раз.
Подумал о группировке по дате. подскажите, пожалуйста, как это можно реализовать?


gvozdkoff   (2012-01-06 03:18:00) [29]

Вобщем не осилил я в гриде  понатыкать разделителей.
Сделал следующим образом.
Значения stringgrid1.Cols[10]сохранил в файл, а вот разделить строку  в файле мне уже знакомо.
текстовый файл получился такого вида
16.08.11
28.12.11
28.12.11
Затем снова подгружаю файл в stringgrid1.Cols[10].
Далее  работаем  c virtualtablу.
Кстати dBgrid отображает дату в формате 16.08.2011, то есть полностью год добавляется.
Запрос соответственно пишу так
VirtualTable1.Filter:='f10="16.08.2011"';


Sha   (2012-01-06 01:52:00) [30]

а почему гридов 2, а не 3 ?


gvozdkoff   (2012-01-06 01:35:00) [31]

то есть, как я понял, нужно  строковое представление даты  перевести в значение типа TDateTime,
для этого как сказал

> Сергей М. ©
должен подсуетиться, понатыкав в строку разделители между днем, месяцем и годом, перед тем как скармливать строку св-ву
VirtualTable1.FieldByName('10').Value

значение каждой записи в поле "10"   разделить на dd.mm.yy, этим получиться строковое представление даты и потом все это дело перевести  в значение типа TDateTime.

А разделитель вставлять в stringgride или после того, как переместили все в Dbgrid?


sniknik   (2012-01-05 22:31:00) [32]

+
имена цифрами не задаются... буква в начале минимум должна быть.


Сергей М.   (2012-01-05 21:59:00) [33]


> дату 160811  в dbgride выводит как 13.04.2340


Правильно выводит.
Откуда же ему знать что это дата ?
Ты сам должен подсуетиться, понатыкав в строку разделители между днем, месяцем и годом, перед тем как скармливать строку св-ву
VirtualTable1.FieldByName('10').Value


Sha   (2012-01-05 21:53:00) [34]

Все правильно:
160 тыщ дней = 440 лет
1900 + 440 = 2340


gvozdkoff   (2012-01-05 21:46:00) [35]

при создании поля в VirtualTable1, следует . видимо присвоить ему тип DateTime
VirtualTable1.AddField('10', ftDateTime, 0, false);
Далее этому полю присваиваем значения из столбца в Stingride
VirtualTable1.FieldByName('10').AsDateTime:=stringgrid1.cells[10,i];

здесь  выходит ошибка, если же делаю так
VirtualTable1.FieldByName('10').AsVariant:=stringgrid1.cells[10,i];

то дату 160811  в dbgride выводит как 13.04.2340


gvozdkoff   (2012-01-05 21:25:00) [36]

Да я вот как раз рассматриваю вариант > Sha (C)


Dennis I. Komarov   (2012-01-05 21:10:00) [37]


> А вообще Sha (C) тебя пытается вразумить и наставить на
> путь вполне праведный - ты прислушался бы)

Эм, а как же быть героем? :)


Сергей М.   (2012-01-05 20:37:00) [38]


> записываются туда данные в 6 символов


Не факт.
То что ты видишь 6 символов и не видишь прочие "пробельные" символы, вовсе не говорит о том что их там нет.

А вообще Sha (C) тебя пытается вразумить и наставить на путь вполне праведный - ты прислушался бы)


gvozdkoff   (2012-01-05 20:30:00) [39]


> > ну ведь есть же такое
>
>
> ага, есть)
> вот такое '160811              '

а вот теперь совсем не понял, если я создаю поле размером 20, записываются туда данные в 6 символов, а все остальное пробелы чтоли, единственная догадка у меня


Сергей М.   (2012-01-05 20:26:00) [40]


> ну ведь есть же такое


ага, есть)
вот такое '160811              '


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо