Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.20;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.082 c
14-1130088480
Нокия- Коннектинг Пипл
2005-10-23 21:28
2005.11.20
Телефоны


14-1130338041
Starcom
2005-10-26 18:47
2005.11.20
Variant Asynh for D7


14-1130226864
stud
2005-10-25 11:54
2005.11.20
опять вопрос про оболочки


14-1130497437
штамм
2005-10-28 15:03
2005.11.20
На каком C приводятся примеры в Windows SDK ?


14-1130503656
Андрей Жук
2005-10-28 16:47
2005.11.20
Бинарная совместимость в виндах