Текущий архив: 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.51 MB
Время: 0.009 c