Форум: "Базы";
Текущий архив: 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 ...
← →
Sergey_Masloff (2005-10-06 14:14) [41]Курдль © (06.10.05 14:08) [40]
>Не сомневаюсь, а абсолютно уверен, что по производительности и объемам >у оракла конкуренты отсутствуют
На сем позвольте откланяться. У меня сведения другие но полемезировать на эту тему не собираюсь.
← →
Anatoly Podgoretsky © (2005-10-06 14:16) [42]Курдля не трогать, а то потеряем такого ценного кадра.
← →
Курдль © (2005-10-06 14:19) [43]
> Sergey_Masloff (06.10.05 14:14) [41]
> На сем позвольте откланяться. У меня сведения другие но
> полемезировать на эту тему не собираюсь.
Очень прошу сообщить такие данные. Мы, конечно, любим здесь поспорить, иногда даже не в тему, но все равно приходим сюда за знаниями! Не затруднит поделиться, кто это составил конкуренцию ораклу? MS SQL 2005 Yukon?
← →
Seg (2005-10-06 14:36) [44]Я работал с базой Оракл с количеством записей 145 миллионов.
Мне смешно смотреть, как люди делают круглые глаза, говоря, что в их базе 100 тысяч записей...
← →
Sergey_Masloff (2005-10-06 14:51) [45]Курдль © (06.10.05 14:19) [43]
IBM DB2 к примеру. Или в мире только 2 SQL сервера осталось?
Seg (06.10.05 14:36) [44]
>Я работал с базой Оракл с количеством записей 145 миллионов
И что? с десятками млн. я работал и в InterBase ;-)
В оракле я их и не считаю. Больше 145 млн. это 100% но все это не показатель.
← →
Курдль © (2005-10-06 15:00) [46]
> Sergey_Masloff (06.10.05 14:51) [45]
> IBM DB2 к примеру.
Много хорошего слышал про ее производительность, но сам поработать чести не имел.
А как она в проектировании? Чем отличается от оракла?
Я как-то загорелся идеей FastObjects от Versant. Даже скачал демо-версию и интегрировал в среду. Потыкал наугад - работает.
Но ни времени потестировать, ни подходящих проектов для экспериментов не выдалось. Потом надежные источники порекомендовали забить на эти попытки.
← →
Seg (2005-10-06 16:30) [47]Что вы подразумеваете под производительностью?
скорость выполнения запросов?
← →
Anatoly Podgoretsky © (2005-10-06 16:35) [48]Seg (06.10.05 14:36) [44]
Разве это количество MSSQL поддерживает 1000000 террабайт базы. Оракл тоже как минимум такого порядка, про DB2 вообще молчу. Среди моих знакомых есть люди у которых свыше 8 000 000 000 записей в таблице, даже не в базе.
← →
Курдль © (2005-10-06 16:44) [49]
> Seg (06.10.05 16:30) [47]
> Что вы подразумеваете под производительностью?
> скорость выполнения запросов?
Я? Число, прямо пропорциональное количеству обработанных данных в единицу времени, помноженное на объем БД и количество одновременно подключенных пользователей и обратно пропорциональное числу выполняемых операций аппаратным обеспечением.
На самом деле существуют специальные оценочные таблицы и методики.
← →
Seg (2005-10-06 16:50) [50]На самом деле существуют специальные оценочные таблицы и методики.
Вот и примени эти методики, потом результат покажешь.
← →
Sergey_Masloff (2005-10-06 20:34) [51]Курдль © (06.10.05 15:00) [46]
>> IBM DB2 к примеру.
>Много хорошего слышал про ее производительность, но сам поработать >чести не имел.
Я видел только "персонал" версию которая от "той" DB2 отличается сильно. Просто слышал мнение примерно такое "для мелких с тенденцией к средним систем Oracle подходит хорошо но выше начинается другая ниша в которой он просто не представлен. Там область для DB2 и... " он назвал еще какие-то две системы но я, к стыду своему, о них не слышал. Человек компетентный хоть и буржуй а считается что все американе дураки. Но это не так. Кстати наша система (мы в своей области ну в тройку в России точно входим да и в европе наверное не затеряемся) по их классификации именно "маленькая система". Я не готов назвать параметры системы (конфиденциальная информация) но поверь она немаленькая. Мне кажется что средней считалась бы база минимум несколько терабайт и числом пользователей в десятки тысяч. Это просто мое предположение, я лично не уточнял.
← →
Курдль © (2005-10-07 10:34) [52]
> Sergey_Masloff (06.10.05 20:34) [51]
Снимаю шляпу перед терабайтами! Пока не представляю, куда бы это можно было применить. На этом форуме редко кто заводит речь про системы, выше уровня рабочей группы и еще ведутся споры об успешном применении Paradox и FoxPro. Ни разу не слышал, чтобы хоть раз кто-то пожаловался, что он уперся в возможности оракла. Но у нас все возможно. Знаю, что одна фирма делала билинговую систему на MS SQL. И даже продала ее, несмотря на то, что цикл расчета мог длиться 3-е суток. (Типа: "купите себе хорошее железо!")
Мне пока не представлялась возможность автоматизировать предприятия одного уровня с NASA и Пентагоном, которые не жалуются на оракл.
Но если придется - обязательно изучу возможности DB2 Informix и т.п.
← →
Seg (2005-10-07 10:58) [53]для мелких с тенденцией к средним систем Oracle подходит хорошо но выше начинается другая ниша в которой он просто не представлен. Там область для DB2 и... " он назвал еще какие-то две системы но я, к стыду своему, о них не слышал. Человек компетентный хоть и буржуй а считается что все американе дураки.
Это он прочитал в каком-нибудь рекламном проспекте.
Если бы он самолично переполнил данными Оракл, или привел бы конкретный пример, а так, надувать щеки и разводить руками любой может.
← →
Sergey_Masloff (2005-10-07 11:11) [54]Seg (07.10.05 10:58) [53]
Если учесть что это человек профессионально занимающийся аудитом информационных систем корпоративного уровня и именно по этому поводу произошло мое с ним знакомство то позволю себе проигнорировать ваше мнение. Конкретный пример он приводил, я, к сожалению, не могу его процитировать.
← →
Juice © (2005-10-07 16:16) [55]Вы конечно извините, но можно все-таки по сабжу продолжить ?
> Desdechado © (05.10.05 11:06) [3]
> > Delete from ... where 1=2
> имхо, если ничего не вписывать, ничего и не случится с БД
>
> а с правильным запросом и вопросов не будет, как сказал
> ANB
> конечно, только не пойму зачем это ему на клиенте. я бы
> все-таки посмотрел в сторону хп, возвращающей нужный набор.
>
> есть активы (товар), есть сделки (покупка/продажа). Надо
> вычислить портфель (остаток).
> Здесь вообще нечего удалять!
> Курдль © (05.10.05 12:39) [9]
> Надо знать структуру БД.
> Видится приблизительно так
>
> Товары(наименование) +-< Сделки(дата, К/П, кол-во, цена)
>
> Отсюда выполнить необходимый запрос элементарно.
Судя по этим словам для всех авторов этих постов написать нужный запрос не составляет труда и представляется очевиднейшим решением ?
Я например долго думал и ничего не придумал. Может я sql плохо знаю или думалка не работает. Хотелось бы таки услышать ответ, пусть и на простейший пример : таблица это просто стэк - последний пришел - первый ушел. На опр. момент нужно получить состояние (остаток). Упростим еще - в таблице содержится инф. про торги только одного товара.
Давайте рассмотрим на конкретном примере:
Таблица orders;
date - дата ввода /вывода;
quantity - кол-во ввода/вывода;
sale - boolean 1- продажа, 0 - покупка;
Если это так элементарно, то почему бы вам не привести пример ?
← →
Курдль © (2005-10-07 16:21) [56]На одной таблице пример не получится.
Я вижу, как минимум - две.
1. Сделки или Ваша orders
2. Связь сделок (bindings)
Последняя должна быть ассоциативно-зависимой от первых 2-х (иметь составной первичный ключ из их ID). Причем - с бизнес условием: "покупке" может быть сопоставлена только "продажа" иколичеством не превышающая покупку.
← →
Danilka © (2005-10-07 16:32) [57]Juice © (07.10.05 16:16)
На опр. момент нужно получить состояние (остаток). Упростим еще - в таблице содержится инф. про торги только одного товара.
Давайте рассмотрим на конкретном примере:
Таблица orders;
date - дата ввода /вывода;
quantity - кол-во ввода/вывода;
sale - boolean 1- продажа, 0 - покупка;
1. (правильный, незнаю есть-ли он в ИБ6) используя case
2. (извращенный) sum(quantity*(sale*2-1))
3. в ХП
:)
А по-хорошему еще следует хранить остатки в регистре остатков.
← →
Курдль © (2005-10-07 16:41) [58]Приведу максимально упрощенный рабочий запрос из похожей задачи:
select D.DEA_ID, D.DEA_DATE, A.ART_ID, A.ART_CODE, D.DEA_PRI,
D.DEA_VOL-isnull(
(select sum(BIN_VOL)
from BINDINGS B, DEALS S
where B.DEA_ID_BUY = D.DEA_ID
and B.DEA_ID_SAL = S.DEA_ID
and S.DEA_DATE <= :DEA_DATE
),0) as DEA_VOL
from DEALS D, ARTICLES I
where D.DEA_TYPE = "BUY"
and D.ART_ID = A.ART_ID
and DEA_VOL > 0
and D.DEA_DATE <= :DEA_DATE
Где
BINDINGS - связь сделок
DEALS - сделки
ARTICLES - товары
← →
Juice © (2005-10-07 17:45) [59]К сожалению варианты с модификацией базы не подходят по независимым от меня причинам.
> ЗЫ. А зачем удалять из CDS ? Если туда можно класть только
> нужные записи ?
Дайте пожалуйста какую-то подсказку, не могу разобраться со всеми этими провайдерами
← →
Juice © (2005-10-07 18:19) [60]Все, проблема снята. Через CDS все было очень просто и без лишних телодвижений.
← →
Danilka © (2005-10-10 08:58) [61]Juice © (07.10.05 18:19)
Все, проблема снята. Через CDS все было очень просто и без лишних телодвижений.
Млин, ну шо ты какой сложный? CDS это и есть лишнее телодвижение.
Не хочешь делать в ХП, делай так:
SELECT good_id, sum(quantity*(sale*2-1)) rest_amount
FROM orders
WHERE date <= :REST_DATE
GROUP BY
Если у тебя не IB6, а FB, то у него есть case, и запрос будет выглядеть так:
SELECT
good_id,
sum(CASE sale WHEN 1 THEN quantity ELSE -quantity END) rest_amount
FROM orders
WHERE date <= :REST_DATE
GROUP BY
Таблица orders;
good_id - код товара
date - дата ввода /вывода;
quantity - кол-во ввода/вывода;
sale - boolean 1- продажа, 0 - покупка;
В любом случае, через несколько месяцев на реальных данных отгребещь тормоза с постоянным
пересчетом остатка. А если ты еще весь свой orders на клиент будешь утягивать и там считать,
тормоза наступят намного раньше.
Знаю я одних, у которых табличка dbf - аналог твоего orders, весит за 900 мегабайт, если
бы они считали остаток также по-идотски как и ты, то давно-бы разорились, или повесили такого
милого программера как ты за одно интимное место.
← →
Danilka © (2005-10-10 08:59) [62]да, в запросах пиши не
GROUP BY
а
GROUP BY goods_id
:)
← →
Juice © (2005-10-11 19:24) [63]
> Млин, ну шо ты какой сложный? CDS это и есть лишнее телодвижение.
>
> Не хочешь делать в ХП, делай так:
Млин, ну шож ты не читаешь вопроса ? Было бы все так просто а я настолько тупым, то думаю и до тебя другие люди догадались бы написать слово sum. Мне остаток нужен вместе с историей его формирования, понимаешь ? Т.е. я должен знать, что если на дату А товара Б осталось 10 шт., то сколько когда и как он покупался, всю историю этих остатков.
> да, в запросах пиши не
> GROUP BY
> а
> GROUP BY goods_id
> :)
Может подскажешь еще что вместо :REST_DATE писать ? :)
← →
Juice © (2005-10-11 19:36) [64]
> В любом случае, через несколько месяцев на реальных данных
> отгребещь тормоза с постоянным
> пересчетом остатка. А если ты еще весь свой orders на клиент
> будешь утягивать и там считать,
> тормоза наступят намного раньше.
> Знаю я одних, у которых табличка dbf - аналог твоего orders,
> весит за 900 мегабайт, если
> бы , то давно-
> бы разорились, или повесили такого
> милого программера как ты за одно интимное место.
Ну просто телепатические способности и умение предсказывать будущее по ... SQL-запросам ?
А насчет "по-идиотски", я тебе могу с абсолютной увереностью сказать - это не по-идиотски:) А если тебе охота поспорить то могу тебе обьяснить почему так, и сказать даже больше - раньше вся эта фигня считалась на сервере в виде ХП - лажа была страшная.
Страницы: 1 2 вся ветка
Форум: "Базы";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];
Память: 0.66 MB
Время: 0.048 c