|
|
|
Pack выдает ошибку
|
|||
|---|---|---|---|
|
#18+
В форме есть элемент грид, в нем я помечаю элементы на удаление, после чего нажимаю на кнопочку которая должна удаить(пакетировать) записи из таблицы и обновить элемент грид... Трабл в том, что не получается удалить..... прога ступорится на строке с PACK и выдает следующее сообщение о оибке: "file is open in another work area". Честно, мне даже трудно представить где еще ХитрыйЛис наше anothe area :(..... Может тут дело в том что я создаю прогу через проект? Вот код кнопки. Код: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. товарищи срочно хелп....... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2007, 16:28 |
|
||
|
Pack выдает ошибку
|
|||
|---|---|---|---|
|
#18+
А если условие не выполняется, что пакуется? И перед паком селект врядли помешает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2007, 16:53 |
|
||
|
Pack выдает ошибку
|
|||
|---|---|---|---|
|
#18+
Ой, я тут маленько подшаманил теперь когда условие выполняется он пишет File in Use :((( и дальше не идет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2007, 17:28 |
|
||
|
Pack выдает ошибку
|
|||
|---|---|---|---|
|
#18+
Гарантированно закрыть USE in sponsors и потом уже переоткрывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2007, 17:32 |
|
||
|
Pack выдает ошибку
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2007, 17:37 |
|
||
|
Pack выдает ошибку
|
|||
|---|---|---|---|
|
#18+
MifusВ форме есть элемент грид, в нем я помечаю элементы на удаление, после чего нажимаю на кнопочку которая должна удаить(пакетировать) записи из таблицы и обновить элемент грид...Вопрос: "Зачем пакуешь?" Используй в настройках SET DELETED ON т.е. неотображать записи помеченные как удаленные. Таким образом если и удалил записи в GRID-е, который привязан к таблице ну тогда произведи GRID.REFRESH и записи помеченные как удаленные исчезнут. Я как понял ты используешь маркер удаления записи в GRID-е. А PACK-овать каждый раз таблицу на мой взгляд это неправильно. Проблем больше. Уж лучше в конце работы программы это делать если у тебя много удаленных записей собирается в таблице и логика программы этого требует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2007, 17:38 |
|
||
|
Pack выдает ошибку
|
|||
|---|---|---|---|
|
#18+
Как написть то? Вот так не работает... может через Асю поговорим.... 264853104 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2007, 17:38 |
|
||
|
Pack выдает ошибку
|
|||
|---|---|---|---|
|
#18+
2 Владимир СА: Ну да, все правильно вы поняли... Как правильно писать на фоксе я незнаю, поскоку предпочитаю Access, а с лисом связался тока потому, что преподаватель в универе требует от нас писать обязательно на FoxPro, но при этом почему-то забыл прочитать еще и программирование на нем..... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2007, 17:43 |
|
||
|
Pack выдает ошибку
|
|||
|---|---|---|---|
|
#18+
У тебя работает только отдельная форма или ты делаешь целый проект? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2007, 18:01 |
|
||
|
Pack выдает ошибку
|
|||
|---|---|---|---|
|
#18+
На 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 Файл должен иметь активным индекс, чтобы записи с пустыми полями были впереди по порядку сортировки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2007, 11:45 |
|
||
|
Pack выдает ошибку
|
|||
|---|---|---|---|
|
#18+
Пошел по пути наименьшего сопротивления не стал использовать PACK, просто поставил в стартовой форме set deleted on и все.... тока я ни как не пойму философию FoxPro... Почему сделано так что после удаления ничего не удаляется, а только отмечается как удаленно??? Почему бы сразу не удалять? Зачем нужна команда PACK если ей не все не рекомендуют пользоваться??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2007, 16:55 |
|
||
|
Pack выдает ошибку
|
|||
|---|---|---|---|
|
#18+
Это не философия, а логика. нарисуйте алгоритм упаковки на листочке, так вот пак - это плохо, почему, да потому, что лис вынужден создать новый файл, а старый удалить. как Вы думаете, логично ли переписывать большой объем, чем просто забить знак '*' в нужное место? как Вы думаете хорошо это на больших объемах, и как Вы думаете это делать если файл одновременно держат несколько человек? всегда в своей практике использовал технологию восстановления удаленных записей, пользуясь финтом с индексами по условию делетед и нот делетед ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2007, 17:11 |
|
||
|
Pack выдает ошибку
|
|||
|---|---|---|---|
|
#18+
MifusПошел по пути наименьшего сопротивления не стал использовать PACK, просто поставил в стартовой форме set deleted on и все.... тока я ни как не пойму философию FoxPro... Почему сделано так что после удаления ничего не удаляется, а только отмечается как удаленно??? Почему бы сразу не удалять? Зачем нужна команда PACK если ей не все не рекомендуют пользоваться??? Это не проблема FoxPro. Это проблема ЛЮБОГО приложения, использующего в качестве хранения данных файлы DBF. Файл DBF физически - это просто последовательный набор байт. Одна строка таблицы в этом случае это некая последовательность байт, которая начинается с позиции N и занимает M байт. Адресация к строкам таблицы на физическом уровне идет именно по ее позиции. Физическое удаление записи означает, что из файла изымается кусок данных с позиции N длиной M байт. Все, что находится после него сдвигается "вверх" (или "влево", как смотреть). Изменяет свои текущие позиции. Теперь представь ситуацию, несколько пользователей одновременно работают с одной и той же таблицей. Даже не записью, а именно таблицей. На физическом уровне, обращаются к некоторым байтам в файле DBF. Физически удалили некоторую запись. ВСЕ пользователи должны изменить адресацию. Ведь у них у ВСЕХ "поехали" позиции той записи, с которой они работают. Они то считают, что запись лежит по одному адресу, а реальный адрес оказался другой. Полный "бардак" начинается. Это еще не рассматривая вопросов времени выполнения собственно упаковки, различных блокировок и т.д. и т.п. Именно поэтому, при удалении запись физически не удаляется, а только помечается как удаленная. Становится скрытой, невидимой при помощи настройки SET DELETED ON. Это позволяет не менять адресацию к строкам таблицы. Нет никаких проблем. Не надо что-то там требовать от работающих в этот момент клиентов. Физическое удаление записей, ранее помеченных как удаленные происходит "потом". Когда есть возможность выгнать всех пользователей из программы и открыть таблицу в единоличное использование (Exclusive). Т.е. командой PACK пользоваться можно и нужно, но не в процессе оперативной работы, а при проведении ряда операций по регулярному обслуживанию базы данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2007, 17:25 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=34259497&tid=1590021]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
142ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 242ms |
| total: | 478ms |

| 0 / 0 |
