![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблемка с удалением записей из набора данных [IB6.x]
Juice © (2005-10-05 10:21:00)Есть 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!)
и т.п.
Наверное отсюда и все глюки грида (кстати пробовал и другие гриды, проблема явно не в гриде). Может вы что-то подскажите?
Курдль (2005-10-05 13:37:00) [41]Sergey13 © + Val ©
Приведите мне, пожалуйста, навскидочку пример необходимости ХП в предмете данного обсуждения.
Sergey13 (2005-10-05 13:28:00) [42]2[20] Val © (05.10.05 13:21)
>Страдает прежде всего сопровождение таких систем
"Страдает" - очень сильно сказано, ИМХО. По моему оно просто немного отличается.
Val (2005-10-05 13:28:00) [43]>Курдль © (05.10.05 13:12)
> Многие (и я) считают, что написание ХП - это чаще всего
> признак неумения правильно создать БД и организовать работу
> с ней!
многие ошибаются.
Sergey13 (2005-10-05 13:24:00) [44]2 [19] Курдль © (05.10.05 13:12)
> К чему такой пафос, коллега?
Где и в чем ты его увидел? Я просто перебрал несколько (не все) причин для разбора набора данных на клиенте.
Val (2005-10-05 13:21:00) [45]>Sergey13 © (05.10.05 13:04)
Я понимаю, что причины бывают :) я ,вероятно, неверно выразился.
Я не знаю причин в конкретной ситуации, это вопрос, скорее к автору, конечно.
P.S. По поводу "неважно" и "страдает только траффик" не соглашусь. Страдает прежде всего сопровождение таких систем - поменять всем клиентов при ошибке в алгоритме/изменении его либо поменять хп? Таки, чем меньше бизнес-логики зашито в клиент, тем лучше.
Курдль (2005-10-05 13:12:00) [46]
> Sergey13 © (05.10.05 13:04) [16]
> 2 [13] Val © (05.10.05 12:51)
> Иногда одна из причин - не умение писать ХП.
К чему такой пафос, коллега? Многие (и я) считают, что написание ХП - это чаще всего признак неумения правильно создать БД и организовать работу с ней!
Курдль (2005-10-05 13:07:00) [47]
> 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:00) [48]2[15] Juice © (05.10.05 13:00)
>Что-то я не улавливаю где ошибка ?
>Пример1:
> Дата1: Покупка Товара1 10 шт. остаток -10
> Дата2: Продажа Товара1 1 шт. остаток -9
Sergey13 (2005-10-05 13:04:00) [49]2 [13] Val © (05.10.05 12:51)
Иногда одна из причин - не умение писать ХП. Иногда на самом деле сложный алгоритм и на клиенте это сделать проще, потому что язык программирования мощнее. Иногда сервер - это обычный ПК и грузить его не хочется. В принципе - не важно где делать, страдает только трафик.
Juice (2005-10-05 13:00:00) [50]
> Надо знать структуру БД.
> Видится приблизительно так
>
> Товары(наименование) +-< Сделки(дата, К/П, кол-во, цена)
>
> Отсюда выполнить необходимый запрос элементарно.
Информативный ответ. Выполнить конечно элементарно, - 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 не придется эмулировать удаление ?
ANB (2005-10-05 12:58:00) [51]2 решения :
1. Оптимальное. Таки написать нормальный запрос, если никак не получается запихать его в один селект - сделать хранимку, возвращающую НД.
2. Затычка. Кинуть на форму виртуальный дейтасет (есть куча), прогуляться по реальному НД и перекачать нужные записи в виртуальный. На экран выдавать виртуальный.
Val (2005-10-05 12:51:00) [52]>Sergey13 © (05.10.05 12:41)
конечно, только не пойму зачем это ему на клиенте. я бы все-таки посмотрел в сторону хп, возвращающей нужный набор.
Курдль (2005-10-05 12:50:00) [53]
> Val © (05.10.05 12:45) [11]
> Ок, но где проблема с удалением?
Вот и я не вижу! Это классический пример задачи фондового рынка -
есть активы (товар), есть сделки (покупка/продажа). Надо вычислить портфель (остаток).
Здесь вообще нечего удалять!
Val (2005-10-05 12:45:00) [54]Ок, но где проблема с удалением? Удаления я не вижу в вашем примере. Или вы запрашиваете набор указанный в примере, а потом из него на клиенте пытаетесь сделать то, что называете "выводом"?
Sergey13 (2005-10-05 12:41:00) [55]2[8] Juice © (05.10.05 12:31)
У тебя примеры не правильные. 8-)
>Дата1: Товар 1 9 шт.
Не 9 а 10. Это на Дата2 - 9.
Что мешает залить данные в CDS или какую нито таблицу в памяти и уже потом крутить-вертеть не эмулируя удаление?
Курдль (2005-10-05 12:39:00) [56]Надо знать структуру БД.
Видится приблизительно так
Товары(наименование) +-< Сделки(дата, К/П, кол-во, цена)
Отсюда выполнить необходимый запрос элементарно.
Juice (2005-10-05 12:31:00) [57]
> что значит "обработать"?
Ну если сильно упрощенно, то что-то наподобие такого стэка:
Несколько таблиц содержат инф. о покупках и продажах товар ов, нужно отобразить сост. наличия товаров на опр. момент. Продается последний купленный товар.
Пример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:28:00) [58]
> Juice © (05.10.05 10:21)
Есть наборы компонентов, в которых кроме DataSet-ов есть DataView.
Они-то отображают только реальные записи, а не их версии, безошибочно.
Еще вариант - поиграться с "DataSet.Disable/EnableControls" вокруг модификаций.
Val (2005-10-05 12:21:00) [59]
> Нужно выбрать данные, обработать их, и показать пользователю
> (широкий грид).
что значит "обработать"?
Juice (2005-10-05 12:15:00) [60]
> ANB © (05.10.05 11:09) [4]
> Desdechado © (05.10.05 11:06) [3]
Товарищи, ну вы можете понять что это абсолютно нереально ? Это будет ну ооооочччччченььььь сложно написать, и одной ХП тут не обойдешься, в придачу еще и куча udf. Сам sql который делает выборку для датасета весьма непростой, а о таком я даже и думать не хочу. Я согласен с вами, если что-то можно сделать с помощью одного запроса то это НУЖНО сделать с помощью одного запроса, и я всегда стараюсь делать так. Но поверьте мне, тут не тот случай. Нужно выбрать данные, обработать их, и показать пользователю (широкий грид). Можно конечно после выборки обрабатывать данные в каких-то своих структурах, но потом будут большие проблемы с их "выводом на экран".