Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];

Вниз

Просмотр и восстановление "удаленных" записей в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.05 c
2-1130827236
syte_ser78
2005-11-01 09:40
2005.11.20
глупый вопрос по TDBLoocupComboBox


4-1126989851
NikNet
2005-09-18 00:44
2005.11.20
Запрет на выключение/перезагрузки, компьютера


3-1128048706
Извращенец2
2005-09-30 06:51
2005.11.20
Interbase 5.6 жрет память


14-1130078980
alexsis
2005-10-23 18:49
2005.11.20
Михаил Задорнов


2-1130502856
Oxid Burn
2005-10-28 16:34
2005.11.20
Timer





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский