0

INVOICELINE にオブジェクト起動ポイントを持つスクリプトがあります。mbo の場合、現在の MBO と同じ PONUM を持つすべての INVOICELINES を取得したい (現在の mbo の請求書以外にある可能性があるため)

スクリプトでは、次のようなPOを見つけます:(ステータスをテストするため)

from psdi.server import MXServer
from psdi.mbo import Mbo
from psdi.mbo import MboConstants
from psdi.security import UserInfo
from psdi.server import MXServer

myMXServer = MXServer.getMXServer()
userInfo = mbo.getThisMboSet().getUserInfo()

# find the PO
poSet = myMXServer.getMboSet("PO", userInfo)
poSetWhere = "ponum='" + mbo.getString("PONUM") + "' and siteid='" + mbo.getString("POSITEID") + "' and status not in " + poNoUpdate
poSet.setWhere(poSetWhere)

poMbo = poSet.getMbo(0)

これはうまく機能します。

その後、invoicelines のセットに対してまったく同じことを行います。

ilSet = myMXServer.getMboSet("INVOICELINE", userInfo)
ilSetWhere = "ponum='" + mbo.getString("PONUM") + "' and positeid='" + mbo.getString("POSITEID") + "'"
ilSet.setWhere(ilSetWhere)
ilMbo = ilSet.moveFirst()

while ilMbo is not None:
    ...

setWhere 行でエラーが発生します。不思議なことに、ロギング (読みやすくするために削除しました) は、(予想どおり) getMboSet の後のすべての送り状レコードが ilSet に含まれていることを示しています。ilSetWhere には、SQL Developer でコピーして貼り付けることができる有効なクエリがあります。

Maximo は、この setWhere を実行する前にインデックスなどを必要としますか?

2 つの setWhere 文字列のログ結果を次に示します。

ponum='4140006682' and siteid='mysite' and status not in ('CLOSED','CAN','GESLTN','ANN')

ponum='4140006682' and positeid='mysite'

私が得るエラーは、一般的な BMXAA7837E java.lang.NullPointerException のスクリプトの行です... (この行は、ilSet.setWhere(ilSetWhere) 式の行を参照しています。これを修正する方法がわかりません。それを回避する方法の手がかり。

4

1 に答える 1

2

エラーが発生しました。

Maximo は、INVOICELINE セットに「所有者」があることを効果的に主張しますが、これはコード例では設定していません。所有者を親セットと考えてください。具体的には、現在のセットを取得するために使用される MBOSet です。実際には現在のセットに関連付ける必要はありませんが、ほとんどの場合は関連付けられます (そのようにセットを取得するのが最も理にかなっています)。セットがフェッチされた後に所有者をセットに注入できますが (それを変更したり、Maximo を騙したりするために)、これが適切なコードになることはめったにありません。

独自のトランザクションでサーバーから新しいセット (他のタイや可能なデータ キャッシュなし) を取得する代わりに、現在の MBO からインボイスライン セットを取得するのが最善の方法かもしれません。あなたの正確なユースケースはわかりませんが、一般的には、新しいセットを取得する代わりに、このようなことをしたいと考えています。少なくとも、新しいセットに「所有者」が与えられます。SQL をハードコーディングするのではなく、「関係」にしたい場合もあります。

ilSetWhere = "ponum='" + mbo.getString("PONUM") + "' and positeid='" + mbo.getString("POSITEID") + "'"
ilSet = mbo.getMboSet("$TempInvoiceLineRelationship", "INVOICELINE", ilSetWhere)
ilMbo = ilSet.moveFirst()

このコードは記憶から探すので、正確かどうかはわかりません。その形式の「getMboSet」は、3 つのパラメーターを取ります。1 つ目は関係名です。この開始オブジェクトから関係名がすでに「登録済み」であることが Maximo によって検出された場合、Maximo は次の 2 つのパラメーターを無視し、その関係を使用してそのセットを取得します。その関係が「登録済み」であることが見つからない場合は、このコードのスコープに登録します (必要に応じて、後でこのコードで再利用できます)。2 番目のパラメーターは、一時的な関係を作成する宛先オブジェクトを定義します。3 番目のパラメーターは、この一時的な関係の「where 句」を定義します。


元の回答:

あなたが得ているエラーは何ですか?

また、「myMXServer.getMboSet...」行の後に「ilSet」を記録するとおっしゃっていますか?これにより、Maximo はクエリを実行し、その時点でオブジェクトをセットにロードします (必要になるまでクエリの実行を待機します)。その結果、セットを「reset()」するまで、where 句の変更の影響は見られません。

于 2014-12-11T13:15:06.100 に答える