LoginSignup
0
0

[X++]サンプルコード集

Last updated at Posted at 2022-09-05

■Systemクラス
一覧

<Args>
Args.caller
 - public Object caller([Object _value])

X++
// フォームから呼び出されるクラスメソッド
public void runFromForm(Args _args)
{
    FormRun callerForm;

    // Argsから呼び出し元のフォームを取得
    callerForm = _args.caller() as FormRun;

    if (callerForm)
    {
        // 呼び出し元のフォームに対する処理を実行
        // 例:フォームのタイトルを変更
        callerForm.design().caption("新しいタイトル");
    }
}

<DictTable>
DictTable.fieldNext
 - public FieldId fieldNext(FieldId fieldId, [TableScope tableScope])

X++
static void showFieldNames(Args _args)
{
    DictTable dictTable = new DictTable(tableNum(CustTable));
    int fieldId = dictTable.fieldNext(0);

    while (fieldId)
    {
        info(dictTable.fieldName(fieldId));
        fieldId = dictTable.fieldNext(fieldId);
    }
}

DictTable.fieldObject
 - public DictField fieldObject(FieldId fieldId)

X++
static void getFieldObjectExample(Args _args)
{
    DictTable dictTable = new DictTable(tableNum(CustTable));
    DictField dictField;
    int fieldId;

    // CustTableのAccountNumフィールドのIDを取得
    fieldId = dictTable.fieldName2Id("AccountNum");

    // fieldName2Idから取得したIDを使ってDictFieldオブジェクトを取得
    dictField = dictTable.fieldObject(fieldId);

    if (dictField)
    {
        // フィールドのラベルを情報ログに出力
        info(strFmt("Field Label: %1", dictField.label()));
    }
}

DictTable.fieldCnt
 - public int fieldCnt([TableScope tableScope])

X++
static void showFieldCount(Args _args)
{
    DictTable dictTable = new DictTable(tableNum(CustTable));
    int fieldCount;

    // テーブルのフィールド数を取得
    fieldCount = dictTable.fieldCnt();

    // フィールド数を情報ログに出力
    info(strFmt("フィールド数: %1", fieldCount));
}

<DictField>
DictField.label
 - public str label([int arrayIndex])

X++
static void ShowFieldLabels(Args _args)
{
    DictTable dictTable = new DictTable(tableNum(CustTable));
    DictField dictField;
    int fieldId = dictTable.fieldNext(0);

    while (fieldId)
    {
        dictField = new DictField(tableNum(CustTable), fieldId);
        info(strFmt("Field ID: %1, Label: %2", fieldId, dictField.label()));
        fieldId = dictTable.fieldNext(fieldId);
    }
}

DictField.name
 - public str name([...])

X++
static void showFieldName(Args _args)
{
    DictTable dictTable = new DictTable(tableNum(CustTable));
    DictField dictField;
    int fieldId = dictTable.fieldNext(0); // 最初のフィールドIDを取得

    while (fieldId)
    {
        dictField = dictTable.fieldObject(fieldId);
        info(strFmt("フィールド名: %1", dictField.name()));
        fieldId = dictTable.fieldNext(fieldId); // 次のフィールドIDを取得
    }
}

<DateTimeUtil>
DateTimeUtil::date
 - public static date date(utcdatetime t)

X++
static void ShowCurrentDate(Args _args)
{
    DateTime currentDateTime = DateTimeUtil::getSystemDateTime();
    date currentDate = DateTimeUtil::date(currentDateTime);

    info(strFmt("現在の日付: %1", currentDate));
}

<FormControl>
FormControl.formRun
 - public FormRun formRun()

X++
public void clicked()
{
    FormRun formRun;

    // FormControlからFormRunインスタンスを取得
    formRun = this.formRun();

    // FormRunインスタンスを使用してフォームのタイトルを変更
    if (formRun)
    {
        formRun.design().caption("新しいフォームタイトル");
    }

    super();
}

<FormStringControl>
FormStringControl.lookup
 - public void lookup()

X++
public void lookup()
{
    Query query = new Query();
    QueryBuildDataSource qbds;
    QueryBuildRange qbr;
    SysTableLookup sysTableLookup;

    // QueryとQueryBuildDataSourceを設定
    qbds = query.addDataSource(tableNum(CustTable));
    qbr = qbds.addRange(fieldNum(CustTable, AccountNum));

    // SysTableLookupオブジェクトを初期化
    sysTableLookup = SysTableLookup::newParameters(tableNum(CustTable), this);
    sysTableLookup.addLookupfield(fieldNum(CustTable, AccountNum));
    sysTableLookup.addLookupfield(fieldNum(CustTable, Name));
    sysTableLookup.parmQuery(query);

    // ルックアップを表示
    sysTableLookup.performFormLookup();
}

// このメソッドは、FormStringControlのイベントまたはメソッド内で呼び出されることを想定しています。

FormStringControl.gotFocus
 - public void gotFocus()

X++
public void gotFocus()
{
    super();

    // フォーカスが当たったときに実行されるカスタムロジック
    info("このコントロールがフォーカスを受け取りました。");
}

<FormDesign>
FormDesign.controlName
 - public FormControl controlName(str controlName)

X++
public void setControlProperty()
{
    FormRun formRun = this;
    FormDesign formDesign;
    FormStringControl formStringControl;

    // フォームデザインを取得
    formDesign = formRun.design();

    // controlNameを使って特定のコントロールを取得
    formStringControl = formDesign.controlName("コントロール名") as FormStringControl;

    if (formStringControl)
    {
        // コントロールのプロパティを設定または変更
        formStringControl.text("新しいテキスト");
    }
}

<FormRun>
FormRun.design
 - public FormDesign design([int reserved])

X++
public void toggleControlVisibility()
{
    FormRun formRun = this;
    FormDesign formDesign;
    FormControl formControl;

    // フォームのデザインオブジェクトを取得
    formDesign = formRun.design();

    // フォームデザインから特定のコントロールを取得
    formControl = formDesign.control("コントロールID");

    if (formControl)
    {
        // コントロールの可視性を切り替える
        formControl.visible(!formControl.visible());
    }
}

FormRun.dataSource
 - public FormObjectSet dataSource([anytype objectSet])

X++
void updatePurchTable()
{
    FormDataSource purchTableDS;

    // FormRunからPurchTableデータソースにアクセス
    purchTableDS = this.dataSource("PurchTable");

    if (purchTableDS)
    {
        // データソース内の現在選択されているレコードを取得
        PurchTable purchTable = purchTableDS.cursor() as PurchTable;

        // 何らかの条件でレコードの更新が必要な場合
        if (purchTable && purchTable.PurchStatus == PurchStatus::Created)
        {
            // フィールド値の更新
            purchTable.PurchStatus = PurchStatus::Confirmed;
            
            // レコードの変更をコミット
            purchTableDS.update();
            
            info("購買注文ステータスを確認済みに更新しました。");
        }
    }
}

<FormDataSource>
FormDataSource.cursor
 - public Common cursor([int rowIndex])
 - returns the currently active record in the table that is referenced by the data source

X++
void exampleMethod(FormDataSource _formDataSource)
{
    CustTable custTable;

    // フォームデータソースから現在選択されているレコードを取得
    custTable = _formDataSource.cursor() as CustTable;

    if (custTable)
    {
        // ここに、取得したレコードに対する処理を記述
        info(strFmt("Customer: %1, Name: %2", custTable.AccountNum, custTable.Name));
    }
}

FormDataSource.getFirst
 - public Common getFirst([int mark, boolean fetchAhead])

X++
void accessFirstRecord()
{
    FormDataSource myDataSource;
    // フォームデータソースの名前を指定して取得
    myDataSource = this.dataSource("MyDataSourceName");

    // 最初のレコードに移動(データソース内の最初のレコードにカーソルが移動する)
    myDataSource.getFirst();

    // ここで、取得したレコードに対する操作を行う
    // 例: ログにレコードの情報を出力
    info(strFmt("Current record ID: %1", myDataSource.cursor().RecId));
}

FormDataSource.getNext
 - public Common getNext()

X++
void accessNextRecord()
{
    FormDataSource myDataSource;
    // フォームデータソース名を指定
    myDataSource = this.dataSource("MyDataSourceName");

    // 最初のレコードに移動
    myDataSource.getFirst();

    // 次のレコードに移動
    boolean found = myDataSource.getNext();

    if (found)
    {
        // 次のレコードが存在する場合の処理
        info(strFmt("次のレコードのID: %1", myDataSource.cursor().RecId));
    }
    else
    {
        // 次のレコードが存在しない場合の処理
        info("これ以上レコードはありません。");
    }
}

<QueryRun>
QueryRun.next
 - public boolean next()

X++
static void QueryRunNextExample(Args _args)
{
    Query query = new Query();
    QueryRun queryRun;
    CustTable custTable;

    // QueryオブジェクトにCustTableデータソースを追加
    query.addDataSource(tableNum(CustTable));

    // QueryRunオブジェクトを初期化
    queryRun = new QueryRun(query);

    // クエリを実行し、結果セットをループ
    while (queryRun.next())
    {
        // 現在のレコードを取得
        custTable = queryRun.get(tableNum(CustTable));

        // 顧客情報を情報ログに出力
        info(strFmt("顧客ID: %1, 名前: %2", custTable.AccountNum, custTable.Name));
    }
}

<QueryBuildDataSource>
QueryBuildDataSource.addDataSource
 - public QueryBuildDataSource addDataSource(anytype arg, [str name, boolean emptyFieldList])

X++
Query                  query;
QueryBuildDataSource   qbds;

// Queryのインスタンスを作成します。
query = new Query();

// QueryBuildDataSourceのインスタンスを作成します。
qbds = query.addDataSource(tableNum(CustTable));

// サブデータソースを追加します。
qbds.addDataSource(tableNum(SalesTable));

// サブデータソースの結合を設定します。
qbds.addLink(fieldNum(CustTable, AccountNum), fieldNum(SalesTable, CustAccount));

// クエリを実行します。
QueryRun queryRun;
queryRun = new QueryRun(query);
while (queryRun.next())
{
    // 結果の処理を行います。
    CustTable custTable;
    SalesTable salesTable;

    custTable = queryRun.get(tableNum(CustTable));
    salesTable = queryRun.get(tableNum(SalesTable));

    // ここで取得したデータを処理します。
}

QueryBuildDataSource.addRange
 - public QueryBuildRange addRange(FieldId field, [int arrayIndex, QueryRangeType rangeType])

X++
Query                  query;
QueryBuildDataSource   qbds;
QueryBuildRange        qbr;

// Queryのインスタンスを作成します。
query = new Query();

// QueryBuildDataSourceのインスタンスを作成します。
qbds = query.addDataSource(tableNum(CustTable));

// QueryBuildRangeのインスタンスを作成します。
qbr = qbds.addRange(fieldNum(CustTable, CustGroup));

// 範囲を設定します。
qbr.value('10');

// クエリを実行します。
QueryRun queryRun;
queryRun = new QueryRun(query);
while (queryRun.next())
{
    // 結果の処理を行います。
    CustTable custTable;

    custTable = queryRun.get(tableNum(CustTable));

    // ここで取得したデータを処理します。
}

<QueryBuildRange>
QueryBuildRange.value
 - public str value([str value])

X++
static void QueryBuildRangeExample(Args _args)
{
    Query query = new Query();
    QueryBuildDataSource qbds;
    QueryBuildRange qbr;
    QueryRun qr;

    // CustTableをクエリのデータソースとして追加
    qbds = query.addDataSource(tableNum(CustTable));
    
    // CustomerGroupが'10'のレコードを選択する範囲を設定
    qbr = qbds.addRange(fieldNum(CustTable, CustomerGroup));
    qbr.value("10");
    
    // クエリを実行
    qr = new QueryRun(query);
    
    // 結果をループして処理
    while (qr.next())
    {
        CustTable custTable = qr.get(tableNum(CustTable));
        info(strFmt("Customer Account: %1, Name: %2", custTable.AccountNum, custTable.Name));
    }
}

<XppPrePostArgs>
XppPrePostArgs.getThis
 - public anytype getThis()

X++
[PostHandlerFor(classStr(MyTable), methodStr(MyTable, validateWrite))]
public static void MyTable_Post_validateWrite(XppPrePostArgs args)
{
    MyTable myTable = args.getThis() as MyTable;
    // ここにカスタムロジックを実装
    info("validateWriteが呼び出されました。");
}
X++
[PreHandlerFor(classStr(MyTable), methodStr(MyTable, validateWrite))]
public static void MyTable_Pre_validateWrite(XppPrePostArgs args)
{
    MyTable myTable = args.getThis() as MyTable;
    // 特定の条件に基づいて検証を行う
    if (!myTable.validateSomething())
    {
        // 条件を満たさない場合、エラーメッセージを表示して処理を中断
        throw error("特定の条件を満たさないため、書き込みを中止します。");
    }
}

■その他クラス
<RunBaseBatch>
 - class RunBaseBatch extends RunBase implements Batchable
RunBase.dialog
 - protected Object dialog()

X++
class MyRunBaseClass extends RunBase
{
    DialogField    field1;
    DialogField    field2;

    public Object dialog()
    {
        Dialog       dialog;
        DialogGroup  group;

        dialog = super();

        // ダイアログフィールドを作成します。
        group = dialog.addGroup('My Group');
        field1 = group.addField(extendedTypeStr(AccountNum), 'Account Number');
        field2 = group.addField(extendedTypeStr(Datetime), 'Date');

        // ダイアログを返します。
        return dialog;
    }

    public boolean run()
    {
        // ダイアログの入力値を取得します。
        str accountNum;
        utcdatetime date;

        accountNum = field1.value();
        date = field2.value();

        // ここで取得した値を使用して処理を行います。

        // trueを返して処理が成功したことを示します。
        return true;
    }
}

RunBase.pack
 - public container pack()

X++
class MyRunBaseClass extends RunBase
{
    str   accountNum;
    date  startDate;
    date  endDate;

    public container pack()
    {
        container packedData = super();

        // パラメーターをコンテナにパックします。
        packedData += [this.accountNum, this.startDate, this.endDate];

        return packedData;
    }

    public boolean unpack(container _packedData)
    {
        boolean unpacked = super(_packedData);

        // パラメーターをアンパックします。
        this.accountNum = conPeek(_packedData, 1);
        this.startDate = conPeek(_packedData, 2);
        this.endDate = conPeek(_packedData, 3);

        return unpacked;
    }

    public boolean run()
    {
        // ここで取得した値を使用して処理を行います。

        // trueを返して処理が成功したことを示します。
        return true;
    }
}

RunBase.unpack
 - public boolean unpack(container packedClass)

X++

RunBaseBatch.getFromDialog
 - public boolean getFromDialog()

X++
class MyRunBaseBatchClass extends RunBaseBatch
{
    DialogField    field1;
    DialogField    field2;

    public Object dialog()
    {
        Dialog       dialog;
        DialogGroup  group;

        dialog = super();

        // ダイアログフィールドを作成します。
        group = dialog.addGroup('My Group');
        field1 = group.addField(extendedTypeStr(AccountNum), 'Account Number');
        field2 = group.addField(extendedTypeStr(Datetime), 'Date');

        // ダイアログを返します。
        return dialog;
    }

    public boolean getFromDialog()
    {
        // ダイアログの入力値を取得します。
        this.accountNum = field1.value();
        this.startDate = field2.value();

        // trueを返して処理が成功したことを示します。
        return true;
    }

    public boolean pack()
    {
        boolean packed = super();

        // パラメーターをコンテナにパックします。
        this.parmAccountNum(this.accountNum);
        this.parmStartDate(this.startDate);

        return packed;
    }

    public boolean unpack()
    {
        boolean unpacked = super();

        // パラメーターをアンパックします。
        this.accountNum = this.parmAccountNum();
        this.startDate = this.parmStartDate();

        return unpacked;
    }

    public boolean run()
    {
        // ここで取得した値を使用して処理を行います。

        // trueを返して処理が成功したことを示します。
        return true;
    }
}

RunBaseBatch.validate
 - public boolean validate([Object calledFrom])

X++
class MyRunBaseBatchClass extends RunBaseBatch
{
    str   accountNum;
    date  startDate;
    date  endDate;

    public boolean validate()
    {
        boolean isValid = super();

        // バッチジョブのパラメーターが有効かどうかをチェックします。
        if (this.startDate > this.endDate)
        {
            // 開始日が終了日よりも後の場合はエラーとします。
            isValid = false;
            error('Start date cannot be later than end date.');
        }

        return isValid;
    }

    public boolean run()
    {
        // バリデーションが成功した場合にのみ処理を実行します。
        if (this.validate())
        {
            // ここで取得した値を使用して処理を行います。
        }

        // trueを返して処理が成功したことを示します。
        return true;
    }
}

RunBaseBatch.caption
 - public ClassDescription caption()

X++
class MyRunBaseBatchClass extends RunBaseBatch
{
    public static void main(Args _args)
    {
        MyRunBaseBatchClass myRunBaseBatchClass = new MyRunBaseBatchClass();
        myRunBaseBatchClass.run();
    }

    public container pack()
    {
        return super();
    }

    public boolean unpack(container _packedClass)
    {
        return super(_packedClass);
    }

    public boolean validate()
    {
        return super();
    }

    public str caption()
    {
        return "My Custom Caption"; // カスタムのキャプションを返します。
    }

    public boolean run()
    {
        info(this.caption()); // カスタムのキャプションを表示します。

        return true;
    }
}

<Box>
Box::yesNo
 - public static boolean yesNo(str question, NoYes default, str title)

X++
static void ShowYesNoDialogExample(Args _args)
{
    boolean userResponse;

    // ユーザーにはい/いいえの選択を促すダイアログを表示
    userResponse = Box::yesNo("この操作を続行しますか?", DialogButton::No, "操作の確認");

    if (userResponse)
    {
        // ユーザーが「はい」を選択した場合の処理
        info("ユーザーが「はい」を選択しました。");
    }
    else
    {
        // ユーザーが「いいえ」を選択した場合の処理
        info("ユーザーが「いいえ」を選択しました。");
    }
}

<>

 -

<>

 -

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0