Autor Téma: View - nemôže obsahovať výraz *1E0  (Přečteno 369 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2872
  • Karma: 27
    • Verze Delphi: XE7 professional
View - nemôže obsahovať výraz *1E0
« kdy: 04-06-2017, 22:29:28 »
V SELECT-e to zbehne a po vytvorení view to padne na chybu v zozname výstupných polí. V praxi to priamo nepotrebujem, ale pri experimentovaní/hľadaní chyby to so mnou poriadne zacvičilo.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1290
  • Karma: 28
    • Pepak.net
Re:View - nemôže obsahovať výraz *1E0
« Odpověď #1 kdy: 05-06-2017, 07:49:25 »
Uveď celý SELECT a celou definici VIEW. Podle mě zjistíš, že máš ve VIEW jiný počet polí než kolik vrací SELECT.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2872
  • Karma: 27
    • Verze Delphi: XE7 professional
Re:View - nemôže obsahovať výraz *1E0
« Odpověď #2 kdy: 05-06-2017, 08:09:29 »

Citace
Uveď celý SELECT a celou definici VIEW. Podle mě zjistíš, že máš ve VIEW jiný počet polí než kolik vrací SELECT.
To som si niekoľkokrát s nervami preveril :)  Doslova stačilo vyhodiť všetky výskyty daného člen a išlo to. Na ukážku jedno počítané pole:
Kód: [Vybrat]
SUM(INVOICEINCOMINGITEMS.NUMBER) * SERVICEPARAMETERS.PERCENT1*1E0 / 100 NUMBER1,Mňa zarážala už skutočnosť, že keď som so SELECT-u dal v EMS SQL Manger-i generovať pohľad, tak vytvoril telo pohľadu a vždy vyhodil chybu. A stále na nej trval. Aj keď som pohľad vytváral ručne.
Preto neviem či je chyba v manažéri, alebo je to vlastnosť FB.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1290
  • Karma: 28
    • Pepak.net
Re:View - nemôže obsahovať výraz *1E0
« Odpověď #3 kdy: 05-06-2017, 08:25:04 »
Pro začátek by bylo nejjednodušší se toho 1e0 úplně zbavit, protože to je jen jinak vyjádřená jednička a násobení jedničkou je mnohdy zbytečné.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1290
  • Karma: 28
    • Pepak.net
Re:View - nemôže obsahovať výraz *1E0
« Odpověď #4 kdy: 05-06-2017, 08:25:56 »
A dál máš blbě tu sumu, už jsem tě na to upozorňoval ve vedlejším vlákně.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1290
  • Karma: 28
    • Pepak.net
Re:View - nemôže obsahovať výraz *1E0
« Odpověď #5 kdy: 05-06-2017, 08:29:44 »
Každopádně mě následující dotaz v pohodě funguje i v pohledu:
Kód: SQL [Vybrat]
  1. CREATE VIEW xxx (cislo)
  2. AS
  3. SELECT SUM(nejake_pole)*1e0/100
  4. FROM nejaka_tabulka
  5. GROUP BY jine_pole
Takže pokud budeš mít problémy i poté, co předěláš tu sumu, tak napiš celý SELECT a celou definici VIEW, jak jsem tě výše žádal. Bez toho není možný jiný závěr, než že jsi to napsal blbě.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2872
  • Karma: 27
    • Verze Delphi: XE7 professional
Re:View - nemôže obsahovať výraz *1E0
« Odpověď #6 kdy: 05-06-2017, 09:01:18 »

Citace
A dál máš blbě tu sumu, už jsem tě na to upozorňoval ve vedlejším vlákně.
Ja tam nič zlé nevidím. Nechytám sa :(
Takže dávam minimum:
Kód: [Vybrat]
SELECT SUM(INVOICEINCOMINGITEMS.NUMBER) * SERVICEPARAMETERS.PERCENT1 * 1E0/ 100 AS NUMBER1
FROM
  INVOICEINCOMINGITEMS
  RIGHT OUTER JOIN SERVICEPARAMETERS ON (INVOICEINCOMINGITEMS.FKSERVICEPARAMETERS = SERVICEPARAMETERS.IDSERVICEPARAMETERS)
  INNER JOIN SERVICES ON (SERVICEPARAMETERS.FKSERVICES = SERVICES.IDSERVICES)
WHERE
  SERVICES.FKFOCS = 1776 AND SERVICEPARAMETERS.PERIOD = 2016 AND SERVICEPARAMETERS.FKCATEGORY = 2 AND
  INVOICEINCOMINGITEMS.ISCOST = 1 AND INVOICEINCOMINGITEMS.DATEFROM BETWEEN '1.1.2016' AND '31.12.2016'
GROUP BY SERVICEPARAMETERS.PERCENT1
Zbehne bez problémov. Tak to mám aj v Delphi a nie je problém. Vygenerovaný pohľad
Kód: [Vybrat]
CREATE VIEW NEW_VIEW (
    NUMBER1)
AS
SELECT
  SUM(INVOICEINCOMINGITEMS.NUMBER) * SERVICEPARAMETERS.PERCENT1 * 1E0/ 100 AS NUMBER1
FROM
  INVOICEINCOMINGITEMS
  RIGHT OUTER JOIN SERVICEPARAMETERS ON (INVOICEINCOMINGITEMS.FKSERVICEPARAMETERS =
    SERVICEPARAMETERS.IDSERVICEPARAMETERS)
  INNER JOIN SERVICES ON (SERVICEPARAMETERS.FKSERVICES = SERVICES.IDSERVICES)
WHERE
  SERVICES.FKFOCS = 1776 AND SERVICEPARAMETERS.PERIOD = 2016 AND SERVICEPARAMETERS.FKCATEGORY = 2 AND
  INVOICEINCOMINGITEMS.ISCOST = 1 AND INVOICEINCOMINGITEMS.DATEFROM BETWEEN '1.1.2016' AND '31.12.2016'
GROUP BY SERVICEPARAMETERS.PERCENT1;
a chyba
Kód: [Vybrat]
There is an error in entry field "View body"Ako som písal, bez toho *1E0 to ide. Mám to kvôli tomu, že v prípade ak súčin súčtu a poľa bude menší ako 100, tak výsledok dostanem nulu.
Viď 10/3 = 0, ale 10*1E0/3 = 0,3...
« Poslední změna: 05-06-2017, 09:03:45 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1290
  • Karma: 28
    • Pepak.net
Re:View - nemôže obsahovať výraz *1E0
« Odpověď #7 kdy: 05-06-2017, 09:14:54 »

Citace
A dál máš blbě tu sumu, už jsem tě na to upozorňoval ve vedlejším vlákně.
Ja tam nič zlé nevidím. Nechytám sa :(
Mimo SUM() mohou být pouze konstanty. SERVICEPARAMETERS.PERCENT1 není konstanta.

Citace
Takže dávam minimum:
Kód: [Vybrat]
SELECT SUM(INVOICEINCOMINGITEMS.NUMBER) * SERVICEPARAMETERS.PERCENT1 * 1E0/ 100 AS NUMBER1
FROM
  INVOICEINCOMINGITEMS
  RIGHT OUTER JOIN SERVICEPARAMETERS ON (INVOICEINCOMINGITEMS.FKSERVICEPARAMETERS = SERVICEPARAMETERS.IDSERVICEPARAMETERS)
1) Proč RIGHT OUTER JOIN?
2) A zde je důkaz mého tvrzení výše: Ke každému záznamu z INVOICEINCOMINGITEMS bude použit jiný záznam z SERVICEPARAMETERS.

Citace
Zbehne bez problémov. Vygenerovaný pohľad [...]
a chyba
Kód: [Vybrat]
There is an error in entry field "View body"

To na mě dělá dojem, že zápis toho pohledu probíhá nějak blbě. Taková chyba by normálně vůbec vzniknout neměla. A když si vezmu tvoje SQL a předělám to na svoje tabulky, tak ji taky nedostanu, VIEW mi normálně funguje. Jak přesně dostaneš ten VIEW do databáze? Zkus si ho založit z ISQL.EXE.

Citace
Ako som písal, bez toho *1E0 to ide. Mám to kvôli tomu, že v prípade ak súčin súčtu a poľa bude menší ako 100, tak výsledok dostanem null.
Viď 10/3 = 0, ale 10*1E0/3 = 0,3...
To jako vážně?
Kód: SQL [Vybrat]
  1. SELECT 10/3 FROM rdb$database
  2. -- výsledek = 3
Každopádně takhle bych to nedělal, funkčnost ti závisí na tom, v jakém pořadí ti proběhnou konverze - a to se může mezi verzemi databáze měnit. Když už chceš dvě čísla dělit jako desetinná čísla, tak si tu konverzi udělej explicitně:
Kód: SQL [Vybrat]
  1. SELECT CAST(10 AS DOUBLE PRECISION)/3 FROM rdb$database
  2. -- výsledek = 3.333...
« Poslední změna: 05-06-2017, 09:16:28 od pepak »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2872
  • Karma: 27
    • Verze Delphi: XE7 professional
Re:View - nemôže obsahovať výraz *1E0
« Odpověď #8 kdy: 05-06-2017, 09:25:31 »
Vďaka za vysvetlenie. Tú fintu s *1E0 a jej vysvetlenie a delenie v SQL som našiel na internete. Na to pretypovanie som nenarazil.
Citace
Mimo SUM() mohou být pouze konstanty. SERVICEPARAMETERS.PERCENT1 není konstanta.

Ako to tam dostanem ako konštatnu? Cez SubSelect?. Bude sa potom to pole brať ako konštanta?
Jedna možnosť je hodiť do v Delphi do cyklu a použiť parameter. To sa mi dvakrát nepozdáva.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2872
  • Karma: 27
    • Verze Delphi: XE7 professional
Re:View - nemôže obsahovať výraz *1E0
« Odpověď #9 kdy: 05-06-2017, 09:56:52 »
Podľa mňa by malo fungovať a generovať správne výsledky:
Kód: [Vybrat]
CAST(SUM(INVOICEINCOMINGITEMS.NUMBER * SERVICEPARAMETERS.PERCENT1) AS DOUBLE PRECISION)/100
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1290
  • Karma: 28
    • Pepak.net
Re:View - nemôže obsahovať výraz *1E0
« Odpověď #10 kdy: 05-06-2017, 14:35:20 »
Podle mě taky.

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Křestní jméno zpěváka Gotta: