Proste obliczenia - posiłki

Jak każdy program i nasza DM Plaza nie jest wolna od błędów - prosimy opiszcie je - szybciej zostaną naprawione
AJP_Kuba
Ekspert
Posty: 155
Rejestracja: 2009-06-05, 07:20
Lokalizacja: Kraków
Kontakt:

Proste obliczenia - posiłki

Post autor: AJP_Kuba »

Wersja 4228
Rezerwacja na 3.noce, 3.osoby, dodane śniadania dla każdej osoby. Gra.
Zakładka posiłki pokazuje: rodzaj posiłku => śniadanie, wielkość=> pełny; ilość=>6

Wynik jest pobierany z widoku. Wyłączenie parametru SQLCanUseViews nic nie daje. Zmianę obserwujemy po usunięciu widoku z bazy - wtedy jako ilość podawana jest ilość na dzień.

Aby wyliczenie było poprawne, trzeba podmienić widok w bazie:

Kod: Zaznacz cały

CREATE VIEW USLUGA_POSILEK_VIEW
(
USLUGA_ID,
ASORT_ID,
MELDUNEK_ID,
REZERWACJA_ID,
GRUPA_ID,
USLUGA_DATA_DO,
USLUGA_DATA_OD,
USLUGA_ILOSC,
ILE_RAZY,
USLUGA_KWOTA_BRUTTO,
USLUGA_KWOTA_BRUTTO_EUR,
ASORT_USLUGA_TYP,
PODTYP
)
AS
SELECT
 U.USLUGA_ID,
 U.ASORT_ID,
 U.MELDUNEK_ID,
 U.REZERWACJA_ID,
 U.GRUPA_ID,
 U.USLUGA_DATA_DO, U.USLUGA_DATA_OD,
 U.USLUGA_ILOSC,
 U.USLUGA_ILOSC *(U.USLUGA_DATA_DO-U.USLUGA_DATA_OD +1) AS ILE_RAZY,
 U.USLUGA_KWOTA_BRUTTO,
 U.USLUGA_KWOTA_BRUTTO_EUR,
 A.ASORT_USLUGA_TYP,
 A.ASORT_USLUGA_TYP
FROM USLUGA U
LEFT OUTER JOIN ASORT A ON A.ASORT_ID = U.ASORt_ID
WHERE A.ASORT_TYP = 4;
Zmiany w kodzie:
1. wyliczenie pola ILE_RAZY - różnica dat+1
2. sugerowana zmiana warunku (oryginalnie jest U.ASORT_TYP=4); dzięki temu zmiana definicji asortymentu wpłynie na wynik wyliczenia. Stosuję w raportach żywień, pomaga gdy użytkownicy sami dodają asortyment ("utworzyłem obiad, dodałem do usług a raport nie widzi").
Awatar użytkownika
jevkoo
Administrator
Posty: 482
Rejestracja: 2009-05-17, 19:28
Lokalizacja: Skoczów

Post autor: jevkoo »

Bardzo dziękuję. Kuba jesteś nieoceniony.

Kod: Zaznacz cały

CREATE VIEW USLUGA_POSILEK_VIEW
(
USLUGA_ID,
ASORT_ID,
MELDUNEK_ID,
REZERWACJA_ID,
GRUPA_ID,
USLUGA_DATA_DO,
USLUGA_DATA_OD,
USLUGA_ILOSC,
ILE_RAZY,
USLUGA_KWOTA_BRUTTO,
USLUGA_KWOTA_BRUTTO_EUR,
ASORT_USLUGA_TYP,
PODTYP
)
AS
SELECT
 U.USLUGA_ID,
 U.ASORT_ID,
 U.MELDUNEK_ID,
 U.REZERWACJA_ID,
 U.GRUPA_ID,
 U.USLUGA_DATA_DO, U.USLUGA_DATA_OD,
 U.USLUGA_ILOSC,
 u.USLUGA_ILOSC * 
        case 
           when u.USLUGA_DATA_DO-u.USLUGA_DATA_OD <=0 then 1 
           else &#40;U.USLUGA_DATA_DO-U.USLUGA_DATA_OD +1&#41; 
        end ILE_RAZY,
 U.USLUGA_KWOTA_BRUTTO,
 U.USLUGA_KWOTA_BRUTTO_EUR,
 A.ASORT_USLUGA_TYP,
 A.ASORT_USLUGA_TYP
FROM USLUGA U
JOIN ASORT A ON A.ASORT_ID = U.ASORt_ID
WHERE A.ASORT_TYP = 4; 
Mały case, gdyby ktoś błędnie wprowadził daty
AJP_Kuba
Ekspert
Posty: 155
Rejestracja: 2009-06-05, 07:20
Lokalizacja: Kraków
Kontakt:

Post autor: AJP_Kuba »

Wychodzę z założenia, że zadaniem raportu (a taką funkcje pełni ten widok) nie jest poprawianie danych. Dane błędnie wprowadzone powinny być raportowane tak, aby łatwo było doszukać się błędu - tu np. jaku ujemna liczba posiłków. Jeśli już się zabezpieczać przed błędnym wprowadzeniem danych, to może tam, gdzie są wprowadzane?;)
AJP_Kuba
Ekspert
Posty: 155
Rejestracja: 2009-06-05, 07:20
Lokalizacja: Kraków
Kontakt:

Post autor: AJP_Kuba »

v. 4411 - przy wejściu na zakładkę posiłki, dostaję komunikat o braku kolumny USLUGA_ANULOWANA. Po usunięciu widoku i powrocie do tego miejsca, mamy General SQL error. Dodałem ręcznie _ANULOWANA oraz _ZYWIENIE_STATUS (proste uzupełnienie widkou z kodu powyżej), i zakładce są bzdury.
usługi:
- śniadanie, 3 dni x 1szt, cena 0.00 zł (wliczone w pobyt)
- śniadanie, 3 dni x 2szt, cena 5.00zł (dodatkowo płatne)
posiłki:
- śniadanie, ilość 9 (ok), wartość 10???
Przecież z wyliczenia wychodzi wartość 30zł. Ilość wyliczana jest jako suma wszystkich usług, a wartość jest sumą na dzień?

Może zrezygnujcie z dodatkowego przeliczania w tym okienku? Jeśli jego zawartość będzie czytana z widoku, to grupowanie można sobie dodać właśnie w widoku, albo pokazywać wyliczenie bardziej szczegółowo.
Ostatnio zmieniony 2016-02-22, 09:28 przez AJP_Kuba, łącznie zmieniany 1 raz.
Awatar użytkownika
jevkoo
Administrator
Posty: 482
Rejestracja: 2009-05-17, 19:28
Lokalizacja: Skoczów

Post autor: jevkoo »

poprawiony kod:

Kod: Zaznacz cały

CREATE OR ALTER VIEW USLUGA_POSILEK_VIEW&#40;
    USLUGA_ID,
    ASORT_ID,
    MELDUNEK_ID,
    REZERWACJA_ID,
    GRUPA_ID,
    USLUGA_DATA_DO,
    USLUGA_DATA_OD,
    USLUGA_ILOSC,
    ILE_RAZY,
    USLUGA_KWOTA_BRUTTO,
    USLUGA_KWOTA_BRUTTO_EUR,
    ASORT_USLUGA_TYP,
    USLUGA_ZYWIENIE_STATUS,
    USLUGA_ANULOWANA,
    PODTYP&#41;
AS
select u.USLUGA_ID,
    u.ASORT_ID,
    u.MELDUNEK_ID,
    u.REZERWACJA_ID,
    u.GRUPA_ID,
    u.USLUGA_DATA_DO,u.USLUGA_DATA_OD,
    u.USLUGA_ILOSC,
    u.USLUGA_ILOSC * 
    case 
       when u.USLUGA_DATA_DO-u.USLUGA_DATA_OD <=0 then 1 
       else &#40;U.USLUGA_DATA_DO-U.USLUGA_DATA_OD +1&#41; 
    end ILE_RAZY, 
    u.USLUGA_KWOTA_BRUTTO, 
    u.USLUGA_KWOTA_BRUTTO_EUR, 
    a.ASORT_USLUGA_TYP, 
    u.USLUGA_ZYWIENIE_STATUS, 
    u.USLUGA_ANULOWANA, 
    a.ASORT_USLUGA_TYP 
    from USLUGA u 
    Left outer join ASORT a on u.asort_id=a.asort_id 
where u.ASORT_TYP=4;
;
ODPOWIEDZ