次の方法で共有


明細書を選択

コミュニティの関心グループが Yammer から Microsoft Viva Engage に移行されました。 Viva Engage コミュニティに参加し、最新のディスカッションに参加するには、「 Finance and Operations Viva Engage Community へのアクセスを要求する 」フォームに入力し、参加するコミュニティを選択します。

select ステートメントは、データベースからデータをフェッチします。

  • すべての選択ステートメントではレコードをフェッチするためテーブル変数を使用します。 この変数のタイプは、アプリケーション オブジェクト ツリーで定義されたテーブルです。 select ステートメントを実行する前に、この変数を宣言する必要があります。

  • select ステートメントは、1 つのレコードまたはフィールドのみをフェッチします。 複数のレコードをフェッチまたは走査するには、 のステートメントまたは while select ステートメントを使用します。

    • next ステートメントは、テーブルの次のレコードをフェッチします。 選択ステートメントの前に、ステートメントがある場合、エラーが発生します。 ステートメントを使用する場合、firstOnly 検索オプションを使用しません。
    • while select ステートメントを使用して複数のレコードを移動する方がより適切です。
  • select ステートメントは、その結果をテーブル バッファー変数で返します。

  • 選択ステートメントのフィールド リストを使用すると、これらのフィールドでは、テーブル変数が使用されます。 他のすべてのフィールドには既定値があります。

  • 各テーブルには、定義済フィールドのセットがあります。 これらのフィールドの 1 つである RecId フィールドには、そのテーブル内の各レコードに固有の値が含まれています。 この値が 0 の場合、データベースからレコードが選択されませんでした。

例の選択

次の例では、CustTable テーブルからレコードのすべての列をフェッチし、その行の AccountNum 列に値を出力します。 並べ替え順 order by 句が指定されていないため、フェッチされたレコードは予測できません。

CustTable custTable;
select * from custTable;
info("AccountNum: " + custTable.AccountNum);

データ選択のその他の例については、データの選択を参照してください。

例の挿入

次の例では、新しいレコードを CustTable テーブルに挿入します。 新しいレコードの AccountNum 列は 2000 に設定され、CustGroup 列は 1 に設定されます。

ttsBegin;
    CustTable custTable;

    custTable.AccountNum = '2000';
    custTable.CustGroup = '1';

    custTable.insert();
ttsCommit;

データの挿入に関するその他の例については、データの挿入 を参照してください。

例の更新

次の例では、更新する CustTable テーブルを選択します。 AccountNum フィールドの値が2000等しいレコードのみが更新されます。 nextの呼び出しはなく、この例では select while ステートメントを使用しないため、コードは 1 つのレコードのみを更新します。 このコードは、5000と等しいCustTable インスタンスを見つけた場合に、AccountNum フィールドの値を2000に変更します。

ttsBegin;
    CustTable custTable;
    select forUpdate custTable
        where custTable.AccountNum == '2000';

    if (custTable)
    {
        custTable.CreditMax = 5000;
        custTable.update();
    }
ttsCommit;

データの更新に関するその他の例については、データの更新 を参照してください。

例の削除

次の例では、CustTable フィールドが と等しい2000 テーブル内のすべてのレコードを削除します。 このコードは、一度に 1 つのレコードを削除します。

ttsBegin;
    CustTable custTable;
    while select forUpdate CustTable
        where custTable.AccountNum == '2000'
    {
        custTable.delete();
    }
ttsCommit;

データの削除に関するその他の例については、データの削除 を参照してください。

Select ステートメントの構文

この構文では、次の記号を使用します。

  • [] – かっこはオプションの要素を囲みます。
  • {} – 中かっこは、0 回以上含めることができる要素を囲みます。
  • + – プラス記号は、1 回以上含めることができる要素を示します。
  • | – バーはオプションを示します。
記号  
SelectStatement = パラメーター選択する
パラメーター = { FindOption }[ FieldListfrom ] TableBufferVariable [ IndexClause ] [ Options ] [ WhereClause ] [ JoinClause ]
FindOption = crossCompany [:ContainerVariable] |reverse | firstFast | FirstOption | forUpdate | noFetch | ForceOption | forceSelectOrder | forceNestedLoop | LockOption | repeatableRead | validTimeState
FirstOption = firstOnly | firstOnly10 | firstOnly100 | firstOnly1000
LockOption = optimisticLock | pessimisticLock
ForceOption = forcePlaceholders | forceLiterals
FieldList = { フィールド } | *
フィールド = Aggregate(FieldIdentifier) | FieldIdentifier
集計 = 合計 | 平均 | 最小値 | 最大値 | カウント
オプション = OrderClause | IndexClause
OrderClause = [OrderBy [GroupBy]] |[GroupBy [OrderBy]]
OrderBy = 順序 [by] FieldOrder {FieldOrder }
GroupBy = グループ [by] FieldOrder {FieldOrder }
FieldOrder = FieldIdentifier [ asc | desc ]
IndexClause = インデックスIndexName | インデックス ヒントIndexName
WhereClause = whereExpressionInClause
InClause = inList
JoinClause = [c0>existsnotexistsouter ] 結合パラメーター
ContainerVariable = コンテナー。
= 式。
TableBufferVariable = 結果の変数名。
FieldIdentifier = テーブルでのフィールドの名前。
IndexName = テーブルのインデックスの名前。
リスト = 値の配列。

集計関数

集計関数は、レコードのグループに対する単一のフィールドで計算を実行します。

  • 集計関数を実行したフィールドに結果が返されます。
  • 結果のフィールドは、group by 句の集計値とフィールドです。
  • 整数フィールドおよび実数フィールのみを計算、平均、または合計することができます。
  • sum 関数が null を返す場合、行は返されません。

X++ と SQL 間の違い

業界標準の SQL では、データベース クエリに集計関数を含めることができます。 例では、count(RecID) および sum(columnA) があります。 集計関数を使用しても where 句と一致する行がない場合、クエリは集計の結果を保持する行を返します。 返された行には、count 関数の値 0 (ゼロ) と sum 関数の null が表示されます。 X++ はデータベースの null 値の概念をサポートしません。 したがって、 sum 関数が null を返す場合、クエリは行を返しません。 また、すべてのデータ型は、状況によっては null 値として処理される特定の値を持ちます。

クエリ結果のグループ化および順序付け

クエリは複数の group by 句を持つことができますが、フィールドは 1 つのgroup by 句のテーブル名で修飾できます。 テーブル名修飾子を使用します。 order by 句は、group by と同じ構文パターンに従います。 両方の句が提供されている場合は、join (または from) 句の後に表示する必要があり、両方とも同じ join 句に存在する where 句よりも前にある必要があります。 最後の join 句の直後にすべての group byorder bywhere 句を配置します。 次の例は、フィールドがテーブル名で修飾されている group by 句を示しています。

CustTable custTable;
CustGroup custGroup;
struct groupSummary = new struct("int CustomerCount; str CustGroup");

while select count(CreditMax) from custTable
    join custGroup
    order by custGroup.Name
    group by custGroup.CustGroup
    where custTable.CustGroup == custGroup.CustGroup
        && custGroup.Name like "*Days*"
{

    groupSummary.value("CustomerCount", custTable.CreditMax);
    groupSummary.value("CustGroup", custGroup.CustGroup);
    info(groupSummary.toString());
}

// Example output:
// (CustomerCount:1; CustGroup:"1")
// (CustomerCount:3; CustGroup:"2")

テーブルの結合

次の例は、 select ステートメントの一部として内部結合を実行する方法を示しています。 この例では、order by 句も表示されており、各フィールドはテーブル名で修飾されています。 したがって、1 つの order by 句のみを使用して、取得したレコードのソート方法を制御することができます。

CustTable custTable;
CustGroup custGroup;
struct output = new struct("int AccountNum; str CustGroup");

while select AccountNum from custTable
    join Name from custGroup
    order by custGroup.Name, custTable.AccountNum
    where custTable.CustGroup == custGroup.CustGroup
{
    info(custGroup.Name + ': ' + custTable.AccountNum);
}

// Example output:
// Days1: 6000
// Days1: 6001
// Days2: 5000

クエリで where、order by、および index hint を一緒に使用する

クエリから返されるデータを 並べ替 える場合は、 select ステートメントで order by キーワードを使用します。 インデックス ヒント キーワードを使用して、クエリで使用するインデックスを指定します。 クエリは、選択したレコードをインデックスで定義された順序で並べ替えます。 インデックスは、クエリがレコードを選択する方法を最適化します。 特定の順序でレコードを選択するには、インデックス ヒントキーワードを並べ替えの式と組み合わせます。 出力を逆順に並べ替えるには、 reverse キーワードを使用します。 インデックスの Enabled プロパティを No に設定してテーブル インデックスを無効にした場合、インデックスを参照する select ステートメントは有効なままです。 ただし、インデックスがデータベースに存在しないため、データベースはインデックスをヒントとして使用してデータを並べ替えることはできません。 次のテーブルは、select ステートメントで index hint および order by キーワードを使用する方法を示しています。

タスク 明細書を選択
注文が重要でない場合は、レコードを選択します。 select .. どこ。。。
注文が重要な場合は、レコードを選択します。 select .. order by ... where ...
レコードを選択し、特定のインデックスを強制的に使用します。 select .. インデックス ヒント ...どこ。。。
注文が重要な場合は、レコードを選択し、特定のインデックスを強制的に使用します。 select .. index hint ... order by ... where ...

次の例は、顧客の範囲と期日に基づいて、SalesTable テーブルからトランザクションを選択する方法を示しています。

SalesTable salesTable;
select salesTable
    index hint CustIdx
    order by CustAccount
    where
        salesTable.CustAccount >= '3000'
        && salesTable.CustAccount <= '4000'
        && salesTable.FixedDueDate >= 12\12\2004
        && salesTable.FixedDueDate <= 05\05\2009;

asc キーワード

asc キーワードは、order by または group by 句のオプションです。 昇順の並べ替え順序を指定します。 asc または desc を指定しない場合、既定では並べ替えは昇順になります。

CustTable custTable;
select * from custTable
    order by CredMax asc;

avg キーワード

avg キーワードはフィールドの平均を返します。

CustTable custTable;
select avg(CreditMax) from custTable;
info(strFmt('%1', custTable.CreditMax));

count キーワード

count キーワードは、レコードの数を返します。

CustTable custTable;
int64 iCountRows;
select count(RecID) from custTable;
iCountRows = custTable.RecID;
info('Rows: ' + int642Str(iCountRows));

crossCompany キーワード

crossCompany キーワードは、ユーザーが読み取りを承認されているすべての会社のデータを返します。 コンテナを追加して関連する会社の数を削減することができます。 次の例では、ユーザーが読み取りを承認されている会社のデータを返します。 結果は dat および dmo 会社に限定されます。

CustTable custTable;
container conCompanies = ['dat','dmo'];
select crossCompany :conCompanies
    * from custTable;

crossCompany 句には任意の式を含めることができます

select ステートメントで crossCompany 句を使用して、検索ステートメントが考慮する必要がある会社を示します。 この構文では、1 つの識別子ではなく、コンテナー型の任意の式がサポートされています。

このコード例では、企業と共にコンテナーを作成します。

private void SampleMethod()
{
    MyTable t;
    container mycompanies = ['dat', 'dmo'];
    select crosscompany: mycompanies t;
}

このコードでは、変数の代わりに式を使用します。

private void SampleMethod()
{
    MyTable t;
    container mycompanies = ['dat', 'dmo'];
    select crosscompany: (['dat'] + ['dmo']) t;
}

降順キーワード

order by 句または group by 句のオプションとして desc キーワードを使用します。 降順の並べ替え順序を指定します。 asc または desc を指定しない場合、並べ替えは昇順です。

CustTable custTable;
select * from custTable
    order by AccountNum desc;

exists キーワード

exists キーワードは、ブール値と結合句を返すメソッドです。

CtrTable ctrTable;
CustTable custTable;
while select AccountNum, Value from custTable
    order by AccountNum
    exists join * from ctrTable
    where (ctrTable.AccountNum == custTable.AccountNum)
{
}

firstFast キーワード

firstFast キーワードは優先順位のヒントです。 最初の行はより迅速に表示されますが、このオプションの合計戻り時間は遅くなる場合があります。 firstFast ヒントは、すべてのページから自動的に取得されます。

次のコード例では、最初の行をすばやく返します。

CustTable custTable;
select firstFast custTable
    order by AccountNum;

firstOnly、firstOnly10、firstOnly100、および firstOnly1000 キーワード

firstOnly キーワードは、限られた数の行を返すことによって、フェッチを高速化します。 クエリに firstOnly を含めると、ランタイムはテーブル バッファーを返します。 firstOnly を省略すると、レコードを反復処理できるオブジェクトがランタイムによって割り当てられます。 firstOnly は、最初のレコードをフェッチする際のみに使用します。これは、パフォーマンスの観点からの推奨です。

キーワード 内容
firstOnly 最初の行のみを返します。
firstOnly10 10 行を返します。
firstOnly100 100 行を返します。
firstOnly1000 1,000 行を返します。

次のコード例では、結果の最初の行のみが返されます。

CustTable custTable;
select firstOnly custTable
    index hint AccountIdx
    where custTable.AccountNum == '5000';

forceLiterals キーワード

forceLiterals キーワードは、最適化時に where 句で使用される実際の値を Microsoft SQL Server データベースに表示するようにカーネルに指示します。 forceLiterals および forcePlaceholders キーワードは相互に排他的です。 詳細については、forcePlaceholders キーワード セクションを参照してください。

警告

select ステートメントでは forceLiterals キーワードを使用しないでください。これは、コードが SQL インジェクションのセキュリティ上の脅威にさらされる可能性があるためです。

forceNestedLoop キーワード

forceNestedLoop キーワードを使用すると、SQL Server データベースはネストループ アルゴリズムを使用して、結合アルゴリズムを含む特定の SQL ステートメントを処理します。 そのため、データベースは、2 番目のテーブルからレコードをフェッチする前に、最初のテーブルからレコードをフェッチします。 通常、データベースでは、ハッシュ結合やマージ結合など、他の結合アルゴリズムが考慮されます。 このキーワードを forceSelectOrder キーワードと組み合わせます。

CustGroup custGroup;
CustTable custTable;

while select forceNestedLoop custGroup
    join custTable
    where custGroup.CustGroup == custTable.CustGroup
{
    Info(custTable.CustGroup);
}

forcePlaceholders キーワード

forcePlaceholders キーワードは、最適化時に WHERE 句で使用される実際の値を SQL Server データベースに表示しないようにカーネルに指示します。 既定では、カーネルは join ステートメントではないすべてのステートメントでこの動作を使用します。 このキーワードを使用する利点は、他の検索値がある同様の明細書のアクセス計画をカーネルが再利用できることです。 欠点は、アクセス プランは計算されますが、データ分散が不均一であるとは見なされないということです。 アクセス計画は、平均的なアクセス計画です。 forcePlaceholders および forceLiterals キーワードは相互に排他的です。

次の例では、カーネルが CustTable テーブルと結合する CustGroup テーブルを反復処理します。

CustGroup custGroup;
CustTable custTable;

while select forcePlaceholders custGroup
    join custTable
    where custGroup.CustGroup == custTable.CustGroup
{
    Info(custTable.CustGroup);
}

forceSelectOrder キーワード

forceSelectOrder キーワードを指定すると、SQL Server データベースは指定した順序で結合内のテーブルにアクセスします。 2 つのテーブルが結合されている場合、データベースは常に最初のステートメントの最初のテーブルにアクセスします。 このキーワードを forceNestedLoop キーワードと組み合わせます。

次の例では、CustGroup フィールドの CustGroup および CustTable テーブルを結合します。

CustGroup custGroup;
CustTable custTable;

while select forceSelectOrder custGroup
    join custTable
    where custGroup.CustGroup == custTable.CustGroup
{
    Info(custTable.CustGroup);
}

forUpdate キーワード

forUpdate キーワードは、更新用にのみレコードを選択します。 基になるデータベースによっては、データベースによって他のユーザーのレコードがロックされる場合があります。 次の例では、AccountNum の値が 2000 であるレコードの更新のために、CustTable テーブルの CreditMax 列を選択します。

ttsBegin;
    CustTable custTable;

    select forUpdate custTable
        where custTable.AccountNum == '2000';
    
    custTable.CreditMax = 5000;
    custTable.update();
ttsCommit;

group by キーワード

group by キーワードは、選択したレコードをフィールドごとにグループ化するようデータベースに指示します。

CustTable custTable;
while select sum(CreditMax) from custTable
    group by CustGroup
{
    info(custTable.CustGroup + ' ' + int642Str(custTable.CreditMax));
}

in キーワード

in キーワードは、値がリスト内にある行をフィルター処理します。

in キーワードを使用しない場合、コードは次の例のようになります。

// This code doesn't use the in keyword.
private CostAmountStdAdjustment calcCostAmountStdAdjustment()
{
    InventSettlement inventSettlement;

    select sum(CostAmountAdjustment) from inventSettlement
        where inventSettlement.TransRecId == this.RecId
            && inventSettlement.Cancelled == NoYes::No
            && (inventSettlement.OperationsPosting == LedgerpostingType::purchStdProfit
                || inventSettlement.OperationsPosting == LedgerpostingType::purchStdLoss
                || inventSettlement.OperationsPosting == LedgerpostingType::InventStdProfit
                || inventSettlement.OperationsPosting == LedgerpostingType::InventStdLoss);

    return inventSettlement.CostAmountAdjustment;
}

in キーワードを使用すると、コードは次の例のようになります。

// This code uses the in keyword.
private CostAmountStdAdjustment calcCostAmountStdAdjustment()
{
    InventSettlement inventSettlement;
    container ledgerPostingTypes = this.ledgerPostingTypesForCostAmountStdAdjustmentCalculation();

    select sum(CostAmountAdjustment) from inventSettlement
        where inventSettlement.TransRecId == this.RecId
            && inventSettlement.Cancelled == NoYes::No
            && inventSettlement.OperationsPosting in ledgerPostingTypes;

    return inventSettlement.CostAmountAdjustment;
}

protected container ledgerPostingTypesForCostAmountStdAdjustmentCalculation()
{
return [
    LedgerPostingType::purchStdProfit,
    LedgerPostingType::PurchStdLoss,
    LedgerPostingType::InventStdProfit,
    LedgerPostingType::InventStdLoss];
}

index キーワード

index キーワードは、 選択 したレコードをインデックスで指定されたとおりに並べ替えるようデータベースに指示します。

CustTable custTable;
while select AccountNum, Value from custTable
    index AccountIdx
{
    Info(custTable.AccountNum +  ": " + int642Str(custTable.RecID));
}

index hint キーワード

インデックス ヒント のキーワードにより、SQL Server は特定のインデックスを使用します。 インデックス ヒント キーワードを使用する場合は、使用するインデックスのコントロールをクエリ オプティマイザーから削除します。 インデックス ヒントが正しくない場合はパフォーマンスに大きな影響を与えます。 インデックス ヒントは、動的な where 句または order by 句がなく、ヒントの効果を確認できる SQL ステートメントにのみ適用します。

クエリで index hint を使用する前に、テーブルで allowIndexHint(true) を呼び出す必要があります。 index hint の既定の動作 false であり、ヒントは無視されます。

警告

インデックス ヒントは、パフォーマンスの向上が確実である場合のみ、慎重にそして注意深く使用してください。 index hint キーワードと API を使用すると、必要なときに正しいヒントを渡すことができます。 疑問がある場合は、index hint の使用を避けてください。

次の例では、 AccountIdx インデックスによって、CustTable テーブルのクエリ内のレコードが並べ替えられます。

str accountNum = '111';
CustTable custTable;
custTable.allowIndexHint(true);

while select forUpdate custTable
    index hint AccountIdx
    where custTable.AccountNum == accountNum
{
}

join キーワード

join キーワードを使用して、両方のテーブルが共有する列のテーブルを結合します。 SQL のような on キーワードがないため、where 句で結合条件を指定します。 このキーワードを使用すると、テーブルをループ処理し、関連テーブル内のトランザクションを更新する場合に必要な SQL ステートメントの数が減ります。 たとえば、テーブル内の 500 のレコードを処理し、別のテーブルで関連するレコードを更新します。 while selectを入れ子構造で使用する場合、データベースへのアクセスが501回発生します。 ただし、 結合を使用する場合は、データベースへのトリップを 1 回だけ行います。

CustTable custTable;
CustGroup custGroup;
int totalCredit;

while select custGroup
    join custTable
    where custGroup.CustGroup == custTable.CustGroup
{
    totalCredit += custTable.CreditMax;
}

maxof キーワード

maxof キーワードは、フィールドの最大値を返します。

CustTable custTable;
select maxof(CreditMax) from custTable;
info(strFmt('%1', custTable.CreditMax));

minof キーワード

minof キーワードは、フィールドの最小値を返します。

CustTable custTable;
select minof(CreditMax) from custTable;
info(strFmt('%1', custTable.CreditMax));

noFetch キーワード

noFetch キーワードは、クエリが今レコードを取得しないことを示します。 通常、 select ステートメントの 結果を別のアプリケーション オブジェクト (実際のフェッチを実行するクエリなど) に渡す場合は、このキーワードを使用します。

次の例では、クエリ変数を作成しますがレコードはフェッチしません。

CustTable custTable;
select noFetch custTable
    order by AccountNum;

一致するレコードは、 の最初の呼び出しが実行されるときにフェッチされます。 この動作は、多数の行を持つテーブルとのロック競合を制限する場合に役立ちます。

notExists キーワード

notExists キーワードは、結合されたテーブルに関連するレコードが存在しないことをチェックします。 一致が存在する場合、レコードは結果から除外されます。 一致が見つからない場合は、そのレコードが結果に含まれます。

CustTable custTable;
CtrTable ctrTable;

while select AccountNum, Value from custTable
    order by AccountNum
    notExists join * from ctrTable
    where (ctrTable.AccountNum == custTable.AccountNum)
{
}

optimisticLock キーワード

optimisticLock キーワードは、ステートメントがテーブルに別の値を設定した場合でも、オプティミスティック コンカレンシー制御を使用してステートメントを実行します。

CustTable custTable;
select optimisticLock custTable
    where custTable.AccountNum > '1000';

order by キーワード

キーワードによる順序は、選択したレコードをリスト順のフィールド並べ替えます。 キーワード by はオプションです。

CustTable custTable;
select * from custTable
    order by accountNum desc
    where custTable.AccountNum > '100';
info("AccountNum: " + custTable.AccountNum);

次の使用例は、 テーブルで最も高い CustTable 値を出力します。

CustTable custTable;
select reverse custTable
    order by accountNum;
info("AccountNum: " + custTable.AccountNum);

outer キーワード

外側のキーワードは、2 番目のテーブルに一致しない行であっても、最初のテーブルのすべての行を返します。 この結合は左外部結合です。 他の結合テーブルの一致する行から取得できないデータの既定値が入力されます。

left キーワードはなく、右外部結合もありません。

内部結合の場合、 on 句でのフィルター処理は where 句でのフィルター処理と同じように機能します。

CustTable custTable;
CustGroup custGroupTable;

while select CustGroup from custGroupTable
    order by CustGroup
    outer join * from custGroupTable
    where custTable.CustGroup == custGroupTable.CustGroup
{
    Info(custTable.CustGroup + ', ' + custGroupTable.Name);
}

次の例では、2 つのテーブルを使用します。 これには、フィールド型とサンプル データが含まれます。 SalesOrder 親テーブルと SalesOrderLine 子テーブルには、一対多リレーションシップがあります。 SalesOrder テーブルの各行に対して、 SalesOrderLine テーブルにはゼロまたはそれ以上の行があります。 SalesOrder テーブルには 2 つの行があります。

SalesOrderID (整数、主キー) DateAdded (日付)
1 2010-01-01
2 2010-02-02

SalesOrderLine テーブルには、 SalesOrderID という名前の外部キー フィールドがあります。 このフィールドは、SalesOrder テーブルの主キー列を参照します。 SalesOrderID2 は、SalesOrderLine テーブルのデータには表示されません。

SalesOrderLineID (文字列、主キー) 数量 (整数) SalesOrderID (整数、外部キー)
AA 32 1
BB 67 1
CC 66 1

次のコードでは、select ステートメントで 2 つのテーブルを読み込みます。 select ステートメントには、左の outer join 句が含まれています。 結合基準とデータ フィルターは両方とも where 句にあります。 コードからの出力も表示されます。 出力の 2 番目のレコードには、値が 2SalesOrderID があります。 ただし、その値は SalesOrderLine テーブルに存在しません。 したがって、2 番目のレコードのフィールドの一部には、整数の場合は 0、文字列の場合は長さゼロの文字列が既定値となります。

SalesOrder recSalesOrder;
SalesOrderLine recSalesOrderLine;
struct struct4 = new struct
    ("int SalesOrderID;"
    + "date DateAdded;"
    + "str SalesOrderLineID;"
    + "int Quantity"
    );
while select *
    from
        recSalesOrder
        outer join recSalesOrderLine
    where
        recSalesOrder.SalesOrderID == recSalesOrderLine.SalesOrderID
        && recSalesOrderLine.Quantity == 66
{
    struct4.value("SalesOrderID", recSalesOrder.SalesOrderID);
    struct4.value("DateAdded", recSalesOrder.DateAdded);
    struct4.value("SalesOrderLineID", recSalesOrderLine.SalesOrderLineID);
    struct4.value("Quantity", recSalesOrderLine.Quantity);
    info(struct4.toString());
}

// Example output:
// (SalesOrderID:1; DateAdded:2010/1/1; SalesOrderLineID:"CC"; Quantity:66)
// (SalesOrderID:2; DateAdded:2010/2/2; SalesOrderLineID:""; Quantity:0)

pessimisticLock キーワード

pessimisticLock キーワードは、テーブルが別の値を使用している場合でも、ペシミスティック コンカレンシー制御を使用してステートメントを強制的に実行します。

CustTable custTable;
select pessimisticLock custTable
    where custTable.AccountNum > '1000';

repeatableRead キーワード

repeatableRead キーワードは、他のトランザクションが現在のトランザクションのロジックで読み取るデータを変更する前に、現在のトランザクションを完了する必要があることを指定します。 明示的なトランザクションは 、ttsAbort または最も外側の ttsCommit で完了します。 スタンドアロンの select 明細書では、トランザクション期間は select コマンドの期間です。 ただし、このキーワードがコードに表示されない場合でも、データベースは時に、個々の選択ステートメントの repeatableRead と同等のものを実施します。 この動作は、データベースがテーブルをスキャンする必要があるかどうかを判断するために使用する方法によって異なります。 詳細については、「基になるリレーショナル データベース製品のドキュメント」を参照してください。

reverse キーワード

reverse キーワードは、逆の順序レコードを返します。

CustTable custTable;
select reverse custTable
    order by AccountNum;

sum キーワード

sum キーワードはフィールドの合計を返します。 これを使用して、すべての勘定、注文明細行などを合計します。

CustTable custTable;
select sum(CreditMax) from custTable;
info(strFmt('%1', custTable.CreditMax));

validTimeState キーワード

validTimeState キーワードは、ValidTimeStateFieldType プロパティが None 以外の値を持つテーブルから行を選択します

CustPackingSlipTransHistory history;
utcDateTime dateFrom, dateTo = DateTimeUtil::utcNow();
anytype recid = -1;

select validTimeState(dateFrom, dateTo) * from history;
recid = history.RecId;

info('RecId:' + int642Str(recid));

where キーワード

where キーワードは、式が true であるテーブルのからの行をフィルタ処理します。

次の例では、 AccountNum 値が 100 を超える顧客を検索します。

CustTable custTable;
select * from custTable
    where custTable.AccountNum > '100';
info("AccountNum: " + custTable.AccountNum);

次の例では、100 より大きい最小の AccountNum 値を出力します。

CustTable custTable;
select * from custTable
    order by accountNum
    where custTable.AccountNum > '100';
info("AccountNum: " + custTable.AccountNum);

次の例では、100 を超える最大 の AccountNum 値を出力します。

CustTable custTable;
select * from custTable
    order by accountNum desc
    where custTable.accountNum > "100";
info("AccountNum: " + custTable.AccountNum);