![]() |
| ||
|
|
Новости |
Поиск |
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 "
Подскажите как это решить, пожалуйста
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 '