Форум: "Базы";
Текущий архив: 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.049 c