sobota, 20 października 2018

Giełda - pBuySellStock wersja pierwsza

Opis procedury pBuySellStock

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/zlecenia

Zmienne 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)
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

 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 ...