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

Вниз

Изменение номеров в поле!!!   Найти похожие ветки 

 
Developerr ©   (2003-10-27 13:31) [0]

Ув, мастера, столкнулся со следующей проблемой:
У меня есть в базе 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-х одинаковых, тогда все пересчитывается нормально.

Что я делаю не так?


 
NickBat ©   (2003-10-27 13:36) [1]

> Что я делаю не так?

Справочниками ты неправильно пользуешься. Какая разница какой у него код 8 или 11?


 
Anatoly Podgoretsky ©   (2003-10-27 13:47) [2]

Индексы отключи


 
bushmen ©   (2003-10-27 13:53) [3]

>Я прописую кнопке следующий код
>while not Table1.Eof do begin
>Table1.Edit;
>Table1.FieldByName("Code").AsInteger:=Table1.FieldByName
>("Code").AsInteger+1;
>Table1.Post;
>Table1.Next;
>end;

А где ты вставляешь новую строку?


 
Anatoly Podgoretsky ©   (2003-10-27 14:04) [4]

Это не существенно, вопрос не про это


 
bushmen ©   (2003-10-27 14:12) [5]

>Anatoly Podgoretsky ©

>Некоторые пропускаются, например, идет 11 потом идет 13, 12 >пропускается.

А если посмотреть на код - ничего не напоминает? :) Несколько раз запущенная программа с изменением разных кодов


 
Anatoly Podgoretsky ©   (2003-10-27 14:27) [6]

У него проблема с индексами, он не понимает как они работают при изменении.


 
Anatoly Podgoretsky ©   (2003-10-27 14:31) [7]

Было так он перенумровал 10 в 11, следующий промустил и сразу перешел к 12 - Table1.Next;


 
bushmen ©   (2003-10-27 14:46) [8]

>Anatoly Podgoretsky

Вы правы, скорее всего в этом у него ошибка.


 
Developerr ©   (2003-10-27 15:36) [9]

Я понимаю, что у меня ошибка, а где именно?


 
bushmen ©   (2003-10-27 15:40) [10]

>Developerr ©
У тебя в структуре таблицы есть индекс на поле code. Перед изменением убей этот индекс и будет тебе счастье.


 
Developerr ©   (2003-10-28 11:10) [11]

Попробовал. Нихрена не работает. У меня в Table1 стоит IndexFieldName=Code
Попробовал сделать так
Table1.IndexFieldName:=""
while not Table1.Eof do begin
Table1.Edit;
Table1.FieldByName("Code").AsInteger:=Table1.FieldByName("Code").AsInteger+1;
Table1.Post;
Table1.Next;
end;

Тот же эффект. Может я неправильно делаю?

> Перед изменением убей этот индекс и будет тебе счастье.

Если не трудно подскажите как убить этот индекс.
Спасибо.


 
Developerr ©   (2003-10-28 12:40) [12]

Ау, подскажите как индекс правильно убить!!! Я понимаю, что где-то проблема с индексами, но не пойму, как её решить. Если можно пример как нужно индексы грохать.

Спасибо.


 
Sandman25 ©   (2003-10-28 12:46) [13]

Попробуйте сделать так:
OldCode := Table1.FieldByName("Code").AsInteger;
Table1.Last;
while not Table1.Bof and (Table1.FieldByName("Code").AsInteger >= OldCode) do begin
Table1.Edit;
Table1.FieldByName("Code").AsInteger:=Table1.FieldByName("Code").AsInteger+1;
Table1.Post;
Table1.Prev;
end;


 
Developerr ©   (2003-10-28 13:05) [14]

Спасибо. Но здесь тоже возникает проблема. Если 2 строки с одинаковым кодом, то обеим строкам присвоится код на 1 больше. Т.е. если было два кода=10, то получится два кода=11.


 
Developerr ©   (2003-10-28 13:12) [15]

Ура!!! Победил.
Нужно было 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;


 
Sandman25 ©   (2003-10-28 13:13) [16]

[14] Developerr © (28.10.03 13:05)

Почему раньше было две 10? Если исходные данные правильные, то и после изменения они будут правильными.

Что нужно в итоге? Из второй десятки сделать минимальное незанятое значение?


 
Anatoly Podgoretsky ©   (2003-10-28 13:16) [17]

Вот твое требование

Мне нужно, чтобы все коды начиная со второй 8 и до конца увеличились на 1.


 
NickBat ©   (2003-10-28 13:25) [18]

В каких ситуациях может возникнуть проблема:

>Я хочу программно вставить еще один отдел, где-нибудь в
>середину и присвоить код отделу, например, 8. Отдел с таким
>кодом уже существует.

Что значит вставить в середину? Какая тебе разница где в таблице лежат твои данные?
Для чего нужен код отдела? Если для связи с другими таблицами, то какая разница какое значение он примет?
Если код отдела задается номенклатурой, то ты тем более не должен АВТОМАТИЧЕСКи менять все коды после 8.

Ты пойми я не умничаю. Я пытаюсь понять зачем тебе это?


 
Малиновский Владимир   (2003-10-28 13:36) [19]

Не мучайся, пусть твои проблемы на сервере решаются:
1) update OTDEL set Code = Code + 1
where CODE >= 8;
2) insert into OTDEL (NPP, DEP, CODE)
values (12345, "Особый отдел", 8)

Возможны варианты


 
bushmen ©   (2003-10-28 13:42) [20]

При помощи компоненты TTable в Paradox ?


 
Малиновский Владимир   (2003-10-28 13:43) [21]

Ну, например, не используйте TTable...


 
Anatoly Podgoretsky ©   (2003-10-28 13:46) [22]

Малиновский Владимир (28.10.03 13:36) [19]
И сервер тоже напишешь?


 
Developerr ©   (2003-10-28 13:52) [23]


> NickBat ©

Мне жужно, чтобы все коды у отделов были разные, но не просто, чтобы в конце добавлять новый отдел, а чтобы определенный отдел стоял в определенной позиции. Это нужно для штатного рассписания. Т.е. при своде таблицы, чтобы все сотрудиники были отсортированы по отделам. И положение отделов имеет важное значение в штатном рассписании, по крайней мере у нас в суде.

> Малиновский Владимир

Извиняюсь, но я немного не понял. Но, вижу, что в условии стоит where CODE >= 8; А это значит, если две строки имеют код 8, то они будут изменены на 9.

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

Всем спасибо.


 
Малиновский Владимир   (2003-10-28 13:59) [24]

Ну, в общем-то, Paradox понимает кой-какой SQL...


 
bushmen ©   (2003-10-28 14:00) [25]

> Developerr ©

> Т.е. при своде таблицы, чтобы все сотрудиники были отсортированы по отделам.

А я вижу, что Вам надо заменить компонент TTable на TQuery и не мучиться с вставкой строки в определённое место, а при выборке напишите запрос типа:
Query1.SQL.Add("select * from dep order by Code");
Query1.Open;

И будет Вам счастье


 
Anatoly Podgoretsky ©   (2003-10-28 14:02) [26]

Малиновский Владимир (28.10.03 13:59) [24]
То что он понимает сомнений нет, не совсем конечно он, но ты то потребовал сервер, чего нет, значит только остается его писать.


 
Малиновский Владимир   (2003-10-28 14:07) [27]

2 Anatoly Podgoretsky:
- а вот бушмен вроде бы то же самое сказал... И не напрягает его, что Paradox - файл-серверная система...


 
Anatoly Podgoretsky ©   (2003-10-28 14:09) [28]

Меня тоже не напрягает, я всегда обходился без сервера, пускай с этим разбирается БДЕ, сервер не нужен, Бушмену тоже.


 
Малиновский Владимир   (2003-10-28 14:12) [29]

Сколько экспресии!


 
bushmen ©   (2003-10-28 14:24) [30]

> Малиновский Владимир
Просто вещи надо своими именами называть и люди к тебе потянутся


 
Developerr ©   (2003-10-28 15:35) [31]


> Sandman25 ©


> Что нужно в итоге? Из второй десятки сделать минимальное
> незанятое значение?

Нет, нужно чтобы из такого порядка:
1
2
..
10
10
11
12
Получилось
1
2
..
10
11
12
13

В общем все работает. Спасибо.


 
Sandman25 ©   (2003-10-28 15:44) [32]

[31] Developerr © (28.10.03 15:35)

Да я уже понял из [17] Anatoly Podgoretsky © (28.10.03 13:16)
Вы на продолжающуюся дискуссию внимания не обращайте, такое бывает :)


 
Anatoly Podgoretsky ©   (2003-10-28 15:49) [33]

Developerr © (28.10.03 15:35) [31]
Еоличество записей известно, вести перенумерацию в обратном порядке, если последний номер больше количества записей, то можно за два этапа, перенумеровать с шагом 10, 100 и затем с шагом 1



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

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

Наверх




Память: 0.55 MB
Время: 0.037 c
3-56490
Duce
2003-10-28 14:12
2003.11.17
Обработать отмену удаления.


3-56447
alex-ran
2003-10-29 12:35
2003.11.17
ListBox.Assign(результат выполнения запроса)


4-56950
shuba
2003-09-22 16:21
2003.11.17
Запуск процедуры из чужой программы


1-56740
Aleksandr
2003-11-06 16:50
2003.11.17
Как отправить потоку сообщение?


14-56827
Карелин Артем
2003-10-28 10:03
2003.11.17
TIBQuery.UniDirectional