Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.11.17;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.033 c
1-56735
Timon
2003-11-06 19:16
2003.11.17
Замена фраз в бинарном файле. Помогите


3-56467
DimChan
2003-10-27 08:39
2003.11.17
SQL


14-56849
Peter
2003-10-27 15:10
2003.11.17
Html


14-56902
Rouse_
2003-10-25 03:01
2003.11.17
Молодой и не опознанный


1-56694
Armageddon
2003-11-07 15:36
2003.11.17
Можно примерчик функции LookupAccountName.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский