3

レコードセット rstImportData("Flat Size") の項目 = Null

それにより、次のステートメントが与えられます。

IIF(IsNull(rstImportData("Flat Size")), Null, cstr(rstImportData("Flat Size")))
Result: Throws error 94: Invalid use of Null

偽の比較で型変換を削除してステートメントを変更すると、次のようになります。

IIF(IsNull(rstImportData("Flat Size")), Null, 0)
Result: Null

最初は Null を返します。IIF テストに合格したとしても、渡された値が null である必要がある場合、IIF で型変換を実行できないようです。それでも、真と偽の両方の答えで評価しようとします。このように IIF を使用している唯一の理由は、インポートからのデータをデータベース内の一致するレコードと比較して、履歴の前に追加する必要があるかどうかを確認するための 25 行の比較があるためです。

何かご意見は?データがインポートされる方法にはnullの日付があり、スプレッドシートのインポートが文字列形式の場合、値を適切に比較するためにどちらか一方を他方に変換する必要がありますが、どちらかの側がnullの場合、この例外が発生します:(

編集 IIF を使用していた理由の例 (およびユニバーサル関数の使用を検討している)

If master("one") <> import("one") Or _
   master("two") <> import("two") Or _
   master("date") <> import("date") Or _  //import("date") comes from a spreadsheet, it comes in as string, CAN be a null value
   master("qty") <> import("qty") Or _    //import("qty") comes from spreadsheet, comes in as a string can CAN be null
   master("etc") <> import("etc") Then

....stuff....

End If

このコードは、データベースで比較するために約 20 列に展開されます。声明の一部として確認したいと思います。たくさんの解決策を思いつくことができますが、それらにはさらに多くのコードを追加する必要があります。ならば力だが、俺はそう簡単に屈服する者ではない。

私が見るオプションは

  • 一時変数を作成して、レコードセットの代わりにこれらの新しい変数を比較して使用する前に作業を行う
  • レコードを渡して事前フォーマットして操作するオブジェクトを作成します。ただし、同様のフィールドを持つ異なるファイルがあるため、追加の作業により各インポート タイプにこの機能が提供されます。

私はアイデアを得るためにここにいます。最も再利用可能なアプローチを探しています。

4

2 に答える 2

3

値を文字列に変更するという単純な方法は、非常に役立ちます。トリックは、NULL である文字列をトリミングすると、NULL 文字列が取得されることです。これは、データベースの null ではないかのように操作できます。
私はよく次のフォームを使用します。

CInt("0" & Trim(SomeVariant & " "))

たくさんのハイジンクを通過することなく有効な番号を取得するには。null は、この問題の非実体です。

于 2010-04-30T23:42:32.757 に答える
3

あなたが説明した動作は、 IIf が VBA で動作する標準的な方法です。これは、Access 2003 ヘルプに記載されている内容の一部です。

" IIfはtruepartfalsepartの一方のみを返しますが、常に両方を評価します。このため、望ましくない副作用に注意する必要があります。たとえば、falsepartを評価するとゼロ除算エラーが発生する場合、exprです。」

ただし、クエリで IIf ステートメントを使用すると、 exprTrue のときにtruepartの後で評価が短絡します。その場合、 falsepartは評価されません残念ながら、この情報は役に立ちません...比較にクエリを組み込むことができない限り。

IIf でエラーを回避する他の方法を知りません。比較対象のテーブルと構造が一致するテーブルに Excel データを追加してみます。これにより、比較と同時に文字列変換を行う必要がなくなります。

于 2010-04-30T23:03:36.327 に答える