powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Пустали ли Dbf-таблица
16 сообщений из 16, страница 1 из 1
Пустали ли Dbf-таблица
    #34810885
Андрей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем!
Как проще всего узнать, Пустали ли Dbf-таблица? И при этом сохранить указатель на текущую запись?
...
Рейтинг: 0 / 0
Пустали ли Dbf-таблица
    #34810895
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотря, что именно Вы вкладываете в понятие "пустая таблица".

1) В ней физически нет ни одной записи? Тогда по Reccount()=0

2) В таблице нет ни одной записи, удовлетворяющей определенным условиям? Например, нет ни одной не удаленной записи. Тогда все зависит от того, что это за условия и как они были надожены.
...
Рейтинг: 0 / 0
Пустали ли Dbf-таблица
    #34811009
Андрей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"пустая таблица" - таблица, где нет ни одной неудалённой записи
После проверки необходимо сохранить указатель на текущую запись
...
Рейтинг: 0 / 0
Пустали ли Dbf-таблица
    #34811174
Burn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей К"пустая таблица" - таблица, где нет ни одной неудалённой записи
После проверки необходимо сохранить указатель на текущую запись
Ну так и сохроняте;)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
lnRecNo=RecNo()
GO top
IF EOF()
   ? 'Пустая'
ELSE
    IF lnRecNo>RecCount()
         GO bott
    ELSE
         GO lnRecNo
    ENDIF
ENDIF
...
Рейтинг: 0 / 0
Пустали ли Dbf-таблица
    #34811310
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей К"пустая таблица" - таблица, где нет ни одной неудалённой записи
После проверки необходимо сохранить указатель на текущую запись

Вы выполняете проверку в той же таблице, в которой надо сохранить положение указателя? Чем не устаривает тот факт, что раз Вы стоите на какой-то строке (т.е. EOF()=.F. или Recno()<=Reccount()), то значит, хотя бы одна не удаленная запись есть. Ведь именно на ней и находится указатель?
...
Рейтинг: 0 / 0
Пустали ли Dbf-таблица
    #34811812
Рома Б.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это недостаток 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

Правда, если по какой-то причине указатель до входа в функцию уже стоял на некорректной записи, будет ошибка. Лень мне было предусматривать...
...
Рейтинг: 0 / 0
Пустали ли Dbf-таблица
    #34812539
Андрей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Итак, как отметил Burn, надо сделать Go top, затем проверить Eof(), и вернуть указатель на место...
Весьма трудоёмко, а проверять "пустоту" таблицы приходится часто, чтобы блокировать кнопки, которые не должны работать при пустой таблице.
...
Рейтинг: 0 / 0
Пустали ли Dbf-таблица
    #34812613
Burn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Весьма трудоёмко
Для фокса обсолютно нетрудоемко - передергивание курсора это делается влет. Обычно делается просто - при входе проверил на пустоту кнопки отключил. Успешно добавил - включил кнопки. Удалил проверил на последную включил/невключил. Таким образом проверять надо в двух местах
...
Рейтинг: 0 / 0
Пустали ли Dbf-таблица
    #34812634
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей КИтак, как отметил Burn, надо сделать Go top, затем проверить Eof(), и вернуть указатель на место...
С какой стати? Вы ведь так и не описали свою задачу!

Вы УЖЕ СТОИТЕ на какой-то записи! Это либо реальная, физически существующая запись (Recno()<=Reccount()), либо некая фиктивная запись (Recno()>Reccount()). Зачем Вам куда-то переходить? Неужели так трудно проверить, чем именно является та запись, на которой Вы в настоящее время находитесь?

Или Вы хотите чего-то другого? Тогда опишите свою задачу более подробно. Не "определить пустоту", а зачем Вам надо эту пустоту определять. Может, и не надо вовсе.
...
Рейтинг: 0 / 0
Пустали ли Dbf-таблица
    #34812773
Андрей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
for ВладимирМ:

Не факт, что я стою на конкретной записи. Ситуация следующая. Я загружаю форму с гридом, источником которого является таблица. Она может быть пуста или нет. Если таблица пуста, некоторые кнопки надо заглушить. Довольно типичная интерфейсная ситуация.
...
Рейтинг: 0 / 0
Пустали ли Dbf-таблица
    #34812870
Фотография Redrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей КНе факт, что я стою на конкретной записи... Я загружаю форму с гридом, источником которого является таблица...
В таком случае ты таки "стоИшь" на "конкретной" записи! ;-)
...
Рейтинг: 0 / 0
Пустали ли Dbf-таблица
    #34812921
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей КНе факт, что я стою на конкретной записи. Ситуация следующая. Я загружаю форму с гридом, источником которого является таблица. Она может быть пуста или нет. Если таблица пуста, некоторые кнопки надо заглушить. Довольно типичная интерфейсная ситуация.

Ну, вот. Теперь задача проясняется.

Чтобы наполнить Grid таблицу надо открыть. Раз Вы таблицу открыли, значит, все-таки встали на какую-то запись. Либо явным образом, либо не явным (FoxPro при открытии таблицы устанавливает указатель на первую запись).

Вы открываете форму. Пользователь еще не успел в ней ничего сделать. Никуда не перешел, никак запись не позиционировал. Это значит, что "привязки" к конкретной записи у Вас нет. Поэтому нет необходимости возвращаться к какой-то конкретной записи.

Тем не менее, в некоторых случаях, при открытии формы необходимо сделать явный переход в начало таблицы по GO TOP. Это может быть, например, в случае использования Private DataSession и установки настройки SET DELETED ON после открытия таблиц.

Факт перехода в начало таблицы вообще не связан с определением пустая или не пустая таблица. Это необходимо сделать, чтобы фильтр вступил в силу. Но, заодно, этот переход решает и проблему определения пустоты таблицы.

Значит, просто в событии Form.Init даете команду GO TOP для Вашей таблицы, а дальше смотрите что возвращает EOF() и в зависимости от этого делаете не активными нужные кнопки. Указатель записи никуда возвращать не надо. Он так и остается на первой записи.
...
Рейтинг: 0 / 0
Пустали ли Dbf-таблица
    #34813616
Андрей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМЗначит, просто в событии Form.Init даете команду GO TOP для Вашей таблицы, а дальше смотрите что возвращает EOF() и в зависимости от этого делаете не активными нужные кнопки. Указатель записи никуда возвращать не надо. Он так и остается на первой записи.

Совершенно согласен. Другая ситуация. Форма с гридом уже загружена. Посредством некой кнопки удаляется запись из таблицы-источника грида. При этом таблица может "опустеть".
Этот факт необходимо проверять, в результате чего указатель на текущую запись улетит за пределы таблицы.
...
Рейтинг: 0 / 0
Пустали ли Dbf-таблица
    #34813658
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей К ВладимирМЗначит, просто в событии Form.Init даете команду GO TOP для Вашей таблицы, а дальше смотрите что возвращает EOF() и в зависимости от этого делаете не активными нужные кнопки. Указатель записи никуда возвращать не надо. Он так и остается на первой записи.

Совершенно согласен. Другая ситуация. Форма с гридом уже загружена. Посредством некой кнопки удаляется запись из таблицы-источника грида. При этом таблица может "опустеть".
Этот факт необходимо проверять, в результате чего указатель на текущую запись улетит за пределы таблицы.
Будете выдввать задачи по одной?

Как физически осуществляется удаление записи? Это делает примерно такой код

Код: plaintext
1.
2.
3.
4.
5.
6.
select MyTab
DELETE
SKIP
IF EOF()=.T.
	SKIP - 1 
ENDIF

Зачем здесь SKIP? А затем, что настройка SET DELETED ON - это своеобразный фильтр. Как и любой другой фильтр он вступает в силу только после попытки перемещения указателя записи. Это значит, что просто по команде DELETE запись, конечно, удалится, но останется видимой. Просто потому, что для данной записи фильтр SET DELETED ON еще не вступил в силу. Надо сдвинуть указатель записи.

Вот именно это и делает приведенный код.

После этого кода, указатель записи окажется либо на какой-то физически существующей записи, либо EOF()=.T. Опять же, ничего никуда перемещать и вычислять не надо. Вы однозначно определяете есть ли записи доступные для просмотра или нет. Просто по самому факту нахождения на какой-то реально существующей записи.

Возвращаемся к тому, с чего начали. Вам не надо ничего вычислять. Достаточно просто посмотреть на текущее положение указателя записей.
...
Рейтинг: 0 / 0
Пустали ли Dbf-таблица
    #34813755
GoshaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Условие просто жуть, точнее описание с двойным отрицанием :)
"пустая таблица" - таблица, где нет ни одной неудалённой записи
После проверки необходимо сохранить указатель на текущую запись
В общем проверка на наличие не удаленных записей.
Можно вот такой извращенный способ:
Код: plaintext
1.
2.
3.
4.
5.
6.
SET SQLBUFFERING ON 
DIMENSION anTmp( 1 )
STORE  0  TO anTmp
SELECT COUNT(*) FROM t_MyTable WHERE !DELETED() INTO ARRAY anTmp
? anTmp( 1 )
RELEASE anTmp
У ВладимирМ способ еще проще и элегантней :)
Код: plaintext
1.
2.
3.
SET DELETED ON
GO TOP IN t_MyTable
? EOF(t_MyTable)
...
Рейтинг: 0 / 0
Пустали ли Dbf-таблица
    #34815569
Андрей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМЭто значит, что просто по команде DELETE запись, конечно, удалится, но останется видимой. Просто потому, что для данной записи фильтр SET DELETED ON еще не вступил в силу. Надо сдвинуть указатель записи.

Убедили. Снимаю шляпу.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Пустали ли Dbf-таблица
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]