Автор | Сообщение |
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 21.11.05 10:56. Заголовок: Как создать уникальный индекс?
Создаю уникальный индекс. Если удалена первая запись (по ключу из уникального индекса), то запись становиться не видна. Если применить условие в индекск FOR deleted()=.f., то всё работает, но если после удаления первой записи по ключу производить переиндексацию. Этот вариант не подходит (большие базы). Что посоветуете. И ещё. Может у кого есть русский NG к Clipper5.3
|
|
|
Ответов - 10
[только новые]
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 21.11.05 13:44. Заголовок: Re:
sasha9 пишет: цитата но если после удаления первой записи по ключу производить переиндексацию.
зачем переиндексировать? после пометки на удаление, индекс разве не корректируется автоматиески? (если он открыт вместе с таблицей)
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 21.11.05 14:03. Заголовок: Re
В том то и дело, что при удалении мы стоим на первой записи (которая включена в уникальный индекс) и сам уникальный индекс не перестраивается (мы остаёмся на тойже записи, но так как она удалена, мы тераем доступ к данным с этим ключём)
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 21.11.05 14:18. Заголовок: Re:
sasha9 Покажи пример
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 21.11.05 15:03. Заголовок: Re:
Возьмите создайте обыкновенную базу с 2 индексами (один из них уникальный). Проделайте то, что я описывал, в любом редакторе (например SDBU). Станет сразу ясно в чём проблема. Вообщето задачка состоит в том, что есть файл накладных (в каждой накладной много сторок). Как высветить список накладных (по 1 одной строчке на накладную) без создания дополнительных баз данных.
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 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() )
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 21.11.05 19:02. Заголовок: Re:
так проблема была в СКИППЕРЕ?
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 21.11.05 19:05. Заголовок: Re:
sasha9 Ты хочешь сказать что накладные держишь в одной базе ? Удобнее было бы держать в 2-х базах. Содержимое в одной а "шапка" (дата, клиент и тд) в другой.
|
|
|
|
| постоянный участник
|
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 22.11.05 11:47. Заголовок: Re:
sasha9 пишет: цитата Создаю уникальный индекс. Если удалена первая запись (по ключу из уникального индекса), то запись становиться не видна. Если применить условие в индекск FOR deleted()=.f., то всё работает, но если после удаления первой записи по ключу производить переиндексацию. Этот вариант не подходит (большие базы). Что посоветуете
Уникальные индексы - R/O. При изменении базы индекс в общем случае надо пересоздавать заново целиком.
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 22.11.05 12:09. Заголовок: Re:
Dima пишет: цитата Ты хочешь сказать что накладные держишь в одной базе ? Удобнее было бы держать в 2-х базах. Содержимое в одной а "шапка" (дата, клиент и тд) в другой.
Не у добнее а единственно правильно. Учите матчасть, рездел "Нормализация баз данных"
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 22.11.05 13:14. Заголовок: Re:
sasha9 пишет: цитата В том то и дело, что при удалении мы стоим на первой записи (которая включена в уникальный индекс) и сам уникальный индекс не перестраивается (мы остаёмся на тойже записи, но так как она удалена, мы тераем доступ к данным с этим ключём)
1) Добавить в индексное выражение ...+IIF(!deleted(),"0","1") - будет перестраиваться 2) после удаления записи всегда делать skip ( 0 или 1)
|
|
|
|