|
|
|
Пустали ли Dbf-таблица
|
|||
|---|---|---|---|
|
#18+
Привет всем! Как проще всего узнать, Пустали ли Dbf-таблица? И при этом сохранить указатель на текущую запись? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2007, 12:47 |
|
||
|
Пустали ли Dbf-таблица
|
|||
|---|---|---|---|
|
#18+
Смотря, что именно Вы вкладываете в понятие "пустая таблица". 1) В ней физически нет ни одной записи? Тогда по Reccount()=0 2) В таблице нет ни одной записи, удовлетворяющей определенным условиям? Например, нет ни одной не удаленной записи. Тогда все зависит от того, что это за условия и как они были надожены. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2007, 12:49 |
|
||
|
Пустали ли Dbf-таблица
|
|||
|---|---|---|---|
|
#18+
"пустая таблица" - таблица, где нет ни одной неудалённой записи После проверки необходимо сохранить указатель на текущую запись ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2007, 13:12 |
|
||
|
Пустали ли Dbf-таблица
|
|||
|---|---|---|---|
|
#18+
Андрей К"пустая таблица" - таблица, где нет ни одной неудалённой записи После проверки необходимо сохранить указатель на текущую запись Ну так и сохроняте;) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2007, 13:42 |
|
||
|
Пустали ли Dbf-таблица
|
|||
|---|---|---|---|
|
#18+
Андрей К"пустая таблица" - таблица, где нет ни одной неудалённой записи После проверки необходимо сохранить указатель на текущую запись Вы выполняете проверку в той же таблице, в которой надо сохранить положение указателя? Чем не устаривает тот факт, что раз Вы стоите на какой-то строке (т.е. EOF()=.F. или Recno()<=Reccount()), то значит, хотя бы одна не удаленная запись есть. Ведь именно на ней и находится указатель? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2007, 14:08 |
|
||
|
Пустали ли Dbf-таблица
|
|||
|---|---|---|---|
|
#18+
Это недостаток FoxPro!!! * Функция, проверяющая, пустая таблица или нет (с учётом фильтра). * Параметр Name (необязательный, символьный) - псевдоним таблицы. * Параметр Filter (необязательный, символьный) - условие проверки. * Функция не наложит перманентно на таблицу фильтр с этим условием. * Если этот параметр отсутсвует, то используется текущий фильтр. * Возвращаемое значение (логическое): * .T. - если пустая, * .F. - если не пустая. FUNCTION IsTableEmpty LPARAMETERS cName, cFilter LOCAL S, N, ReturnValue S = SELECT () IF PCOUNT () > 0 THEN SELECT (cName) ENDIF IF EOF () N = 0 ELSE N = RECNO () ENDIF IF PCOUNT () > 1 THEN LOCAL OldFilter OldFilter = Filter () IF ALLTRIM (cFilter) = "" THEN SET FILTER TO ELSE SET FILTER TO EVALUATE (cFilter) ENDIF ENDIF GO TOP IF EOF () THEN ReturnValue = .T. ELSE ReturnValue = .F. ENDIF IF PCOUNT () > 1 THEN IF ALLTRIM (OldFilter) = "" THEN SET FILTER TO ELSE SET FILTER TO EVALUATE (cFilter) ENDIF ENDIF IF N # 0 THEN GO N ELSE GO BOTTOM IF NOT EOF () THEN SKIP ENDIF ENDIF SELECT (S) RETURN ReturnValue ENDFUNC Правда, если по какой-то причине указатель до входа в функцию уже стоял на некорректной записи, будет ошибка. Лень мне было предусматривать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2007, 16:06 |
|
||
|
Пустали ли Dbf-таблица
|
|||
|---|---|---|---|
|
#18+
Итак, как отметил Burn, надо сделать Go top, затем проверить Eof(), и вернуть указатель на место... Весьма трудоёмко, а проверять "пустоту" таблицы приходится часто, чтобы блокировать кнопки, которые не должны работать при пустой таблице. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2007, 19:08 |
|
||
|
Пустали ли Dbf-таблица
|
|||
|---|---|---|---|
|
#18+
>Весьма трудоёмко Для фокса обсолютно нетрудоемко - передергивание курсора это делается влет. Обычно делается просто - при входе проверил на пустоту кнопки отключил. Успешно добавил - включил кнопки. Удалил проверил на последную включил/невключил. Таким образом проверять надо в двух местах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2007, 19:55 |
|
||
|
Пустали ли Dbf-таблица
|
|||
|---|---|---|---|
|
#18+
Андрей КИтак, как отметил Burn, надо сделать Go top, затем проверить Eof(), и вернуть указатель на место... С какой стати? Вы ведь так и не описали свою задачу! Вы УЖЕ СТОИТЕ на какой-то записи! Это либо реальная, физически существующая запись (Recno()<=Reccount()), либо некая фиктивная запись (Recno()>Reccount()). Зачем Вам куда-то переходить? Неужели так трудно проверить, чем именно является та запись, на которой Вы в настоящее время находитесь? Или Вы хотите чего-то другого? Тогда опишите свою задачу более подробно. Не "определить пустоту", а зачем Вам надо эту пустоту определять. Может, и не надо вовсе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2007, 20:06 |
|
||
|
Пустали ли Dbf-таблица
|
|||
|---|---|---|---|
|
#18+
for ВладимирМ: Не факт, что я стою на конкретной записи. Ситуация следующая. Я загружаю форму с гридом, источником которого является таблица. Она может быть пуста или нет. Если таблица пуста, некоторые кнопки надо заглушить. Довольно типичная интерфейсная ситуация. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2007, 21:50 |
|
||
|
Пустали ли Dbf-таблица
|
|||
|---|---|---|---|
|
#18+
Андрей КНе факт, что я стою на конкретной записи... Я загружаю форму с гридом, источником которого является таблица... В таком случае ты таки "стоИшь" на "конкретной" записи! ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2007, 23:10 |
|
||
|
Пустали ли Dbf-таблица
|
|||
|---|---|---|---|
|
#18+
Андрей КНе факт, что я стою на конкретной записи. Ситуация следующая. Я загружаю форму с гридом, источником которого является таблица. Она может быть пуста или нет. Если таблица пуста, некоторые кнопки надо заглушить. Довольно типичная интерфейсная ситуация. Ну, вот. Теперь задача проясняется. Чтобы наполнить Grid таблицу надо открыть. Раз Вы таблицу открыли, значит, все-таки встали на какую-то запись. Либо явным образом, либо не явным (FoxPro при открытии таблицы устанавливает указатель на первую запись). Вы открываете форму. Пользователь еще не успел в ней ничего сделать. Никуда не перешел, никак запись не позиционировал. Это значит, что "привязки" к конкретной записи у Вас нет. Поэтому нет необходимости возвращаться к какой-то конкретной записи. Тем не менее, в некоторых случаях, при открытии формы необходимо сделать явный переход в начало таблицы по GO TOP. Это может быть, например, в случае использования Private DataSession и установки настройки SET DELETED ON после открытия таблиц. Факт перехода в начало таблицы вообще не связан с определением пустая или не пустая таблица. Это необходимо сделать, чтобы фильтр вступил в силу. Но, заодно, этот переход решает и проблему определения пустоты таблицы. Значит, просто в событии Form.Init даете команду GO TOP для Вашей таблицы, а дальше смотрите что возвращает EOF() и в зависимости от этого делаете не активными нужные кнопки. Указатель записи никуда возвращать не надо. Он так и остается на первой записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2007, 00:03 |
|
||
|
Пустали ли Dbf-таблица
|
|||
|---|---|---|---|
|
#18+
ВладимирМЗначит, просто в событии Form.Init даете команду GO TOP для Вашей таблицы, а дальше смотрите что возвращает EOF() и в зависимости от этого делаете не активными нужные кнопки. Указатель записи никуда возвращать не надо. Он так и остается на первой записи. Совершенно согласен. Другая ситуация. Форма с гридом уже загружена. Посредством некой кнопки удаляется запись из таблицы-источника грида. При этом таблица может "опустеть". Этот факт необходимо проверять, в результате чего указатель на текущую запись улетит за пределы таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2007, 11:06 |
|
||
|
Пустали ли Dbf-таблица
|
|||
|---|---|---|---|
|
#18+
Андрей К ВладимирМЗначит, просто в событии Form.Init даете команду GO TOP для Вашей таблицы, а дальше смотрите что возвращает EOF() и в зависимости от этого делаете не активными нужные кнопки. Указатель записи никуда возвращать не надо. Он так и остается на первой записи. Совершенно согласен. Другая ситуация. Форма с гридом уже загружена. Посредством некой кнопки удаляется запись из таблицы-источника грида. При этом таблица может "опустеть". Этот факт необходимо проверять, в результате чего указатель на текущую запись улетит за пределы таблицы. Будете выдввать задачи по одной? Как физически осуществляется удаление записи? Это делает примерно такой код Код: plaintext 1. 2. 3. 4. 5. 6. Зачем здесь SKIP? А затем, что настройка SET DELETED ON - это своеобразный фильтр. Как и любой другой фильтр он вступает в силу только после попытки перемещения указателя записи. Это значит, что просто по команде DELETE запись, конечно, удалится, но останется видимой. Просто потому, что для данной записи фильтр SET DELETED ON еще не вступил в силу. Надо сдвинуть указатель записи. Вот именно это и делает приведенный код. После этого кода, указатель записи окажется либо на какой-то физически существующей записи, либо EOF()=.T. Опять же, ничего никуда перемещать и вычислять не надо. Вы однозначно определяете есть ли записи доступные для просмотра или нет. Просто по самому факту нахождения на какой-то реально существующей записи. Возвращаемся к тому, с чего начали. Вам не надо ничего вычислять. Достаточно просто посмотреть на текущее положение указателя записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2007, 11:14 |
|
||
|
Пустали ли Dbf-таблица
|
|||
|---|---|---|---|
|
#18+
Условие просто жуть, точнее описание с двойным отрицанием :) "пустая таблица" - таблица, где нет ни одной неудалённой записи После проверки необходимо сохранить указатель на текущую запись В общем проверка на наличие не удаленных записей. Можно вот такой извращенный способ: Код: plaintext 1. 2. 3. 4. 5. 6. Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2007, 11:36 |
|
||
|
Пустали ли Dbf-таблица
|
|||
|---|---|---|---|
|
#18+
ВладимирМЭто значит, что просто по команде DELETE запись, конечно, удалится, но останется видимой. Просто потому, что для данной записи фильтр SET DELETED ON еще не вступил в силу. Надо сдвинуть указатель записи. Убедили. Снимаю шляпу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2007, 17:54 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=34811009&tid=1588750]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
66ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 225ms |
| total: | 362ms |

| 0 / 0 |
