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

Вниз

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

 
Petr V. Abramov ©   (2006-03-07 22:51) [80]

Если первый вопрос считать вежливой(?) провокацией и выводм на дискуссию,
то второй - бред полный

try
if not Database.InTransaction then Database.StartTransaction;
Database.Commit;
except
on E: Exception do
begin
  ShowMessage(E.Message);
  Database.Rollback
end
end;

ошибка возникает либо на StartTransaction, либо на commit. Это возникнуть может, когда ресурсы, похоже, уже съедены :)

Если транзакция так ине стартовала, то есть она ничего не будет. Если сервер не реагирует на commit, он скорее всего, ни на что уже не среагирует (спецслучаи Oracle не берем), и не к месту написанный ShowMessage тут ни при чем


 
Дельфятник   (2006-03-08 00:06) [81]


> Например, на
> a). Имеется таблица
>
> create table T (
>  Дата  date,
>  Валюта char(3),
>  Курс numeric,
>  primary key (Дата, Валюта)
> );
>
> Данные:
>
> Дата      Валюта    Курс
> ------------------------
> 01.09.04  USD       29.8
> 02.09.04  EUR       35.4
> 03.09.04  USD       29.7
> 05.09.04  USD       29.6
> 06.09.04  USD       29.8
> 06.09.04  EUR       35.6
> ...
>
> Напишите запрос, выдающий курс заданной валюты на заданную
> дату.
> Курс считается определенным, если для данной валюты
> есть запись с датой не превосходящей заданную, взять ближайший
> курс.
> Запрос должен выдать курс в обеих случаях:
> - курс USD на 06.09.04
> - курс USD на 04.09.04
>
> Отвечает 1 из 20 !!!,


Я попробовал это сделать на Oracle. Вот что у меня получилось:
create table TT_TEMP
( FDATE DATE,
 CURR  VARCHAR2(3),
 RATE  NUMBER)

create or replace function TT_GetRate(pDate in Date, pCurr in varchar2) return varchar2 is
 s varchar2(200);
begin
 select
   case
     when exists(select rate from TT_TEMP
                      where FDate = pDate and Curr = pCurr)
       then (select distinct to_char(rate) from TT_TEMP
               where FDate= pDate and Curr = pCurr)
     when exists(select rate from TT_TEMP where Curr = pCurr)
       then
         case
           when pDate <= (select min(FDate) from TT_TEMP where Curr = pCurr)
             then "Нет данных о курсе "||pCurr||" на заданную дату ("||to_char(pDate)||")"
           else
             (select distinct to_char(rate) from TT_TEMP
              where Curr = pCurr and
                FDate = nvl((select max(FDate) from TT_TEMP
                                  where Curr= pCurr and FDate <= pDate),
                                 (select max(FDate) from TT_TEMP
                                  where Curr= pCurr)
              )
           end
       else "Нет данных о курсе данной валюты ("||pCurr||")"
    end
 into s
 from dual;
 return(trim(s));
end TT_GetRate;

И, наконец, запрос
select TT_GetRate("06.09.2004","USD") rate1,
        TT_GetRate("04.09.2004","USD") rate2
from dual

выдаёт то, что нужно:

Rate1 | Rate2
29,8      29,7

По-моему, это не вполне нормально предлагать решить такую задачу на собеседовании. Просто тупое перебирание вариантов. Что оно говорит о кандидате?


 
Дельфятник   (2006-03-08 00:16) [82]

Ещё раз посмотрел на функцию, и нашёл неточность:

вместо

               FDate = nvl((select max(FDate) from TT_TEMP
                                 where Curr= pCurr and FDate <= pDate),
                                (select max(FDate) from TT_TEMP
                                 where Curr= pCurr)

должно быть просто

             FDate = (select max(FDate) from TT_TEMP
                         where Curr= pCurr and FDate <= pDate)


 
Жуков Олег   (2006-03-08 01:37) [83]

К чему такие сложности, это делается одним запросом. Синтаксис SQL не помню сейчас, но что-то типа такого должно быть

Select
 Rate
from
 Rates
where
 Date = (Select Max(Date) from Rates where Date <= @NecessaryDate)


 
paul_k ©   (2006-03-09 08:18) [84]

> [74] Romkin ©   (07.03.06 17:33)

если речь о MSSQL то божно и без, насколько помню...


> [81] Дельфятник   (08.03.06 00:06)

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

Table
curensy_id id валюты
rate_value значение курса
rate_date дата курса

select top 1 rate_value
from table
where curency_id=@input_id
and rate_date <=@input date
order by rate_date desc


 
Bless ©   (2006-03-09 08:57) [85]


> Romkin ©   (07.03.06 17:33) [74]
>
> Bless ©   (07.03.06 16:40) [71] Кто такое сказал? Эссно,
>  его надо решать с подзапросом :))


Ну, не так уже и естесственно :)


DECLARE
@dat smalldatetime,
@valuta varchar(5)

SELECT @dat="9/06/2004", @valuta="USD"

SELECT top 1 * FROM T
WHERE valuta=@valuta AND dat<=@dat
ORDER BY @dat-dat



 
Bless ©   (2006-03-09 09:00) [86]


> paul_k ©   (09.03.06 08:18) [84]


:) Не видел, когда писал. Хотя
order by rate_date desc все же не правильно.


 
Bless ©   (2006-03-09 09:01) [87]


> order by rate_date desc все же не правильно.


Упс. Вру.


 
Romkin ©   (2006-03-09 12:01) [88]

Вопрос, собственно, был по стандарту SQL.
А там, по крайней мере в 92м, никаких топов. Так что правильный путь указан в [83] :)))  Я просто это не указал, а по теме ветки все поняли что это MSSQL.
Хотя, конечно, я понимаю, что все привыкли решать без подзапроса, тем или иным способом.
Почему по стандарту? Дык необязательно же придет человек, знающий тот сервер, что нужен. Главное - чтобы SQL знал.


 
paul_k ©   (2006-03-09 12:36) [89]

> [88] Romkin ©   (09.03.06 12:01)

Да понятно, что в ANSI-92 никаких топов нету. Но если чел хоть с TOP напишет то уже плюс.
кстати ещё интересный вопрос - какой из запросов быстрее при прочих равных. Есть подозрение, что стандартный (как у нас говорили - штатный) вариант.
да и способ приведенный в  [83] далеко не единственный.
Речь у меня, собственно, о том что если сказано в задании - запрос, то нада запрос а не процедуру.


> [82] Дельфятник   (08.03.06 00:16)

Попробую разъяснить вышенаписанное мною (про прекращение разговора)
Данный способ получения данных очень часто применяется в различных переоценках и так далее.
а теперь распиши (можешь дома, на бумаге) с применением указанной тобой функции следующую задачу.

есть 500 складов. На каждом склаже примерно по 4000 наименований. По каждому товару есть данные - партия, когда поступил, валюта оплаты, цена единицы, количество
надо в отчете указать по каждому складу указать
наименование,
дату поступления,
стоимость в рублях на момент поступления,
стоимость в валюте на момент поступления
стоимость в рублях на момент ухода партии,
прибыль/убыток от курсовой разницы.

упрощение - партия товара приходит и уходит целиком


Это слегка упрощенный отчет. Собирают подобное обычно одним - несколькими запросами не используя циклов, курсоров и так далее.


 
Romkin ©   (2006-03-09 12:41) [90]

paul_k ©   (09.03.06 12:36) [89] А где записи об уходе-то? И чем отличаются? Стандартно, поле integer, -1 - уход, 1 - приход? Али как?


 
Fay ©   (2006-03-09 12:48) [91]

2 Romkin ©   (09.03.06 12:41) [90]
> -1 - уход, 1 - приход?
Нафиг? Положительное движения - приход 8)


 
Romkin ©   (2006-03-09 12:55) [92]

Положительное что? Количество или сумма? ;)
Нее, я не рискую, у меня именно отдельное поле на знак. Тем более 0 при этом работает, как служебные пометки. А умножить никогда не поздно


 
paul_k ©   (2006-03-09 12:57) [93]

> [90] Romkin ©   (09.03.06 12:41)

да хоть now  для всего уходом считать.
или как ты сказал +-1. без разницы
мsckz в том, что запустив подобный запрос используя может даже верный расчет из [82] на указанном небольшом наборе данных  можно спокойно уходить курить.
а если считать что подобные задачи я обрабатывал в обласи учета ценных бумаг, где не 100 валют а ******** котировок, а уход надо выбрать то по ЛИФО, то по ФИФО, то средневзвешенный, то можно и пообедать успеть легко.


 
paul_k ©   (2006-03-09 12:59) [94]

мsckz - мысль...


 
Brenagwynn   (2006-03-09 13:54) [95]

Насчет валют (пишу для оракла):
select * from (
select * from Rates
where currencycode = "USD"
and rate_date <= to_date("09032006","ddmmyyyy")
order by rate_date desc
)
where rownum = 1

Или так:
SELECT *
 FROM Rates vo
WHERE vo.currencycode = "USD"
  AND vo.rate_date =(
          SELECT MAX(vi.rate_date)
            FROM rates vi
           WHERE vi.currencycode = vo.currencycodecode
                 AND vi.rate_date <= TO_DATE("09032006", "ddmmyyyy"))


 
msguns ©   (2006-03-09 14:07) [96]

>Fay ©   (09.03.06 12:48) [91]
>Нафиг? Положительное движения - приход 8)

Надеюсь, это шутка ? Ибо убивець тот, кто так делает ;)


 
Polevi ©   (2006-03-09 14:37) [97]

>Дельфятник   (08.03.06 00:06) [81]
мдя, плохо дело


 
Romkin ©   (2006-03-09 14:47) [98]

Polevi ©   (09.03.06 14:37) [97] Да это еще терпимо :)))
http://www.sql.ru/forum/actualthread.aspx?bid=1&tid=12992



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

Текущий архив: 2006.04.30;
Скачать: CL | DM;

Наверх




Память: 0.65 MB
Время: 0.116 c
15-1144404748
Vlad
2006-04-07 14:12
2006.04.30
Задачка из жизни.


15-1144171319
Карелин Артем
2006-04-04 21:21
2006.04.30
Сотовый фотоаппарат.. Хорошо или нет??


15-1144321685
Der Nechk@ssoff
2006-04-06 15:08
2006.04.30
Мошенникам-тюрьма!


1-1143126816
voha
2006-03-23 18:13
2006.04.30
PReport &amp; Delphi 2006


4-1139299249
Lucefer
2006-02-07 11:00
2006.04.30
Как писать в EventLog?