Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.6 MB
Время: 0.047 c
7-1073286864
Thunder
2004-01-05 10:14
2004.03.28
Как продублировать данные с СОМ2 на СОМ1?


1-1077871975
Гарик
2004-02-27 11:52
2004.03.28
Как програмно из Delphi 7 изменить свойство компонента в Rave R.


6-1074456340
Эл
2004-01-18 23:05
2004.03.28
Использование TTcpClient


3-1077718586
TransparentGhost
2004-02-25 17:16
2004.03.28
Or в Locate


1-1078584058
Happy SouL
2004-03-06 17:40
2004.03.28
как создать полупрозрачную форму но чо бы компоненты на ней были





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский