powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Pack выдает ошибку
14 сообщений из 14, страница 1 из 1
Pack выдает ошибку
    #34254197
Mifus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В форме есть элемент грид, в нем я помечаю элементы на удаление, после чего нажимаю на кнопочку которая должна удаить(пакетировать) записи из таблицы и обновить элемент грид...
Трабл в том, что не получается удалить..... прога ступорится на строке с PACK и выдает следующее сообщение о оибке: "file is open in another work area". Честно, мне даже трудно представить где еще ХитрыйЛис наше anothe area :(.....
Может тут дело в том что я создаю прогу через проект?
Вот код кнопки.
Код:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
RSBC=this.Parent.Grid1.RecordSource
this.Parent.Grid1.RecordSource=""

IF USED("sponsors") = .T. AND IsExclusive("sponsors") = .F.
SELECT sponsors
USE 
USE sponsors EXCLUSIVE
ENDIF

PACK
this.Parent.Grid1.RecordSource=RSBC

товарищи срочно хелп.......
...
Рейтинг: 0 / 0
Pack выдает ошибку
    #34254208
BMJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BMJ
Гость
А если условие не выполняется, что пакуется?
И перед паком селект врядли помешает.
...
Рейтинг: 0 / 0
Pack выдает ошибку
    #34254237
Mifus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой, я тут маленько подшаманил теперь когда условие выполняется он пишет File in Use :((( и дальше не идет
...
Рейтинг: 0 / 0
Pack выдает ошибку
    #34254239
BMJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BMJ
Гость
Гарантированно закрыть USE in sponsors
и потом уже переоткрывать.
...
Рейтинг: 0 / 0
Pack выдает ошибку
    #34254243
Mifus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RSBC=this.Parent.Grid1.RecordSource
this.Parent.Grid1.RecordSource=""

IF USED("sponsors") = .T. AND IsExclusive("sponsors") = .F.
SELECT sponsors
USE in sponsors
USE sponsors EXCLUSIVE
ENDIF

PACK
&&USE sponsors SHARED
this.Parent.Grid1.RecordSource=RSBC
...
Рейтинг: 0 / 0
Pack выдает ошибку
    #34254244
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MifusВ форме есть элемент грид, в нем я помечаю элементы на удаление, после чего нажимаю на кнопочку которая должна удаить(пакетировать) записи из таблицы и обновить элемент грид...Вопрос: "Зачем пакуешь?"
Используй в настройках SET DELETED ON т.е. неотображать записи помеченные как удаленные. Таким образом если и удалил записи в GRID-е, который привязан к таблице ну тогда произведи GRID.REFRESH и записи помеченные как удаленные исчезнут. Я как понял ты используешь маркер удаления записи в GRID-е. А PACK-овать каждый раз таблицу на мой взгляд это неправильно. Проблем больше. Уж лучше в конце работы программы это делать если у тебя много удаленных записей собирается в таблице и логика программы этого требует.
...
Рейтинг: 0 / 0
Pack выдает ошибку
    #34254247
Mifus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как написть то? Вот так не работает... может через Асю поговорим.... 264853104
...
Рейтинг: 0 / 0
Pack выдает ошибку
    #34254252
Mifus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Владимир СА:
Ну да, все правильно вы поняли... Как правильно писать на фоксе я незнаю, поскоку предпочитаю Access, а с лисом связался тока потому, что преподаватель в универе требует от нас писать обязательно на FoxPro, но при этом почему-то забыл прочитать еще и программирование на нем.....
...
Рейтинг: 0 / 0
Pack выдает ошибку
    #34254265
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя работает только отдельная форма или ты делаешь целый проект?
...
Рейтинг: 0 / 0
Pack выдает ошибку
    #34255136
gelosqlru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На Pack в живой базе я принципиально «забил болт». Это следует делать только в процедурах обслуживания базы, когда с ней не работают другие пользователи. В живой работе применяю подход, позволяющий не устраивать «блошиные бега» с Select и Use, а выполнять технику повторного использования освобожденных от данных записей.

Каркас кода такой :
сTableAlias=<имя_алиаса>
,,,
1. Удаляю запись путем очистки всех её полей :
BLANK IN (сTableAlias)
If <надо>
DELETE Next 1 IN (This.TableAlias)
EndIf

2. Новую запись создаю так :

Gotop IN (сTableAlias)
if IsBlank(сTableAlias) && если запись пуста...
If Deleted(сTableAlias)
Recall next 1 in (сTableAlias)
EndIf
else
APPEND BLANK IN (cTableAlias)
endif


3. Функция IsBlank() имеет вид:
FUNCTION IsBlank(сTableAlias)
LOCAL cStr1,i,nFcount
i=1
nFcount=FCOUNT(сTableAlias)
cStr1=FIELD(i,сTableAlias)
cStr1=FldValue(сTableAlias,cStr1)
DO WHILE EMPTY(cStr1) .AND. i<=nFcount
i=i+1
IF i<=nFcount && проверим, иначе будет ошибка обращения к полю ...
cStr1=FIELD(i,сTableAlias)
cStr1=FldValue(сTableAlias,cStr1)
ENDIF
ENDDO
if i>nFcount
return .t. && Все поля записи пусты.
else
return .f. && нет - есть хотя бы одно непустое поле.
endif
EndFunc

4. Функция FldValue(сTableAlias,cFieldName) - получить значение поля в таблице.
Function FldValue(сTableAlias,cFieldName)
LOCAL cString
cString=сTableAlias+"->"+cFieldName
cString=&cString
Return cString
Endfunc

Файл должен иметь активным индекс, чтобы записи с пустыми полями были впереди по порядку сортировки.
...
Рейтинг: 0 / 0
Pack выдает ошибку
    #34259427
Mifus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пошел по пути наименьшего сопротивления не стал использовать PACK, просто поставил в стартовой форме set deleted on и все.... тока я ни как не пойму философию FoxPro... Почему сделано так что после удаления ничего не удаляется, а только отмечается как удаленно??? Почему бы сразу не удалять? Зачем нужна команда PACK если ей не все не рекомендуют пользоваться???
...
Рейтинг: 0 / 0
Pack выдает ошибку
    #34259497
alex11100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это не философия, а логика.

нарисуйте алгоритм упаковки на листочке,
так вот пак - это плохо, почему,
да потому, что лис вынужден создать новый файл, а старый удалить.

как Вы думаете, логично ли переписывать большой объем, чем
просто забить знак '*' в нужное место?
как Вы думаете хорошо это на больших объемах,
и как Вы думаете это делать если файл одновременно
держат несколько человек?

всегда в своей практике использовал технологию восстановления удаленных записей,
пользуясь финтом с индексами по условию делетед и нот делетед
...
Рейтинг: 0 / 0
Pack выдает ошибку
    #34259546
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MifusПошел по пути наименьшего сопротивления не стал использовать PACK, просто поставил в стартовой форме set deleted on и все.... тока я ни как не пойму философию FoxPro... Почему сделано так что после удаления ничего не удаляется, а только отмечается как удаленно??? Почему бы сразу не удалять? Зачем нужна команда PACK если ей не все не рекомендуют пользоваться???

Это не проблема FoxPro. Это проблема ЛЮБОГО приложения, использующего в качестве хранения данных файлы DBF.

Файл DBF физически - это просто последовательный набор байт. Одна строка таблицы в этом случае это некая последовательность байт, которая начинается с позиции N и занимает M байт. Адресация к строкам таблицы на физическом уровне идет именно по ее позиции.

Физическое удаление записи означает, что из файла изымается кусок данных с позиции N длиной M байт. Все, что находится после него сдвигается "вверх" (или "влево", как смотреть). Изменяет свои текущие позиции.

Теперь представь ситуацию, несколько пользователей одновременно работают с одной и той же таблицей. Даже не записью, а именно таблицей. На физическом уровне, обращаются к некоторым байтам в файле DBF.

Физически удалили некоторую запись. ВСЕ пользователи должны изменить адресацию. Ведь у них у ВСЕХ "поехали" позиции той записи, с которой они работают. Они то считают, что запись лежит по одному адресу, а реальный адрес оказался другой. Полный "бардак" начинается.

Это еще не рассматривая вопросов времени выполнения собственно упаковки, различных блокировок и т.д. и т.п.

Именно поэтому, при удалении запись физически не удаляется, а только помечается как удаленная. Становится скрытой, невидимой при помощи настройки SET DELETED ON. Это позволяет не менять адресацию к строкам таблицы. Нет никаких проблем. Не надо что-то там требовать от работающих в этот момент клиентов.

Физическое удаление записей, ранее помеченных как удаленные происходит "потом". Когда есть возможность выгнать всех пользователей из программы и открыть таблицу в единоличное использование (Exclusive).

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


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