Bilans zamknięcia. Tabela archiwum.

Odpowiedz Nowy wątek
2015-01-21 22:26
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 :)

Pozostało 580 znaków

2015-01-21 23:43
0

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

Pozostało 580 znaków

2015-01-22 06:29
0

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

Przecież napisałeś zapytanie... - Marcin.Miga 2015-01-22 07:17

Pozostało 580 znaków

2015-01-22 07:24
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.


"There are people who actually like programming. I don't understand why they like programming."
Rasmus Lerdorf

Pozostało 580 znaków

2015-01-22 12:31
0

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

Pozdrawiam

Pozostało 580 znaków

2015-01-26 11:13
0
<quote="1105287"> ```sql 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: ```sql $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 ?
edytowany 1x, ostatnio: kmpl, 2015-01-26 15:54

Pozostało 580 znaków

2015-01-26 22:14
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);
edytowany 1x, ostatnio: kmpl, 2015-01-26 22:15

Pozostało 580 znaków

2015-01-27 00:34
0

Let join do archiwum po obu polach

Pozostało 580 znaków

2015-01-27 09:16
0

Ni w kij ni w oko nie wychodzi...

Pozostało 580 znaków

2015-01-27 10:25
0

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

Pozostało 580 znaków

2015-01-27 16:01
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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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