Příčiny chyb v sestavách po migraci na ASA 9

Top  Previous  Next

Seznam témat:

řešení

 

Řešení

Při testech s ASA9 se můžete obecně setkat asi s dvěmi nejčastějšími problémy se syntaxí SQL jazyka (ASA9 je obecně o něco striktnější na správnost SQL příkazů). Ty nejčastější chyby v uživatelských sestavách a SQL příkazech jsou tyto:

illegal reference to correlation name

příklad chybné a správné syntaxe (tedy návod na opravu) takovéhoto SQL dotazu:

SELECT ... FROM t1, t2 LEFT OUTER JOIN t3 ON t1.x=t3.x

Aby ho zbaštil, tak ho stačí upravit takto:

SELECT ... FROM t2, t1 LEFT OUTER JOIN t3 ON t1.x=t3.x

 

Aggregated expression contains multiple columns of which one or more are outer references

uvnitř vnořeného selectu se v agregačních funkcích nesmí objevovat položky z hlavního selectu:

SELECT t1.field1, t1.field2, (select MAX(t2.fieldX-t1.fieldY) from table2 as t2) as field3 FROM table1 as t1

 

Řešení je asi takovéto:

SELECT t1.field1, t1.field2, MAX(t2.fieldX-t1.fieldY) as field3 FROM table1 as t1, table2 as t2 GROUP BY t1.field1, t1.field2

 

Nebo pokud to musí být podselectem tak takto:

SELECT t1.field1, t1.field2, (select MAX(t2.fieldX-t3.fieldY) from table2 as t2, table1 as t3 WHERE t2.keyX=t3.keyX) as field3 FROM table1 as t1

 

V přiložené sestavě "faktury EU standard" je chyba v datovém zdroji "VFpolozky", kde se vyskytuje za prvním UNIONem

SELECT 1 as typ_polozky, i.obd, i.age, i.rada, i.dokl, null, null, .................

FROM DBA.udokit as i, DBA.ukonta as k,

     DBA.uosn as s  LEFT OUTER JOIN DBA.udokhdpzal as z ON i.obd=z.obd AND i.age = z.age AND i.rada = z.rada AND i.dokl = z.dokl AND i.vsym=z.zvsym AND i.vsym2=z.zvsym2

 

toto je potřeba upravit relativně jednoduše a elegantně (prohozením pořadí tabulek v klauzuli FROM tak, aby spojení LEFT OUTER JOIN bylo přímo mezi spojovanými tabulkami):

SELECT 1 as typ_polozky, i.obd, i.age, i.rada, i.dokl, null, null, .................

FROM DBA.ukonta as k, DBA.uosn as s, DBA.udokit as i LEFT OUTER JOIN DBA.udokhdpzal as z ON i.obd=z.obd AND i.age = z.age AND i.rada = z.rada AND i.dokl = z.dokl AND i.vsym=z.zvsym AND i.vsym2=z.zvsym2

 

Doufám, že jsme vyřešili jak aktuální problém, tak jsme pomohli v analýze a řešení i dalších obecných problémů spojených s přechodem na ASA9.

 

Související témata

Postup migrace db ASA 7 - ASA 9