Bilans zamknięcia. Tabela archiwum.

0

Witam.

Mam bazę ewidencji urządzeń sieciowych w różnych pomieszczeniach. (php, mysql).

3 tabele:

sprzet: id_sprzetu, nazwa, indeks, JIM, ilosc
pomieszczenia: id_pomieszczenia, nr_pomieszczenia, opis
lok_sprzetu: id_l_s, id_sprzet, id_pom, iloscloksprzetu, uwagi

W tabeli sprzet mam informacje ile sprzętu i w jakiej ilości mam na stanie (obciążeniu).
W tabeli lok_sprzetu mam dane jaki sprzęt w jakiej ilości znajduje sie w danym pomieszczeniu.

Efektem końcowym jest wykaz sprzętu na dany dzień (np. kwartał - załącznik), który wisi w pomieszczeniu.

Ale w następnym kwartale mogą być zmiany. np. było w pomieszczeniu nr 33 routerów 8 sztuk, a teraz jest 7 sztuk.
W wykazie w kolejnej kolumnie ze stanem na kolejny kwartał muszę te zmiany wykazać. Dane z poprzedniego kwartału muszą zostać zachowane.

Pomyślałem, że stworzę kolejną tabelę Archiwum do której będą kopiowane dane z każdych kwartałów:
id, id_sprzet, id_pom, iloscloksprzetu,data (datę będę wstawiał jako kwartał). Nie wiem czy to dobre rozwiązanie.

Coś na zasadzie:

INSERT INTO ...SELECT tbl
FROM tbl

Ale za bardzo nie wiem jak skonstruować zapytanie.

Może ktoś pomoże :)

0

Pomysł bardzo dobry.. Sam tak robię w cronie codziennie. A i nazwy tabel jakieś mi znajome :-P

0

Tak znajome :) Trochę rozszerzenie wcześniejszych tematów i problemów. Ale brak pomysłu co do realizacji. Chodzi o zapytanie sql.

0
INSERT INTO Archiwum (id_sprzet, id_pom, iloscloksprzetu, data)
SELECT id_sprzet, id_pom, iloscloksprzetu, '2014-12-31'
FROM lok_sprzetu

Jako datę wystarczy podać dowolną datę zawartą w kwartale z którego robisz backup, choć ja przyjąłbym ostatni dzień tego okresu.
Później możesz w łatwy sposób wyciągnąć z tego kwartał przez QUARTER().

Ewentualnie inne podejście, dwie kolumny rok, kwartal i uzupełnianie ich przez podanie roku i kwartału explicite:

INSERT INTO Archiwum (id_sprzet, id_pom, iloscloksprzetu, rok, kwartal)
SELECT id_sprzet, id_pom, iloscloksprzetu, 2014, 4
FROM lok_sprzetu

Trzeba zauważyć, że pierwsze rozwiązanie jest bardziej eleastyczne, nie będzie problemu zmiany okresu za który jest robiony backup. W pewnym momencie można zacząć to robić co miesiąc i nie będzie zbytniego problemu. Drugie rozwiązanie będzie już wymagało większej modyfikacji, jego zaletą jest za to szybkość dostępu do danych bo nie musimy tego kwartału wyliczać. Jednak wydaje mi się, że ta tabela nie będzie często odpytywana zatem rozwiązanie pierwsze ma tutaj więcej sensu.

0

Wielkie dzięki! Zaraz zabieram się do pracy.

Pozdrawiam

0

<quote="1105287">

INSERT INTO Archiwum (id_sprzet, id_pom, iloscloksprzetu, data)
SELECT id_sprzet, id_pom, iloscloksprzetu, '2014-12-31'
FROM lok_sprzetu

Tak też i zrobiłem. Działa super :)
Teraz mam zarchiwizowane dane w tabeli archiwum z datą 31.12.2014.
Teraz dokonałem aktualizacji sprzętu (nastąpiły pewne zmiany w ilości sztuk w danych pomieszczeniach, oraz niektóre egzemplarze sprzętu doszły do pomieszczeń, a niektóre ubyły).
Teraz chcę w kolejnej kolumnie ze stanem na 02.01.2015 wykazać aktualny stan (z tabeli loksprzretu).

Zastanawiam się jak zmodyfikować istniejące zapytanie:

 

$w$query->select('*');
	  $query->from('#__lok_sprzetu As a');
	  $query->leftJoin('#__sprzet AS sprzet ON a.id_sprzet = sprzet.id_sprzetu');
		$query->leftJoin('#__pomieszczenia AS pom ON a.id_pom = pom.id_pomieszczenia');
		$query->where(' a.id_pom = '.$warunek);

UNION ALL ?

0

Teraz mam zarchiwizowane dane w tabeli archiwum z datą 31.12.2014.
Teraz dokonałem aktualizacji sprzętu (nastąpiły pewne zmiany w ilości sztuk w danych pomieszczeniach, oraz niektóre egzemplarze sprzętu doszły do pomieszczeń, a niektóre ubyły).
Teraz chcę w kolejnej kolumnie (wykazu sprzętu) ze stanem na 02.01.2015 wykazać aktualny stan (z tabeli loksprzetu) a stan wcześniejszy na 01.01.2014 będzie pobierany z tabeli archiwum. Załącznik

Zastanawiam się jak zmodyfikować istniejące zapytanie:

$query->SELECT('*');
      $query->FROM('#__lok_sprzetu As a');
      $query->leftJoin('#__sprzet AS sprzet ON a.id_sprzet = sprzet.id_sprzetu');
        $query->leftJoin('#__pomieszczenia AS pom ON a.id_pom = pom.id_pomieszczenia');
        $query->WHERE(' a.id_pom = '.$warunek);
0

Let join do archiwum po obu polach

0

Ni w kij ni w oko nie wychodzi...

0

Wklej na sqlfiddle probke danych "sprzet", "lok_sprzetu", "pomieszczenia", "archiwum"

0

Na razie takie złączenie dla pomieszczenia nr 5:

 
SELECT razem.id_pom, razem.id_sprzet, CONCAT(razem.id_pom,razem.id_sprzet) AS indeks, razem.iloscloksprzetu, razem.data
FROM 
(	SELECT 
		a.id_pom,
		a.id_sprzet,
		a.iloscloksprzetu,
		CURDATE() as data
	FROM jos_lok_sprzetu As a
		LEFT JOIN jos_sprzet AS sprzet ON a.id_sprzet = sprzet.id_sprzetu
		LEFT JOIN jos_pomieszczenia AS pom ON a.id_pom = pom.id_pomieszczenia
		LEFT JOIN jos_miary AS miary ON a.id_miary = miary.id_miary
union
	SELECT
		ar.id_pom,
		ar.id_sprzet,
		ar.iloscloksprzetu,
		ar.data
	FROM jos_archiwum AS ar
) AS razem
WHERE razem.id_pom = '5'
ORDER BY indeks ASC
1

Przekombinowales.
SELECT s.*, a.iloscloksprzetu FROM jos_lok_sprzetu s LEFT JOIN jos_archiwum a ON a.data='2015-01-01' and a.id_sprzetu=s.id_sprzetu and a.id_pom=s.id_pom

0

No tak, działa :) Dzięki.

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