On-line: PSP, гостей 2. Всего: 3 [подробнее..]
АвторСообщение



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 21.11.05 10:56. Заголовок: Как создать уникальный индекс?


Создаю уникальный индекс.
Если удалена первая запись (по ключу из уникального индекса), то запись становиться не видна.
Если применить условие в индекск FOR deleted()=.f., то всё работает, но если после удаления первой записи по ключу производить переиндексацию. Этот вариант не подходит (большие базы).
Что посоветуете.
И ещё. Может у кого есть русский NG к Clipper5.3

Спасибо: 0 
Профиль
Ответов - 10 [только новые]





Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 21.11.05 13:44. Заголовок: Re:


sasha9 пишет:
цитата
но если после удаления первой записи по ключу производить переиндексацию.

зачем переиндексировать? после пометки на удаление, индекс разве не корректируется автоматиески? (если он открыт вместе с таблицей)

Спасибо: 0 
Профиль



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 21.11.05 14:03. Заголовок: Re


В том то и дело, что при удалении мы стоим на первой записи (которая включена в уникальный индекс) и сам уникальный индекс не перестраивается (мы остаёмся на тойже записи, но так как она удалена, мы тераем доступ к данным с этим ключём)

Спасибо: 0 
Профиль
администратор




Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 21.11.05 14:18. Заголовок: Re:


sasha9
Покажи пример


Спасибо: 0 
Профиль



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 21.11.05 15:03. Заголовок: Re:


Возьмите создайте обыкновенную базу с 2 индексами (один из них уникальный).
Проделайте то, что я описывал, в любом редакторе (например SDBU).
Станет сразу ясно в чём проблема.
Вообщето задачка состоит в том, что есть файл накладных (в каждой накладной много сторок). Как высветить список накладных (по 1 одной строчке на накладную) без создания дополнительных баз данных.





Спасибо: 0 
Профиль





Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 21.11.05 15:45. Заголовок: долой уникальные индексы!


oB:skipBlock := {|n| UniSkipper(n) }
//
STATIC FUNC UniSkipper(n)
LOCAL nSkipped:=0, xTmp, nLastRec
DO Case
CASE n<0
DO While nSkipped > n
DBSEEK(sx_KeyData(),.T.)
SKIP -1
If !BOF()
DBSEEK(sx_KeyData(),.T.)
nSkipped --
Else
EXIT
EndIF
EndDO
CASE n > 0
DO While nSkipped < n
nLastRec := RECNO()
DBSEEK(IIF(VALTYPE(xTmp:=sx_KeyData())=='C',ADDASCII(xTmp,1),xTmp+1),.T.)
If !EOF()
nSkipped ++
Else
DBGOTO(nLastRec)
EXIT
EndIF
EndDO
OTHERWISE
DBSKIP(0)
EndCASE
RETURN nSkipped
// если проблемы с sx_KeyData (у линкера или NTX), то
STATIC FUNC sx_KeyData()
RETURN &( IndexKey() )

Спасибо: 0 
Профиль



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 21.11.05 19:02. Заголовок: Re:


так проблема была в СКИППЕРЕ?

Спасибо: 0 
Профиль
администратор




Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 21.11.05 19:05. Заголовок: Re:


sasha9
Ты хочешь сказать что накладные держишь в одной базе ?
Удобнее было бы держать в 2-х базах. Содержимое в одной а "шапка" (дата, клиент и тд) в другой.


Спасибо: 0 
Профиль
постоянный участник




Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 22.11.05 11:47. Заголовок: Re:


sasha9 пишет:
цитата
Создаю уникальный индекс.
Если удалена первая запись (по ключу из уникального индекса), то запись становиться не видна.
Если применить условие в индекск FOR deleted()=.f., то всё работает, но если после удаления первой записи по ключу производить переиндексацию. Этот вариант не подходит (большие базы).
Что посоветуете


Уникальные индексы - R/O. При изменении базы индекс в общем случае надо пересоздавать заново целиком.

Спасибо: 0 
Профиль



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 22.11.05 12:09. Заголовок: Re:


Dima пишет:
цитата
Ты хочешь сказать что накладные держишь в одной базе ?
Удобнее было бы держать в 2-х базах. Содержимое в одной а "шапка" (дата, клиент и тд) в другой.


Не у добнее а единственно правильно. Учите матчасть, рездел "Нормализация баз данных"

Спасибо: 0 
Профиль



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 22.11.05 13:14. Заголовок: Re:


sasha9 пишет:
цитата

В том то и дело, что при удалении мы стоим на первой записи (которая включена в уникальный индекс) и сам уникальный индекс не перестраивается (мы остаёмся на тойже записи, но так как она удалена, мы тераем доступ к данным с этим ключём)


1) Добавить в индексное выражение ...+IIF(!deleted(),"0","1") - будет перестраиваться
2) после удаления записи всегда делать skip ( 0 или 1)

Спасибо: 0 
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 148
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет