Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод результата запроса в edit. 
V
    Опции темы
PaWeLL
Дата 16.11.2009, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 16.11.2009

Репутация: нет
Всего: нет



Появился вопрос. Есть таблица personal_inf, в которой хранятся данные о работниках. У каждого есть идентфикатор w_id.
Есть форма добавления записей в таблицу. Нужно, чтобы при загрузке формы в поле "Номер сотрудника" выводилось первое незанятое значение w_id. Как такое реализовать?
PM MAIL   Вверх
Данкинг
Дата 16.11.2009, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Цитата(PaWeLL @  16.11.2009,  10:16 Найти цитируемый пост)
первое незанятое значение w_id. 

Если w_id уникален и идёт по порядку, то взять максимальное его значение (select max w_id from table) и прибавить 1.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
PaWeLL
Дата 16.11.2009, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 16.11.2009

Репутация: нет
Всего: нет



Цитата(Данкинг @ 16.11.2009,  11:15)
Цитата(PaWeLL @  16.11.2009,  10:16 Найти цитируемый пост)
первое незанятое значение w_id. 

Если w_id уникален и идёт по порядку, то взять максимальное его значение (select max w_id from table) и прибавить 1.

Это я уже обдумал. Но мне хочется посложнее. Допустим в результате удаления оказался свободен один id

0015
0016
0018
0019

Так вот, надо чтобы выводился не 0020, а первый свободный 0017.
PM MAIL   Вверх
Данкинг
Дата 16.11.2009, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Цитата(PaWeLL @  16.11.2009,  11:21 Найти цитируемый пост)
Так вот, надо чтобы выводился не 0020, а первый свободный 0017. 

Тогда в цикле проходить (только сколько это по времени займёт) и искать соседние строчки, разница w_id между которыми больше единицы.

Добавлено через 2 минуты и 42 секунды
Но только не знаю, зачем это практически может быть нужно. Если требуется уникальное поле-идентификатор сотрудника, так обычное автоинкрементное поле отлично для этого подойдёт.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
PaWeLL
Дата 16.11.2009, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 16.11.2009

Репутация: нет
Всего: нет



Цитата(Данкинг @ 16.11.2009,  11:38)
Цитата(PaWeLL @  16.11.2009,  11:21 Найти цитируемый пост)
Так вот, надо чтобы выводился не 0020, а первый свободный 0017. 

Тогда в цикле проходить (только сколько это по времени займёт) и искать соседние строчки, разница w_id между которыми больше единицы.



То есть очень сложно получается, не по моим навыкам?

Цитата

Но только не знаю, зачем это практически может быть нужно. Если требуется уникальное поле-идентификатор сотрудника, так обычное автоинкрементное поле отлично для этого подойдёт.


А подробнее можно про это? А то я пока нуб в этом деле. Да, кстати, забыл упомянуть. База данных - paradox.

Это сообщение отредактировал(а) PaWeLL - 16.11.2009, 11:47
PM MAIL   Вверх
Данкинг
Дата 16.11.2009, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Цитата(PaWeLL @  16.11.2009,  11:42 Найти цитируемый пост)
То есть очень сложно получается, не по моим навыкам?

Почему сложно? Просто по времени такой цикл будет работать долго - в зависимости, конечно, от числа записей в таблице.

Цитата(PaWeLL @  16.11.2009,  11:42 Найти цитируемый пост)
Да, кстати, забыл упомянуть. База данных - paradox.

Я про "Парадокс" ничего не знаю, никогда с ним не работал. Но вот в Access есть поле типа "счётчик", и значения в нём всегда уникальные, генерируемые самой СУБД. В FireBird есть генераторы для той же цели.

Это сообщение отредактировал(а) Данкинг - 16.11.2009, 11:54


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
former
Дата 16.11.2009, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 7
Всего: 17



Цитата(Данкинг @  16.11.2009,  11:15 Найти цитируемый пост)
Если w_id уникален и идёт по порядку, то взять максимальное его значение (select max w_id from table) и прибавить 1. 


Данкинг, ну а как быть если номер мы этот получили, заполняем форму, а в этот момент еще куча пользователей добавило записей? Такой способ подходит только если номер присваивается в триггере или процедуре непосредственно при сохранении данных. В данном случае (если бы речь не шла про Paradox) нужно получать значение с помощью генератора.
PaWeLL, бросай Paradox. Технология бесперспективная. Лучше уж Access.

Цитата(PaWeLL @  16.11.2009,  11:42 Найти цитируемый пост)
То есть очень сложно получается, не по моим навыкам?

Не нужно мерить задачу по себе. Так ты мало чего добьешься.



--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Данкинг
Дата 16.11.2009, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Цитата(former @  16.11.2009,  12:45 Найти цитируемый пост)
Данкинг, ну а как быть если номер мы этот получили, заполняем форму, а в этот момент еще куча пользователей добавило записей?

Я об этом не подумал, я конкретную задачу решал.  smile Просто первое, что мне пришло в голову - моя БД по учёту DVD, в которой именно таким образом выбирается максимальный диск, и новый диск получает номер, соответственно, +1. Но для сетевой БД такое не подойдёт, разумеется.



--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Frees
Дата 16.11.2009, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 23
Всего: 54



Для сетевого варианта только Генератры (firebird) или их аналоги в других СУБД. только они гарантируют уникальность, а максимум или последнее значение в списке могут привести к коллизии номеров.

Добавлено через 1 минуту и 37 секунд
Цитата(PaWeLL @  16.11.2009,  14:42 Найти цитируемый пост)
База данных - paradox.

поменяй СУБД пока не поздно..намучаешься ты с парадоксам


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
PaWeLL
Дата 16.11.2009, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 16.11.2009

Репутация: нет
Всего: нет



Цитата(Данкинг @ 16.11.2009,  13:05)
Цитата(former @  16.11.2009,  12:45 Найти цитируемый пост)
Данкинг, ну а как быть если номер мы этот получили, заполняем форму, а в этот момент еще куча пользователей добавило записей?

Я об этом не подумал, я конкретную задачу решал.  smile Просто первое, что мне пришло в голову - моя БД по учёту DVD, в которой именно таким образом выбирается максимальный диск, и новый диск получает номер, соответственно, +1. Но для сетевой БД такое не подойдёт, разумеется.

Ну у меня БД не сетевая, поэтому не страшно.

Добавлено через 1 минуту и 26 секунд
Цитата(Данкинг @ 16.11.2009,  11:54)
Цитата(PaWeLL @  16.11.2009,  11:42 Найти цитируемый пост)
То есть очень сложно получается, не по моим навыкам?

Почему сложно? Просто по времени такой цикл будет работать долго - в зависимости, конечно, от числа записей в таблице.

Можешь хотя бы намекнуть, как это должно выглядеть?

Добавлено через 8 минут и 43 секунды
Цитата(Frees @  16.11.2009,  13:44 Найти цитируемый пост)
Добавлено через 1 минуту и 37 секунд
Цитата(PaWeLL @  16.11.2009,  14:42 Найти цитируемый пост)
База данных - paradox.

поменяй СУБД пока не поздно..намучаешься ты с парадоксам 


Я бы может и поменял, на задание определено четко: Delphi+paradox.

PM MAIL   Вверх
Frees
Дата 16.11.2009, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 23
Всего: 54



Цитата(PaWeLL @  16.11.2009,  16:48 Найти цитируемый пост)
Можешь хотя бы намекнуть, как это должно выглядеть?

суть такова

Код

var 
  priorId: integer;
  nexId: integer;
....
Table1.First;
priorId := Table1.fieldByName('w_id').asinteger;
nexId :=  priorId + 1;
Table1.Next;
while not Table1.eof do
begin
  nexId :=  priorId + 1;
  if Table1.fieldByName('w_id').asinteger <> nexId then
    breac;
  priorId := Table1.fieldByName('w_id').asinteger;   
  Table1.Next;
end;

//nexId - следующий ид, с заполнением дырок


Добавлено @ 14:08
Цитата(PaWeLL @  16.11.2009,  16:48 Найти цитируемый пост)
Я бы может и поменял, на задание определено четко: Delphi+paradox.

меняй задание

Это сообщение отредактировал(а) Frees - 16.11.2009, 14:10


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Deniz
Дата 16.11.2009, 14:41 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Можно и select'ом выбрать
Код
select min(t1.w_id) +1 as NewNum from personal_inf t1 
where not exists(select 1 from personal_inf t2 where (t2.w_id = (t1.w_id + 1)))
как-то так, только если записей нет, запрос тоже ничего не вернет.

Это сообщение отредактировал(а) Deniz - 16.11.2009, 14:46


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
PaWeLL
Дата 17.11.2009, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 16.11.2009

Репутация: нет
Всего: нет



Всем спасибо. С вопросом разобрался.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0549 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.