Oper01 |
Отправлено: 18.10.2006, 10:25 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 145
|
Здравствуйте.
В таблицах dbf (FoxPro) удаление происходит сначала с пометкой и эти записи не видны пользователю. А затем командой pack физически.
Вопрос: если у меня помеченных на удаление к примеру 10 записей. А физически я хочу удалить только одну выбранную из них, две (не все).
Это реализуемо ? |
|
olegenty |
Отправлено: 18.10.2006, 10:32 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
угу. своими собственными ручками всё реализуемо. для этого требуется создать новый *.dbf файл с идентичным исходному заголовком и перегнать туда из исходного файла всё, что не собираешься удалять.
|
|
Oper01 |
Отправлено: 18.10.2006, 10:37 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 145
|
А FoxPro не сможет с этим справится, не прибегая к написанию кода ? |
|
beginner |
Отправлено: 18.10.2006, 12:23 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 44
|
QUOTE (Oper01 @ 18.10.2006, 11:37) | А FoxPro не сможет с этим справится, не прибегая к написанию кода ? |
Может. Ф-я RECALL
Нужно открыть таблицу с параметром Exclusive, т.е.
USE table1 EXCLUSIVE
SELECT table1
И сперва нужно восстановить все записи
RECALL ALL
После этого удалить те две, напр.
DELETE FOR ID = 13 .OR. ID = 17
Или удалить вручную.
И физическое удаление
PACK |
|
beginner |
Отправлено: 18.10.2006, 13:38 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 44
|
Прога, на быструю руку, удаляет физически одну конкретную запись.
Предполагается, что таблица имеет имя table1,
уникальное поле имеет имя ID, и таблица открыта
ExclusiveCODE | PROCEDURE delRecord
LPARAMETERS piId As INTEGER
LOCAL m_ar(1)
LOCAL liCnt, liI
SELECT table1
SELECT ID FROM table1 INTO ARRAY m_ar WHERE (DELETED() = .T.) AND (ID#piId)
RECALL ALL
liCnt = _TALLY
DELETE FROM table1 WHERE ID = piId
IF _TALLY#0
PACK
ENDIF
IF liCnt#0
FOR liI = 1 TO liCnt
LOCATE FOR ID = m_ar(liI)
IF FOUND()
DELETE
ENDIF
ENDFOR
ENDIF
MESSAGEBOX([Ok]) |
Удаление напр. c ID = 7
delRecord(7)
Отредактировано beginner — 18.10.2006, 14:39 |
|
Oper01 |
Отправлено: 18.10.2006, 13:45 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 145
|
А помеченные записи на удаление также и остануться с пометкой или пометки пропадут ? Смущает функция RECALL ALL. |
|
beginner |
Отправлено: 18.10.2006, 13:52 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 44
|
QUOTE (Oper01 @ 18.10.2006, 14:45) | А помеченные записи на удаление также и остануться с пометкой или пометки пропадут ? Смущает функция RECALL ALL. |
Если ф-ия RECALL не будет сбоить, тогда пометки
уберутся со ВСЕХ записей.
Два варианта. Сперва записать уникальный
идент. записей помеченных на удаление.
И после PACK найти каждый и по отдельности
снова пометить на удаление.
Или процедура типа, что выше. |
|