SCM : グローバル多層工場・多層DCのラフスケジュールを作成します
APS : 単一工場の詳細スケジュールを作成します
MRP : 単一工場の所要量計画を作成します
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 : 下の階層のオブジェクト
上記のインターフェイスを介して、メッセージ内容を取得し、ファイルに出力するコードを記述していただきますと、たとえば、テキストファイルなどにメッセージ内容を出力することができます。
Q:COM I/Fで外部フィールドを参照できるでしょうか?
A:
ASIDBIOインターフェイスのExternalFieldsプロパティで参照することができます。
接続文字列や外部テーブルを変更した場合は、UpdateExternalFieldsメソッドを呼び出して、外部フィールドを更新する必要があります。
Q:COM I/Fを利用してフィールドマッピングを更新するにはどのようにすれば良いでしょうか?
A:
ASIDBIOインターフェイスのMapFieldメソッドを利用して更新します。
第一引数にはマッピングするAsprova内部のプロパティ(ASOPropertyDefインターフェイス)を、
第二引数にはマッピングするインデックスを指定します。
MapFieldメソッドが実行されますと、呼び出されたDBIOに対して、インデックスで指定された外部フィールドとAsprova内部のプロパティがマッピングされます。
フィールドマッピングは外部フィールドの先頭から行なう必要がある点にご注意ください。
マッピングしないフィールドはダミーフィールドをマッピングします。MapFieldの第二引数に「NULL」(言語によっては、「Nothing」、「null」)を指定するとダミーフィールドにマッピングできます。
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と同じフォルダに保存していただき、デバッグを実行してください。
Q:Visual Basic 2005でデバッグしたいのですがブレークポイントで中断できません
A:
以下の設定を行なう必要があります。
Q:プラグインに追加したエントリ関数が認識されません
A:
対象のプラグインが
複数のフォルダに保存されているということはないでしょうか。
とくに開発環境の場合、実行用、開発用など
複数のフォルダにビルドしていることもあります。
プラグインはregsvr32などで登録した際に
モジュールのパスがレジストリに保存されています。
このため、意図しているDLLと異なるDLLのインターフェースが
Windows側から呼び出されている可能性があります。
Asprova.exeと同じフォルダにプラグインを保存し、
regsvr32やregasmを利用して、再登録すると正しく認識されます。
認識されない場合は登録を一度解除して再登録してください。
登録の解除は「 regsvr32 -u」などオプションを追加して実行します。
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であれば、その後の標準機能の挙動はストップされます。
Q:計画パラメタ用のプラグインから計画パラメタを取得できますか
A:
取得できます。
計画パラメタコマンド用のプラグインを作成し、計画パラメタにセットした場合、
コマンドとして追加されたプラグイン自身がkArgCommandObject と して返されます。
例:
デフォルト計画パラメタにこのプラグインを追加しますと、自分がArgList に渡されます。
自分の親はデフォルト計画パラメタコマンドなので、この割付に使用される計画パラメタ設定が取得できます。
ソースコードは以下のような記述となります。
例 VB6 )
Dim cmd As ASPCommandObject
Set cmd = args.ArgAsObject(kArgCommandObject)
Dim param As ASPSchedulingParameter
Set param = cmd.Parent
Q:選択されているオーダに対して、次オーダをセットしたいのですが、プラグイン中で例外が発生してしまいます。何らかしらの作法があるのでしょうか。
A:
次オーダに関する「ASVOrderRel」クラスは
以下のように使用します。
例 C#)
ASVOrderRel addRel = new ASVOrderRelClass();
addRel.AddElement( tmpOrdCode, "");
ord.NextOrder = addRel;
次オーダが存在していない場合、「NextOrder」がnullとなります。
このため、新規に作成してからセットする、
つまり、ASVOrderRelのインスタンスを作成し、セットする必要があります。
一方、次オーダが存在している場合は直接参照できます。
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{ ... }
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)
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) = "テスト"
Q:プラグインがAsprovaから認識されません。何がまずいのでしょうか。
A:
Ver.6.0.1から、プラグインの自動登録の際にエラーがあれば、メッセージに出力する
機能を追加しました。
http://www.asprova.jp/asprova/000874.html
これにより、AutoRegistration 関数の記述ミスが分かりやすくなります。
たいていの場合は、クラス名、関数名のタイプミスですが。
また、メッセージが出ない場合は、管理者権限を持つWindowsアカウントでログインした
状態であるのかどうかを確認してください。管理者権限がないアカウントでログインすると、
dllをロードできなかったり、レジストリにdllを登録できなかったりします。
(この内容は、テクニカルノート Technical Notes.pdf に記述済みです。TN-C070626)
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」をヘルプでそれぞれご参照ください。
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です。あらかじめ取得してください。
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についてはこちらが参考になります。
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などから予め取得しておきましょう。

生産スケジューラのアスプローバ株式会社
All rights reserved by Asprova Corporation .