Procedura
służy do obsługi zleceń trafiających na giełdę, zleceń
kupna i sprzedaży.
create
PROCEDURE
[dbo].[pBuySellStock]
(
@stockName
varchar(10),
@user_id
int
,
@stockCountBuy
int
,
@mark_id
int
)
AS
BEGIN
--pomocnicze
declare
@numberOfStock
int
declare
@stockPrice
money
--potrzebuje
declare
@wall_id
int
declare
@stock_id
int
declare
@stockN_id
int
wyszukuje
id portfela użytkownika
select
@wall_id
=
wal_id
from
UserTable
where
usr_id
=
@user_id
print
'portfel
- '
+
CAST(@wall_id
as
varchar(1))
Szukam
po nazwie akcji jej numer id
select
@stockN_id
=
stockN_id
from
StockName
where
stockN_Name
=
@stockName
select
@stock_id
=
stock_id
from
Stock
where
stockN_id
=
@stockN_id
print
'akcja
nr - '
+
CAST(@stock_id
as
varchar(1))
Sprawdzam
cenę akcji aktualnie wszystkie mają taką samą ustaloną na
sztywno dla wszystkich, warunkiem jest numer akcji oraz to czy są na
sprzedaż
select
@stockPrice
=
mark_sharePriceSell
from
MarketSquare
where
stock_id
=
@stock_id
and
bs_id
=
3
Ilość
akcji na rynku wystawionych na sprzedaż oraz wyemitowanych
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))
Jeżeli
ilość akcji które chcę kupić jest mniejsza od ilości akcji
wystawionych na sprzedaż
if(@stockCountBuy
<=
@numberOfStock)
begin
Kursor
zwróci mi wszystkie zlecenia na rynku które dotyczą danej akcji i
są w statusie na sprzedaż lub emisja
declare
@sumStocksUser
int
--robie
petle lub kursor
declare
@id_markCursor
int
declare
@iloscAkcji
int
declare
@wynikodejmowania
int
declare
@statusTransakcji
int
declare
@priceOfStock
money
declare
@walletToPayForStock
int
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;
--
Pobranie z wiersza cursora do zmiennej
While
@@FETCH_STATUS
=
0 --
test końca kursora
Begin
--ilosc
akcji sie zmniejsza a wartosc transakcji rosnie
if(@iloscAkcji
<=
@stockCountBuy)
begin
declare
@result
int
set
@result
=
@iloscAkcji
-
@stockCountBuy
print
'result
'
+
Cast(@result
as
varchar)
if(@result
<=
0)
begin
update
MarketSquare
set
mark_numberOfShares
=
0 ,
bs_id
=
1,
mark_TransactionPrice
=
@iloscAkcji
*
@priceOfStock
where
mark_id
=
@id_markCursor;
zmniejszenie
ilości akcji do kupienia o te które zostały kupione w danym
zleceniu
set
@stockCountBuy
=
@stockCountBuy
-
@iloscAkcji
print
'pozostala
ilosc akcji w zleceniu =>'
+
Cast(@stockCountBuy
as
varchar)
print
'kwota
po sprzedaniu akcji =>'
+
Cast(
(@iloscAkcji
*
@priceOfStock)
as
varchar)
jeżeli
transakcja jest w statusie sprzedaży
pieniądze za kupione akcje płyną do sprzedającego akcje
if(@statusTransakcji
=
3)
begin
declare
@walletUserSellMoneyLimit
money
declare
@resultWalletUserSellMoneyLimit
money
select
@walletUserSellMoneyLimit
=
wal_MoneyLimit
from
Wallet
where
wal_id
=
@walletToPayForStock
Ilość
pieniędzy należnych za sprzedane akcje plus pieniądze które są w
portfelu użytkownika sprzedającego akcje
set
@resultWalletUserSellMoneyLimit
=
@walletUserSellMoneyLimit
+
(@iloscAkcji
*
@priceOfStock)
update
Wallet
set
wal_MoneyLimit
=
@resultWalletUserSellMoneyLimit
where
wal_id
=
@walletToPayForStock
print
'moeny
limit in wallet heigh to => '
+
CAST(@resultWalletUserSellMoneyLimit
as
varchar)
end
else
begin
W
tej procedurze brak jest użytkownika który odpowiadał by za emisję
i skup akcji więc pieniądze za akcje kupione z emisji znikają
print
'emisja
akcji, na razie bez zarabiania na nich czyli kasa w proznie'
end
end
end
else
Ilość
akcji w zleceniu kupna większa od zera
begin
if(@stockCountBuy
>
0)
begin
Ilość
akcji nie została wyzerowana, pewna liczba akcji pozostała,
status
transakcji pozostaje bez zmian
Ilość
pozostałych akcji w transakcji
declare
@countStockInTransaction
int
set
@countStockPozostalychInTransaction
=
@iloscAkcji
-
@stockCountBuy
update
MarketSquare
set
mark_numberOfShares
=
@countStockPozostalychInTransaction,
mark_TransactionPrice
=
0,
bs_id
=
@statusTransakcji
where
mark_id
=
@id_markCursor;
Transakcja
w statusie sprzedaży
if(@statusTransakcji
=
3)
begin
Nie
wszystkie akcje zostały sprzedane, do portfela trafiają środki ze
sprzedanych akcji pozostałe akcje dalej wystawione są na
sprzedaż, status się nie zmienia
declare
@walletUserSellMoneyLimitRestOfMoney
money
declare
@resultWalletUserSellMoneyLimitRestOfMoney
money
Ilość
pieniędzy w portfelu sprzedawcy
select
@walletUserSellMoneyLimitRestOfMoney
=
wal_MoneyLimit
from
Wallet
where
wal_id
=
@walletToPayForStock
set
@resultWalletUserSellMoneyLimit
=
@walletUserSellMoneyLimitRestOfMoney
+
(@stockCountBuy
*
@priceOfStock)
update
Wallet
set
wal_MoneyLimit
=
@resultWalletUserSellMoneyLimit
where
wal_id
=
@walletToPayForStock
print
'money
limit in wallet heigh to => '
+
CAST(@resultWalletUserSellMoneyLimit
as
varchar)
end
else
begin
print
'emisja
akcji, na razie bez zarabiania na nich czyli kasa w proznie.'
end
end
end
Fetch
Next
From
c1
Into
@id_markCursor,@iloscakcji,@statusTransakcji,@priceOfStock,@walletToPayForStock;
--kolejne
czytani
End
Close
c1;
--
zamknięcie ( do tej chwili kursor może być obracany )
DeAllocate
c1;
--
zwolnienie cursora !!!
Update
portfela kupującego, zabranie środków za zakupione akcje
declare
@ofertaKupna_id
int
declare
@countNumberStockInTransaction
int
declare
@priceStocks
money
declare
@TransactionPriceBuy
money
Ilość
oraz cena akcji w zleceniu (transakcji)
select
@countNumberStockInTransaction
=
mark_numberOfShares,
@priceStocks
=
mark_sharePriceBuy
from
MarketSquare
where
mark_id
=
@mark_id
Zwiększenie
wartości transakcji o kolejne akcje
set
@TransactionPriceBuy
=
@countNumberStockInTransaction
*
@priceStocks
Aktualizacja
zlecenia na rynku zmiana statusu na „nothing happend”
update
MarketSquare
set
bs_id
=
1,
mark_dataEnd
=
GETDATE(),
mark_TransactionPrice
=
@TransactionPriceBuy
where
mark_id
=
@mark_id
Aktualizacja
ilości akcji w portfelu
declare
@allStackCountPerUser
int
declare
@allMoneyCountPerUser
money
Ilość
akcji w porfelu dla danego użytkownika
select
@allStackCountPerUser
=
wal_numberOfShares,
@allMoneyCountPerUser
=
wal_MoneyLimit
from
Wallet
where
wal_id
=
@wall_id
Zabranie
środków za transakcje kupna, orazx dodanie ilości zakupionych
akcji do portfela
declare
@roznicaresult
money
set
@roznicaresult
=
@allMoneyCountPerUser
-
(@TransactionPriceBuy)
declare
@sumaStack
int
set
@sumaStack
=
@allStackCountPerUser
+
@countNumberStockInTransaction
update
Wallet
set
wal_numberOfShares
=
@sumaStack,
wal_MoneyLimit
=
@roznicaresult
where
wal_id
=
@wall_id
end
else
begin
print
'niewystraczajac
ilosc akcji na rynku user musi zmienic ilosc akcji do kupienia
end
END
Brak komentarzy:
Prześlij komentarz