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

Вниз

Счетчик записей в таблице   Найти похожие ветки 

 
Crok   (2002-10-30 15:55) [0]

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

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;

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


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

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

Предлагаемое решение неверно. Лучше создать таблицу, например, 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. Там такой же подход.


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

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

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

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


 
Johnmen ©   (2002-10-30 16:28) [3]

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


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

> Johnmen

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

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


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

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

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

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

> Darts (30.10.02 16:23)

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


 
Anatoly Podgoretsky ©   (2002-10-30 16:41) [6]

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

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



 
Johnmen ©   (2002-10-30 16:43) [7]

>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) [8]

> Crok

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

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





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

> Johnmen

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


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


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

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


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

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


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

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


 
Anatoly Podgoretsky ©   (2002-10-30 17:10) [13]

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



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

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

Наверх




Память: 0.49 MB
Время: 0.028 c
1-59236
deffer
2002-11-06 18:24
2002.11.18
Как идеологически правильно?


7-59451
Polevi
2002-09-18 19:09
2002.11.18
Интересная проблемка..


6-59310
EgnA
2002-09-23 11:36
2002.11.18
Как реализовать параметр в ActiveX


6-59315
alexsandri
2002-09-21 21:06
2002.11.18
необходимо программно выключить комрп в сети


1-59167
Bocman
2002-11-09 04:31
2002.11.18
Капитальный баг