![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
проблема при фильтрации [D7, XP]
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. На этом и остановился