sql - funkcja, procedura czy też inne wyjście?

0

Dzień Dobry,

przeszukałem net od lewej do prawej i nie znalazłem choćby wskazówki jak poradzić sobie z moim problemem. Zapewne dla wielu z was wyda się banalny ale do rzeczy.

Powiedzmy że mam cztery tabele z takimi kolumnami Budynek, Produkt, Miesiąc, Plan Sprzedaży, Sprzedaż (tabele są beznadziejne ale niestety nie mam na to wpływu. Przychodzą z zewnątrz i ja na ich podstawie generuje raporty).
Co chcę zrobić? W aplikacji użytkownik wybiera miesiąc za jaki ma być wygenerowany raport. To jest przekazywane do funkcji albo procedury, która wykonuje np widoki ale z odpowiednim parametrem i wypluwa wynik, który to z kolei jest przechwytywany przez aplikację w postaci datagridview. To tak w skrócie. O ile część po stronie aplikacji potrafię zrobić to po stronie sql już nie wiem jak się za to zabrać. Byłbym ogromnie wdzięczny za wskazówki.
Pozdrawiam
Chande

0

Wybierasz kolumny laczysz joinem i robisz dwa nierówności nieostre z datami pomiędzy parametrami datowymi. Co do procedury. Nie lepiej po prostu zrobic sam widok a procedura tylko zsdeklarowac ze bedzie typ datowy i jak ma byc ustawiony? I w procedurze ustawisz sobie parametry data_od i data_do. Musisz tylko pamietac o wywolaniu procedury a widok pokaze wszystko co potrzebujesz i bedzie to obliczane w locie. PS tylko ja mowie o widokach sqlowych a nie c# żebyś sie nie kopnal.

0

Zrozumiałeś @chande? Bo ja nic nie zrozumiałem z tego co @kate87 napisała...

0

Ciężko :)
Pomyślałem że zrobię tak. Napisałem funkcję w której przekazuję jeden parametr (Miesiąc) i ją uruchamiam z poziomu c#. Teraz przerabiam dotychczasowe widoki tak aby jeden z nich korzystał z tej funkcji. Zobaczymy czy to zadziała :)

aaaa...mały problem się pojawił, czy w funkcji można do selecta dołożyć tworzenie kolumny z wartością parametru przekazywanego do tej funkcji ?
Mam parametr Miesiąc i zależy mi aby wartość jaka zostanie do niej przekazana pojawiła się przy każdym rekordzie.

0
chande napisał(a):

Ciężko :)
aaaa...mały problem się pojawił, czy w funkcji można do selecta dołożyć tworzenie kolumny z wartością parametru przekazywanego do tej funkcji ?
Mam parametr Miesiąc i zależy mi aby wartość jaka zostanie do niej przekazana pojawiła się przy każdym rekordzie.

ten problem już rozwiązałem :)

0

Hmm...przerobiłem.
W jednym z widoków który korzysta z tej funkncji musiałem wpisać parametr na stałe bo się inaczej widok nie chciał zapisać. Teraz jak zmieniać ten parametr?

2

Matko, ale kombinujesz...
Po co Ci do tego widok lub procedura?
Przeca to zwykły select jest, a więc piszesz w aplikacji:

select 
 A.*,
 B.*
from A 
inner join B on (A.ID = B.ID)
where A.Date between @StartDate and @EndDate

potem podstawiasz wartość parametrów, odpalasz i masz dane.
Co w tym trudnego? Po co Ci procedura lub widok?

Poczytaj sobie zapytania sparametryzowanych, bo mam wrażenie że nie wiesz co to...
http://www.csharp-station.com/Tutorial/AdoDotNet/Lesson06

0

To nie jest jedno zapytanie. Na podstawie wyboru miesiąca jest robiony szereg zestawień (podsumowujących, rozbitych na poszczególne miesiące, symulujących sprzedać itp.) Stąd potrzebuje w jednym miejscu zapisać za ile miesięcy mają być zrobione wszystkie raporty korzystające z tego jednego widoku.
Nie przeczę że jestem zielony w temacie.
Udało mi się to zrobić korzystając z tabeli sterującej miesiącami, ale przy kilku użytkownikach to się nie sprawdziło, stąd kombinacje alpejskie.

0
chande napisał(a):

To nie jest jedno zapytanie. Na podstawie wyboru miesiąca jest robiony szereg zestawień (podsumowujących, rozbitych na poszczególne miesiące, symulujących sprzedać itp.)

To że tak jest robione, nie oznacza że tak musi być robione i jest tak dobrze.
Ale nie wiem, nie widziałem bazy żeby cokolwiek powiedzieć.
Tak czy siak musisz sparametryzować te zapytania i przekazywać wartość parametru.

chande napisał(a):

Stąd potrzebuje w jednym miejscu zapisać za ile miesięcy mają być zrobione wszystkie raporty korzystające z tego jednego widoku.
Nie przeczę że jestem zielony w temacie.
Udało mi się to zrobić korzystając z tabeli sterującej miesiącami, ale przy kilku użytkownikach to się nie sprawdziło, stąd kombinacje alpejskie.

Zdefiniuj co rozumiesz przez widok?

BTW - nie da się spragmatyzować widoku po stronie bazy danych.
Parametry możesz przekazać do funkcji lub procedury. W przypadku zestawień, funkcja będzie wygodniejsza, ponieważ jej wynik możesz łączyć z innym zapytaniem.
W przypadku procedury w MSSQL tak się nie da zrobić wprost.

0

To że tak jest robione, nie oznacza że tak musi być robione i jest tak dobrze.

Zgadzam się w 100% :)

Tak czy siak musisz sparametryzować te zapytania i przekazywać wartość parametru.

No właśnie i w tym mam problem :)

Zdefiniuj co rozumiesz przez widok?

Mam sql epxpress i microsoft sql server managment studio. Widok jak widok, kwerenda w formie widoku

BTW - nie da się spragmatyzować widoku po stronie bazy danych.
Parametry możesz przekazać do funkcji lub procedury. W przypadku zestawień, funkcja będzie wygodniejsza, ponieważ jej wynik możesz łączyć z innym zapytaniem.
W przypadku procedury w MSSQL tak się nie da zrobić wprost.

Jestem zielony potwierdzam i powtarzam :) A jak zrobić Funkcję z parametrem Miesiac zwracającą ten parametr (obojętnie w jakiej formie) tak aby móc ten parametr wykorzystać w widoku/kwerendzie i tak aby ten parametr przekazywać z poziomu aplikacji i aby jeszcze sql nie pluł się "Must declare the scalar variable". Aaaa i żeby nie musieć tego parametru zapisywać w widoku tylko w samej funkcji. Nie wiem jak czytelniej wyjaśnić o co mi chodzi :)

Próbowałem coś takiego, ale nie działa :(

 
CREATE FUNCTION [dbo].[Miesiac]

( @Miesiac int )
RETURNS int
AS
BEGIN

set @Miesiac=5
  RETURN (@Miesiac)
END

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