C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Удаление одной записи в dbf
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, и таблица открыта
Exclusive
CODE
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 не будет сбоить, тогда пометки
уберутся со ВСЕХ записей. smile.gif

Два варианта. Сперва записать уникальный
идент. записей помеченных на удаление.
И после PACK найти каждый и по отдельности
снова пометить на удаление.

Или процедура типа, что выше.

Вернуться в Работа с базами данных в C++Builder