この記事では、Microsoft Dynamics GP Dexterity でパススルー SQL ステートメントと Range Where 句を記述する方法について説明します。
適用対象: Microsoft Dynamics GP
元の KB 番号: 910129
Dexterity でパススルー SQL ステートメントと Range Where 句を記述するときは、Transact SQL コードがすべての地域設定と並べ替え順序と互換性があることを確認します。 また、Microsoft SQL Server に渡されるフィールド値が正しく処理されていることを確認します。 次の方法を使用できます。
Microsoft SQL Server に日付値を渡す場合は、
Dexterity sqlDate()グローバル関数を使用して、日付が YYYYMMDD 形式であることを確認します。Dexterity str()関数を使用する場合、プログラムは地域設定に応じて MM/DD/YYYY 形式または DD/MM/YYYY 形式を使用します。 SQL Server では DD/MM/YYYY 形式は受け入れられません。この形式では、毎月 12 日以降に断続的なエラーが発生する可能性があるためです。注
sqlDate関数では、SQL Server に日付を渡すときに必要な単一引用符は追加されません。 したがって、単一引用符を使用して関数の結果を囲みます。文字列値を SQL Server に渡す場合は、
Dexterity SQL_FormatStrings()グローバル関数を使用して、文字列が単一引用符で囲まれていることを確認します。 文字列に単一引用符が存在する場合は、2 番目の単一引用符を追加して、文字列の早期終了を停止する必要があります。文字列フィールドの最小値と最大値の範囲を選択した場合、Dexterity で使用される最大値が SQL Server の正しい最大値ではない可能性があります。 SQL Server の正しい最大値は、並べ替え順序と SQL Server インスタンスの照合順序によって異なります。 Dexterity fill コマンドを使用すると、プログラムは文字列の長さに ASCII 255 を使用してフィールドを入力します。 ただし、並べ替え順序によっては、ASCII 255 が最大値にならない場合があります。 したがって、where 句は結果を返しません。 ASCII 255 の最大値は ÿ (umlaut の小文字 y) です。 この文字は、一部の SQL 並べ替え順序によって Y として扱われます。 これは、MSSQL で範囲の末尾が Y に設定され、文字 Z で始まるものが範囲に含まれていないことを意味します。 次の Dexterity コードは、
system 9600コマンドを使用してシステムの並べ替え順序の最大文字値を取得する例です。 次に、この値を使用して where 句を作成します。local string l_MaxChar; local integerl_Result,l_Length; system 9600, table SOP_HDR_WORK, l_MaxChar, l_Result; if empty('End Location Code') or filled('End Location Code') then fill 'End Location Code'; l_Length = length('End Location Code'); clear 'End Location Code'; 'End Location Code' = pad('End Location Code', TRAILING, l_MaxChar, l_Length); end if; range table SOP_HDR_WORK where physicalname('Location Code' of table SOP_HDR_WORK) + CH_SPACE + CH_GREATERTHAN + CH_EQUAL + CH_SPACE + SQL_FormatStrings('Start Location Code') + CH_SPACE + SQL_AND + CH_SPACE + physicalname('Location Code' of table SOP_HDR_WORK) + CH_SPACE + CH_LESSTHAN + CH_EQUAL + CH_SPACE + SQL_FormatStrings('End Location Code');