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

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

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

Код: 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
19.09.2007, 14:08
    #34811310
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пустали ли Dbf-таблица
Андрей К"пустая таблица" - таблица, где нет ни одной неудалённой записи
После проверки необходимо сохранить указатель на текущую запись

Вы выполняете проверку в той же таблице, в которой надо сохранить положение указателя? Чем не устаривает тот факт, что раз Вы стоите на какой-то строке (т.е. EOF()=.F. или Recno()<=Reccount()), то значит, хотя бы одна не удаленная запись есть. Ведь именно на ней и находится указатель?
...
Рейтинг: 0 / 0
19.09.2007, 16:06
    #34811812
Рома Б.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пустали ли Dbf-таблица
Это недостаток 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
19.09.2007, 19:08
    #34812539
Андрей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пустали ли Dbf-таблица
Итак, как отметил Burn, надо сделать Go top, затем проверить Eof(), и вернуть указатель на место...
Весьма трудоёмко, а проверять "пустоту" таблицы приходится часто, чтобы блокировать кнопки, которые не должны работать при пустой таблице.
...
Рейтинг: 0 / 0
19.09.2007, 19:55
    #34812613
Burn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пустали ли Dbf-таблица
>Весьма трудоёмко
Для фокса обсолютно нетрудоемко - передергивание курсора это делается влет. Обычно делается просто - при входе проверил на пустоту кнопки отключил. Успешно добавил - включил кнопки. Удалил проверил на последную включил/невключил. Таким образом проверять надо в двух местах
...
Рейтинг: 0 / 0
19.09.2007, 20:06
    #34812634
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пустали ли Dbf-таблица
Андрей КИтак, как отметил Burn, надо сделать Go top, затем проверить Eof(), и вернуть указатель на место...
С какой стати? Вы ведь так и не описали свою задачу!

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

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

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

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

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

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

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

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

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

Совершенно согласен. Другая ситуация. Форма с гридом уже загружена. Посредством некой кнопки удаляется запись из таблицы-источника грида. При этом таблица может "опустеть".
Этот факт необходимо проверять, в результате чего указатель на текущую запись улетит за пределы таблицы.
...
Рейтинг: 0 / 0
20.09.2007, 11:14
    #34813658
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пустали ли Dbf-таблица
Андрей К ВладимирМЗначит, просто в событии 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
20.09.2007, 11:36
    #34813755
GoshaS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пустали ли Dbf-таблица
Условие просто жуть, точнее описание с двойным отрицанием :)
"пустая таблица" - таблица, где нет ни одной неудалённой записи
После проверки необходимо сохранить указатель на текущую запись
В общем проверка на наличие не удаленных записей.
Можно вот такой извращенный способ:
Код: 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
20.09.2007, 17:54
    #34815569
Андрей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пустали ли Dbf-таблица
ВладимирМЭто значит, что просто по команде DELETE запись, конечно, удалится, но останется видимой. Просто потому, что для данной записи фильтр SET DELETED ON еще не вступил в силу. Надо сдвинуть указатель записи.

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


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