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

Вниз

Определение реального текущего номера записи таблицы   Найти похожие ветки 

 
Gem   (2005-12-05 08:19) [0]

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

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


 
Anatoly Podgoretsky ©   (2005-12-05 09:24) [1]

Что такое реальный номер записи.
Баталии по поводу используемых тобой функций вести не возможно, поскольку они не указаны. Есть только два свойства, оба из которых не обязаны показывать какую либо достоверную информацию


 
Gem   (2005-12-05 10:31) [2]

> Что такое реальный номер записи.

Это объясняется в тексте сообщения. Все же, если не понятно, пытаюсь разъяснить еще раз. Текущей записи с номером 2600 реально не может быть в базе с 2500 записями (при последующем повторном удалении записей).

> Баталии по поводу используемых тобой функций вести не возможно,
>  поскольку они не указаны.

Извиняюсь за невнимательность, действительно имелось в виду не функции, а свойства.

> Есть только два свойства, оба из которых не обязаны показывать какую либо достоверную информацию

То есть действия RecNo объснениям не поддаются? Для чего тогда вообще оно существует....


 
Morgoth_   (2005-12-05 11:36) [3]

можно предположить, что записи не удалилилсь, а остались с пометкой "удаленные", поэтому общее количество 2500, а текущая может быть до 3000, упаковать попробуй после удаления
хотя возможно я и не прав


 
Anatoly Podgoretsky ©   (2005-12-05 11:44) [4]

Gem   (05.12.05 10:31) [2]
> Что такое реальный номер записи.
Это объясняется в тексте сообщения.


В тексте сообщения это не объясняется.
Поэтому все таки что такое реальный номер записи.

То есть действия RecNo объснениям не поддаются? Для чего тогда вообще оно существует....

На мой взгляд для совместимости со старым обеспечением. По понятиям номер записи это химера в базах данных, они таким понятиями не оперируют. Все понятия теории реляционных баз ограничиваются кортежами и их аттрибутами.


 
Anatoly Podgoretsky ©   (2005-12-05 11:45) [5]

Для тебя будет хорошо, если ты забудешь про RecNo и RecordCount


 
Gem   (2005-12-05 13:50) [6]


> Morgoth_   (05.12.05 11:36) [3]
>
> можно предположить, что записи не удалилилсь, а остались
> с пометкой "удаленные", поэтому общее количество 2500, а
> текущая может быть до 3000, упаковать попробуй после удаления
> хотя возможно я и не прав


возможно ли сжатие с использованием BDE


 
Gem   (2005-12-05 13:54) [7]


> Anatoly Podgoretsky ©   (05.12.05 11:45) [5]
>
> Для тебя будет хорошо, если ты забудешь про RecNo и RecordCount


есть альтернативы?


 
alex_*** ©   (2005-12-05 14:10) [8]

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


 
Gem   (2005-12-06 06:05) [9]


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


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


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

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


 
alex_*** ©   (2005-12-06 10:41) [11]

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


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

>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;


 
msguns ©   (2005-12-06 10:53) [13]

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

;)


 
Gem   (2005-12-06 12:22) [14]


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


не помогло


 
msguns ©   (2005-12-06 12:51) [15]

>ini-файл

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


 
msguns ©   (2005-12-06 12:52) [16]

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


 
Morgoth_   (2005-12-06 12:54) [17]

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

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


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


> 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


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


> 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


 
alex_*** ©   (2005-12-06 13:43) [20]

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


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


> Gem   (06.12.05 13:22) [19]

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


 
msguns ©   (2005-12-06 14:04) [22]

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

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


 
Anatoly Podgoretsky ©   (2005-12-06 14:08) [23]

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


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

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


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


> 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. Дальше что?
>  Что с этим собираешься делать?
>

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


 
Fay ©   (2005-12-07 07:21) [26]

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


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

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


 
Gem   (2005-12-07 07:34) [28]


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


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


 
Fay ©   (2005-12-07 07:40) [29]

2 Gem   (07.12.05 7:34) [28]
Я читал, но нак и не понял - нафинг тебе этот номер вАщЕ нужен?


 
Gem   (2005-12-07 08:27) [30]


> Fay ©   (07.12.05 07:40) [29]
>
> 2 Gem   (07.12.05 7:34) [28]
> Я читал, но нак и не понял - нафинг тебе этот номер вАщЕ
> нужен?
>


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

чего не понятного?


 
evvcom ©   (2005-12-07 08:41) [31]


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

Ты можешь давать много невразумительных ответов типа "просто нужен", "чтобы на него посмотреть", "чтобы его посчитать". Только зачем тебе это нужно, ты так и не ответил. Вразумительным был бы ответ, например, чтобы отобразить progress-bar и правильно обсчитывать прогресс. Твои же "объяснения" - детский лепет.


 
Anatoly Podgoretsky ©   (2005-12-07 08:43) [32]

Gem   (07.12.05 06:46) [25]
Под текущим номером подразумевается номер записи, которая на настоящий момент обрабатывается

Не уходи от вопроса - что такое реальный текущий номер записи таблицы. и что такое в твоем понимании таблица.
Без этого ответ не возможен.


 
Gem   (2005-12-07 08:48) [33]


> evvcom ©   (07.12.05 08:41) [31]
> Ты можешь давать много невразумительных ответов типа "просто
> нужен", "чтобы на него посмотреть", "чтобы его посчитать".
>  Только зачем тебе это нужно, ты так и не ответил. Вразумительным
> был бы ответ, например, чтобы отобразить progress-bar и
> правильно обсчитывать прогресс. Твои же "объяснения" - детский
> лепет.

Елкала-палкала, опять двадцать пять! Если говорю, что нужно узнать сколько уже обработано записей из общего числа, значит так и есть. На форме так и пишу "обработано" столько-то "из" стольки-то. А, если предложить и помочь нечем, так нечего разглагольствовать.


 
Anatoly Podgoretsky ©   (2005-12-07 08:53) [34]

Gem   (07.12.05 08:48) [33]
Это уже совсем другой вопрос, который не имеет отношения к номеру записи.
Вот тебе и Елкала-палкала - пока не объяснишь, до тех пор и двадцатьпятать.
И прекрати наезжать на отвечающих, закрою тему, лучше займись своим интеллектуальным и моральным уровнем.


 
Morgoth_   (2005-12-07 09:58) [35]

Gem, у меня работает.
Но как уже говорили в [20], делай лучше запросами или разбирайся с упаковкой, не все же готовенькое.


 
Gem   (2005-12-07 10:06) [36]


> Anatoly Podgoretsky ©   (07.12.05 08:53) [34]
>
> Gem   (07.12.05 08:48) [33]
> Это уже совсем другой вопрос, который не имеет отношения
> к номеру записи.
> Вот тебе и Елкала-палкала - пока не объяснишь, до тех пор
> и двадцатьпятать.
> И прекрати наезжать на отвечающих, закрою тему, лучше займись
> своим интеллектуальным и моральным уровнем.

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


> Morgoth_   (07.12.05 09:58) [35]
>
> Gem, у меня работает.
> Но как уже говорили в [20], делай лучше запросами или разбирайся
> с упаковкой, не все же готовенькое.

По какой причине функция DbiPackTable может возвращать значение DBIERR_INVALIDHNDL?


 
evvcom ©   (2005-12-07 10:14) [37]


> Елкала-палкала

Ёкала и плакала... :)

см. [35] и выбирай. И где-то говорили про Last и снова First. Хотя за наезды можно было бы и не отвечать.

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


 
evvcom ©   (2005-12-07 10:18) [38]


> В самом начале моего вопроса было написано "...В форме отображается
> сколько записей обработано из общего числа...".

Долго я отвечал. Не было этого поста еще. Видимо к 30-м постам уже подзабыли то, о чем было сказано в [0]. Будь терпимее.

> По какой причине функция DbiPackTable может возвращать значение
> DBIERR_INVALIDHNDL?

Я бы все-таки использовал запрос. Возможно даже в нем уже можно было бы отсечь еще часть записей, которые, возможно, пропускаются при обработке. И клиенту легче будет.


 
Morgoth_   (2005-12-07 10:19) [39]

Могу только привести тебе полную рабочую процедуру, почему Table is busy это уже у себя смотри.
DBIERR_INVALIDHNDL скорее всего из-за того что не было Open.

procedure Tfrm_Noki.PackTable(TableName: string);
begin
   Table.Close ;
   Table.Exclusive := TRUE ;
   Table.TableName := TableName;
   Table.Open ;
   DbiPackTable(Table.DBHandle, Table.Handle, nil, szDBase, TRUE );
   Table.Close ;
end;


 
msguns ©   (2005-12-07 10:21) [40]

>Gem   (07.12.05 06:46) [25]
>Под текущим номером подразумевается номер записи, которая на настоящий момент обрабатывается
>А нужно мне это, чтоб знать сколько уже обработано записей из общего числа

Ну вот, теперь ясно..
Тебе нужен не "реально текущий номер записи таблицы" (сабж), а порядковый номер записи полученного НД (клиентского курсора). Но ведь это же - совсем другое дело !
Во-первых, поищи в архивах - относительно недавно хдесь была достаточно обширная ветка на эту тему.
Во-вторых, проблема такая есть и она полностью целесообразна, хотя и кажется некоторым форумчанам (тому же АП, к примеру) надуманной.
Сформулировать проблему можно так:
"Контроль позиции в курсоре НД". Для чего обычно надо две вещи:
1. Текущий № записи внутри текущего курсора
2. Количество записей в текущем курсоре

Выделение сделано умышленно, т.к. это - суть и ядро решения, которым ты, видимо, манкировал в своей программе.



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

Форум: "Начинающим";
Текущий архив: 2005.12.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.893 c
1-1133179392
grach
2005-11-28 15:03
2005.12.25
Помогите, CRC-16


2-1134219586
gdaujk
2005-12-10 15:59
2005.12.25
Const - параметры функции


2-1133682214
bogdan
2005-12-04 10:43
2005.12.25
Цвета в мемо


5-1117695880
Никита
2005-06-02 11:04
2005.12.25
Как заставить TCustomControl не "моргать" при перерисовывание


2-1133791634
Квэнди
2005-12-05 17:07
2005.12.25
Проблемы с отправкой почты





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский