Hi Andrei,

Thank you for your help.  That seems to work ok now.

I wanted to try to work out what happened.  Do you know if the syntax has 
changed?  I upgraded just before I noticed the problem but deleted the old 
jar so couldn't downgrade.  I went down to the version I thought it used to 
be but still got the same thing.

Many thanks and best regards,

Jim

On Saturday, February 11, 2023 at 10:26:07 PM UTC Andrei Tokar wrote:

> Your test will pass if last view will be defined as (please note placement 
> of join conditions):
> CREATE VIEW VW_INVOICESUMMARY AS
> SELECT IL.INV_ID,
>                ROUND(SUM(IL.QUANTITY * IL.RATE), 2) AS NETTOT,
>                ROUND(SUM(IL.VATVAL), 2) AS VATTOT,
>                ROUND(SUM(IL.QUANTITY * IL.RATE) + SUM(IL.VATVAL), 2) AS 
> GROSSTOT,
>                B.DESC AS DESC,
>                B.YEARREL AS RELEVANT_YEAR,
>                B.RAISED AS RAISED,
>                B.DUE AS DUE,
>                B.JURISID AS JURISID,
>                C.ID AS ACTID,
>                C.NAME AS ACTNAME,
>                D.ID AS ORGID,
>                D.NAME AS ORGNAME
> FROM VW_INVOICELINES IL
> INNER JOIN TB_INVOICE B ON IL.INV_ID = B.ID
> INNER JOIN TB_ACTIVITY C ON B.ACTID = C.ID
> INNER JOIN TB_ORG D ON C.ORGID = D.ID
> GROUP BY IL.INV_ID
>
>
> On Wednesday, February 8, 2023 at 6:08:20 AM UTC-5 Jim Foster wrote:
>
>> Hi, 
>>
>> My financial database has stopped working and I don't have any idea why.  
>> When creating a view, I get a syntax error saying a column can't be found 
>> even though I can see it there.  It worked fine last time I ran it and 
>> after a lot of playing round I can't get it working again.
>>
>> I hacked out the code into a test class, which also fails.  The code is:
>> public class DBTst
>> {
>>
>>   public static void main(String[] args) throws SQLException
>>   {
>>     //JdbcConnectionPool cp = 
>> JdbcConnectionPool.create("jdbc:h2:mem:db1", "sa", "");
>>     
>>     // Set up the database.
>>     try (Connection cn = DriverManager.getConnection("jdbc:h2:mem:db1", 
>> "sa", ""))
>>     {
>>       // Make sure not autocommit.
>>       cn.setAutoCommit(false);
>>
>>       // Create DB structure.
>>       //
>>       // Create the tables.
>>       try (Statement st = cn.createStatement())
>>       {
>>         // Organisations table.
>>         st.execute("CREATE TABLE TB_ORG ( ID IDENTITY, NAME VARCHAR NOT 
>> NULL, ABBREV VARCHAR NOT NULL, TYPE INTEGER NOT NULL)");
>>
>>         // Activity table.
>>         st.execute("CREATE TABLE TB_ACTIVITY ( ID IDENTITY (35), NAME 
>> VARCHAR NOT NULL, CUSTREF VARCHAR NOT NULL, ORGID INTEGER NOT NULL, FOREIGN 
>> KEY (ORGID) REFERENCES TB_ORG(ID))");
>>
>>         // Invoice table.
>>         st.execute("CREATE TABLE TB_INVOICE (ID IDENTITY(114), DESC 
>> VARCHAR NOT NULL, YEARREL INTEGER NOT NULL, RAISED DATE NOT NULL, DUE DATE 
>> NOT NULL, JURISID INTEGER NOT NULL, ACTID INTEGER NOT NULL, FOREIGN KEY 
>> (ACTID) REFERENCES TB_ACTIVITY(ID) )");
>>
>>         // Event line table.
>>         st.execute("CREATE TABLE TB_EVENTLINE(ID IDENTITY, DESC VARCHAR 
>> NOT NULL, QUANTITY NUMERIC(100,2) NOT NULL, RATE NUMERIC(100,2) NOT NULL, 
>> VATVAL NUMERIC(100,2))");
>>
>>         // Invoice line table.
>>         st.execute("CREATE TABLE TB_INVOICETRANSACTIONLINE (INVID INTEGER 
>> NOT NULL, EVLID INTEGER NOT NULL, FOREIGN KEY (INVID) REFERENCES 
>> TB_INVOICE(ID), FOREIGN KEY (EVLID) REFERENCES TB_EVENTLINE(ID))");
>>
>>         
>>         //setupQueries
>>         //VIEWS
>>         
>>         //Invoice lines
>>         st.execute("CREATE VIEW VW_INVOICELINES AS SELECT A.INVID AS 
>> INV_ID, A.EVLID AS EVLID, B.DESC AS DESC, B.QUANTITY AS QUANTITY, B.RATE AS 
>> RATE, ROUND(B.QUANTITY * B.RATE, 2) AS NETTOT, B.VATVAL AS VATVAL, FROM 
>> TB_INVOICETRANSACTIONLINE A INNER JOIN TB_EVENTLINE B ON A.EVLID = B.ID
>> ");
>>         
>>         System.out.println("Invoice lines view:");
>>         ResultSet executeQuery = st.executeQuery("SELECT * FROM 
>> VW_INVOICELINES ");
>>         printResults(executeQuery);
>>
>>         System.out.println("Invoice table:");
>>         executeQuery = st.executeQuery("SELECT * FROM TB_INVOICE ");
>>         printResults(executeQuery);
>>         
>>         System.out.println("Activity table:");
>>         executeQuery = st.executeQuery("SELECT * FROM TB_ACTIVITY ");
>>         printResults(executeQuery);
>>
>>         System.out.println("Organisations table:");
>>         executeQuery = st.executeQuery("SELECT * FROM TB_ORG ");
>>         printResults(executeQuery);
>>
>>         //Invoice summary
>>         System.out.println("Invoice summary view:");
>>         st.execute("CREATE VIEW VW_INVOICESUMMARY AS SELECT IL.INV_ID, 
>> ROUND(SUM(IL.QUANTITY * IL.RATE), 2) AS NETTOT, ROUND(SUM(IL.VATVAL), 2) AS 
>> VATTOT, ROUND(SUM(IL.QUANTITY * IL.RATE) + SUM(IL.VATVAL), 2) AS GROSSTOT, 
>> B.DESC AS DESC, B.YEARREL AS RELEVANT_YEAR, B.RAISED AS RAISED, B.DUE AS 
>> DUE, B.JURISID AS JURISID, C.ID AS ACTID, C.NAME AS ACTNAME, D.ID AS 
>> ORGID, D.NAME AS ORGNAME FROM VW_INVOICELINES IL INNER JOIN TB_INVOICE B 
>> INNER JOIN TB_ACTIVITY C INNER JOIN TB_ORG D ON IL.INV_ID = B.ID AND 
>> B.ACTID = C.ID AND C.ORGID = D.ID GROUP BY IL.INV_ID");
>>
>>         // Commit.
>>         cn.commit();
>>       }
>>
>>     }
>>   }
>>   
>>   public static void printResults(ResultSet rs) throws SQLException
>>   {
>>     StringBuilder sb = new StringBuilder();
>>     
>>     // Top line - the column names.
>>     for(int i = 0; i < rs.getMetaData().getColumnCount(); i++)
>>     {
>>       if (i > 0) sb.append('\t');
>>       sb.append(rs.getMetaData().getColumnName(i + 1));
>>     }
>>     
>>     //Output.
>>     System.out.println(sb.toString());
>>     
>>     //Clear buffer.
>>     sb.setLength(0);
>>     
>>     //Lines.
>>     while(rs.next())
>>     {
>>       for(int i = 0; i < rs.getMetaData().getColumnCount(); i++)
>>       {
>>         if (i > 0) sb.append('\t');
>>         sb.append(rs.getObject(i + 1));
>>       }
>>
>>       //Output.
>>       System.out.println(sb.toString());
>>       
>>       //Clear buffer.
>>       sb.setLength(0);
>>     }
>>   }
>>
>> }
>>
>> The output is:
>> Invoice lines view:
>> INV_ID    EVLID    DESC    QUANTITY    RATE    NETTOT    VATVAL
>> Invoice table:
>> ID    DESC    YEARREL    RAISED    DUE    JURISID    ACTID
>> Activity table:
>> ID    NAME    CUSTREF    ORGID
>> Organisations table:
>> ID    NAME    ABBREV    TYPE
>> Invoice summary view:
>> Exception in thread "main" org.h2.jdbc.JdbcSQLSyntaxErrorException: 
>> Column "IL.INV_ID" not found; SQL statement:
>> CREATE VIEW VW_INVOICESUMMARY AS SELECT IL.INV_ID, ROUND(SUM(IL.QUANTITY 
>> * IL.RATE), 2) AS NETTOT, ROUND(SUM(IL.VATVAL), 2) AS VATTOT, 
>> ROUND(SUM(IL.QUANTITY * IL.RATE) + SUM(IL.VATVAL), 2) AS GROSSTOT, B.DESC 
>> AS DESC, B.YEARREL AS RELEVANT_YEAR, B.RAISED AS RAISED, B.DUE AS DUE, 
>> B.JURISID AS JURISID, C.ID AS ACTID, C.NAME AS ACTNAME, D.ID AS ORGID, 
>> D.NAME AS ORGNAME FROM VW_INVOICELINES IL INNER JOIN TB_INVOICE B INNER 
>> JOIN TB_ACTIVITY C INNER JOIN TB_ORG D ON IL.INV_ID = B.ID AND B.ACTID = 
>> C.ID AND C.ORGID = D.ID GROUP BY IL.INV_ID [42122-214]
>>
>> I've really got no idea what's happening.  Any help would be appreciated.
>>
>> Regards,
>>
>> Jim
>>
>>

-- 
You received this message because you are subscribed to the Google Groups "H2 
Database" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/h2-database/88044a42-10f8-4cd2-bf94-421144bab4d7n%40googlegroups.com.

Reply via email to