Procedura zajmuje się obsługą transakcji kupna i sprzedaży.
Parametry:
@stockName varchar(10), -> nazwa akcji
@user_id int , -> id użytkownika
@stockCountBuy int
, -> liczba akcji do kupienia
@mark_id int -> id rekordu dotyczącego transakcji/zleceniaZmienne pomocnicze:
declare @numberOfStock int -> ilość akcji
declare @stockPrice money -> cena akcji
declare @stockCountMax int -> maksymalna ilość akcji
Zmienne które potrzebuje
declare @wall_id int -> numer id portfela
declare @stock_id int -> numer id akcji
declare @stockN_id int -> numer id słownika z nazwami akcji
Wyszukanie numeru id portfela
select @wall_id = wal_id from UserTable where
usr_id = @user_id
Wyszukanie numeru id akcji po nazwie akcji
select @stockN_id =
stockN_id from StockName where stockN_Name =
@stockName
select @stock_id =
stock_id from Stock where stockN_id =
@stockN_id
Wyszukanie ceny akcji oraz ilość akcji których zlecenia są w statusie sprzedaż oraz emisja
select @stockPrice =
mark_sharePriceSell from MarketSquare where stock_id =
@stock_id and bs_id =
3
select @numberOfStock = sum(mark_numberOfShares) from MarketSquare where stock_id =
@stock_id and bs_id =
3 or bs_id = 4
print 'ilosc akcji na rynku - '
+ CAST(@numberOfStock as varchar(5))
Sprawdzam czy ilość akcji, które chce kupić jest mniejsza bądź równa ilości akcji dostępnych na rynku.
Jeżeli jest większa to wywalam komunikat, informujący że transakcja niemożliwa do wykonania gdyż jest za mało dostępnych akcji.
if(@stockCountBuy <=
@numberOfStock)
Zmienne wykorzystane w kursorze
declare @sumStocksUser int -> suma akcji na uzytkownika
declare @id_markCursor int -> numer id tabeli rynek
declare @iloscAkcji int -> ilość akcji w danej transakcji
declare @wynikodejmowania int -> wiadomo
declare @statusTransakcji int -> wiadomo
declare @priceOfStock money -> cena za akcję
declare @walletToPayForStock int -> numer id portfela do którego będzie zapłata za akcje
Rozpoczęcie kursora, który pobiera dane odnośnie tabeli marketSquare (rynek akcji) ,wiersze które spełniają następujące warunki numer akcji musi być taki jak w parametrze, ilość dostępnych akcji większa od zera, status sprzedaż lub emisja.
Declare c1 Cursor For
select mark_id,mark_numberOfShares,bs_id,mark_sharePriceSell,wal_id
from MarketSquare
where stock_id
= @stock_id and
mark_numberOfShares > 0 and bs_id = 3 or bs_id = 4
Open c1; --> Otwarcie
Fetch Next From c1 Into
@id_markCursor,@iloscakcji,@statusTransakcji,@priceOfStock,@walletToPayForStock;
--
Wykonanie wewnątrz kursora
Warunek jeżeli znajde w kurosorze transakcje w której
if(@iloscAkcji <= @stockCountBuy)Warunek jeżeli znajde w kurosorze transakcje w której
begin
declare @result int
ilosc akcji w zleceniu minus ilość akcji w konkretnym rekordzie rynku (transakcji sprzedaży)
set @result = @iloscAkcji - @stockCountBuy
print 'result ' + Cast(@result as varchar)
jeżeli wynik różnicy będzie mniejszy bądz równy zero oznacza to ilość akcji w konretnej transakcji sprzedaży jest większa od pozostałej ilości akcji w zleceniu kupna, trzeba w tedy inaczej wykonać update
if(@result <= 0)
begin
update MarketSquare
set
mark_numberOfShares = 0 ,
bs_id = 1
where
mark_id = @id_markCursor;
zmniejszenie ilości akcji w zamówieniu kupna o ilość akcji w konkretnym zleceniu sprzedaży
set @stockCountBuy = @stockCountBuy - @iloscAkcji
print 'pozostala ilosc akcji ' + Cast(@stockCountBuy as varchar)
end
end
warunek gdy ilość akcji w zleceniu kupna jest mniejsza od ilości akcji w zleceniu sprzedaży
else
begin
if(@stockCountBuy > 0)
begin
update MarketSquare
set
mark_numberOfShares = @iloscAkcji - @stockCountBuy
where
mark_id = @id_markCursor;
wyzerowanie ilość akcji w zleceniu kupna
set @stockCountBuy = 0
end
end
Fetch Next From c1 Into @id_markCursor,@iloscakcji; --kolejne czytani
End
Close c1; -- zamknięcie ( do tej chwili kursor może być obracany )
DeAllocate c1; -- zwolnienie cursora !!!
declare @ofertaKupna_id int
--update portfela kupujacego
update zlecenia kupna
update MarketSquare
set
bs_id = 1,
mark_dataEnd = GETDATE()
where
mark_id = @mark_id
przygotowanie danych do update portfela
declare @countNumberStockInTransaction int
declare @priceStocks money
pobranie ilości akcji w transakcji (zleceniu) kupna oraz ceny z transakcji
póki co cena jest narzucona, bez możliwości ustalenia
select @countNumberStockInTransaction = mark_numberOfShares, @priceStocks = mark_sharePriceBuy from MarketSquare where mark_id = @mark_id
--aktualizacjia ilosc akcji w portfelu
declare @allStackCountPerUser int
declare @allMoneyCountPerUser money
znalezienie ilości akcji użytkownika oraz limitu pieniędzy w portfelu
select @allStackCountPerUser = wal_numberOfShares, @allMoneyCountPerUser = wal_MoneyLimit
from Wallet
where wal_id = @wall_id
wyliczenie kwoty obciążającej portfel użytkownika
declare @roznicaresult money
set @roznicaresult = @allMoneyCountPerUser - (@countNumberStockInTransaction * @priceStocks)
wyliczenie ilości akcji którą użytkownik otrzymuje po udanej transakcji kupna
declare @sumaStack int
set @sumaStack = @allStackCountPerUser + @countNumberStockInTransaction
aktualizacja portfela
update Wallet
set
wal_numberOfShares = @sumaStack,
wal_MoneyLimit = @roznicaresult
where
wal_id = @wall_id
end
else
begin
print 'nie wystrczajac ilosc akcji na rynku user musi zmienic ilosc akcji do kupienia '
end
END
Brak komentarzy:
Prześlij komentarz