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

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

Определение реального текущего номера записи таблицы [D7, XP]


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

Gem ©   (2005-12-05 08:19:00) 

Используются компоненты Table и Dataset. Кой-какие записи удаляются. В форме отображается сколько записей обработано из общего числа. Для этого использую RecNo и RecordCount. При первом удалении записей в таблице все отображается верно. Если производится попытка удалить еще раз записи из этой таблицы, RecNo ведет себя странно. То есть, например, изначально было в таблице 3000 записей. При первой обработке удалено 500 записей. При повторном удалении общее число отображается верно - 2500, а текущий номер записи со временем зашкаливает 2500 и доходит до 3000, как раньше. Как это объяснить? И лечиться ли?

ЗЫ. Просьба не вести бурных баталий по поводу используемых мною двух функций.


Gem   (2005-12-07 07:27:00) [21]

Судя по-всему мне либо нужно упаковать таблицу, что по неизвестной мне причине не получается, либо добавить, как предлагали, поле счетчика, куда циклом забивать номера записей, вот только во втором случае будет ли значение заносится и в помеченные на удаление записи...


Fay   (2005-12-07 07:21:00) [22]

2 Gem   (07.12.05 6:46) [25]
"Номер записи в таблице" <> "номер по порядку в некотором наборе данных"


Gem   (2005-12-07 06:46:00) [23]


> msguns ©   (06.12.05 14:04) [22]
> Что имется в виду под "текущим номером записи" ?
> Зачем он нужен ?

> Anatoly Podgoretsky ©   (06.12.05 14:08) [23]
>
> msguns ©   (06.12.05 14:04) [22]
> Я тоже пытаюсь от него получить этот же ответ, что такое
> реального текущего номера записи таблицы

Под текущим номером подразумевается номер записи, которая на настоящий момент обрабатывается

> evvcom ©   (06.12.05 17:19) [24]
>
> Ну получил ты, например, номер записи 2 или 3. Дальше что?
>  Что с этим собираешься делать?
>

А нужно мне это, чтоб знать сколько уже обработано записей из общего числа


evvcom   (2005-12-06 17:19:00) [24]

Ну получил ты, например, номер записи 2 или 3. Дальше что? Что с этим собираешься делать?


Anatoly Podgoretsky   (2005-12-06 14:08:00) [25]

msguns ©   (06.12.05 14:04) [22]
Я тоже пытаюсь от него получить этот же ответ, что такое реального текущего номера записи таблицы


msguns   (2005-12-06 14:04:00) [26]

>Gem   (06.12.05 13:09) [18]
>с определением количества записей проблем нет, проблема определить текущий номер

Что имется в виду под "текущим номером записи" ?
Зачем он нужен ?


Плохиш   (2005-12-06 13:43:00) [27]


> Gem   (06.12.05 13:22) [19]

Телепатор сказал, что таблицу в среде разработки тоже закрыть надо.


alex_***   (2005-12-06 13:43:00) [28]

делай удаление запросами. Потом обновишь DataSet


Gem   (2005-12-06 13:22:00) [29]


> Morgoth_   (06.12.05 12:54) [17]
>
> Table.Close ;
>    Table.Exclusive := TRUE ;
>    Table.Open ;
>    DbiPackTable(Table.DBHandle, Table.Handle, nil, szDBase,
>  TRUE );
>    Table.Close ;
>
> а что именно не помогло? упаковка не получилась или не решился
> основной вопрос?
>


как ты написал, выдает ошибку table is busy, я делаю так
table.Active:=false;
table.Exclusive:=true;
DbiPackTable(table.DBHandle, table.Handle, nil, szDBase, TRUE );

при этом база не упаковывается, когда делаю проверку на возвращаемое функцией значение оно получается равным DBIERR_INVALIDHNDL


Gem   (2005-12-06 13:09:00) [30]


> msguns ©


с определением количества записей проблем нет, проблема определить текущий номер


> alex_*** ©   (06.12.05 10:41) [11]
>
>
> - счетчик заведи себе. RecNo во многих компонентах не работает.


то есть добавить поле с типом счетчик, но насколька я понимаю, при удалении записи значение поля счетчика не обновляется и это проблему не решит


> Morgoth_   (06.12.05 10:21) [10]
>
> DbiPackTable(Table.DBHandle, Table.Handle, nil, szDBase,
>  TRUE );

функция возвращает значение DBIERR_INVALIDHNDL


Morgoth_   (2005-12-06 12:54:00) [31]

Table.Close ;
   Table.Exclusive := TRUE ;
   Table.Open ;
   DbiPackTable(Table.DBHandle, Table.Handle, nil, szDBase, TRUE );
   Table.Close ;

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


msguns   (2005-12-06 12:52:00) [32]

Прошу прощения, замечание [15] относилось к посту [14]


msguns   (2005-12-06 12:51:00) [33]

>ini-файл

Таблицу надо предварительно закрыть и перевести в эксклюзив.


Gem   (2005-12-06 12:22:00) [34]


> Morgoth_   (06.12.05 10:21) [10]
>
> DbiPackTable(Table.DBHandle, Table.Handle, nil, szDBase,
>  TRUE );


не помогло


msguns   (2005-12-06 10:53:00) [35]

Вообще-то джидаи типа Джонмэна, Сникника и т.д. для получения к-ва записей делаю паралелльный запрос Select Count..

;)


msguns   (2005-12-06 10:42:00) [36]

>Anatoly Podgoretsky ©   (05.12.05 11:44) [4]
>По понятиям номер записи это химера в базах данных, они таким понятиями не оперируют.

"Базы", конечно, не оперируют. А вот "клиенты" вполне.

Можно и нужноиспользовать и RecNo, и RecordCount, но !!!

- Во первых, в контексте возвращенного набора данных, но никак не таблицы (таблиц) БД, из которой эти данные были получены. Т.е. это сущности сугубо виртуальныеи имеют смысл только с момента, когда данные, полученные запросом (т.е. собственно датасет), становятся доступными клиенту и до того момента, когда этот запрос бюудет закрыт (переоткрыт или "обновлен").

- Во-вторых, учитывать, что не все объекты доступа могут поддерживать эти свойства, а если и могут, то делают это "своеобразно", а именно лишь в тех пределах, в которых "возникает надобность" с т.зр. самих объектов. В частности, после открытия непустого НД RecordCount обычно равен 1, даже если запрос вернул 1000 записей. Поэтому НЕЛЬЗЯ при сканировании (сквозного просмотра всех записей) НД "плясать"  от этой величины:

  for i := 1 to DataSet.RecordCount do ..
Вместо этого надо использовать цикл

 while Not DataSet.Eof do
   begin
    ..
    Next
   end;

В случаях, если нужно получить к-во записей без сканирования (например для оповещения пользователя о кол-ве записей непосредственно после открытия НД) достаточно выполнить такие действия:

With DataSet do
 begin
  Open;
  First;
  Last;
  StatusBar1.Panels[0].Text := 'Всего записей - '+IntToStr(RecordCount);
  First;
 end;


alex_***   (2005-12-06 10:41:00) [37]

какая запись сейчас обрабатывается
- счетчик заведи себе. RecNo во многих компонентах не работает.


Morgoth_   (2005-12-06 10:21:00) [38]

DbiPackTable(Table.DBHandle, Table.Handle, nil, szDBase, TRUE );


Gem   (2005-12-06 06:05:00) [39]


> alex_*** ©   (05.12.05 14:10) [8]
>
> Recno тебе для чего нужен? и что компонент DataSet


болею я, простите, имелось в виду не DataSet - DataSource
А RecNo нужен, чтоб видеть какая запись сейчас обрабатывается


alex_***   (2005-12-05 14:10:00) [40]

Recno тебе для чего нужен? и что компонент DataSet


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

Наверх

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