4Dでは、コードをトレースしたり修正したりする二つの方法があります。Duringを使用してトレースや修正を行うか、ON ERR CALLコマンドを呼び出してエラーをキャッチし、適切なアクションを行います。これらの方法を使用して、SQLコード中にある問題を解決することができます。
この例題では、わざと右側の括弧が抜けています。つまりHAVING SUM(Sold_Tickets <:$MinSoldTickets)となるべきところがHAVING SUM(Sold_Tickets <:$MinSoldTicketsとなっています。
ARRAY LONGINT(aSoldTickets;0)
ARRAY INTEGER(aMovieYear;0)
C_LONGINT($MovieYear;$MinSoldTickets)
$MovieYear:=1979
$MinSoldTickets:=10000000
Begin SQL
SELECT Year_of_Movie, SUM(Sold_Tickets)
FROM MOVIES
WHERE Year_of_Movie >= :$MovieYear
GROUP BY Year_of_Movie
HAVING SUM(Sold_Tickets < :$MinSoldTickets
ORDER BY 1
INTO :aMovieYear, :aSoldTickets;
End SQL
以下のウィンドウのとおり、アプリケーションはエラーを検知し、
Afterシンタックスエラーウィンドウを開いて、エラーに関する詳細な情報とエラーの発生場所を提供します。
編集ボタンをクリックすると、エラーが発生したメソッドが開きます。
![](../../picture/148239/pict148239.en.png)
エラーがもっと複雑な場合、アプリケーションはスタック情報を含むさらなる情報を提供します。この情報は詳細ボタンをクリックすると表示されます。
これをテストするには、4D SQL Code Samplesデータベースのメインウィンドウで、Debugging SQL code ボタンをクリックします。
SQLエラーを追跡するもう一つの方法は、ON ERR CALLコマンドを使用することです。
この例題ではSQLコードで発生するエラーをキャッチするために、SQL_Error_Handlerメソッドをエラーハンドラとして使用します。
ARRAY LONGINT(aSoldTickets;0)
ARRAY INTEGER(aMovieYear;0)
C_LONGINT($MovieYear;$MinSoldTickets;MySQL_Error)
$MovieYear:=1979
$MinSoldTickets:=10000000
MySQL_Error:=0
ON ERR CALL("SQL_Error_Handler")
Begin SQL
SELECT Year_of_Movie, SUM(Sold_Tickets)
FROM MOVIES
WHERE Year_of_Movie >= :$MovieYear
GROUP BY Year_of_Movie
HAVING SUM(Sold_Tickets < :$MinSoldTickets
ORDER BY 1
INTO :aMovieYear, :aSoldTickets;
End SQL
&NBSP;
ON ERR CALL("")
If(MySQL_Error#0)
ALERT("SQL Error number: "+String(MySQL_Error))
End if
SQL_Error_Handlerメソッドは以下のようになります:
MySQL_Error:=Error
これをテストするには、4D SQL Code Samplesデータベースのメインウィンドウで、Using ON ERR CALLボタンをクリックします。