生産スケジューラのAsprova
 
よくあるご質問

COM

よくある質問内を検索:

COM I/FでAsprovaのメッセージを取得することができますか? (2010/04/07)

Q:COM I/FでAsprovaのメッセージを取得して、ファイルに出力したいのですが、どのようにして取得すれば良いでしょうか?

A:

COM I/Fでメッセージを取得する場合、ASOMessageインターフェイスを利用します。

メッセージはプロジェクトの子オブジェクトとなり、以下のようにして取得することができます。

Dim pRootMsg As ASOMessage
Set pRootMsg = pProj.RootMessage
(pProjはASBProjectインターフェイスです。事前に取得しておく必要があります。)

実際のメッセージはRootMessageの子オブジェクトとなりますので、以下のように、ChildAsMessageメソッドを利用して、参照します。

If Not pRootMsg Is Nothing Then
Dim strMsg As String
Dim i As Long
Dim msgCount As Long
msgCount = pRootMsg.ChildCount
Dim pMsg As ASOMessage
For i = 1 To msgCount
Set pMsg = pRootMsg.ChildAsMessage(i)
       ( ここでメッセージの情報を取得します )
Next i
End If

ASOMessageインターフェイスの主なプロパティは以下のとおりです。
 MsgSeverity : メッセージのレベル(情報/警告/エラー)
 MsgString : メッセージの内容
 MsgRelatedObject : 関連しているオブジェクト

資源評価など、メッセージによって、下の階層に詳細メッセージを保持することもあります。この場合は以下のプロパティを参照して、取得することができます。
 ChildAsMessage : 下の階層のオブジェクト

上記のインターフェイスを介して、メッセージ内容を取得し、ファイルに出力するコードを記述していただきますと、たとえば、テキストファイルなどにメッセージ内容を出力することができます。

COM I/Fで外部フィールドを参照できるでしょうか? (2010/03/26)

Q:COM I/Fで外部フィールドを参照できるでしょうか?

A:

ASIDBIOインターフェイスのExternalFieldsプロパティで参照することができます。

接続文字列や外部テーブルを変更した場合は、UpdateExternalFieldsメソッドを呼び出して、外部フィールドを更新する必要があります。

COM I/Fを利用してフィールドマッピングを更新するにはどのようにすれば良いでしょうか? (2010/03/26)

Q:COM I/Fを利用してフィールドマッピングを更新するにはどのようにすれば良いでしょうか?

A:

ASIDBIOインターフェイスのMapFieldメソッドを利用して更新します。
第一引数にはマッピングするAsprova内部のプロパティ(ASOPropertyDefインターフェイス)を、
第二引数にはマッピングするインデックスを指定します。

MapFieldメソッドが実行されますと、呼び出されたDBIOに対して、インデックスで指定された外部フィールドとAsprova内部のプロパティがマッピングされます。

フィールドマッピングは外部フィールドの先頭から行なう必要がある点にご注意ください。
マッピングしないフィールドはダミーフィールドをマッピングします。MapFieldの第二引数に「NULL」(言語によっては、「Nothing」、「null」)を指定するとダミーフィールドにマッピングできます。

VB .NET 2003でプラグインをデバッグすることができません。 (2010/02/19)

Q:VB .NET 2003でプラグインをデバッグ使用としたところ、VB .NET 2003が異常終了してしまいます。何か設定に問題があるのでしょうか。

A:

VB .NET2003は.NET Framework 1.1以下に対応しており、.NET Framework 2.0がインストールされておりますと、アンマネージコードデバッグ時に.NET Framework 2.0がロードされ、デバッガがクラッシュするようです。詳細は以下のURLをご参照ください。
  http://support.microsoft.com/kb/886609/ja


回避する方法としましては、強制的に.NET Framework 1.1をロードするように変更することです。
具体的には、「Asprova.exe.config」というファイルに以下の内容を記載します。

<?xml version = "1.0"?>
<configuration>
<startup>
<requiredRuntime version="v1.1.4322"/>
</startup>
</configuration>

上記のファイルをデバッグ時に起動するAsprova.exeと同じフォルダに保存していただき、デバッグを実行してください。

Visual Basic 2005でデバッグしたいのですがブレークポイントで中断できません (2009/11/24)

Q:Visual Basic 2005でデバッグしたいのですがブレークポイントで中断できません

A:

以下の設定を行なう必要があります。


  • プロジェクトプロパティ→コンパイル→詳細コンパイルオプション→デバッグ情報を作成で「Full」を選択

  • プロジェクトプロパティ→デバッグ→外部プログラムの開始にC:\Program Files\Asprova corporation\Asprova\Asprova.exe を指定

  • プロジェクトのプロパティ→デバッグ→デバッガを有効にする→「アンマネージ コード デバッグを有効にする」にチェックを入れます


この状態でリビルドしたモジュールをAsprova.exeと同じフォルダに保存してデバッグするとブレークポイントで中断できるかと思います。
ブレークポイントで認識されない場合はAsprova.exeと同じフォルダに保存したモジュールをregasmで登録解除後、再登録の上、デバッグしてください。

プラグインに追加したエントリ関数が認識されません (2009/11/13)

Q:プラグインに追加したエントリ関数が認識されません

A:

対象のプラグインが
複数のフォルダに保存されているということはないでしょうか。
とくに開発環境の場合、実行用、開発用など
複数のフォルダにビルドしていることもあります。

プラグインはregsvr32などで登録した際に
モジュールのパスがレジストリに保存されています。
このため、意図しているDLLと異なるDLLのインターフェースが
Windows側から呼び出されている可能性があります。

Asprova.exeと同じフォルダにプラグインを保存し、
regsvr32やregasmを利用して、再登録すると正しく認識されます。
認識されない場合は登録を一度解除して再登録してください。
登録の解除は「 regsvr32 -u」などオプションを追加して実行します。

資源ガントチャートでダブルクリックしたに出てくるプロパティウィンドウを、プラグインで作る別のダイアログに置き換えたい (2009/11/05)

Q:資源ガントチャートでダブルクリックしたに出てくるプロパティウィンドウを、プラグインで作る別のダイアログに置き換えたいのですが、プロパティウィンドウを表示させない方法はありますか?

A:

方法は2つあります。

1つは、メニュー[表示]-[ワークスペース設定]にて、ワークスペースのプロパティを
表示し、「設定タブ」を選択して「プロパティウインドウ表示方法」を
「ダイアログを開く」以外にすれば良いです。

2つ目は、プラグインのエントリ関数の戻り値でコントロールできます。
たとえば、資源ガントチャートのオブジェクトの上でダブルクリックしたときの
プラグインキーには、KeyEventLDblClickOnResChartOnObject を用いますが、
このプラグインのエントリ関数は以下のように定義します。

Public Function LDblClickOnResChartOnObject(args As ASPArgList) As
TReturnType
LDblClickOnResChartOnObject = kContinue
End Function

関数名はなんでも良いのですが、戻り値は、TReturnType とします。
これは列挙子で、
 kContinue
kBreak
 kError
の3つが選べます。kContinue だと、その後の標準機能の挙動は続行されます。
たとえば指図バーをダブルクリックしたら、プロパティウィンドウが起動します。
(お電話でお話ししたように、ワークスペースの設定にも依存しますが)

kBreak、kErrorであれば、その後の標準機能の挙動はストップされます。

計画パラメタ用のプラグインから計画パラメタを取得できますか (2009/10/01)

Q:計画パラメタ用のプラグインから計画パラメタを取得できますか

A:

取得できます。
計画パラメタコマンド用のプラグインを作成し、計画パラメタにセットした場合、
コマンドとして追加されたプラグイン自身がkArgCommandObject と して返されます。

例:
デフォルト計画パラメタにこのプラグインを追加しますと、自分がArgList に渡されます。
自分の親はデフォルト計画パラメタコマンドなので、この割付に使用される計画パラメタ設定が取得できます。

ソースコードは以下のような記述となります。

例 VB6 )
Dim cmd As ASPCommandObject
Set cmd = args.ArgAsObject(kArgCommandObject)
Dim param As ASPSchedulingParameter
Set param = cmd.Parent

次オーダをセットしたい (2009/09/04)

Q:選択されているオーダに対して、次オーダをセットしたいのですが、プラグイン中で例外が発生してしまいます。何らかしらの作法があるのでしょうか。

A:

次オーダに関する「ASVOrderRel」クラスは
以下のように使用します。

例 C#)
 ASVOrderRel addRel = new ASVOrderRelClass();
 addRel.AddElement( tmpOrdCode, "");
 ord.NextOrder = addRel;

次オーダが存在していない場合、「NextOrder」がnullとなります。
このため、新規に作成してからセットする、
つまり、ASVOrderRelのインスタンスを作成し、セットする必要があります。

一方、次オーダが存在している場合は直接参照できます。

プラグインのエントリ関数が正しく認識されません。 (2009/08/07)

Q:プラグインをいくつか作成したのですが、Asprovaの「プラグイン情報」で確認すると呼び出し関数名に追加したプラグインのうち、あるプラグインDLLの関数がほかのプラグインに表示されます。ほかのプラグインの関数が表示されないのはなぜでしょうか。

A:

最初に作成したプラグインのASDefaultのGUIDを確認してください。
同じGUIDが指定されている可能性があります。

GUIDは重複しないよう、プラグインのインターフェースごとにGUIDを生成して、
プラグインを作成してください。

GUIDは以下の箇所で登録しています。

VB.NET)
<Assembly: Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")>

C++)
[
object,
uuid(XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX),
dual,
nonextensible,
helpstring("IASDefault Interface"),
pointer_default(unique)
]
interface IASDefault : IDispatch{ ... }

[
uuid(XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX),
version(1.0),
helpstring("ASExtensionVC 1.0 Type Library")
]
library ASExtensionVCLib
{
coclass ASDefault
{ [default] interface IASDefault; };
};

C#)
[Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"),
InterfaceTypeAttribute( ComInterfaceType.InterfaceIsDual )]
public interface IASDefault{ ... }

[Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"),
ClassInterface( ClassInterfaceType.None )]
public class ASDefault : IASDefault{ ... }


COMでコメントを削除するには (2008/07/04)

Q:コメント4までコメントが入っている状態でコメント4を削除する際に

Dim pSelOrder As ASBOrder
Set pSelOrder = args.ArgAsObject(kArgOrder)
pSelOrder.Comment(4) = ""

 というコードのアドインを実行するとコメント4自体は何もない
 状態になります。
 但し、コメント全体としては「コメント1;コメント2;コメント3;」と
 コメント3のあとに「;」が残ってしまいます。
 「;」がない状態にすることは出来ないでしょうか?

A:

値を削除するには、以下のようにしてください。
Dim utils As ASFUtility
Set utils = args.ArgAsObject(kArgUtility)
Dim result As Boolean
result = utils.Remove(prodTask, AsLib.kASBOrder_Comment, 4)

COMでのコメントの設定位置 (2008/07/04)

Q:オーダーガントチャートの左で右クリックし、オーダーに対して
特定のコメントを追加、削除するプラグインをVB6で作ろうとして
おります。(KeyPopupOnOrderGanttChartLeft)

質問①
 もともと、全くコメントが入っていないオーダーに対して
 コメント4に「テスト」というコメント追加する際に

Dim pSelOrder As ASBOrder
Set pSelOrder = args.ArgAsObject(kArgOrder)
pSelOrder.Comment(4) = "テスト"

 というコードのアドインを実行するとコメント4に入らず
 コメント1に「テスト」が入ってしまいます。
 コードの書き方がおかしいでしょうか?

A:

いえ。そういうものです。4つめのコメントを設定したいのであれば、3つ、空の
コメントを追加してから設定してください。例えば、以下です。
 pSelOrder.Comment(0) = ""
 pSelOrder.Comment(0) = ""
 pSelOrder.Comment(0) = ""
 pSelOrder.Comment(4) = "テスト"

プラグインがAsprovaから認識されません (2008/06/26)

Q:プラグインがAsprovaから認識されません。何がまずいのでしょうか。

A:

Ver.6.0.1から、プラグインの自動登録の際にエラーがあれば、メッセージに出力する
機能を追加しました。
 http://www.asprova.jp/asprova/000874.html
これにより、AutoRegistration 関数の記述ミスが分かりやすくなります。
たいていの場合は、クラス名、関数名のタイプミスですが。

また、メッセージが出ない場合は、管理者権限を持つWindowsアカウントでログインした
状態であるのかどうかを確認してください。管理者権限がないアカウントでログインすると、
dllをロードできなかったり、レジストリにdllを登録できなかったりします。
(この内容は、テクニカルノート Technical Notes.pdf に記述済みです。TN-C070626)

負荷率グラフの集計値を出力するには (2007/05/15)

Q:COMから、負荷率グラフの集計値を表示するには、どのようにすれば良いのでしょうか。

A:

ASGTimeChartWindowクラスに、
 ExportSummaryData
というメソッドがあります。
このメソッドは、チャートのデータをエクスポートします。
引数に、出力ファイルの形式、出力ファイルの名前、期間の長さを渡します。

RDB形式かつチャートの列幅を1日とする場合は、以下のようになります。
 Dim ratiograph as AsLib.ASGTimeChartWindow
 Set ratiograph = root.RootWorkspace.ObjectWindow.Views.OpenNewLoadGraph
 
 ratiograph.ExportSummaryData kChartFileFormat_RDB,
                      strExportPath,
                      kUnitTermType_1Day

なお、ASGTimeChartWindowクラスのLoadGraphSummaryMethodの値により、
集計方法を指定することもできます。
 集計方法(TLoadGraphSummaryMethod型)
 なし : kLoadGraphSummaryMethod_None
 平均値 : kLoadGraphSummaryMethod_Average

※rootオブジェクトはASORootObjectです。あらかじめ取得してください。 
※strExportPathには出力ファイルのパスをあらかじめ設定してください。
※引数の詳細について、出力ファイルの形式は「TChartFileFormat」を、
  期間の長さは「TUnitTermType」をヘルプでそれぞれご参照ください。

開いた状態で保存したウィンドウ(ガントチャート、もしくはテーブル)を最前面にするには (2007/05/15)

Q:負荷率グラフを開いた状態で保存しておき、COMからこの負荷率グラフを最前面に表示するには、どのようにしたら良いですか?

A:

Rootオブジェクトから
  RootWorkspace.ActiveProjectViews
を参照すると、開かれているウィンドウ(ASGViews型)が取得できます。

ActiveProjectViewsのメソッドに、
  WindowCount
というメソッドがあります。
このメソッドは、開かれているウィンドウの数を返します。
このウィンドウの数を利用して、ActiveProjectViews中から目的のウィンドウを検索します。

Asprovaでは、資源ガントチャート、負荷率グラフなどを外部から識別できません。
このため、キャプション(ASGViews::Caption)など、
識別可能なプロパティをご用意ください。

キャプションを使用した場合、ソースコードは以下のようになります。
 Dim ActiveWnd As AsLib.ASGViews
 Dim WndNum As Long

 Set ActiveWnd = root.RootWorkspace.ActiveProjectViews
 WndNum = ActiveWnd.WindowCount

 For i = 1 To WndNum
   ' 負荷率グラフを検索します。
   If InStr(ActiveWnd.Window(i).Caption, "負荷率グラフ") <> 0 Then
     ActiveWnd.Window(i).MoveToFront ' ウィンドウを最前面に表示します。
   End If
 Next i

ここでは、キャプションの先頭が"負荷率グラフ"のウィンドウを最前面に表示します。
※RootオブジェクトはASORootObjectです。あらかじめ取得してください。

配列型のユーザ追加プロパティに設定されたデータの数を調べるには (2006/11/29)

Q:例えばAsprova上からオーダに"OrderUser_TEST"というプロパティを追加しました。配列型にしたのですが、設定されているデータの数をCOMから調べるにはどうしたら良いですか?

A:

ROOTオブジェクトに
  PropertyValueCount
というメソッドがありますので、これを利用して設定されているデータの数を調べることが出来ます。

例えばVBですと、以下のような感じで使用します。

Dim propID As Long
Dim numData As Long

propID = root.LookupPropID("OrderUser_TEST")
numData = root.PropertyValueCount(order, propID)


※rootはASORootObject、orderはASBOrderです。argListなどから予め取得しておきましょう。
※LookupPropIDは、プロパティIDを取得するメソッドです。LookupPropIDについてはこちらが参考になります。

ユーザ追加プロパティをCOMから参照・取得するには (2006/11/29)

Q:例えばAsprova上からオーダに"OrderUser_TEST"というプロパティを追加したのですが、このプロパティにCOMを通して値を設定したり、取得したりする方法はありますか?

A:

ROOTオブジェクトに
  LookupPropID
というメソッドがありますので、これを利用して追加したプロパティのプロパティIDを取得します。
取得したプロパティIDを使って、
  SetAsStr
を使えば値を設定できますし、
  GetAsStr
を使えば値を取得することが出来ます。

例えばVBですと、LookupPropID、SetAsStr、GetAsStrは以下のような感じで使用します。

Dim propID As Long
Dim buf As String

propID = root.LookupPropID("OrderUser_TEST")
order.SetAsStr propID, 0, "123"
buf = order.GetAsStr(propID, 0)


※rootはASORootObject、orderはASBOrderです。argListなどから予め取得しておきましょう。