Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.20;
Скачать: CL | DM;

Вниз

Просмотр и восстановление "удаленных" записей в DBF таблицах   Найти похожие ветки 

 
АМБ   (2005-07-18 11:15) [0]

Как организовать просмотр помеченных на удаление записей в DBF таблице? Т.е. сначала, записи обрабатываются tblDBF1.Delete; и становятся невидимы в DBGrid-е. Как сделать их видимыми, да еще и другим цветом, или как-то еще их выделить, а затем, выбрав какую-нибудь запись - восстановить ее, т.е. снять пометку на удаление.


 
ЮЮ ©   (2005-07-18 11:24) [1]

А что будешь делать, когда на сервер перейдешь?
Умерла так умерла.
Если кто-то удалил нужные данные, пусть садится в выходные и вбивает заново :)


 
Val ©   (2005-07-18 11:32) [2]

>АМБ   (18.07.05 11:15)
компоненты доступа? если - БДЕ, то тут недавно был пример Подгорецкого с исп. БДЕ-API.


 
Anatoly Podgoretsky ©   (2005-07-18 11:32) [3]

АМБ   (18.07.05 11:15)  
dbiSetProp


 
АМБ   (2005-07-18 11:50) [4]


> Anatoly Podgoretsky

А нельзя ли немного поподробнее.  А если можно, то и с примером.
А то, что-то не понятно...:-(


 
Anatoly Podgoretsky ©   (2005-07-18 11:52) [5]

Можно и подробнее и с примером, который приведен в справке, но это будет верхом невежливости по отношению к другим, копировать примеры из справки.
Так что попробуй немного и сам поработать.


 
АМБ   (2005-07-18 12:09) [6]


> Anatoly Podgoretsky

Спасибо за подсказку. А то я не понял где искать. По инерции думал, что это неизвестное мне свойство TTable или DBGrid-a
Еще раз спасибо.


 
evvcom ©   (2005-07-18 12:13) [7]

Тогда уж лучше добавить в таблицу поле с именем Deleted. По нему и запросы можно будет строить и физического удаления не будет. Всегда можно выяснить существовали ли такие данные, и кто "удалил". Имхо.


 
Johnmen ©   (2005-07-18 12:17) [8]

dbiSetProp + F1


 
АМБ   (2005-07-18 15:28) [9]

Всем спасибо! Все работае! Удаленные записи и показываются и прячуться. Единственная пока проблема: когда удаленные записи показываются, то их не отличишь от обычных. Подскажите, можно ли сделать как-нибудь такое отличие в рамках использования метода dbiSetPropа?


 
Val ©   (2005-07-18 15:33) [10]

обязательно в рамках данного метода? :)
определяем состояние соотв. BDE-API и красим в соотв. обработчике сетки.


 
Anatoly Podgoretsky ©   (2005-07-18 15:34) [11]

А DbiGetRecord на что тебе дан?


 
АМБ   (2005-07-18 16:57) [12]

К своему стыду, я так и не понял...:-((((((


 
Anatoly Podgoretsky ©   (2005-07-18 16:59) [13]

Поиск вверху форума видишь, попробуй будешь приятно удивлен.


 
АМБ   (2005-07-19 11:52) [14]


> Anatoly Podgoretsky

Еще раз спасибо за подсказку. Но все равно мало, что понял.:о(((
Ваш пример:
function DELETED(Table:TTable);
var
Prop : RECProps;
begin
dbiGetRecord(Table.Handle, dbiNoLock, nil, @Prop);
Result := Prop.bDeleteFlag;
END;

При компиляции выдается ошибка: Function needs result type.
Поставил тип: function DELETED(Table:TTable): Boolean;
Ругаться перестал. Но что с этим делать - не пойму.

В BDE32.HLP написано:
DbiGetRecord retrieves the current record, if any, in the table associated with hCursor. Т.е. вроде бы выдает запись с необходимым для нас условием, в ващей функции - что удалена.
Но как это использовать? А если запись не одна?
Пробовал по разному. Последнее что пробовал, это написал в обработчике dbgDBFDrawColumnCell, следующее:
if DELETED(tblDBF) then
begin
 dbgDBF.Canvas.Brush.Color := $00ff00;
 dbgDBF.Canvas.Font.Color := $0000ff;
 dbgDBF.Canvas.FillRect(Rect);
 dbgDBF.Canvas.TextOut(Rect.Left,Rect.Top,Column.Field.Text);    
end;
Раскрашивается весь DBGrid, да еще как-то тоже не понятно. Но удаленные записи все-равно не отличаются.
Если можно подскажите. Что не так? И как надо?


 
Anatoly Podgoretsky ©   (2005-07-19 12:27) [15]

Зачем же тогда спрашивал как определелить удаленая или нет?


 
АМБ   (2005-07-19 13:29) [16]


> Anatoly Podgoretsky

Мне нужно включать (и выключать) режим просмотра удаленных записей. Если нужно восстанавливать их, а какие уже совсем не нужны тех совсем удалять, физически.
Сейчас у меня уже получилось выводить удаленные записи в просмотр и "прятать" их снова. Если надо, удалять их физически (через DbiPackTable). Но никак не пойму, как сделать, чтобы при просмотре удаленных записей они выделялись другим цветом.
К своему сожалению, я еще не работал с функциями BDE.
Английский тоже перевожу...  со словарем :о(.
Поэтому рад всякой помощи...


 
Val ©   (2005-07-19 14:14) [17]

>[16] АМБ   (19.07.05 13:29)
Как красить сетку в зависимости от разл.условий отлично написано в статьях на "Королевстве Делфи". Сделайте просто условие с использованием вашей функции (кстати, не очень уверен, что вы верно трактуете результат props...) - разница небольшая.


 
АМБ   (2005-07-19 14:34) [18]


> Val

Все верно. Именно с этими статьми я и познакомился. И также верно, что я не так "трактую" результат Props... Но как надо?
Это я и прошу подсказать.


 
Val ©   (2005-07-19 14:43) [19]

>[18] АМБ   (19.07.05 14:34)
Извините, но я не хочу лезть за вас в хелп и смотреть структуру типа этого самого Props, и в зависимости от нее проводить анализ результата.


 
АМБ   (2005-07-19 15:03) [20]

Даже не знаю, что и сказать... Я конечно, извиняю. Но в хелп я и лазил и смотрел, анализировал и пробовал, но не получилось. Потому и обратился за помощью. Может кто знает? Из тех, кто практически уже проходил этот вопрос.


 
Anatoly Podgoretsky ©   (2005-07-19 19:37) [21]

Результат функции BOOLEAN


 
АМБ   (2005-07-20 14:50) [22]

Уважаемый,
> Anatoly Podgoretsky

Подскажите пожалуйста, Ваша функция она показывает свойство bDeleteFlag текущей записи? Т.е. можно перебирать записи и  у каждой проверять это свойство и реагировать не это. Или Ваша функция показывает что в таблице есть записи, помеченные на удаление. Но мои пробы показали, что Ваша функция показывает True, даже после физического удаления записей. Так как с ней можно работать?
Скажите пожалуйста.


 
Anatoly Podgoretsky ©   (2005-07-20 16:26) [23]

Перебирать не надо, это делает dbgDBFDrawColumnCell, а результат используй в IF


 
АМБ   (2005-07-21 10:26) [24]

Уважаемый, Anatoly Podgoretsky (или кто-нибудь). Ну подскажите, пожалуйста. Почему не работает, как надо, следующий код:

procedure TfrmMain.dbgDBFDrawColumnCell(Sender: TObject; const Rect: TRect;
 DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
 if DELETED(tblDBF) then
   begin
     TDBGrid(Sender).Canvas.Brush.Color := $00ff00;
     TDBGrid(Sender).Canvas.Font.Color := $0000ff;
     TDBGrid(Sender).Canvas.FillRect(Rect);
     TDBGrid(Sender).Canvas.TextOut(Rect.Left,Rect.Top,Column.Field.Text);

     IF  gdSelected   IN State Then
       Begin
        TDBGrid(Sender).Canvas.Brush.Color:= clHighLight;
 TDBGrid(Sender).Canvas.Font.Color := clHighLightText;
    End;

     TDBGrid(Sender).DefaultDrawColumnCell(Rect,DataCol,Column,State);
   end;

end;

function DELETED(Table:TTable): Boolean;
var
Prop : RECProps;
begin
dbiGetRecord(Table.Handle, dbiNoLock, nil, @Prop);
Result := Prop.bDeleteFlag;
END;

Напоминаю. Необходимо, чтобы в DBGrid-e удаленные записи были выделены цветом. Но сейчас цветом выделяются все записи. Не зависимо от того включен режим показа удаленных записей или нет.
Извиняюсь по поводу моей "несообразительности". :о((((


 
Anatoly Podgoretsky ©   (2005-07-21 10:49) [25]

А что не работает, я глубоко анализировать твой код не буду, поскольку ты сам не приложил никаких усилий для обрисовки проблемы не работоспособности. Могу скажать у тебя отсутсвует блок ELSE


 
АМБ   (2005-07-21 11:24) [26]

Хорошо:::(((. Можете мне сказать Anatoly Podgoretsky, в каком случае функция DELETE(tblDBF) выдают True, а в каком - False?


 
sniknik ©   (2005-07-21 11:47) [27]

ну код тут явно бракованный... ;о)) но у меня сомнения в том что данный подход вообще работоспособен, даже если его написать правильно (с else и вообще... ;о)).
дело в том, что отрисовка работает через даталинк (данные получает для нее), а она использует ненавигационные методы работы с таблицей, т.е. для получения данных записи делается не Next, а "Внутренний указатель" + 1; ну чтото вроде этого. неохота "углублятся" в тему.
вот. и если это так то BDE будет не в курсе всех этих дел, что там "навернула" его обертка (TTable), рискуем получать неверные данные, и как следствие "неопределенно пятнистый грид".
ну вот например, что будет возвращено при BOF = true? реально указатель "за гридом" на "до первой записи" а в гриде в это время рисуется первая строка (нет строки BOF)...

ну вот, правильнее определять удалена запись или нет в событии где реально определена текущая запись (и в BDE и TTable одна и та же). например в onCalcFields... там вычисляемому полю присваивать значение, ну "Удалено" к примеру, а в отрисовке уже для условия использовать его (если уж действительно необходимо выделять цветом).

p.s. сугубо имхо естественно. BDE это не мой "конек". поэтому и пояснение хромает.. не, оно хорошее. только хромает. ;о)) (© винни пух)


 
sniknik ©   (2005-07-21 11:50) [28]

> в каком случае функция DELETE(tblDBF) выдают True
если запись удалена.


 
АМБ   (2005-07-21 12:14) [29]

А у меня функция DELETE(tblDBF) всегда True?!?!?!? При прохождении Debug-ером.
Хотя в таблице есть и удаленные и не удаленные записи.


 
sniknik ©   (2005-07-21 12:46) [30]

> А у меня функция DELETE(tblDBF) всегда True?!?!?!?
прочитай [27] внимательно (похоже правдв ;), и смени событие.


 
ANB ©   (2005-07-21 12:50) [31]

Самый тупорылый, но самый надежный способ - читать запись напрямую из файла. Если в первой байте записи *,  то она удалена, если пробел, то нет. ИМХО.


 
АМБ   (2005-07-21 13:49) [32]


> ANB

Да... Теоретически выглядит все понятно. Но как считывать 1-й байт записи? Подскажите...


 
ANB ©   (2005-07-21 13:56) [33]

Могу переслать модуль. По исходникам разберешься и сделаешь свой вариант. Модуль умеет читать записи.


 
sniknik ©   (2005-07-21 14:14) [34]

> По исходникам разберешься
терзают меня смутные сомнения. ;о)) человек с выходным параметром единствнной функции в 2 строчки разобратся не может. а ты ему исходники... на сколько строк? ;)

к тому же там тоже вылезет проблема связи записи в TTable с записью в файле. просто уметь читать не самое главное.


 
АМБ   (2005-07-21 14:16) [35]


> ANB

Жду с нетерпением...:о)


 
ANB ©   (2005-07-21 14:33) [36]


> sniknik ©   (21.07.05 14:14) [34]
- да там всего 18 Кб. А в обработчике раскраски разве мы не имеем доступа к полям строки, которую красим ?


 
ANB ©   (2005-07-21 14:34) [37]

А коли имеем, номер записи вполне можно оттуда выдернуть.


 
Anatoly Podgoretsky ©   (2005-07-21 14:52) [38]

ANB ©   (21.07.05 12:50) [31]
Нафиг, функция из БДЕ нормально работает.


 
ANB ©   (2005-07-21 14:57) [39]


> Anatoly Podgoretsky ©   (21.07.05 14:52) [38]
- дык я не против. Я ж написал ИМХО. Может ему легче будет в моем коде разобраться. Кстати, я отправил, а спасибо нету . . .


 
Val ©   (2005-07-21 15:05) [40]

Разбирается. Разберется - скажет. 18 кил символов, означающих странные вещи - не шутки.



Страницы: 1 2 вся ветка

Текущий архив: 2005.11.20;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.045 c
3-1128587181
msguns
2005-10-06 12:26
2005.11.20
Access. JOIN более 2 таблиц


4-1127128263
Новый Гость
2005-09-19 15:11
2005.11.20
Как узнать, запущен ли Excel и закрыть его в случ. необходимости?


4-1127380492
Xobbit
2005-09-22 13:14
2005.11.20
Импорт из DLL


2-1130585016
Erl
2005-10-29 15:23
2005.11.20
MDI


14-1130184262
Volodya
2005-10-25 00:04
2005.11.20
Переполнение йомкости для отработаного чернила