"CASE WHEN" syntax error

Adatbázis kezelő
boncsa
Hozzászólások: 9
Csatlakozott: 2012. április 28., szombat 17:44

"CASE WHEN" syntax error

Hozzászólás Szerző: boncsa »

Sziasztok!

Van egy táblám, amelyre a következő lekérdezést hoztam létre:

SELECT "Datum" AS "Datum", "BizSzam" AS "BizSzam", "Partner" AS "Partner", "Megjegyzes" AS "Megjegyzes", "FokSzamJelleg" AS "FokSzamJelleg", "FokSzam" AS "FokSzam", "AfaJelleg" AS "AfaJelleg", "AfaFokSzam" AS "AfaFokSzam", "Brutto" AS "Brutto", "Brutto" / 127 * 100 AS "Netto", "Brutto" / 127 * 27 AS "Afa" FROM "Naplo_Penztar" WHERE "Datum" >= :KezdőDátum AND "Datum" <= :Végdátum ORDER BY "Datum" ASC

Ez tulajdonképpen a meglévő bruttó mezőből két új mezőbe beírja a nettó és az áfá értékét is (dátumra lehet szűkíteni).
Annyit szerettem volna benne bővíteni, hogy a nettó és az áfa értékét csak akkor számolja, ha az "AfaJelleg" mező értéke 't' vagy 'k'.
A CASE WHEN feltétellel próbáltam, de akárhogy és akárhová írom, mindig SYNTAX ERROR-t ír. Már megőrülök, minden variációt kipróbáltam, egyszerűen nem megy!

Tudtok segíteni?

Üdv.
boncsa
Ubuntu 10.04 LTS, OpenOffice 3.2
Avatar
Zizi64
Globális moderátorok
Hozzászólások: 4031
Csatlakozott: 2008. november 12., szerda 21:22
Tartózkodási hely: Budapest

Re: "CASE WHEN" syntax error

Hozzászólás Szerző: Zizi64 »

Sajnos a Base-ban teljesen járatlan vagyok, segíteni nem tudok.
(r4zoli a te embered nagy valószínűséggel - meg még egy páran jóval jártasabbak az adatbázis kezelésben, mint én.)

Most viszont a témádat leválasztom, áthelyezem, mert "Egy probléma - egy kérdés" az alapszabály itt a fórumon. Ott keresd majd a hozzászólásodat. Így, hogy a téma címét az n-edik hozzászólás után módosítod, végképp átláthatatlan lesz a fórum...
 Szerkesztett: No, már meg is tettem... 
Sok sikert!
Kovács Tibor (W10x64Pro/W7x64P: 7.5.8;
winPenPack/PortableApps: LO3.3.1-7.6.2, AOO4.1.14
Ha megoldódott a probléma, jelöld a témaindító hozzászólásod címének szerkesztésével. Írd elé: [Megoldva].
antiuhu
Önkéntesek
Hozzászólások: 194
Csatlakozott: 2008. február 28., csütörtök 23:44

Re: "CASE WHEN" syntax error

Hozzászólás Szerző: antiuhu »

Üdv!

Erről a függvényről olvashatsz Reizinger Zoltán – Bevezetés az adatbázis használatába 28. oldalán.
Ha jól értelmezem, akkor az SQL lekérdezésekben a mezőneveket idézőjelek, vagy aposztrófok közé kell tenni. A te lekérdezésedben a KezdőDátum és Végdátum csak önmagukban szerepelnek. Továbbá a mezőnevek csak ékezet nélküliek lehetnek (az "álnevek" lehetnek ékezetesek).
A CASE WHEN-ről ezt írja:
CASE WHEN...[1]
CASE WHEN expr1 THEN v1[WHEN expr2 THEN v2] [ELSE v4] END
amikor expr1 igaz térj vissza v1 értékével [opcionálisan ismételhető több esetre]
[egyébként v4 vagy nulla ha nincs ELSE]
Máshogy "ábrázolva":

Kód: Egész kijelölése

CASE WHEN expr1 THEN v1
          [WHEN expr2 THEN v2]
          [WHEN expr3 THEN v3]
          [...]
          [ELSE v4]
END
Tehát: soronként nézi a feltételeket, ha nem teljesül, akkor nézi a következő sort egészen addig amíg nem teljesül a feltétel. Ha semelyik feltétel sem teljesül, akkor az ELSE részben megadott értéket adja - Ha nincs ELSE, akkor 0. Az egy "sorban" levő feltételeket [] közé kell tenni.

Ha valamit rosszul írtam, akkor nyugodtan javítsatok!

Anti
boncsa
Hozzászólások: 9
Csatlakozott: 2012. április 28., szombat 17:44

Re: "CASE WHEN" syntax error

Hozzászólás Szerző: boncsa »

Szia!

Eszerint a könyv szerint tanulok én is. A dátummal nincs gondom, működik a lekérdezés vele. Csak akárhová írom a "WHEN CASE" szintaktikát, mindenhol hibát jelez. Konkrétan a fenti kódrészletembe hová tennétek? Elméletileg így nézne ki:

CASE "AfaJelleg" WHEN '*' THEN "Brutto"/127*100 AS "Netto", "Brutto"/127*27 AS "Afa" END

Tehát: Ha az "AfaJelleg" mezőben bármilyen érték van, számolja ki a bruttóból a nettót és az áfát úgy, hogy a nettót és az áfát új oszlopba írja.

Üdv.
boncsa
Ubuntu 10.04 LTS, OpenOffice 3.2
antiuhu
Önkéntesek
Hozzászólások: 194
Csatlakozott: 2008. február 28., csütörtök 23:44

Re: "CASE WHEN" syntax error

Hozzászólás Szerző: antiuhu »

Üdv!

Gyorsan próbáltam összerakni egy példa adatbázist. Ebben külön, külön meg tudom csinálni, a lekérdezést, de egyben nem :(
Ezeket az SQL utasításokat használtam:
Áfa

Kód: Egész kijelölése

SELECT CASE WHEN "AfaJelleg" <> '' THEN ( "Brutto" / 127 ) * 27 END AS "Afa", "ID" FROM "TABLA" "AfaJelleg"
Brutto

Kód: Egész kijelölése

SELECT CASE WHEN "AfaJelleg" <> '' THEN ( "Brutto" / 127 ) * 100 END AS "Netto", "ID" FROM "TABLA" "AfaJelleg"
Figyelem! A THEN előtt dupla ' jel (Shift+1) van!

Anti
Csatolmányok
CASE-WHEN.odb
CASE-WHEN példa adatbázis
(3.46 KiB) Letöltve 236 alkalommal.
antiuhu
Önkéntesek
Hozzászólások: 194
Csatlakozott: 2008. február 28., csütörtök 23:44

Re: "CASE WHEN" syntax error

Hozzászólás Szerző: antiuhu »

Üdv!
Ha az "AfaJelleg" mezőben bármilyen érték van, számolja ki a bruttóból a nettót és az áfát úgy, hogy a nettót és az áfát új oszlopba írja.
Ehhez szerintem nem kell a CASE WHEN, mert itt bármilyen érték van akkor el kell készíteni a "Netto" és az "Afa" oszlopot a lekérdezésben. Tehát valami ilyesmi kellene inkább neked:

Kód: Egész kijelölése

SELECT "Brutto" AS "Brutto", ( "Brutto" * 100) / 127  AS "Netto", ( "Brutto" * 27 ) / 127 AS "Afa" FROM "TABLA"

Ha a fenti lekérdezést elkészíted, akkor ilyesmi eredményt kapsz:

Kód: Egész kijelölése

| Brutto | Netto  | Afa  |
|1000    |   787,4| 212,6|
|2000    |  1574,8| 425,2|
Anti
boncsa
Hozzászólások: 9
Csatlakozott: 2012. április 28., szombat 17:44

Re: "CASE WHEN" syntax error

Hozzászólás Szerző: boncsa »

Nem jó, mert csak akkor kell nettót és áfát számolni, ha bármilyen érték van az "AfaJelleg" mezőben. Lehet, hogy rosszul magyaráztam: ha ez a mező nem tartalmaz adatot, akkor nem áfás a számla. A "bármilyen" meghatározást azért akartam értéknek adni, mert nem akartam azon agyalni, hogy csak 't' és 'k' lehet az "AfaJelleg" értéke. (Vagy üres.)

boncsa
Ubuntu 10.04 LTS, OpenOffice 3.2
antiuhu
Önkéntesek
Hozzászólások: 194
Csatlakozott: 2008. február 28., csütörtök 23:44

Re: "CASE WHEN" syntax error

Hozzászólás Szerző: antiuhu »

Üdv!

Meglestem ezekkel a feltételekkel is és azt hiszem sikerült alkotnom valamit.
Az alábbi kód az "AfaJelleg_t_k"-ban található meg.

Kód: Egész kijelölése

SELECT "AfaJelleg", CASE WHEN "AfaJelleg" = 't' THEN "Brutto" WHEN "AfaJelleg" = 'k' THEN "Brutto" END AS "Brutto", CASE WHEN "AfaJelleg" = 't' THEN ( "Brutto" * 100 ) / 127 WHEN "AfaJelleg" = 'k' THEN ( "Brutto" * 100 ) / 120 END AS "Netto" , CASE WHEN "AfaJelleg" = 't' THEN ( "Brutto" * 27 ) / 127 WHEN "AfaJelleg" = 'k' THEN ( "Brutto" * 20 ) / 120 END AS "Afa" FROM "TABLA" WHERE "AfaJelleg" <> ''
Elvileg annyit tesz, hogy kilistázza a "t" és "k" ÁfaJellegű rekordokat, a "t"-s értékhez 27, a "k"-hoz 20%-ot számol, amit az áfa és a nettó oszlopokba listáz. Lehetne még rendezni is a lekérdezést az ORDER BY segítségével.
Tehát, hogy az alap kérdésre is válaszoljak, úgy kell a CASE WHEN-t használni, (több sorba írom, így talán átláthatóbb)

Kód: Egész kijelölése

SELECT  //Ezzel tudod a lekérdezést végrehajtani
CASE WHEN <feltétel1> THEN <feltétel1 teljesülése esetén ez történik> WHEN <feltétel2> THEN <feltétel2 teljesülése esetén ez történik> ELSE <feltétel1,2...n nem teljesülése esetén ez történik> END AS <amit itt beállítasz az alapján készül el az eredmény>,

A fenti részt annyiszor ismételd, ahány oszlopot szeretnél (persze nem kötelező mindegyiknél CASE WHEN-t használni).
FROM <Tábla>
WHERE <Feltétel>
...

Mellékelem a gyakorló adatbázisomat. Előfordulhatnak benne hibák. Ezért Csak saját felelősségre! ;)

Anti
Csatolmányok
CASE-WHEN.odb
Módosított CASE-WHEN Adatbázis
(4.15 KiB) Letöltve 225 alkalommal.
boncsa
Hozzászólások: 9
Csatlakozott: 2012. április 28., szombat 17:44

Re: "CASE WHEN" syntax error

Hozzászólás Szerző: boncsa »

Szia!

Közben én is kiderítettem, hogy kétszer kell a CASE WHEN-t alkalmazni. :-)
És ami nagyon blőd hiba részemről: csak akkor fut a lekérdezés, ha megnyomom az "sql parancs közvetlen futtatása" ikont. (Egyébként nem tudom, hogy ez az ikon mi célt szolgál.) Így jár az, aki kezdő! :-)
Még mindig van egy kis probléma, de előbb agyalok rajta, hátha megoldom. Ha nem sikerül, jelentkezem.
Nagyon, nagyon köszönöm a segítségedet! Ha nem agyalsz velem együtt, nem sikerült volna!

Üdv.
boncsa
Ubuntu 10.04 LTS, OpenOffice 3.2
boncsa
Hozzászólások: 9
Csatlakozott: 2012. április 28., szombat 17:44

Re: "CASE WHEN" syntax error

Hozzászólás Szerző: boncsa »

Megint itt vagyok. :-)

Gyönyörűen működik a CASE WHEN, de csak akkor, ha a dátum választást lehagyom a végéről. Illetve lefut a kérdezés, de üresen jelenik meg (nincs rekord benne). Egyébként olyan fura hibaüzeneteket kapok sql-re, nem lehet, hogy valami kiegészítőm hiányzik?

Ez működik szépen, bekéri a dátumot és listáz:

Kód: Egész kijelölése

SELECT "Datum" AS "Datum", "BizSzam" AS "BizSzam", "Partner" AS "Partner", "Megjegyzes" AS "Megjegyzes", "FokSzamJelleg" AS "FokSzamJelleg", "FokSzam" AS "FokSzam", "AfaJelleg" AS "AfaJelleg", "AfaFokSzam" AS "AfaFokSzam", "Brutto" AS "Brutto" FROM "Naplo_Penztar" WHERE "Datum" >= :KezdőDátum AND "Datum" <= :Végdátum ORDER BY "Datum" ASC
Ez is működik, feltétel szerint kiszámolja a nettót és az áfát:

Kód: Egész kijelölése

SELECT CASE WHEN "AfaJelleg" <> '' THEN "Brutto"/127*100 END AS "Netto", CASE WHEN "AfaJelleg" <> '' THEN "Brutto"/127*27 END AS "Afa", "Datum" AS "Datum", "BizSzam" AS "BizSzam", "Partner" AS "Partner", "Megjegyzes" AS "Megjegyzes", "FokSzamJelleg" AS "FokSzamJelleg", "FokSzam" AS "FokSzam", "AfaJelleg" AS "AfaJelleg", "AfaFokSzam" AS "AfaFokSzam", "Brutto" AS "Brutto" FROM "Naplo_Penztar" ORDER BY "Datum" ASC
Viszont a kettő együtt már nem hajlandó dolgozni nekem! Ahogy írtam, nem kéri be a dátum intervallumot és bead egy üres listát, amely csak a mezőneveket tartalmazza.

Valami nagyon nem stimmel.

Üdv.
boncsa
Ubuntu 10.04 LTS, OpenOffice 3.2
antiuhu
Önkéntesek
Hozzászólások: 194
Csatlakozott: 2008. február 28., csütörtök 23:44

Re: "CASE WHEN" syntax error

Hozzászólás Szerző: antiuhu »

Üdv!

Ehhez kellene egy mintafájl mert így nehéz megállapítani, hogy mi nem stimmel. De úgy gondolom a WHERE résznél nem sikerül összerakni a lekérdezést. Ott én így készíteném el:

Kód: Egész kijelölése

WHERE ("AfaJelleg" = 't' OR "AfaJelleg" = 'k') AND ("Datum" >= '2012-02-01' AND "Datum" <= '2012-06-01') ORDER BY "Datum" ASC
Egyébként olyan fura hibaüzeneteket kapok sql-re, nem lehet, hogy valami kiegészítőm hiányzik?
Szerintem próbáld ki egy másik gépen, ahol biztos minden fent van a tökéletes működéshez.

Anti
boncsa
Hozzászólások: 9
Csatlakozott: 2012. április 28., szombat 17:44

Re: "CASE WHEN" syntax error

Hozzászólás Szerző: boncsa »

Megnéztem, másik ubuntus gépen sem működik. Ráadásul most már olyan hibát is ír ha szűrőt akarok nyomni, hogy váratlan hiba lépett fel és újra megnyitáskor helyreállítást végez az openoffice. :-(
Csatoltam az adatbázist.

Üdv.
boncsa
Csatolmányok
Új adatbázis3.odb
(16.36 KiB) Letöltve 239 alkalommal.
Ubuntu 10.04 LTS, OpenOffice 3.2
boncsa
Hozzászólások: 9
Csatlakozott: 2012. április 28., szombat 17:44

Re: "CASE WHEN" syntax error

Hozzászólás Szerző: boncsa »

Megoldottam, de máshogy!

Üdv.
boncsa
Csatolmányok
1_0.odb
(21.46 KiB) Letöltve 232 alkalommal.
Ubuntu 10.04 LTS, OpenOffice 3.2
boncsa
Hozzászólások: 9
Csatlakozott: 2012. április 28., szombat 17:44

Re: "CASE WHEN" syntax error

Hozzászólás Szerző: boncsa »

Szóval: a Te egyik megoldásod szerint csináltam meg és a dátumot is bekéri így. Az "AfaKulcs"-nak adtam alapértelmezett értéket, hogy ne kelljen mindig beütnöm az űrlapon. Köszönöm a segítséget!

Ettől függetlenül szükségem lesz még a CASE WHEN használatára, így nem zárom le a témát, hátha valaki tudja.

Üdv.
boncsa
Ubuntu 10.04 LTS, OpenOffice 3.2
Válasz küldése