Главная страница
    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 ...


 
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
14-1130749014
Который Барлог
2005-10-31 11:56
2005.11.20
Вирус? :)


2-1131170308
balepa
2005-11-05 08:58
2005.11.20
Как прочитать *.bin


2-1130968376
Duralei
2005-11-03 00:52
2005.11.20
прозрачное текстовое поле


2-1130516275
DelphiLexx
2005-10-28 20:17
2005.11.20
Подскажите где ошибка


14-1130413226
Jeer
2005-10-27 15:40
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский