Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.28;
Скачать: CL | DM;

Вниз

Номер записи   Найти похожие ветки 

 
13-ый   (2004-01-27 12:17) [0]

Есть таблица(Table Не Query-это принципиально) необходимо после фильтрации данных в этой таблице вычислить номер каждой записи.
Т.е. если было 6 записей ,а после фильтрации осталось 3,то и соответственно номера должны идти по-порядку (в первом случае от 1 к 6,а во втором от 1 к 3 не смотря  ни на что)


 
Sandman25 ©   (2004-01-27 12:23) [1]

Зачем это нужно?
Добиться этого довольно сложно, особенно с учетом фильтрации.


 
13-ый   (2004-01-27 12:26) [2]

Это необходимо для отображения номера учащегося в таблице студентов.
Делаю это при помощи вычисляемового поля в котором Value:=Table1.RecNo;


 
Sandman25 ©   (2004-01-27 12:28) [3]

Я так и думал. Но при фильтрации номера остаются прежними...
И все-таки, зачем это нужно? Зачем номер студента отображать? Общее количество недостаточно?


 
13-ый   (2004-01-27 12:32) [4]

Да нет это необходимо.Должо быть поле в котором отображение должно быть номера каждой записию


 
Sandman25 ©   (2004-01-27 12:37) [5]

Для Query можно добавить поле:

select cast(0 as integer) nomer, T.*
 from table T

А затем каждый раз после фильтрации пробегаться по DataSet и присваивать новое значение nomer-у. Только надо будет использовать CashedUpdates = true.


 
VAleksey ©   (2004-01-27 12:47) [6]


> 13-ый   (27.01.04 12:32) [4]

Так ты объяснишь ЗАЧЕМ это нужно иным образом, кроме "необходимо"?

> Это необходимо для отображения номера учащегося в таблице
> студентов.

Это - не номер учащегося.


 
div ©   (2004-01-28 10:19) [7]

Напиши обработчик события OnCalcFields примерно так (предполагая, что твое калькулироемре поле называется "RowNo"):

procedure TForm1.Table1CalcFields(DataSet: TDataSet);
{$J+} // - в D7 разрешает изменять типизированные константы
const
 RowNo: integer = 0;
begin
 if DataSet.RecNo = 1 then
   RowNo := 0;
 RowNo := RowNo + 1;
 DataSet.FieldBayName("RowNo").AsInteger := RowNo;
end;


 
Плохиш_   (2004-01-28 10:35) [8]

>div ©   (28.01.04 10:19) [7]

Сам-то пробовал?


 
div ©   (2004-01-28 10:42) [9]

2 Плохиш_
пробовал...


 
jack128 ©   (2004-01-28 10:48) [10]

и что  получилось?
ЗЫ
procedure TForm1.Table1CalcFields(DataSet: TDataSet);
begin
 Dataset.FieldByName("RowNo").AsInteger := DataSet.RecNo;
end;


 
Некто   (2004-01-28 11:26) [11]

В обработчике прорисовки Грида выводить номер текущей записи.


 
Anatoly Podgoretsky ©   (2004-01-28 11:59) [12]

Забыть об этом, как о не нужной вещи и из за отсутствия реализации этого в базе данных.


 
Некто   (2004-01-28 12:03) [13]

2 Anatoly Podgoretsky
 "Если звезды зажигаются, значит, это кому-то нужно..." (С)


 
Anatoly Podgoretsky ©   (2004-01-28 12:13) [14]

О нужности/ненужности можно много говорить, но данный номер за собой ничего не несет.


 
Volodya_   (2004-01-28 12:13) [15]

2 Некто   (28.01.04 11:26) [11]
На какой точно обработчик вешать?


 
div ©   (2004-01-28 12:15) [16]

мда уж... чушь написал и сам не понял... если кто скажет как это можно сделать поставлю пиво :)))

2 jack128 ©   (28.01.04 10:48) [10] - это тож не то что он хочет...


 
Некто   (2004-01-28 12:22) [17]

OnDrawColumnCell


 
Некто   (2004-01-28 12:26) [18]

2 Anatoly Podgoretsky
 Существует единственный критерий нужности: если человек задал вопрос - значит, ему это нужно.


 
Anatoly Podgoretsky ©   (2004-01-28 12:36) [19]

Некто   (28.01.04 12:26) [18]
Это уже не первый человек. Следующий вопрос от пользователя, почему у этого человек поменялся номер.


 
Sandman25 ©   (2004-01-28 12:36) [20]

[18] Некто   (28.01.04 12:26)

Вы не будете предлагать человеку другое решение, если он уже какое-то выбрал, причем выбрал, не зная всех возможных решений? Если человек пытается уменьшить размер файла на 1 байт, считывая весь файл в TStringList, изменяет один Strings, и записывает в тот же файл, но наткнулся на ограничение размера, Вы ему посоветуете уйти с Win95 или добавить памяти? Вместо того, чтобы предложить Truncate?


 
Некто   (2004-01-28 12:49) [21]

О!... Церберы накинулись! :)... Спровоцировал таки!... ;)

2 Anatoly Podgoretsky
 То, о чем идет речь - не номер человека. Это - номер записи в отфильтрованном DataSet. Порядковый номер записи в результирующем наборе данных. (Перефразировать по-другому?).

>>из за отсутствия реализации этого в базе данных
Во-первых, то, о чем идет речь - не уровень данных, а уровень представления. Поэтому о базе данных говорить поздно. Хотя, если Вас послушать, тогда давайте вообще откажемся от нумерации! Начнем с номеров страниц в книгах, потому что номер страницы никак не связан с информацией, представленной в книге. Согласны?
Во-вторых, в DataSet"e есть свойство RecNo. Интересно, зачем оно нужно? Не объясните?

2 Sandman25
 Вопрос стоял не "что сделать", а "как сделать". Вот когда он спросит "как сделать лучше" - тогда и советовать будете. А до тех пор - или отвечайте на поставленный вопрос, или молчите. Потому что советов можно надавать сколько угодно. Только нужны ли они вопрошающему?


 
Sandman25 ©   (2004-01-28 12:58) [22]

[21] Некто   (28.01.04 12:49)

В данном случае согласен, мне следовало молчать. Только потом не жалуйтесь, если какая-то программа будет становиться в автозагрузку, гадить в реестре и запрашивать по 3 подтверждения на каждую операцию. Ведь Вы запретили мне советовать, что следует делать, а что не следует :)


 
Некто   (2004-01-28 13:07) [23]

2 Sandman25
 Это рассудит рынок. Плохую программу никто не купит. :)
 Но я все же думаю, что в нумерации строк таблицы нет ничего крамольного. Ведь пользователи не жалуются на нумерацию строк и столбцов в том же Excel"е. Ведь удобно сказать, сидя с собеседником перед монитором: "обратите внимание на строку 238". А большего, поди, от такой нумерации и не требуется.


 
Sandman25 ©   (2004-01-28 13:09) [24]

[23] Некто   (28.01.04 13:07)

Согласен.
Но опять-таки с оговорками. Если из-за этого не будет замедления, которое для пользователя более неудобно, чем ему номера удобны. Надеюсь, эта конструкция понимаема :)


 
Anatoly Podgoretsky ©   (2004-01-28 13:15) [25]

Некто   (28.01.04 12:49) [21]
Давай не будем отказываться от номеров в накладных, отчетов.
Речь же идет об RecNo, который совсем не RecNo, и который оставлен для совместимости с древними временами, в большинстве случаев ты получишь номер -1

Ему же по уточнению в [2] нужен не RecNo, "Это необходимо для отображения номера учащегося в таблице студентов"


 
Volodya_   (2004-01-28 13:16) [26]

2 Некто   (28.01.04 12:22) [17]
Проц грузится на 100%


 
Некто   (2004-01-28 13:16) [27]

Замедления в работе программы или в работе с программой?...

Если программы, то вряд ли это вызовет замедление:

procedure TForm1.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
 if (DataCol = 0) then
   DBGrid.Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2, IntToStr(Table.RecNo));
end;

P.S. Ух... о чем мы спорим? 13-й давно уже ушел... :о)


 
Некто   (2004-01-28 13:19) [28]

2 Sandman25
 У Володи-С-Подчерком от этого процессор грузится на 100%. Вот это уже проблема...


 
Sandman25 ©   (2004-01-28 13:19) [29]

[27] Некто   (28.01.04 13:16)

Можно еще попробовать OnGetText, для этого TField.
Все, прекращаю "спорить". Вроде мы друг друга поняли :)


 
Плохиш   (2004-01-28 13:21) [30]

>Некто   (28.01.04 13:16) [27]
>    DBGrid.Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top
> + 2, IntToStr(Table.RecNo));

А что, если к таблице применить фильтр, RecNo то же измениться?


 
Некто   (2004-01-28 13:26) [31]

2 Anatoly Podgoretsky
 >>номера учащегося
 "Я бывают разные!" (С) Заяц :)

Вариант 1: Для распечатки списка студентов по группам. Вас в данном случае интересует номер студента в базе данных, или просто порядковый номер студента в списке студентов группы, отсортированном в алфавитном порядке?

Вариант 2: Регистрационный номер студента в базе данных. В общем случае такое номер используется в качестве первичного ключа. Если этот номер присутствует в базе данных, то у вопрошающего вряд ли бы возник (заданный) вопрос.

P.S. С радостью рассмотрю другие варианты...


 
Некто   (2004-01-28 13:27) [32]

2 Sandman25
 :)


 
Некто   (2004-01-28 13:32) [33]

2 Плохиш
 Не буду говорить о таблицах Paradox (13-ый   (27.01.04 12:26) [2]), но в ADO меняется...


 
Anatoly Podgoretsky ©   (2004-01-28 13:39) [34]

Некто   (28.01.04 13:26) [31]
Вроде я уже сказал про отчеты, или мне почуилось, в отчетах это святое, но там и не RecNo, а чистый порядковы, вычисляемый номер, никак проблем ни с номером ни с ненужностью.


 
Плохиш   (2004-01-28 13:39) [35]

>Некто   (28.01.04 13:26) [31]

>Вариант 1
Делается средствами подготовки отчёта

>Вариант 2
Никакого отношения к заданному вопросу (порядковый номер) не имеет


 
Некто   (2004-01-28 13:57) [36]

2 Плохиш

> >Вариант 1
> Делается средствами подготовки отчёта

Да, извините, опечатался. Перефразирую: "Для выборки списков студентов по группам"
Какой смысл использовать генераторы отчетов, если конечному пользователю достаточно простого представления в виде электронной таблицы? Просто чтобы посмотреть, обсудить, сидя перед монитором, и закрыть окно. Не больше, но и не меньше.


> >Вариант 2
> Никакого отношения к заданному вопросу (порядковый номер)
> не имеет

см. [31] "...у вопрошающего вряд ли бы возник (заданный) вопрос.". Попрошу меня не цитировать! :)

2 Anatoly Podgoretsky

> а чистый порядковы, вычисляемый номер

см. Вопрос, "вычислить номер каждой записи"

И давайте прекращать спорить! Ведь все уже давно всё поняли. Идет только отстаивание собственной правоты. Не более!


 
Anatoly Podgoretsky ©   (2004-01-28 14:01) [37]

Подай пример, там посмотрим.


 
Некто   (2004-01-28 14:13) [38]

http://cards.yandex.ru/cards/c604adfd6fa97e4ab0513f11fea42bd5.gif


 
13-ый   (2004-02-01 14:08) [39]

И так давайте снова:
1)ТАблица TTable-без обсуждений
2)RecNo при фильтрации даёт номер записи не в отображаемых данных,а во всей таблице(основная проблема)
3)Задача - выводить в вычесляемом поле номер отображаемой в Гриде записи
Т.е. Без фильтрации в Гриде (при 10-ти записях) в выч.поле отображаются все номера от 1 до 10 при фильтрации ,если остаётся отображаться 3 записи, от 1 до 3
вот так!!!


 
Sergei!   (2004-02-01 14:18) [40]

Я кажется понял. Можно ввести поле вычисляемое. При фильтрации данному полю задавать номер по порядку. Т.е.

var
GlobalCounter:longint;

...

procedure TTable1.OnFilterRecord...
begin
if <условие фильтра> then
begin
 GlobalCounter+=1;
 TTable1MyCalcNumField.Value:=GlobalCounter;
end
else ...
end;


вроде, то что нужно.


 
13-ый   (2004-02-01 14:33) [41]

Да да да да и ещё раз да!!!! Но GlobolCounter Как-то  нужно обнавлять? как?


 
Sergei!   (2004-02-01 14:46) [42]

Так он и обнавляется

GlobalCounter+=1

тоже самое что и

GlobalCounter:=GlobalCounter+1;


Но вот сейчас только пришла в голову мысль. Каждый раз как менятеются условия фильтра и еще что-то необходимо счетчик т.е. GlobalCounter приравнивать 0.

А можно вообще без него обойтись, т.е. напрямую TTable1MyCalcNumField.Value:=TTable1MyCalcNumField.Value+1


 
13-ый   (2004-02-01 14:51) [43]

Последнее не пройдёт оно при каждом обновлении будет у каждой записи значение прибавлять на 1.
я имею в виду как збрасывать GlobalCounter? при всех изменениях?


 
Anatoly Podgoretsky ©   (2004-02-01 15:01) [44]

Sergei!   (01.02.04 14:18) [40]
И ты конечно попробовал, потестировал?


 
Sergei!   (2004-02-01 15:09) [45]

Не в таком виде, но подобный код у меня работает. Даже если данный код в чем то не верен - ход мыслей уже понятен. Человеку нужен был ответ на его вопрос, я дал ему один из возможных путей куда копать.


 
13-ый   (2004-02-01 15:19) [46]

Sergei!
 как збрасывать GlobalCounter? при всех изменениях?


 
Sergei!   (2004-02-03 05:12) [47]

Я имею ввиду, что как только изменились условия фильтра его необходимо сбросить. Иначе у тебя все номера будут идти по возрастающей. Например, установил ты фильтр на первую букву фамилий "С". То делаешь примерно так:


...
TTable.Filtered:=False;
GlobalCounter:=0;
TTable.Filtered:=True;
...


 
Deniz ©   (2004-02-03 09:20) [48]

Можно и мне пару слов вставить :)
> Некто   (28.01.04 13:07) [23]
>Это рассудит рынок. Плохую программу никто не купит. :)

Согласен, если только есть выбор, а программа не директива сверху :) Видели ли Вы персонифицированный учет во время его начала? (2000 г. если память не изменяет). Это ...

Но я все же думаю, что в нумерации строк таблицы нет ничего крамольного. Ведь пользователи не жалуются на нумерацию строк и столбцов в том же Excel"е. Ведь удобно сказать, сидя с собеседником перед монитором: "обратите внимание на строку 238". А большего, поди, от такой нумерации и не требуется.
Так вроде в Excel"е при автофильтре строки не перенумируются, а вопрос автора именно про это(перенумирование).
Для автора можно предложить сл-щее:
1. Использовать не DBGrid а StringGrid, ListView и т.д. и самому выводить информацию!
2. Написать своего наследника от DBGrid с необходимыми св-вами.
3. Написать письмо разработчикам (EhLib, Quantum и т.д.) с предложением внести дополнительную функцианальность.


 
Anatoly Podgoretsky ©   (2004-02-03 09:46) [49]

Именно это не база, а разграфленный лист бумаги, от того, что несколько строк заклены нумерация не измения и нумерация нужна для работы формул, такая уж там технология.
Ссылка на строку 238 возможно только при налиции инентичных наборов и фильтрации, больше пользы от ключа, там возникает одназначность. А при искуственном создании номеров часто возникают сильные проблемы, это известно тому, кто работает с клиентом удалено. Отчеты, типа накладные совсем другое дело, во первых там это поддержано самим принципом и отпечатаный отчет не изменится, но и там номер нужен не для идентификации, а просто так, для счета позиций.
Все это было бы возможно и для баз, если бы речь шла о таблицах полностью закаченых в память, но о какой закачке может идти речь например для нескольких десятках миллионах записей. Но если такое нужно, то есть TClientDataset, но результаты будут отличаться в разных сеансах работы.


 
13-ый   (2004-02-08 19:04) [50]

Deniz
ты правильно понял,но варианты выхода мне не подходят.
Я сделал калк фиелд в котором идёт начисление глобальной переменной.
Мне нужен список событий после которых идёт просчёт полей.


 
ЮЮ ©   (2004-02-09 06:36) [51]

>13-ый   (08.02.04 19:04) [50]
Достаточно 1 раз, после изменения фильтра, пробежав от начала(First) до конца (EOF) Таблицы, т.к. при этом будем попадать только в записи, удовлетворяющие фильтру


 
13-ый   (2004-02-22 15:25) [52]

Блин вы поймите,что нужно делать записи в калк фиелд.
Я ето делаю так:

procedure TForm1.T1CalcFields(DataSet: TDataSet);
begin
if yu=false then
 begin
  if DbGridEh1.VisibleRowCount<=No then no:=0;
  inc(no);
  T1Nom.Value:=no;
 end;
end;

где No- глобальная переменная
Так вот её нужно обнавлять при всех изменениях .
Вроде обнавляю.
Но при фильтрации и при пересортировке номера путаются.


 
Sergey13 ©   (2004-02-22 15:46) [53]

Боже мой. Ты целый месяц думаешь над проблемой, которую сам придумал.
>Но при фильтрации и при пересортировке номера путаются.
Ну и кому нужны такие номера. Если они даже не будут путаться. То Иванов был 12, то после фильтрации стал 3. И что? Кому это надо?


 
13-ый   (2004-02-22 16:00) [54]

Вы поймите что номера не должны быть прилеены к записи,а постоянно идти по порядку .Такое нужно для распечатки данных. Просто представьте как красиво!!!!


 
Наталия ©   (2004-02-23 07:36) [55]

А если это нужно для печати - причём здесь Grid? Используй отчёты - или тебе религия не позволяет?


 
13-ый   (2004-02-28 22:14) [56]

Какие отчёты млин....
Не только для печати ,но и чтоб красиво на экране было


 
Petr V. Abramov ©   (2004-02-29 01:41) [57]

Наталия ©   (23.02.04 07:36) [55] дело говорит. На экране, как правило, места мало - во-первых, колонка "№ п/п" - в 90% случаев - информация лишняя, это - во-вторых. А в отчете ей (такой колонке) - самое место, бумажке умного вида прибавляет. Если действительно надо или ну очень хочется - я б использовал поле формы (не глобальную переменную!) + OnCalcFields
MyCounter := 0
Filtered := true;

В OnCalcFields:
 inc(MyCounter);
 FiledByName("Nomer_PP").Value := MyCounter


 
Petr V. Abramov ©   (2004-02-29 01:43) [58]

Ну и про BeforeOpen не забыть



Страницы: 1 2 вся ветка

Текущий архив: 2004.03.28;
Скачать: CL | DM;

Наверх




Память: 0.62 MB
Время: 0.035 c
14-1078380197
Rouse_
2004-03-04 09:03
2004.03.28
С Днем Рождения 4 Марта


3-1077875150
wild_arg
2004-02-27 12:45
2004.03.28
Время запроса


8-1069395228
Коляныччч
2003-11-21 09:13
2004.03.28
DelphiX AlphaDraw


3-1077373914
diwin
2004-02-21 17:31
2004.03.28
Как скопировать хранимую процедуру в другую бд?


1-1078598082
Ton
2004-03-06 21:34
2004.03.28
Express Bars