![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Счетчик записей в таблице [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. Там такой же подход.