Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Просмотр и восстановление "удаленных" записей в DBF таблицах [D7, dBase, FoxPro]


Страницы:   1 2 3 4

АМБ ©   (2005-07-18 11:15:00) 

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


sniknik   (2005-07-26 11:59:00) [21]

> Правда подсчет записей осталься таким как и был.
я его не трогал.

> Насколько я правильно понял, Вы ввели вычисялемое поле, и по нему уже прорисовываете DBGrid.
нет, именно тут я воспользовался другим способом ([51]).
сдесь это проше как оказалось, но не зная ничего о задаче даже не думал о решении в таком аспекте. до получения исходников. а предлогат теоретическое решение, на проверку, но тоже рабочее (см. [50]).

> Хотя нерешенный вопрос о подсчете записей, все-таки висит небольшым, но неприятным грузом.
обьяснял в первом же своем посте, сдесь похоже то самое.
BDE и компонент на его основе это всетаки не одно и тоже.


АМБ   (2005-07-26 11:42:00) [22]

Для > sniknik. Во-первых, БОЛЬШОЕ СПАСИБО!!!
Во-вторых, "сразу" я имел ввиду не сразу после приглашения, а сразу после моей просьбой разобраться с моим кодом.
А все это время я пыталься выяснить, что я "потерял" и почему программка перестала считать "удаленные" записи и "неудаленные".
Ваш екзешник работает как я и хотел. Это радует.
Правда подсчет записей осталься таким как и был. Это немного огорчает.
Насколько я правильно понял, Вы ввели вычисялемое поле, и по нему уже прорисовываете DBGrid. ЧТо ж буду проповать теперь этот вариант. Хотя нерешенный вопрос о подсчете записей, все-таки висит небольшым, но неприятным грузом.


sniknik   (2005-07-26 11:27:00) [23]

> Для sniknik я выслал сразу, воспользовавшись его приглашением.
ничего себе сразу ...
предложено (и потом следующим же постом сказал что проверил, значит все, проблема себя исчерпала. неинтересно)
sniknik ©   (25.07.05 13:17) [50]
получено  
Дата: Tue, 26 Jul 2005 10:50:30 +0400 (MSD)

потом в исходниках просто нет кода который обсуждается...!!!??? я код за других не пишу... исправить могбы. может быть. (именно поэтому в ответ выслал только екзешник (с добавкой которую долго пытался донести словами... безушпешно)) все работает. читай еще раз эту ветку, можеш мои посты перечитывать по два раза...


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

Всем кому еще не надоело….
Не успел я порадоваться, что все заработало как надо (а ведь действительно работало…), как все перестало работать. И теперь работает, по-новому, но не так как надо. А работает следующим образом. Не зависимо от настройки BDE->Configuration->Native->DBASE->LEVEL=3 (или 4), отработка кода, текст которой выше, выдает следующие результаты.
Форма моей программки может менять размер, меняется и размер DBGrid-a. Если размер DBGrid-a такой, что показываются все записи таблицы без скроллинга, то все записи считаются как удаленные. А если размер формы вместе с размером DBGrid-a изменить так, что появляется скроллинг, то все записи считаются не удаленными. Хотя в таблице есть и удаленные и не удаленные записи.
Не знаю, что я мог изменить неаккуратно в BDE или в тексте программки, но знаю, что работало, а теперь не работает. Если кому интересно могу выслать весь исходник своей программки (архив 41 кб) с тестовыми базами (архив 8 кб ).
Для sniknik я выслал сразу, воспользовавшись его приглашением.


Anatoly Podgoretsky   (2005-07-25 15:19:00) [25]

А попробуй изменить 12 байт в kernel.exe может пригодится.
Зачем чесать левое ухо правой рукой, когда тебе рассказали про нормальные пути? Делать что ли нечего?


ANB   (2005-07-25 15:06:00) [26]


> Anatoly Podgoretsky ©   (25.07.05 14:22) [53]
- а вдруг пригодится ?


Anatoly Podgoretsky   (2005-07-25 14:22:00) [27]

ANB ©   (25.07.05 14:11) [52]
учимся работать с файлами БД напрямую

Тупиковый путь.


ANB   (2005-07-25 14:11:00) [28]


> sniknik ©   (25.07.05 13:17) [50]
> во настырные... и все время через задницу норовят сделать.
> ;о))
- че сразу ругаться то. Через задницу интереснее же. Опять же польза - учимся работать с файлами БД напрямую.


sniknik   (2005-07-25 13:25:00) [29]

кстати способ определить удаленность не единственный (теперь когда практически "заставили" сделать тест, это вижу). но предлагать другое не буду, не вижу смысла. зачем? с одним то не разобрались.


sniknik   (2005-07-25 13:17:00) [30]

во настырные... и все время через задницу норовят сделать. ;о))

все работает и с 3-м dBase тоже (не выдержал, сам сделал таблицу 3-го и проверил), проблема не в версии, проблема в интерпретации, просто проверялось так понимаю на таблице с малым количеством записей, первая была удаленная...
вот вся неопределенность "неопределенно пятнистого грида" вылилась в одно пятно... (на большее не хватает).

впрочем все это уже описывал, не буду повторятся, если хочеш перечитай ветку.


ANB   (2005-07-25 12:40:00) [31]


> АМБ   (25.07.05 08:28) [47]

В коде, который я тебе выслал, самое главное - это определение рекордов заголовка DBF и полей DBF. В сети есть описание структуры DBF файла. Если в мои рекорды записать из файла инфу - то в полях начдешь много полезного и сможешь определить по какому смещению начинается запись с нужным тебе номером. Я, вроде, комментарии воткнул. * юзается для пометки практически во всех DBF. Минус - если заюзал индекс, то я не знаю, как ты будешь искать номер нужной тебе записи. Если нет - то все просто. Работать должно быстро, если все параметры (смещение первой записи и размер записи) ты определишь заранее (до или сразу после открытия таблицы). Затем все сведется к :
- расчитать позицию нужной записи
- прочитать один байт
- проанализить его.
Все имхо. На исчерпывающий вариант не претендую.


sniknik   (2005-07-25 08:38:00) [32]

> Это так и надо?
проверь, открой таблицу текстовым редактором, если значки у удаленных "*" на месте (а куда им дется то ;о))) должно работать...
если есть, а всетаки не работает пришли пример таблици, посмотреть. может и придумаем чего (если не работает).


АМБ   (2005-07-25 08:28:00) [33]

Мастера, извините за назойливость.
В силу "специфики" работы со сторонними организациями, я работаю с DBASE-III.
dbiGetRecord заработала начиная с DBASE-IV.
На DBASE-III не работает.
Это так и надо?


ANB   (2005-07-21 19:13:00) [34]


>   begin
>       N2 := N2 + 1;
> //       Label2.Caption := IntToStr(N1);
>     end;

- вот это место замени на

>   begin
>       N2 := N2 + 1;
> //       Label2.Caption := IntToStr(N2);
>     end;

Проблеме не поможет, но будет красивее работать.


АМБ   (2005-07-21 17:20:00) [35]


> Anatoly Podgoretsky ©   (21.07.05 16:04) [44]

Немного изменил текст кода:


procedure TfrmMain.Button1Click(Sender: TObject);
var
N1, N2: integer;
begin
n1 := 0;
n2 := 0;
tblDBF.First;
while not tblDBF.Eof do
begin
  if Deleted(tblDBF) Then
    begin
      N1 := N1 + 1;
//       Label1.Caption := IntToStr(N1);
    end
  else
    begin
      N2 := N2 + 1;
//       Label2.Caption := IntToStr(N1);
    end;
  Application.ProcessMessages;
  tblDBF.Next;
end;
lblForInfo.Caption:='Del:'+IntToStr(N1)+#10+'NotDel:'+IntToStr(N2);
end;



Результат: Del:14
Т.е., в таблице, которая открывалась в DBGrid-e всего 14 записей: удаленных и неудаленных


Anatoly Podgoretsky   (2005-07-21 16:04:00) [36]

Для начала сделай тестовую версию

n1 := 0;
n2 := 0;
tblDBF.First;
begin
 while not tblDBF.Eof do
 if Deleted(tblDBF) do begin
   N1 := N1 + 1;
   Label1.Caption := IntToStr(N1);
 end;
 else begin
   N2 := N2 + 1;
   Label2.Caption := IntToStr(N1);
 end;
 Application.ProcessMessages;
 tblDBF.Next;
end;


АМБ   (2005-07-21 15:51:00) [37]


> Anatoly Podgoretsky ©   (21.07.05 15:38) [42]


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+2,Rect.Top+2,Column.Field.Text);
   end
 else
   begin
     TDBGrid(Sender).Canvas.Brush.Color := $ffffff;
     TDBGrid(Sender).Canvas.Font.Color := $000000;
     TDBGrid(Sender).Canvas.FillRect(Rect);
     TDBGrid(Sender).Canvas.TextOut(Rect.Left+2,Rect.Top+2,Column.Field.Text);
   end;

 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;

"Шагал" по всем записям... Идет по каждой ячейки всей записи, переходит на новую, снова по всем ячейкам и т.д. В блок ELSE ни разу не попадает.


Anatoly Podgoretsky   (2005-07-21 15:38:00) [38]

Ты сначала сделай блок ELSE в своем коде. Потом сделай метку и двигаясь по записям вывод в нее состояние, тогда и говорить можно, а что говорить по ошибочному коду, не понимая как работает OnDrawCell


АМБ   (2005-07-21 15:30:00) [39]

Всем спасибо! Судя по полученному коду (за что, конечно, БОЛЬШОЕ спасибо ANB) мне еще и до тупорылого шагать и шагать...%((((
Поэтому прийдеться и впрям идти в... дворники, и то, если возьмут.

> Anatoly Podgoretsky ©   (21.07.05 14:52) [38]

Я и не сомневалься, что БДЕ работает нормально, но... так и не понял, почему в моем случае она (функция DELETED) все время показывает True? Ну, да... может когда-нибудь и пойму...
Еще раз ВСЕМ СПАСИБО %о))))(((())))


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

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


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо