sobota, 20 października 2018

Giełda - pBuySellStock wersja druga


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

 Po wielu miesiącach przerwy Czteroletnim exodusie do bloga ismartdev, który zdechł w zeszłym roku w listopadzie, na powrót wstąpiłem w ten ...