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 "
Подскажите как это решить, пожалуйста


gvozdkoff   (2012-01-05 20:17:00) [41]


> Сергей М. ©   (05.01.12 20:14) [10]
>
> > выдает одну пустую строку
>
>
> Значит в НД нет ни одной записи, содержащей в поле с именем
> '10' значение точно равное строке '160811'
>
>
> > но ошибка исчезла
>
>
> Ну так что просил - то и получил)


)) ну да что просил , а если серьезно то, я сначала тоже подумал что нет записи в 10-м поле, специально посмотрел. ну ведь есть же такое!


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


> выдает одну пустую строку


Значит в НД нет ни одной записи, содержащей в поле с именем '10' значение точно равное строке '160811'


> но ошибка исчезла


Ну так что просил - то и получил)


Sha   (2012-01-05 20:14:00) [43]

и даже отбирать по дате (диапазону) можно в момент загрузки


Sha   (2012-01-05 20:12:00) [44]

в смысле нужного, TDateTime, например


Sha   (2012-01-05 20:11:00) [45]

> gvozdkoff   (05.01.12 19:57) [6]

почему нельзя строковые данные из лога
грузить в данные соответствующего типа?


gvozdkoff   (2012-01-05 19:57:00) [46]


> Sha ©   (05.01.12 19:49) [3]
> нельзя ли приблизительно описать цель?

Вобщем, лог-файл GPS навигатора,в этот лог записываются координаты через каждые 30 секунд, записи дабавляются каждый день,
цель  - выборка по дате


gvozdkoff   (2012-01-05 19:54:00) [47]


> Сергей М. ©   (05.01.12 19:50) [4]
> Filter:= Format('10="%u"', [160811]);

выдает одну пустую строку (( ,
но ошибка исчезла )


Сергей М.   (2012-01-05 19:50:00) [48]

Filter:= Format('10="%u"', [160811]);


Sha   (2012-01-05 19:49:00) [49]

нельзя ли приблизительно описать цель?


Сергей М.   (2012-01-05 19:49:00) [50]

Filter:= Format('10=%u', [160811]);


gvozdkoff   (2012-01-05 19:46:00) [51]

рассматривал как вариант занести все данные в базу (sqlite), используя ZEOS Access, а потом уже запросами.
Но это альтернативный вариант, особо не разбирался, остановился на том что dbgrid как  то странно отображает данные, во всех ячейках отображается надпись MEMO. На  этом и остановился


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

Наверх

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