Hej, no problem, nista licno. Niko nije rekao da si ti kriv sto sistem ne valja. A da ne valja - ne valja brate, tu se nista ne moze ;-)
Pomoc na kraci rok: - kako rece Djoka, dinamicki kveri
Code:
-- prvo napraviom tri tabele za testitanje:
CREATE TABLE [dbo].[Proizvodi_2012APR01]
(
[Proizvod] [varchar](6) NOT NULL,
[Kolicina] [int] NOT NULL,
)
;
CREATE TABLE [dbo].[Proizvodi_2012APR02]
(
[Proizvod] [varchar](6) NOT NULL,
[Kolicina] [int] NOT NULL,
)
;
CREATE TABLE [dbo].[Proizvodi_2012APR03]
(
[Proizvod] [varchar](6) NOT NULL,
[Kolicina] [int] NOT NULL,
)
;
CREATE TABLE [dbo].[Proizvodi_2012APR04]
(
[Proizvod] [varchar](6) NOT NULL,
[Kolicina] [int] NOT NULL,
)
;
-- Zatim dodamo nekoliko tets podataka:
INSERT INTO [Proizvodi_2012APR01] VALUES ('Ananas',10)
INSERT INTO [Proizvodi_2012APR01] VALUES ('Banana',10)
INSERT INTO [Proizvodi_2012APR01] VALUES ('Citrus',10)
;
INSERT INTO [Proizvodi_2012APR02] VALUES ('Grozde',20)
INSERT INTO [Proizvodi_2012APR02] VALUES ('Papaya',20)
INSERT INTO [Proizvodi_2012APR02] VALUES ('Orange',20)
;
INSERT INTO [Proizvodi_2012APR03] VALUES ('Grozde',30)
INSERT INTO [Proizvodi_2012APR03] VALUES ('Mangos',30)
INSERT INTO [Proizvodi_2012APR03] VALUES ('Orange',30)
;
INSERT INTO [Proizvodi_2012APR04] VALUES ('Sljiva',40)
INSERT INTO [Proizvodi_2012APR04] VALUES ('Kruska',40)
INSERT INTO [Proizvodi_2012APR04] VALUES ('Drenak',40)
;
Te tabele vidomo kroz system view, INFORMATION_SCHEMA.TABLES, ovako:
Code:
SELECT
TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'Proizvodi_%'
TABLE_NAME
-------------------
Proizvodi_2012APR01
Proizvodi_2012APR02
Proizvodi_2012APR03
Proizvodi_2012APR04
(4 row(s) affected)
Ako malo budemo kreativni sa SELECT izrazom mozemo da napisemo ovo:
Code:
SELECT
TABLE_NAME, SQLizraz = 'SELECT Proizvod, Kolicina FROM '
+ TABLE_NAME
+ ' UNION ALL '
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'Proizvodi_%'
;
-- Rezultat:
TABLE_NAME SQLizraz
Proizvodi_2012APR01 SELECT Proizvod, Kolicina FROM Proizvodi_2012APR01 UNION ALL
Proizvodi_2012APR02 SELECT Proizvod, Kolicina FROM Proizvodi_2012APR02 UNION ALL
Proizvodi_2012APR03 SELECT Proizvod, Kolicina FROM Proizvodi_2012APR03 UNION ALL
Proizvodi_2012APR04 SELECT Proizvod, Kolicina FROM Proizvodi_2012APR04 UNION ALL
Sad vec vidis ideju. Teorijski, to je to. Imas kod koji pise kod, cool, eh. E, sad, ima jos nekoliko trikoava da bismo dosli do konacnog resenja. Pazi, cela skripta mora da se izvrsi odjednom, ne moze linija po linija.
Code:
--- Ovde gradimo listu UNION
DECLARE @SQL_UNION varchar(8000)
SET @SQL_UNION = ''
;
SELECT
@SQL_UNION = @SQL_UNION + 'SELECT Proizvod, Kolicina FROM '
+ TABLE_NAME
+ ' UNION ALL '
+ char(10)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'Proizvodi_%'
;
-- Ovde pokazujemo sta smo sagradili:
SELECT [@SQL_UNION] = @SQL_UNION
;
-- Ovde se resimo poslednjeg UNION ALL
SET @SQL_UNION = LEFT(@SQL_UNION, LEN(@SQL_UNION)-11)
;
-- dodamo ; na kraj izraza
SELECT [@SQL_UNION] = @SQL_UNION + char(10)+ ';'
;
-- Izvrsimo dinamcki sastavljen kod
PRINT 'Now EXECUTE @SQL_UNION:'
EXECUTE (@SQL_UNION)
;
AKo je sve bilo u redu kopirano, rezultat treba da bude ovakav:
Code:
Proizvod Kolicina
-------- -----------
Ananas 10
Banana 10
Citrus 10
Grozde 20
Papaya 20
Orange 20
Grozde 30
Mangos 30
Orange 30
Sljiva 40
Kruska 40
Drenak 40
(12 row(s) affected)
Poslednju skriptu mozes da zapakujes u stored proceduru i da je pozivas svaki drugi dan. Problem je sto sam ja stavio da @SQL_UNION moze da bude do 8,000 karaktera, pa postoji sansa da nemas dovoljno prostora. To ces vec da resis promenom tipa sa vrachar(8000) u vrcharmax ili tako nesto slicno.
Ovo je samo gruba skica kako bi to zigledalo sa dinamickim kvarijima. To je resenja na kraci rok.
Na duzi rok, bolje resenje je da se tri tabele strpaju u jednu, kako smo vec rekli. Ovako nekako:
Code:
CREATE TABLE [dbo].[Proizvodi_Zbirno]
(
[Proizvod] [varchar](6) NOT NULL,
[Kolicina] [int] NOT NULL,
[DatumUnosa] datetime NOT NULL
)
;
-- malo podataka:
INSERT INTO [Proizvodi_Zbirno] VALUES ('Ananas',10,'20120401')
INSERT INTO [Proizvodi_Zbirno] VALUES ('Banana',10,'20120401')
INSERT INTO [Proizvodi_Zbirno] VALUES ('Citrus',10,'20120401')
INSERT INTO [Proizvodi_Zbirno] VALUES ('Grozde',20,'20120402')
INSERT INTO [Proizvodi_Zbirno] VALUES ('Papaya',20,'20120402')
INSERT INTO [Proizvodi_Zbirno] VALUES ('Orange',20,'20120402')
INSERT INTO [Proizvodi_Zbirno] VALUES ('Grozde',30,'20120403')
INSERT INTO [Proizvodi_Zbirno] VALUES ('Mangos',30,'20120403')
INSERT INTO [Proizvodi_Zbirno] VALUES ('Orange',30,'20120403')
INSERT INTO [Proizvodi_Zbirno] VALUES ('Sljiva',40,'20120404')
INSERT INTO [Proizvodi_Zbirno] VALUES ('Kruska',40,'20120404')
INSERT INTO [Proizvodi_Zbirno] VALUES ('Drenak',40,'20120404')
;
-- sve je sada mnogo lakse :-)
SELECT * FROM [Proizvodi_Zbirno]
ORDER BY DatumUnosa
Ako imas dozvolu da kreiras tabele, probaj sa zajednickom tabelo. Znam, znam, nesto u sitemu generise druge tabele, nad tim nemas kontrolu. Onda napravi proceduru koja pretrazuje ima li novih tabela, pa iz njih prepisuj podatke u zajednicku.
Ja mislim da sam se izvadio za kritiku. Ponavlajm, kritika sistema, ne tebe, jer sistem je napravila vodeca svetska kompanija, nisi ti, pa ne mozes biti kriv.
Srecan rad :-)
:-)