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

Вниз

Проблемка с удалением записей из набора данных   Найти похожие ветки 

 
Juice ©   (2005-10-05 10:21) [0]

Есть TIBDataSet, делаю в него выборку а затем программно удаляю из него множетсво записей, но удаляю имено из набора данных и на саму базу это не отображается - в DeleteSQL стоит что-то наподобие "Delete from ... where 1=2", аналогично и в ModifySQL. После этого показываю это все в TDBGrid.

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

Попробовал разобраться в чем дело, и обнаружил следующее. Это код, который я вставил после функции "удаления ненужных записей" :

 First;
 while not eof do
 begin
   Next;
 end;

В дебагере имеем следующее :
RecorcCount - 33.
RecNo : после First - 7 ! (Почему?)
после первого Next - 9,
после второго Next - 15,
...
после n-ного Next - 45, (что уже больше чем RecordCount!)
и т.п.

Наверное отсюда и все глюки грида (кстати пробовал и другие гриды, проблема явно не в гриде). Может вы что-то подскажите?


 
ANB ©   (2005-10-05 10:50) [1]

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


 
Juice ©   (2005-10-05 11:03) [2]


> Судя по всему, дырки образовались из-за удаления.
> Вопрос - а зачем огород с удалением в НД "лишних" записей,
>  если в базе они остаются ? Может проще было написать нормальный
> запрос с правильными условиями и не мучиться ?

Ну как вы думаете, если бы я мог просто взять и написать запрос то я бы мучался с датасетом? Запрос такой невозможно написать, алгоритм выборки записей на удаление слишком сложный.


 
Desdechado ©   (2005-10-05 11:06) [3]

> Delete from ... where 1=2
имхо, если ничего не вписывать, ничего и не случится с БД

а с правильным запросом и вопросов не будет, как сказал ANB


 
ANB ©   (2005-10-05 11:09) [4]


> Juice ©   (05.10.05 11:03) [2]
- не бывает слишком сложных алгоритмов выборки, которых нельзя реализовать на SQL. Тем более, ИБ очень даже ничего, только с деревом работать не умеет, но это через ХП решается - вон А.Жук уже опубликовал хорошую процедурку.


 
Juice ©   (2005-10-05 12:15) [5]


> ANB ©   (05.10.05 11:09) [4]


> Desdechado ©   (05.10.05 11:06) [3]

Товарищи, ну вы можете понять что это абсолютно нереально ? Это будет ну ооооочччччченььььь сложно написать, и одной ХП тут не обойдешься, в придачу еще и куча udf. Сам sql который делает выборку для датасета весьма непростой, а о таком я даже и думать не хочу. Я согласен с вами, если что-то можно сделать с помощью одного запроса то это НУЖНО  сделать с помощью одного запроса, и я всегда стараюсь делать так. Но поверьте мне, тут не тот случай. Нужно выбрать данные, обработать их, и показать пользователю (широкий грид). Можно конечно после выборки обрабатывать данные в каких-то своих структурах, но потом будут большие  проблемы с их "выводом на экран".


 
Val ©   (2005-10-05 12:21) [6]


> Нужно выбрать данные, обработать их, и показать пользователю
> (широкий грид).

что значит "обработать"?


 
Курдль ©   (2005-10-05 12:28) [7]


> Juice ©   (05.10.05 10:21)


Есть наборы компонентов, в которых кроме DataSet-ов есть DataView.
Они-то отображают только реальные записи, а не их версии, безошибочно.
Еще вариант - поиграться с "DataSet.Disable/EnableControls" вокруг модификаций.


 
Juice ©   (2005-10-05 12:31) [8]


> что значит "обработать"?

Ну если сильно упрощенно, то что-то наподобие такого стэка:
Несколько таблиц содержат инф. о покупках и продажах товаров, нужно отобразить сост. наличия товаров на опр. момент. Продается последний купленный товар.
Пример1:
Дата1: Покупка Товара1   10 шт.
Дата2: Продажа Товара1   1 шт.
Дата3: Покупка Товара1    5 шт.
Дата4: Продажа Товара     4 шт.

Вывод д.б. таким:
Дата1: Товар 1  9 шт.
Дата3: Товар 1  1 шт.

Пример2:
Дата1: Покупка Товара1   10 шт.
Дата2: Покупка Товара1    5 шт.
Дата3: Продажа Товара     6 шт.

Вывод д.б. таким:
Дата1: Товар 1  9 шт.

И результат по всем товарам сразу вывести в один грид.


 
Курдль ©   (2005-10-05 12:39) [9]

Надо знать структуру БД.
Видится приблизительно так

Товары(наименование) +-< Сделки(дата, К/П, кол-во, цена)

Отсюда выполнить необходимый запрос элементарно.


 
Sergey13 ©   (2005-10-05 12:41) [10]

2[8] Juice ©   (05.10.05 12:31)
У тебя примеры не правильные. 8-)
>Дата1: Товар 1  9 шт.
Не 9 а 10. Это на Дата2 - 9.

Что мешает залить данные в CDS или какую нито таблицу в памяти и уже потом крутить-вертеть не эмулируя удаление?


 
Val ©   (2005-10-05 12:45) [11]

Ок, но где проблема с удалением? Удаления я не вижу в вашем примере. Или вы запрашиваете набор указанный в примере, а потом из него на клиенте пытаетесь сделать то, что называете "выводом"?


 
Курдль ©   (2005-10-05 12:50) [12]


> Val ©   (05.10.05 12:45) [11]
> Ок, но где проблема с удалением?


Вот и я не вижу! Это классический пример задачи фондового рынка -
есть активы (товар), есть сделки (покупка/продажа). Надо вычислить портфель (остаток).
Здесь вообще нечего удалять!


 
Val ©   (2005-10-05 12:51) [13]

>Sergey13 ©   (05.10.05 12:41)
конечно, только не пойму зачем это ему на клиенте. я бы все-таки посмотрел в сторону хп, возвращающей нужный набор.


 
ANB ©   (2005-10-05 12:58) [14]

2 решения :
1. Оптимальное. Таки написать нормальный запрос, если никак не получается запихать его в один селект - сделать хранимку, возвращающую НД.
2. Затычка. Кинуть на форму виртуальный дейтасет (есть куча), прогуляться по реальному НД и перекачать нужные записи в виртуальный. На экран выдавать виртуальный.


 
Juice ©   (2005-10-05 13:00) [15]


> Надо знать структуру БД.
> Видится приблизительно так
>
> Товары(наименование) +-< Сделки(дата, К/П, кол-во, цена)
>
> Отсюда выполнить необходимый запрос элементарно.

Информативный ответ. Выполнить конечно элементарно, - DatSet.Open :)
А написать ? Пусть хоть и совсем упрощенный,
crate table orders(
 good integer, //id товара
 date timestamp, //дата сделки
 quantity integer, // кол-во сделки
 buy integer, //1- покупка, 0 - продажа
)


> >Дата1: Товар 1  9 шт.
> Не 9 а 10. Это на Дата2 - 9.

Что-то я не улавливаю где ошибка ?


>
> Что мешает залить данные в CDS или какую нито таблицу в
> памяти и уже потом крутить-вертеть не эмулируя удаление?
>

А TIBDataSet разве не в памяти, и разве в CDS не придется эмулировать удаление ?


 
Sergey13 ©   (2005-10-05 13:04) [16]

2 [13] Val ©   (05.10.05 12:51)
Иногда одна из причин - не умение писать ХП. Иногда на самом деле сложный алгоритм и на клиенте это сделать проще, потому что язык программирования мощнее. Иногда сервер - это обычный ПК и грузить его не хочется. В принципе - не важно где делать, страдает только трафик.


 
Курдль ©   (2005-10-05 13:07) [17]


> Juice ©   (05.10.05 13:00) [15]
> Информативный ответ. Выполнить конечно элементарно, - DatSet.
> Open :)
> А написать ? Пусть хоть и совсем упрощенный,
> crate table orders(
>  good integer, //id товара
>  date timestamp, //дата сделки
>  quantity integer, // кол-во сделки
>  buy integer, //1- покупка, 0 - продажа
> )


Я разве намекал на такие извращения? :)

Открываете свой CASE-инструмент, 15 секунд водите мышкой и кликаете кнопкой, в результате модифицируется концептуальная модель.
Потом - "generate phisical model" - "generate database" и все! Какие проблемы?

ЗЫ: Есть тут счастливчики, у кого сообщения запостились с первого раза? :(


 
Sergey13 ©   (2005-10-05 13:07) [18]

2[15] Juice ©   (05.10.05 13:00)
>Что-то я не улавливаю где ошибка ?

>Пример1:
>Дата1: Покупка Товара1   10 шт.     остаток -10
>Дата2: Продажа Товара1   1 шт.      остаток -9


 
Курдль ©   (2005-10-05 13:12) [19]


> Sergey13 ©   (05.10.05 13:04) [16]
> 2 [13] Val ©   (05.10.05 12:51)
> Иногда одна из причин - не умение писать ХП.


К чему такой пафос, коллега? Многие (и я) считают, что написание ХП - это чаще всего признак неумения правильно создать БД и организовать работу с ней!


 
Val ©   (2005-10-05 13:21) [20]

>Sergey13 ©   (05.10.05 13:04)
Я понимаю, что причины бывают :) я ,вероятно, неверно выразился.
Я не знаю причин в конкретной ситуации, это вопрос, скорее к автору, конечно.
P.S. По поводу "неважно" и "страдает только траффик" не соглашусь. Страдает прежде всего сопровождение таких систем - поменять всем клиентов при ошибке в алгоритме/изменении его либо поменять хп? Таки, чем меньше бизнес-логики зашито в клиент, тем лучше.


 
Sergey13 ©   (2005-10-05 13:24) [21]

2 [19] Курдль ©   (05.10.05 13:12)
> К чему такой пафос, коллега?
Где и в чем ты его увидел? Я просто перебрал несколько (не все) причин для разбора набора данных на клиенте.


 
Val ©   (2005-10-05 13:28) [22]

>Курдль ©   (05.10.05 13:12)

> Многие (и я) считают, что написание ХП - это чаще всего
> признак неумения правильно создать БД и организовать работу
> с ней!

многие ошибаются.


 
Sergey13 ©   (2005-10-05 13:28) [23]

2[20] Val ©   (05.10.05 13:21)
>Страдает прежде всего сопровождение таких систем
"Страдает" - очень сильно сказано, ИМХО. По моему оно просто немного отличается.


 
Курдль ©   (2005-10-05 13:37) [24]

Sergey13 ©  + Val ©

Приведите мне, пожалуйста, навскидочку пример необходимости ХП в предмете данного обсуждения.


 
Val ©   (2005-10-05 13:38) [25]

>[23] Sergey13 ©   (05.10.05 13:28)
:) Нет, Сергей, не отступлюсь. "Сильно" сказал, основываясь на личном опыте сопровождения банковских систем, когда время по внесению исправлениий/тестированию/передаче заказчику бывает крайне ограниченным.
Хотя в иных случаях все, конечно же, может быть иначе.


 
Val ©   (2005-10-05 13:41) [26]

>[24] Курдль ©   (05.10.05 13:37)
разнотипные клиенты, имеющие доступ к одной БД.


 
Sergey13 ©   (2005-10-05 13:53) [27]

2[24] Курдль ©   (05.10.05 13:37)
Для себя я решаю подобные дилемы примерно так.
Бывают случаи, когда несложная обработка производится над большим объемом данных. Тут выгоднее сделать ХП, т.к. трафика нет, а процессорное время минимально. Иногда наоборот. Небольшой объем данных крутится долго и сложно. Иногда это выгоднее сделать на клиенте, т.к. трафик небольшой, а нагружать сервверный процессор не хочется - другим будет мешать.
Вот изходя из этих соображений я и стараюсь строить свои программы. По религиозным соображениям ничего не делаю. 8-)

2 [25] Val ©   (05.10.05 13:38)
Может быть. Зависит от конкретики. Просто я имею в виду, что изменение сервера без изменения клиента - это очень частный случай (когда параметры вызова ХП и ее выход не меняется). Часто надо менять и то и это.


 
Val ©   (2005-10-05 13:59) [28]

>[27] Sergey13 ©   (05.10.05 13:53)

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

Видно, не сталкивались с нашим/вашим законодательством и стремительностью его изменений. :)
Но ок. Это уже оффтоп. Завязываю.


 
Sergey13 ©   (2005-10-05 14:11) [29]

2 [28] Val ©   (05.10.05 13:59)
>Но ок. Это уже оффтоп. Завязываю.
Поддерживаю. Сколько людей - столько (и даже больше!) и мнений. 8-)


 
ANB ©   (2005-10-05 14:13) [30]


> Juice ©   (05.10.05 13:00) [15]
- структуру запостил. Теперь внятно - что хотим на выходе ?

ЗЫ. А зачем удалять из CDS ? Если туда можно класть только нужные записи ?


 
Sergey13 ©   (2005-10-05 14:30) [31]

2[15] Juice ©   (05.10.05 13:00)
> А TIBDataSet разве не в памяти, и разве в CDS не придется эмулировать удаление ?
Все в памяти. Но TIBDataSet привязан к БД, а CDS может быть и НЕ привязан.


 
Курдль ©   (2005-10-05 15:15) [32]


> Sergey13 ©   (05.10.05 13:53) [27]
> Val ©   (05.10.05 13:41) [26]

В общем, согласен. Но хочу предупредить о страшнейших граблях:
Есть у Вас давно исполненный, отлаженный и успешно работающий проект. Вдруг, когда Вы уже о нем забыли, приходит крупный клиент с хорошими деньгами и говорит: "Хочу то же самое, но на ОРАКЛЕ!"

С тех пор у нас корпоративный стандарт - трехзвенка. Где основная бизнес-логика исполняется на сервере приложений. И он готов работать с клиентами хоть в локалке, хоть по инету. А к базам обращается по максимуму на ANSI SQL.


 
Sergey13 ©   (2005-10-05 15:23) [33]

2[32] Курдль ©   (05.10.05 15:15)
> приходит крупный клиент с хорошими деньгами
Ну и что. Раз есть деньги под требования - переделаем хоть под DB2 хоть под DBF. 8-)
Перевод на другую БД вообще вещь нетривиальная. Хоть серверную часть переводи хоть клиентскую хоть обе сразу.


 
ANB ©   (2005-10-05 15:29) [34]


> Курдль ©   (05.10.05 15:15) [32]

Видел я одну такую хорошую, мощную трехзвенку. На мс скл. Под оракл ее уже лет 5 переписывают. Гы.


 
Sergey_Masloff   (2005-10-06 11:04) [35]

ANB ©   (05.10.05 15:29) [34]
>Видел я одну такую хорошую, мощную трехзвенку. На мс скл. Под оракл ее >уже лет 5 переписывают. Гы.
Да все видели. Когда бывш. нормальная система на MSSQL ложит мощнейший по железу сервак оракла при 5 юзерах.
Не стоит забывать что за нормальный сервер плачены немалые деньги (именно за его фичи) и потом использовать тот же оракл как дорогой интербейс ;-) смешно. Том кайт с нами согласен.


 
Курдль ©   (2005-10-06 11:31) [36]


> ANB ©   (05.10.05 15:29) [34]
> Видел я одну такую хорошую, мощную трехзвенку. На мс скл.
>  Под оракл ее уже лет 5 переписывают. Гы.


> Sergey_Masloff   (06.10.05 11:04) [35]
> Да все видели. Когда бывш. нормальная система на MSSQL ложит
> мощнейший по железу сервак оракла при 5 юзерах.
> Не стоит забывать что за нормальный сервер плачены немалые
> деньги (именно за его фичи) и потом использовать тот же
> оракл как дорогой интербейс ;-) смешно. Том кайт с нами
> согласен.


Подытожив вышесказанное могу лишь процитировать классику: "Сдуру можно и х... сломать!"  :)

Оракл от MS SQL отличается не фитчами!!! PL/SQL не лучше TSQL. В некоторых СУБД серверную логику на Java писать можно! Но это не делает их лучше, чем оракл! :)
Оракл - прежде всего высокая производительность при колоссальных объемах данных и большом числе пользователей (NASA и Pentagon не дадут соврать :).


 
Sergey13 ©   (2005-10-06 11:34) [37]

2[36] Курдль ©   (06.10.05 11:31)
>Оракл - прежде всего высокая производительность при колоссальных объемах данных и большом числе пользователей
Это не значение по умолчанию. В "умелых" руках и Оракл ложится на раз. 8-)
"Кадры решают все" (с) И.В.Сталин.


 
Sergey_Masloff   (2005-10-06 12:10) [38]

Курдль ©   (06.10.05 11:31) [36]

>Оракл от MS SQL отличается не фитчами!!!
Ну ладно возьмем DB2. Кстати чует мое сердце что MSSQL все ближе ;-)

>PL/SQL не лучше TSQL.
Ну и что. В оракле и без того фич хватает. Те же собственные (полтзовательские) агрегатные функции, аналитические функции, туча возможностей подключаемых через пакеты, да устать можно перечислять. За это и денежки и выбор разработчиков. А по производительности и объемам у оракла конкуренты имеются, не сомневайся.  

>В некоторых СУБД серверную логику на Java писать можно! Но это не >делает их лучше, чем оракл! :)
Ты хочешь сказать что на оракле это делать нельзя?! ;-)))

>Оракл - прежде всего высокая производительность при колоссальных >объемах данных и большом числе пользователей
Не. Не только и не столько.


 
Seg   (2005-10-06 13:46) [39]

Запрос надо построить по case технологии.
например

select case(when field1="1" then result=result+field21)
              (when field1="2" then result=result-field2) as result

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


 
Курдль ©   (2005-10-06 14:08) [40]


> Sergey_Masloff   (06.10.05 12:10) [38]
>  А по производительности и объемам у оракла конкуренты имеются,  не сомневайся.  


Не сомневаюсь, а абсолютно уверен, что по производительности и объемам у оракла конкуренты отсутствуют. За это и денежки платят, а не за connect ... by prior ...



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

Форум: "Базы";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.57 MB
Время: 0.069 c
3-1128085302
ZedeS
2005-09-30 17:01
2005.11.20
Быстая работа с большой базой


2-1130756029
Spectre_s
2005-10-31 13:53
2005.11.20
Параметры


5-1111314760
Начинающий программист
2005-03-20 13:32
2005.11.20
Добавление свойства к TTreeNode


14-1130323680
Digitman
2005-10-26 14:48
2005.11.20
TOpenDialog.OnIncludeItem


2-1130856983
Arazel
2005-11-01 17:56
2005.11.20
Быстрый пойск в масиве





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