この記事では、Microsoft Dynamics GP の Dexterity から Microsoft SQL Server に日付と時刻を渡す方法について説明します。
適用対象: Microsoft Dynamics GP
元の KB 番号: 929786
はじめに
SQL Server に渡す日付と時刻が、コンピューターの地域設定で指定されている形式と競合しない形式であることを確認します。 これは、Dexterity でパススルー SQL ステートメントまたは Range Where 句を記述する場合、またはストアド プロシージャを呼び出すときに当てはまります。
SQL Server は、次の形式で日付を認識します。
- YYYYMMDD
- MM/DD/YYYY
注意
これらの形式では、YYYY は 4 桁の年を表し、MM は 2 桁の月を表し、DD は 2 桁の日を表します。
SQL Server は、次の形式で時刻を認識します。
- HH:MM:SS (24 時間形式の場合)
- HH:MM:SS XX (12 時間形式の場合)
注意
- これらの形式では、HH は 2 桁の時間を表し、MM は 2 桁の分を表し、SS は 2 桁の秒を表します。
- 12 時間形式で、 XX を AM、 am、 PM、または pm に置き換えます。
str() 関数を使用して、日付または時刻を文字列値に変換できます。 その後、この文字列値が SQL Server に渡されます。 この状況では、コンピューターの地域設定によって、SQL Server に渡される文字列値の形式が決まります。 そのため、次の動作が発生する可能性があります。
コンピューターの地域設定で DD/MM/YYYY 日付形式が指定されている場合、SQL Server に渡される日付は、毎月最初の 12 日間は正しくありません。 さらに、月の残りの各日に、SQL Server によって次の SQL エラー 241 メッセージが生成されます。
文字列から datetime を変換する構文エラー。
12 時間形式と、コンピューターの地域設定で "AM"、"am"、"PM"、または "pm" 以外の省略形が指定されている場合、SQL Server は次の SQL エラー 241 メッセージを生成します。
文字列から datetime を変換する構文エラー。
注記
たとえば、12 時間形式と A.M. または p.m. がコンピューターの地域設定で指定されている場合、SQL Server はこのメッセージを生成します。
Dexterity から SQL Server に日付を渡す
Dexterity から SQL Server に日付を渡すには、str() 関数の代わりに sqlDate 関数を使用します。 sqlDate 関数は Microsoft Dynamics GP に組み込まれています。 日付の書式を設定するには、記述するコードでこの関数を呼び出します。
注記
sqlDate 関数では、SQL Server に日付を渡すときに必要な単一引用符は追加されません。 そのため、単一引用符を使用して関数の結果を囲みます。
Dexterity から SQL Server に時間を渡す
Microsoft は、例示のみを目的としてプログラミング例を提供しており、明示または黙示にかかわらず、いかなる責任も負わないものとします。 これには、商品性または特定の目的への適合性に関する黙示的な保証が含まれますが、これらに限定されません。 この記事は、説明されているプログラミング言語、手順を作成およびデバッグするために使用されているツールに読者が精通していることを前提にしています。 Microsoft のサポート エンジニアが、特定の手順の機能をわかりやすく説明します。 ただし、これらの例を変更して、特定の要件を満たす追加の機能を提供したり、プロシージャを構築したりすることはありません。
Dexterity から SQL Server に時間を渡すには、str() 関数の代わりに作成した関数を使用する必要があります。 Microsoft Dynamics GP には、sqlDate 関数が日付を書式設定する方法で時刻を書式設定する関数がないため、関数を作成する必要があります。
次のコード例では、SQL Server に時間を渡す sqlTime 関数を作成します。
{ Global Function : sqlTime }
function returns string OUT_String;
in time IN_Time;
OUT_String = pad(str(hour(IN_Time)), LEADING, CH_0, 2) + CH_COLON +
pad(str(minute(IN_Time)), LEADING, CH_0, 2) + CH_COLON +
pad(str(second(IN_Time)), LEADING, CH_0, 2);
詳細については、「 Microsoft Great Plains Dexterity で "パススルー" SQL ステートメントと "Range Where" 句を記述する方法を参照してください。