Procedura składowana w SQL Server

0

Witam!
Proszę wybaczyć jeśli wybrałem złe miejsce na forum na to pytanie.
Piszę program w Delphi kozrystający z SQL Servera 2000.
W bazie danych mam tabelę "Nieobecnosc planowana" z kolumnami:
id_nieobecności (int), id_pracownika (int), data_poczatkowa (datetime), data końcowa (datetime).

Chcę napisać procedurę składowaną w SQL Serverze, aby po podaniu jakiejś daty sprawdzała, czy mieści się ona w którymś z zakresów data_początkowa - data_końcowa, i jeśli się mieści to zwracała np. 1, a jeśli nie to 0.

Jak korzystać z procedur składowanych w Delphi wiem :-).
Jeśli ktoś może, bardzo proszę o pomoc.
KnockerD.

0

Pisanie funkcji nie było mi jeszcze potrzebne i nie umiem tego robić, ale jeśli chcesz zezwalać lub nie na dodanie rekordu na podstawie zwróconej wartości (tego nie napisałeś), to możesz stworzyć zasadę (rule).

create rule R_DATA as
 @column is null or (@column between '1900-01-01 00:00' and '2100-12-31 23:59')

To chyba będzie takie coś - nie miałem czasu sprawdzić.

0

Dzięki, to akurat też może mi się przydać do innej części programu, ale tu chodzi mi o sprawdzenie czy podana data znajduje się w przedziale od-do każdego rekordu w tabeli. Nie wstawiam tu nowych danych tylko chcę sprawdzać. Z tego co już się orientowałem trzeba chyba będzie wykożystać CURSOR i FETCH NEXT...

0

Z pomocą kumpla ;)

CREATE FUNCTION [dbo].[SprawdzPrzedzial] (@pData DATETIME)
RETURNS NUMERIC(1,0) AS
BEGIN
 declare @i int
 set @i = 0
 IF @pData between '2005-03-01' and '2005-04-01'
  set @i=1
 return (@i)
END

//btw, wątek zostanie przeniesiony do działu JS/PHP/XML który to traktuje również o SQL gdyż nie ma tu nic co jest charakterystyczne dla Delphi

0

Ok, to by było prawie to. Tylko jak jeszcze zrobić, żeby daty nie były wpisywane z palca, a brane z nazwy pola (pole typu datetime). Wiem, można wpisać zamiast daty w apostrofach nazwę pola z tabeli, ale trzeba wziąć pod uwagę, że w tabeli nie jest tylko jeden rekord, a wiele.

Tabela nieobecności:
id_nieobecności, id_pracownika, od_data, do_data
1 1 01-01-2005 05-01-2005
2 1 10-02-2005 11-02-2005
3 1 05-03-2005 05-03-2005
.
.
.

i tak, podana przez nas data np. 03-01-2005 zwróci nam 1, bo mieści się ona w jednym z przdziałów (tu w pierwszym, od 01-01-2005 do 05-01-2005),
a np. data 06-01-2005 ort! 0, bo nie mieści się w żadnym z perzedziałów.
[???]

0

2 godziny szukałem na google jak wyświetlić wynik funkcji, bo chciałem sprawdzić czy działa... i nie znalazłem :/
Więc poniżej masz mój pomysł, ale nie sprawdzony.

Napisz jak możesz jak wyświetlic wynik funkcji spod SQL (bez żadnych języków dodatkowych jak Delphi etc).

CREATE FUNCTION [dbo].[SprawdzPrzedzial] (@pData DATETIME, @pId int)
RETURNS BIT AS
BEGIN
 declare @i bit
 set @i = 0
 IF @pData between (select od_data from nieobecnosci where id_nieobecnosci=@pId) and (select do_data from nieobecnosci where id_nieobecnosci=@pId)
  set @i=1
 return (@i)
END

Może da się zrobić tylko jednego selecta, aby zwrócił od razu 2 daty i potem się do nich jakoś odwołać - nie wiem - nie pisałem wcześniej takich funkcji.

0

Ja nie używałem jeszcze nigdy funkcji, tylko procedur składowanych (przerobie pomysł na nią ;-) ), ale wywołanie tej funkcji pewno było by w następujący sposób:

SELECT dbo.SprawdzPrzedzial(podana_data, 1)

ale gdzie to wpisać, to nie jestem pewien, nie mam w pracy kompa z SQL Serverem, ale podejrzewam, że może po wpisaniu jej w Enterprose Meneger'e, w funkcje, będzie opcja na niej pt. 'return all rows', tak jak przy 'Views'. Głowy nie daję, proszę się nie śmiać.

0

Znalazłem taki zapis z nawiasami, ale MS SQL Server zwraca błąd.
Jedyny zapis, który działa i którego używałem już wcześniej to taki:
SprawdzPrzedzial @pData='2005-04-02 01:30:47', @pId=1
ale wtedy nie można zrobić żadnego SELECT z takim zapisem :/

0

Chodziło mi o takie coś (odpowiedź z forum forum.pcmaniak.pl):

CREATE PROCEDURE DataWPrzedziale
(
@data datetime

)
AS

IF EXISTS (SELECT * FROM [Nieobecnosc planowana] WHERE @data BETWEEN data_poczatkowa AND data_koncowa)
RETURN 1
ELSE RETURN 0

Sprawdzałem - działa.

0
Marooned napisał(a)

Znalazłem taki zapis z nawiasami, ale MS SQL Server zwraca błąd.
Jedyny zapis, który działa i którego używałem już wcześniej to taki:
SprawdzPrzedzial @pData='2005-04-02 01:30:47', @pId=1
ale wtedy nie można zrobić żadnego SELECT z takim zapisem :/

Żeby to odpalić pod np. Query Analizer to zapisujesz

exec nazwa procedury [parametry oddzielone przecinkami]

nie potrzeba dodawać nazwy paremetru, wystarczy je podać w kolejności deklarowania, nie programuje w Delphi, ale ja bym zwracał jako parametr (output)
łatwiej przechwycić programistycznie... i może bardziej elegancko.
Jeżeli ktoś chce to mogę podać kod VB wykorzystująca do dostępu do danych bibliotekę ADO...

1 użytkowników online, w tym zalogowanych: 0, gości: 1