Work at SourceForge, help us to make it a better place! We have an immediate need for a Support Technician in our San Francisco or Denver office.

Close

JasperReportsによるPOの出力でエラー

cozy
2010-10-07
2013-03-07
  • cozy
    cozy
    2010-10-07

    金森です。

    いつもクレクレですいません。こないだの勉強会にて教えていただいたJasperReportsによるPOの出力が
    どうしてもできません。ご教授ください。

    なお手順としては、

    1.c:\adempiere\reportsを作り、そこに久保田さんから頂いた以下のファイルを保存。
     ・poSubrepBP.jasper,poSubrepBP.jrxml,poSubrepLine.jasper
      poSubrepLine.jrxml,purchaseOrder.bak,purchaseOrder.jasper,purchaseOrder.jrxml

    2.「レポートとプロセス」ウィンドで、以下の新規コード作成
     ・名前および検索キー:JasperPO
     ・データ・アクセスレベル:クライアント組織
     ・クラス名:org.compiere.report.ReportStarter
     ・JasperReport:purchaseOrder.jrxml

    3.iText-5.0.4.jarをダウンロード、環境変数CLASSPATHに追加

    4."GardenWorld Admin"でログインして、過去の発注を参照して"Print preview"

    5.プレビューウィンドにて、「レポートをカスタマイズ」ボタンを押し、「印刷フォーマット」ウィンドにて
     "Jasper Process"フィールドに"JasperPO"を設定

    すると以下のようなエラーが発生します。
    2010-10-07 14:11:43.883 SEVERE ReportStarter.startProcess ReportStarter.startProcess: Can not run report - Error executing SQL statement for : purchaseOrder

    ご教授ください。お願いします。m(__)m

     
  • kubotti
    kubotti
    2010-10-07

    久保田です。

    このエラーは、purchaseOrder.jrxmlに書かれているSQL文が間違っていると出るエラーのようです。

    ・iReportのプレビューではレポートが出力されますか?
    ・使っているDBは、PostgreSQLでしょうか?

    メールで送ったpurchaseOrder.jrxmlをPostgreSQL用に書いたか、OracleXE用に書いたかは忘れてしまったのですが、
    どちらか専用で、別の方で実行するとうまく動かないと思います。(レポート内のカラム名の大文字小文字が違っていた記憶があります)

    テーブル名の前につけている"adempiere."は、PostgreSQLのデータベース名なので、
    使っているデータベース名が違うとエラーになります。(これはiReportのプレビューでもエラーになります)

    エラーメッセージがAdempiere Javaクライアントの出力と微妙に違うのですが、
    WebUIから実行していますか?

     
  • cozy
    cozy
    2010-10-08

    クレクレでお馴染みの金森です(^^;)

    >・iReportのプレビューではレポートが出力されますか?
    ⇒"purchaseOrder.jrxml"でプレビューすると"Error executing SQL statement for : purchaseOrder"というエラーが起こります

    >・使っているDBは、PostgreSQLでしょうか?
    ⇒はい。バージョンは8.2です。

    >テーブル名の前につけている"adempiere."は、PostgreSQLのデータベース名なので、
    >使っているデータベース名が違うとエラーになります。(これはiReportのプレビューでもエラーになります)
    ⇒DB名は"adempiere"なので、問題ないと思います。

    >エラーメッセージがAdempiere Javaクライアントの出力と微妙に違うのですが、 WebUIから実行していますか?
    ⇒いいえ。Swingクライアントを利用しています。

     
  • kubotti
    kubotti
    2010-10-08

    久保田です。

    iReportのプレビューでエラーになるなら、
    「Report query」というウィンドウでエラーの内容を見れると思います。

    purchaseOrder.jrxmlタブ内にある、"データベースのようなマークに矢印"のアイコンを押すと表示されるウィンドウです。
    「Report query」の真ん中あたりにある、「Read Fields」というボタンを押すと、
    エラーの詳細が表示されます。

     
  • cozy
    cozy
    2010-10-22

    金森です。

    返答遅くなってすいません。

    メールで送られてきたものはOracleXEぽいです。
    なので、NVL関数⇒COALESCE関数に変換しました。

    すると、フィールド値が"大文字"⇒"小文字"になり(iReportのなぞ仕様(たぶんバグ))、帳票レイアウトのフィールドとの
    リンクが取れなくなるので、どちらか一方を大文字か小文字に変換しました。
    (サブリポートも全部同様のことをする)

    あと、パラメータで設定されている、Redord_id, #AD_Client_ID の両方のプロパティで"Use as a prompt"に
    チェックを入れると、iReport上でも動作しました。

     
  • cozy
    cozy
    2010-10-22

    上記補足ですが、

    >メールで送られてきたものはOracleXEぽいです。
    >なので、NVL関数⇒COALESCE関数に変換しました。
    (補足)あと、SQLで"AND rownum = 1"の条件文をコメントアウトしました。

    あとAdemで使用できるか検証するためプロセスを作って、パラメータにRedord_id, #AD_Client_IDを
    割り振って、メニューから作ったプロセスを呼び出せるようにして実行しましたが、下記エラーが発生しました。

    ReportStarter.compileReport
    "JRException; e.getMessage()= Language ""null"" not supported by this report compiler.
    Expecting ""java"" instead."

    どなたかヘルプ願います。

     
  • kubotti
    kubotti
    2010-10-24

    > ReportStarter.compileReport
    > "JRException; e.getMessage()= Language ""null"" not supported by this report compiler.
    > Expecting ""java"" instead."

    このエラーは見たことが無いのですが、
    iReportのReport Inspectorでレポート名(階層のroot)を選択して、
    「プロパティ」で「Language」をJavaにしたら直ったりしないですか?

     
  • cozy
    cozy
    2010-10-26

    上記エラーですが、AdempiereのVer3.4.3を使っていたために起こりました。
    Ver3.6.0では実行できました。

    ただパラメータの受け渡しがうまくいきません。
    "#AD_Client_ID"については文字列型で渡せばうまくいきますが、
    "RECORD_ID"についてはうまくいきません。

    jasper側では"RECORD_ID"はintger型で持っていますので、Adempiereでプロセスのパラメータを整数型で
    設定すると、

    ReportStarter.startProcess: Can not run report - Incompatible java.math.BigDecimal value assigned to parameter RECORD_ID in the purchaseOrder dataset.

    というエラーが表示されます。

    一方でjasper側では"RECORD_ID"をBigDecimal型で持たすと"ProcessError null"という
    プロセスエラーになります。

    くぼっちさんはどうやってパラメータ設定されましたか?

     
  • cozy
    cozy
    2010-10-26

    上記エラーですが、SubReportとのリンクと初期値設定でエラーが発生していました。

    要はサブリポート(poSubrepBP.jrxml, poSubrepLine.jrxml)とpurchaseOrder.jrxmlとのリンクで
    RECORD_IDが使われていますが、それを全部BigDecimal型に設定し、あと各々のレポートで
    初期値がintger型で設定されていますが、それを全部外すとうまくいきました。

    なお手順についてはwikiに掲載する予定です。

    ちなみに、今使用しているパソコンではExcelをインストールしていませんが、
    できた帳票をExcelおよびpdfにエクスポート出来ませんでした。

    Excelへのエクスポートについては、iReport上では出来ましたが、Adempiere上からは
    出来ませんでした。

    PDFについてはiReport上、Adempiere上両方でエクスポートできますが、
    両方共白紙で出力されます。

    ちなみに、OpenOffice形式では両方ともうまくいきまいた。

    くぼっちさんの環境ではExcel形式でのエクスポート、PDFでのエクスポート、
    うまくいきましたか?

     
  • kubotti
    kubotti
    2010-10-27

    久保田です。

    > くぼっちさんの環境ではExcel形式でのエクスポート、PDFでのエクスポート、
    > うまくいきましたか?

    Adempiere 3.6.0で、PDFのエクスポートはできました。
    Excel形式もエクスポートできましたが、値が出ない箇所があります。
    これは、Apache POIで出力すると要素が重なっている部分が表示されない、
    とiReportのマニュアル(有料のやつ)に書いてあったので、
    レポート自体が出力される・されないとは別の問題のようです。

    メーリングリストに.jrxmlファイルを送信しました。

    Adempiereから渡されるパラメーターについてですが、
    Eclipseのデバッグで、
    JasperReports/src/org/compiere/report/ReportStarter.java
    の554行目で止めて、paramsの値を見たら、
    {REPORT_LOCALE=ja_JP, AD_PINSTANCE_ID=1000033, RECORD_ID=1000004, CURRENT_LANG=ja_JP}
    でした。
    以前は、#AD_Client_ID も RECORD_ID も設定しなくてもレポートに渡されたはずなんですが、
    バージョンが上がって変わってしまったのかもしれません。
    あとでもう少し調べてみます。

    金森さんはアプリケーションディクショナリで、
    パラメーターの設定をしたんですか?

    > Excelへのエクスポートについては、
    > iReport上では出来ましたが、Adempiere上からは出来ませんでした。

    http://sourceforge.net/projects/adempiere
    でダウンロードできるバージョン3.6.0は、
    xls形式でエクスポートしようとしたら、エラーが出てうまく動きませんでした。
    vectorに載せているファイルは、Apache POIの.jarを新しいものに変えてビルドしています。
    http://www.vector.co.jp/soft/dl/winnt/business/se441673.html
    金森さんはどちらを使ってますか?

     
  • cozy
    cozy
    2010-10-27

    >メーリングリストに.jrxmlファイルを送信しました。
    毎度、ありがとうございます。

    >JasperReports/src/org/compiere/report/ReportStarter.java の554行目で止めて、paramsの値を見たら、 >{REPORT_LOCALE=ja_JP, AD_PINSTANCE_ID=1000033, RECORD_ID=1000004, CURRENT_LANG=ja_JP} でした。
    >以前は、#AD_Client_ID も RECORD_ID も設定しなくてもレポートに渡されたはずなんですが、バージョンが上がって
    >変わってしまったのかもしれません。
    ⇒そうなんですか。いや、下記URLとかを見るとiReportで設定したパラメータをAdemのApplication Dictionaryでパラメータ
     設定しているので、設定するものかと思いました。

    http://wtcindia.wordpress.com/2010/05/24/jasper-reports-and-adempiere-integration/

    ちなみに、AdempiereからJasperへ渡すパラメータはソースレベルで決まるんですね。
     勉強になります。

    >金森さんはアプリケーションディクショナリで、パラメーターの設定をしたんですか?
    ⇒そうです。上記URLのサイトと同じやり方でやっています。

    >vectorに載せているファイルは、Apache POIの.jarを新しいものに変えてビルドしています。
    >http://www.vector.co.jp/soft/dl/winnt/business/se441673.html 金森さんはどちらを使ってますか?
    ⇒私は本家からダウンロードして久保田さんが配布していた翻訳ファイルを当てています。
     ベクター版、ダンロードして使ってみます。

     
  • cozy
    cozy
    2010-10-29

    久保田さんに伺いたいのですが、

    1.AdempiereからJasperへ受け渡すパラメータはどうやって調べましたか?
    2.久保田さんが作成されたJasper版purchase orderのSQLはどうやって調べましたか?

     
  • cozy
    cozy
    2010-10-30

    日本版AdempiereのWikiにJasperReportでの帳票開発方法を掲載しました。
    場所は下記URLの"Ja/SummaryBook"⇒"帳票開発"です。

    http://www.adempiere.com/index.php/Ja

     
  • kubotti
    kubotti
    2010-10-30

    久保田です。

    > 1.AdempiereからJasperへ受け渡すパラメータはどうやって調べましたか?

    これは、4個上の書き込みにも書きましたが、
    Eclipseのデバッグ機能を使って、
    JasperReports/src/org/compiere/report/ReportStarter.java の
    途中とかで止めて、paramsの値を見ました。

    Adempiere Wikiのどこかにも、詳しい情報があるかもしれないですが覚えていません。
    RECORD_IDについては、
    http://www.adempiere.com/index.php/ADempiere/JasperReports_Integration_HowTo
    の7の部分ですね。

    Application Dictionaryの「レポートとプロセス」ウィンドウの
    「パラメータ」タブでパラメータを追加したら、パラメータが追加されました。
    必要なら追加できるようです。

    > 2.久保田さんが作成されたJasper版purchase orderのSQLはどうやって調べましたか?

    SQLは、Adempiereのデータベース構成をPostgresのpgAdmin3で見たり、
    Application Dictionaryを見たりして作りました。
    SQLを調べたというか、DB構造を調べてSQLを自分で作ったという感じで、
    ウィンドウ上でどういうSQLでデータを表示しているかは、レポートを作る時はあまり調べませんでした。
    本当は画面上のデータがどういうSQLで表示されているか確認した方がいいのかもしれません。

     
  • cozy
    cozy
    2010-11-01

    金森です。

    下記URLにJasper連携を記載しましたが、下記の"JasperProductList"プロセスでパラメータ入力時、
    空白ならWhere文を実行しない、とかする方法がわかる方がおられましたら、教えて下さい。
    (AdempiereというよりJapserReportの質問ですね。スイマセン)

    http://www.adempiere.com/index.php/Ja/SummaryBook/CreateReport/HowToSet

     
  • Kan-kun
    Kan-kun
    2010-11-08

    久保田さんへ。

    お世話になります。 カンです。

    すみませんが、以下のファイルを僕も頂けないでしょうか。
    poSubrepBP.jasper,poSubrepBP.jrxml,poSubrepLine.jasper
    poSubrepLine.jrxml,purchaseOrder.bak,purchaseOrder.jasper,purchaseOrder.jrxml

    お忙しいところすみませんが、お願いします。

    後、sourceforge.jpの開発者フォーラムに意見の書き込みましたのでご参考になればと思います。

     
  • Kan-kun
    Kan-kun
    2010-11-10

    久保田さん

    返信ありがとうございます。
    大変参考になりました。

    金森さん

    私が成功したパターンですが、久保田さんから頂いたファイルのpurchaseOrder.jrxml のSQLの中で「 AND o.C_ORDER_ID = $P{RECORD_ID}」部分を削除します。(iReport上の「RECORD_ID」パラメーターは削除しないで下さい)
    アプリケーションディクショナリにはパラメーターを設定する必要ありません。パラメータなしにします。
    そうするとパラメーターを指定する必要もなくうまくいきました。
    Adempiereバージョン:3.6.0_ja_rev002、iReportバージョン:3.7.5と3.7.6で確認できました。
    ですが、SQL分で一部の項目を修正する必要があると思います。(発注日付、内税の場合など)

    ちなみに購買発注でプレビューを表示する時に以下のSQL文からデータを取ります。
    (GardenAdminの購買発注番号800000の例)
    (ヘッダがなぜこんなに長いのかまだよく把握できてないですが;;)

    ヘッダのSQL:
    SELECT A.City||'.' AS AAddress,C_Order_Header_v.Org_Location_ID AS Org_Location_ID,C_Order_Header_v.BPGreeting,C_Order_Header_v.Name,C_Order_Header_v.Name2,C_Order_Header_v.BPContactGreeting,C_Order_Header_v.Title,C_Order_Header_v.ContactName,B.City||'.' AS BAddress,C_Order_Header_v.C_Location_ID AS C_Location_ID,C_Order_Header_v.DatePromised,C_Order_Header_v.BPValue,C_Order_Header_v.ReferenceNo,C_Order_Header_v.POReference,C_Order_Header_v.SalesRep_Name,C_Order_Header_v.DocumentType,C_Order_Header_v.DocumentNo,C_Order_Header_v.DateOrdered,C_Order_Header_v.Description,C_Order_Header_v.C_Order_ID,(SELECT NVL(C_Currency.ISO_Code,'') FROM C_Currency WHERE C_Order_Header_v.C_Currency_ID=C_Currency.C_Currency_ID) AS CC_Currency_ID,C_Order_Header_v.C_Currency_ID AS C_Currency_ID,C_Order_Header_v.GrandTotal,C_Order_Header_v.PaymentTerm,C_Order_Header_v.PaymentTermNote,C_Order_Header_v.DocumentTypeNote,C_Order_Header_v.C_Order_ID FROM C_Order_Header_v LEFT OUTER JOIN C_Location A ON (C_Order_Header_v.Org_Location_ID=A.C_Location_ID) LEFT OUTER JOIN C_Location B ON (C_Order_Header_v.C_Location_ID=B.C_Location_ID) WHERE (C_Order_Header_v.C_Order_ID=104) AND C_Order_Header_v.AD_Client_ID IN(0,11) AND C_Order_Header_v.AD_Org_ID IN(50007,0,50004,50005,50006,50000,50001,50002,11,12) AND A.C_Location_ID NOT IN ( SELECT Record_ID FROM AD_Private_Access WHERE AD_Table_ID = 162 AND AD_User_ID <> 101 AND IsActive = 'Y' ) AND B.C_Location_ID NOT IN ( SELECT Record_ID FROM AD_Private_Access WHERE AD_Table_ID = 162 AND AD_User_ID <> 101 AND IsActive = 'Y' ) ORDER BY C_Order_Header_v.DocumentNo

    明細のSQL:
    SELECT C_Order_LineTax_v.QtyEntered,C_Order_LineTax_v.UOMSymbol,C_Order_LineTax_v.Name,C_Order_LineTax_v.PriceEnteredList,C_Order_LineTax_v.Discount,C_Order_LineTax_v.PriceEntered,C_Order_LineTax_v.LineNetAmt,C_Order_LineTax_v.Description,C_Order_LineTax_v.DocumentNote,C_Order_LineTax_v.ResourceDescription,C_Order_LineTax_v.C_OrderLine_ID FROM C_Order_LineTax_v WHERE (C_Order_LineTax_v.C_Order_ID=104) AND C_Order_LineTax_v.AD_Client_ID IN(0,11) AND C_Order_LineTax_v.AD_Org_ID IN(50007,0,50004,50005,50006,50000,50001,50002,11,12) ORDER BY C_Order_LineTax_v.Line