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

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

Изменение номеров в поле!!! [D7, Paradox]


Страницы:   1 2

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.


Страницы:   1 2

Наверх

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