![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Изменение номеров в поле!!! [D7, Paradox]
Developerr © (2003-10-27 13:31:00)
Ув, мастера, столкнулся со следующей проблемой:
У меня есть в базе 3 поля:
Npp Dep Code
1 1-й отдел 1
2 2-й отдел 2
...
10 Отдел кадров 10
Поле Npp + (Autoincrement)
Я хочу программно вставить еще один отдел, где-нибудь в середину и присвоить код отделу, например, 8. Отдел с таким кодом уже существует.
В RxDBGrid я становлюсь на нужную мне строку, например, на одну из двух строк у которых код 8, соответственно на ту которая идет последней, нажимаю кнопку пересчитать коды.
Мне нужно, чтобы все коды начиная со второй 8 и до конца увеличились на 1.
Я прописую кнопке следующий код
while not Table1.Eof do begin
Table1.Edit;
Table1.FieldByName("Code").AsInteger:=Table1.FieldByName("Code").AsInteger+1;
Table1.Post;
Table1.Next;
end;
В результате получается ерунда, а именно: некоторые коды удваиваются, т.е. становится например, два кода равных 9, два 11 и т.д. Некоторые пропускаются, например, идет 11 потом идет 13, 12 пропускается.
Если цифры идут подряд, т.е. нет 2-х одинаковых, тогда все пересчитывается нормально.
Что я делаю не так?
Anatoly Podgoretsky (2003-10-28 15:49:00) [1]
Developerr © (28.10.03 15:35) [31]
Еоличество записей известно, вести перенумерацию в обратном порядке, если последний номер больше количества записей, то можно за два этапа, перенумеровать с шагом 10, 100 и затем с шагом 1
Sandman25 (2003-10-28 15:44:00) [2]
[31] Developerr © (28.10.03 15:35)
Да я уже понял из [17] Anatoly Podgoretsky © (28.10.03 13:16)
Вы на продолжающуюся дискуссию внимания не обращайте, такое бывает :)
Developerr (2003-10-28 15:35:00) [3]
> Sandman25 ©
> Что нужно в итоге? Из второй десятки сделать минимальное
> незанятое значение?
Нет, нужно чтобы из такого порядка:
1
2
..
10
10
11
12
Получилось
1
2
..
10
11
12
13
В общем все работает. Спасибо.
bushmen (2003-10-28 14:24:00) [4]
> Малиновский Владимир
Просто вещи надо своими именами называть и люди к тебе потянутся
Малиновский Владимир (2003-10-28 14:12:00) [5]
Сколько экспресии!
Anatoly Podgoretsky (2003-10-28 14:09:00) [6]
Меня тоже не напрягает, я всегда обходился без сервера, пускай с этим разбирается БДЕ, сервер не нужен, Бушмену тоже.
Малиновский Владимир (2003-10-28 14:07:00) [7]
2 Anatoly Podgoretsky:
- а вот бушмен вроде бы то же самое сказал... И не напрягает его, что Paradox - файл-серверная система...
Anatoly Podgoretsky (2003-10-28 14:02:00) [8]
Малиновский Владимир (28.10.03 13:59) [24]
То что он понимает сомнений нет, не совсем конечно он, но ты то потребовал сервер, чего нет, значит только остается его писать.
bushmen (2003-10-28 14:00:00) [9]
> Developerr ©
> Т.е. при своде таблицы, чтобы все сотрудиники были отсортированы по отделам.
А я вижу, что Вам надо заменить компонент TTable на TQuery и не мучиться с вставкой строки в определённое место, а при выборке напишите запрос типа:
Query1.SQL.Add("select * from dep order by Code");
Query1.Open;
И будет Вам счастье
Малиновский Владимир (2003-10-28 13:59:00) [10]
Ну, в общем-то, Paradox понимает кой-какой SQL...
Developerr (2003-10-28 13:52:00) [11]
> NickBat ©
Мне жужно, чтобы все коды у отделов были разные, но не просто, чтобы в конце добавлять новый отдел, а чтобы определенный отдел стоял в определенной позиции. Это нужно для штатного рассписания. Т.е. при своде таблицы, чтобы все сотрудиники были отсортированы по отделам. И положение отделов имеет важное значение в штатном рассписании, по крайней мере у нас в суде.
> Малиновский Владимир
Извиняюсь, но я немного не понял. Но, вижу, что в условии стоит where CODE >= 8; А это значит, если две строки имеют код 8, то они будут изменены на 9.
Спасибо. Но тот код который я привел работает без глюков, думаю, что менять его нет особой нужды.
Всем спасибо.
Anatoly Podgoretsky (2003-10-28 13:46:00) [12]
Малиновский Владимир (28.10.03 13:36) [19]
И сервер тоже напишешь?
Малиновский Владимир (2003-10-28 13:43:00) [13]
Ну, например, не используйте TTable...
bushmen (2003-10-28 13:42:00) [14]
При помощи компоненты TTable в Paradox ?
Малиновский Владимир (2003-10-28 13:36:00) [15]
Не мучайся, пусть твои проблемы на сервере решаются:
1) update OTDEL set Code = Code + 1
where CODE >= 8;
2) insert into OTDEL (NPP, DEP, CODE)
values (12345, "Особый отдел", 8)
Возможны варианты
NickBat (2003-10-28 13:25:00) [16]
В каких ситуациях может возникнуть проблема:
>Я хочу программно вставить еще один отдел, где-нибудь в
>середину и присвоить код отделу, например, 8. Отдел с таким
>кодом уже существует.
Что значит вставить в середину? Какая тебе разница где в таблице лежат твои данные?
Для чего нужен код отдела? Если для связи с другими таблицами, то какая разница какое значение он примет?
Если код отдела задается номенклатурой, то ты тем более не должен АВТОМАТИЧЕСКи менять все коды после 8.
Ты пойми я не умничаю. Я пытаюсь понять зачем тебе это?
Anatoly Podgoretsky (2003-10-28 13:16:00) [17]
Вот твое требование
Мне нужно, чтобы все коды начиная со второй 8 и до конца увеличились на 1.
Sandman25 (2003-10-28 13:13:00) [18]
[14] Developerr © (28.10.03 13:05)
Почему раньше было две 10? Если исходные данные правильные, то и после изменения они будут правильными.
Что нужно в итоге? Из второй десятки сделать минимальное незанятое значение?
Developerr (2003-10-28 13:12:00) [19]
Ура!!! Победил.
Нужно было OldCode присвоить Table1.RecNo. И все пошло.
OldCode := Table1.RecNo;
Table1.Last;
while not Table1.Bof and (Table1.RecNo >= OldCode) do begin
Table1.Edit;
Table1.FieldByName("Code").AsInteger:=Table1.FieldByName("Code").AsInteger+1;
Table1.Post;
Table1.Prior;
end;
Developerr (2003-10-28 13:05:00) [20]
Спасибо. Но здесь тоже возникает проблема. Если 2 строки с одинаковым кодом, то обеим строкам присвоится код на 1 больше. Т.е. если было два кода=10, то получится два кода=11.