Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Счетчик записей в таблице [D6, dBase, FoxPro]


Crok ©   (2002-10-30 15:55:00) 

Здравстуйте, Мастера, может кто поможет? У меня проблема не знаю как в поле таблицы поставить счетчик

procedure TForm4.btnInsertClick(Sender: TObject);
var s: real;
begin
s:=Table1.FieldByName("KOD").AsFloat;
Table1.Insert;
Table1.FieldByName("KOD").AsFloat:=s+1;
Table1.FieldByName("DATA_O").AsDateTime:=Now;

end;

вроде всё работает, только как только пытаюсь вставить запись в эту же таблицу из другой формы, код повторяется...
ПОМОГИТЕ КТО МОЖЕТ КТО МОЖЕТ ПОМОГИТЕ :)


Anatoly Podgoretsky   (2002-10-30 17:10:00) [1]

Crok (30.10.02 17:06)
Работает у меня в некоторых базах именно так сделано


Crok   (2002-10-30 17:06:00) [2]

Пробовал. Не работает.


Darts   (2002-10-30 16:57:00) [3]

Table1.Last для текущего индекса


Crok   (2002-10-30 16:54:00) [4]


> надо сначал спозичионировать по индексу на последнюю записиь
>

А как это будет выглядеть по коду? Я копался в различных справочниках но нигде не нашел ничего работоспособного


Darts   (2002-10-30 16:49:00) [5]

> Johnmen

Тоже можно. Но производительность будет ниже из-за постоянных выборок. Впрочем, какая разница - лишь бы работало.


Johnmen   (2002-10-30 16:43:00) [6]

>Darts (30.10.02 16:33)

Ничего подобного ! Алгоритм зависит от юзанья !

>Crok (30.10.02 16:37)

Для монопольного юзанья - SELECT MAX(KOL)+1 AS NextKOL FROM <Table>


Darts   (2002-10-30 16:43:00) [7]

> Crok

...Спасибо! Об этом я не подумал, эту Демо базу можно будет использовать как базу счетчиков для всех таблиц!

Можно и так. Для каждой таблицы - отдельное поле в Demo. Пример: имеем три таблицы, по которым нужен autoincrement => в Demo должны созданы 3 поля Count1, Count2, Count3.




Anatoly Podgoretsky   (2002-10-30 16:41:00) [8]

Формат DBase VII поддерживает автоинкриментные поля, а ошибка в примере состоит в том, что постоянно берется одна и таже записиь, а надо брать масимальный номер. Перед s:=Table1.FieldByName("KOD").AsFloat; надо сначал спозичионировать по индексу на последнюю записиь или взять с помощью запроса максимальный номер.

Еще один недостатоко при таком методе в многопользовательской среде обеспечены ошибки.


Crok   (2002-10-30 16:37:00) [9]

Спасибо! Об этом я не подумал, эту Демо базу можно будет использовать как базу счетчиков для всех таблиц!

> Многопользовательское юзанье ?

Нет база локальная, все равно спасибо!

> Darts (30.10.02 16:23)

ОСТАВАЙТЕСЬ У НАС БУДЕТЕ ГЕНИАЛЬНЫМ МЕХАНИКОМ НАШЕЙ ПЛАНЕТЫ..


Darts   (2002-10-30 16:33:00) [10]

> Johnmen

Про это не было. Будет вопрос - будет и ответ :)

тут самое главное - алгоритм.


Johnmen   (2002-10-30 16:28:00) [11]

Многопользовательское юзанье ?


Darts   (2002-10-30 16:26:00) [12]

Забыл убрать первую строчку после begin:
s: = Table1.FieldByName("KOD").AsInteger;

А в конце поставить Table1.Post;

В остальном же все верно.


Darts   (2002-10-30 16:23:00) [13]

Попытка создать аналог автоинкремента? Это есть в Парадоксе.

Предлагаемое решение неверно. Лучше создать таблицу, например, Demo, с одним полем и с одной строкой, где хранится счетчик. При вставке новой записи в вашу таблицу обращаетесь в Demo, считываете данные, инкрементируете, заносите в Demo. Потом это же значение загоняете в вашу таблицу. Т.е. это будет выглядеть примерно так:


procedure TForm4.btnInsertClick(Sender: TObject);
var s: Integer;
begin
s: = Table1.FieldByName("KOD").AsInteger;
Demo.Edit;
s := Demo.FieldByName("Count").AsInteger + 1;
Demo.FieldByName("Count").AsInteger := s
Demo.Post;
Table1.Insert;
Table1.FieldByName("KOD").AsInteger := s;
Table1.FieldByName("DATA_O").AsDateTime := Now;

end


Измените тип поля на целочисленный.

Смотрите пример Demos\DB\MastApp. Там такой же подход.


Наверх

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