2016-05-31 6 views
1

Javaで書かれたSQL文(netbeans/uncanaccess)は、データベースの1つのテーブルから少数のIIFとSUMを含むかなり単純なselect文です。同じクエリを実行しているときにJavaが異なる結果を返す

AccessでSQL文を実行すると、正しい結果が返されますが、Javaで実行しようとすると、類似した結果が返されますが、まったく同じ結果は返されません。

Javaコード

public int getActualMHDetails(String strNumber, String strYear, String strPeriod){ 
    String strSQLString = null; 
    System.out.println("Getting cost details for: " + strNumber); 
    try{ 

strSQLString = "SELECT tblExportCost.ProjDef, tblExportCost.Year,\n" 
         + "Sum(IIf([Per]=1,[Val/ObjCur],0)) AS Jan, Sum(IIf([Per]=2,[Val/ObjCur],0)) AS Feb, Sum(IIf([Per]=3,[Val/ObjCur],0)) AS Mar,\n" 
         + "Sum(IIf([Per]=4,[Val/ObjCur],0)) AS Apr, Sum(IIf([Per]=5,[Val/ObjCur],0)) AS May, Sum(IIf([Per]=6,[Val/ObjCur],0)) AS Jun,\n" 
         + "Sum(IIf([Per]=7,[Val/ObjCur],0)) AS Jul, Sum(IIf([Per]=8,[Val/ObjCur],0)) AS Aug, Sum(IIf([Per]=9,[Val/ObjCur],0)) AS Sep,\n" 
         + "Sum(IIf([Per]=10,[Val/ObjCur],0)) AS Oct, Sum(IIf([Per]=11,[Val/ObjCur],0)) AS Nov, Sum(IIf([Per]=12,[Val/ObjCur],0)) AS Dec\n" 
         + "FROM tblExportCost\n" 
         + "GROUP BY tblExportCost.ProjDef, tblExportCost.Year, tblExportCost.Year\n" 
         + "HAVING (((tblExportCost.Year)= '" + strYear + "') AND ((tblExportCost.ProjDef)= 'T3415" + strNumber + "'))"; 

//SETTING PREPARED STATEMENT 
     PreparedStatement preStatement = con.prepareStatement(strSQLString, ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 

     ResultSet rs = preStatement.executeQuery(); 

     rs.next(); 

     //IF CHECKS TO MAKE SURE RECORDS 
     if(rs.getRow()==0){ 
      rs.close();  
      preStatement.close(); 
      return 3; 
     }   

     strTest = rs.getString("Jan"); 

     System.out.println("Test Value: " + strTest); 

     intAMHCJan = rs.getInt("Jan"); 
     intAMHCFeb = rs.getInt("Feb"); 
     intAMHCMar = rs.getInt("Mar"); 
     intAMHCApr = rs.getInt("Apr"); 
     intAMHCMay = rs.getInt("May"); 
     intAMHCJun = rs.getInt("Jun"); 
     intAMHCJul = rs.getInt("Jul"); 
     intAMHCAug = rs.getInt("Aug"); 
     intAMHCSep = rs.getInt("Sep"); 
     intAMHCOct = rs.getInt("Oct"); 
     intAMHCNov = rs.getInt("Nov"); 
     intAMHCDec = rs.getInt("Dec"); 

     //CLOSES CONNECTIONS 
     System.out.println("Database query successful; closing connections"); 
     rs.close(); 
     preStatement.close();    

     return 1; 

    }catch(Exception ex){ 
     ex.printStackTrace(); 
     strEXMessage=ex.getMessage(); 
     return 2; 
    } 
} 

アクセスコード

SELECT tblExportCost.ProjDef, tblExportCost.Year, 
Sum(IIf([Per]=1,[Val/ObjCur],0)) AS Jan, Sum(IIf([Per]=2,[Val/ObjCur],0)) AS Feb, Sum(IIf([Per]=3,[Val/ObjCur],0)) AS Mar, 
Sum(IIf([Per]=4,[Val/ObjCur],0)) AS Apr, Sum(IIf([Per]=5,[Val/ObjCur],0)) AS May, Sum(IIf([Per]=6,[Val/ObjCur],0)) AS Jun, 
Sum(IIf([Per]=7,[Val/ObjCur],0)) AS Jul, Sum(IIf([Per]=8,[Val/ObjCur],0)) AS Aug, Sum(IIf([Per]=9,[Val/ObjCur],0)) AS Sep, 
Sum(IIf([Per]=10,[Val/ObjCur],0)) AS Oct, Sum(IIf([Per]=11,[Val/ObjCur],0)) AS Nov, Sum(IIf([Per]=12,[Val/ObjCur],0)) AS Dec 
FROM tblExportCost 
GROUP BY tblExportCost.ProjDef, tblExportCost.Year, tblExportCost.Year 
HAVING (((tblExportCost.Year)= 2016) AND ((tblExportCost.ProjDef)= 'T34151234')) 

私もAccessクエリを保存し、単に

strSQLString = "SELECT * FROM qryTestJava"; 

を使用しようとしましたが、これも返します同じものrect結果。

結果

SQL

ProjDef  Year Jan  Feb    Mar   Apr  May 
T34151234 2016 22358.1 18742.9 3443.33000000001 10251.03 12706.78  

のJava

ProjDef  Year Jan  Feb   Mar  Apr  May 
T34151234 2016 22,329 18,714  3,420  10,226 12,684 

私は掘るのビットを行なったし、丸めとucanaccess Hereと同様の問題を発見したが、それは伝えました以前のバージョンで修正されました。

ucanaccessの私の現在のバージョンでは、私はUCanAccess 3.0.5の下で、あなたの問題を再現することができました2.0.9.3

+0

最新のversio代わりにUCanAccess(現在3.0.5)のn? –

+0

また、 '3443.33000000001'は浮動小数点値のように見えます。 Accessを使用してデザインビューで[tblExportCost]を開き、[Val]と[ObjCur]の列の種類を確認できますか? (Single?Double?Currency?...?) –

+0

HAVINGをWHERE句で置き換える必要がありますか? HAVINGはほとんどの場合、関数を制限するために使用しますが、SQLは一部のフィールドを制限しようとします。また、同じフィールドで2回グループ化する必要もありません。 – LukStorms

答えて

3

です。 IIf()は数値リテラル値として0.0で呼び出されたときに全体double値が正しく、すなわち、

SELECT IIf([Per]=1,[Val/ObjCur],0.0) AS ... 
戻される IIf()機能が

SELECT IIf([Per]=1,[Val/ObjCur],0) AS ... 

として呼び出されたとき、その整数値にdouble型の値を切り捨てるように見えます

これを使用して正しいSUMを取得できるはずです

strSQLString = "SELECT tblExportCost.ProjDef, tblExportCost.Year,\n" 
         + "Sum(IIf([Per]=1,[Val/ObjCur],0.0)) AS Jan, Sum(IIf([Per]=2,[Val/ObjCur],0.0)) AS Feb, Sum(IIf([Per]=3,[Val/ObjCur],0.0)) AS Mar,\n" 
         + "Sum(IIf([Per]=4,[Val/ObjCur],0.0)) AS Apr, Sum(IIf([Per]=5,[Val/ObjCur],0.0)) AS May, Sum(IIf([Per]=6,[Val/ObjCur],0.0)) AS Jun,\n" 
         + "Sum(IIf([Per]=7,[Val/ObjCur],0.0)) AS Jul, Sum(IIf([Per]=8,[Val/ObjCur],0.0)) AS Aug, Sum(IIf([Per]=9,[Val/ObjCur],0.0)) AS Sep,\n" 
         + "Sum(IIf([Per]=10,[Val/ObjCur],0.0)) AS Oct, Sum(IIf([Per]=11,[Val/ObjCur],0.0)) AS Nov, Sum(IIf([Per]=12,[Val/ObjCur],0.0)) AS Dec\n" 
         + "FROM tblExportCost\n" 
         + "GROUP BY tblExportCost.ProjDef, tblExportCost.Year\n" 
         + "HAVING (((tblExportCost.Year)= '" + strYear + "') AND ((tblExportCost.ProjDef)= 'T3415" + strNumber + "'))"; 
+1

は完璧に動作します。あなたの答えと明確な説明のためにいつものようにGordに多くの感謝を! – ppw

関連する問題