0

データベースがあります。一部のテーブルには、タイプの列がありますmoney

MS Accessフロントエンドとして使いたい。

しかし、postgres odbc ドライバーを使用して MS Access でテーブルをリンクしているときに、money 型の列の値がすべて 0 になっています。値を更新しようとすると、次のエラーが表示されます。

operator does not exist: money = double precision

リンクされたテーブルのデータ型は NUMBER(FieldSize = DOUBLE)で、通貨に変更できません。

postgres のデータ型を money から numeric に変更したくありません。(でも、多分、私はしなければならないのですか?)

うまくいけば、誰かが助けてくれるでしょう。

ありがとう。

4

3 に答える 3

0

問題を (少なくとも部分的に) 再現することができますが、Access ユーザー インターフェイス、Access データベース エンジン、および PostgreSQL ODBC ドライバーの間の奇妙な相互作用であることは間違いないようです。PostgreSQL テーブルにリンクされている [public_table1] という名前の Access リンク テーブルがあります。

CREATE TABLE table1
(
  id serial NOT NULL,
  customer character varying(255),
  balance money,
  CONSTRAINT pk_table1 PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE table1
  OWNER TO postgres;
GRANT ALL ON TABLE table1 TO postgres;
GRANT ALL ON TABLE table1 TO public;

リンクされたテーブルをデータシート ビューで開くことができ、[残高] の値は表示されますが、編集できません (あなたと同じエラー)。Access クエリ ビルダーを使用して、このような更新クエリを作成すると...

UPDATE public_table1 SET public_table1.balance = 2.22
WHERE (((public_table1.[id])=4));

...エラーも発生します。ただし、次の VBA ステートメントは正常に機能します。

Sub pgTest()
CurrentDb.Execute "UPDATE public_table1 SET balance=6.78 WHERE id=4", dbFailOnError
End Sub

したがって、少なくとも私の場合、データシートとバインドされたフォームを使用して PostgreSQL データを表示できましたが、変更はできなかったようです。残念ながら、この制限により、Access をフロントエンドとして使用するメリットが大幅に減少する可能性があります (実行する操作の種類によって異なります)。

于 2013-06-24T14:32:36.817 に答える
0

数値にキャストしてみてください:

# select 2::double precision::money;
ERROR:  cannot cast type double precision to money
LINE 1: select 2.0::double precision::money;
                                    ^
# select 2::double precision::numeric::money;
 money 
-------
 $2.00
(1 row)

# select 2::money::double precision;
ERROR:  cannot cast type money to double precision
LINE 1: select 2::money::double precision;
                       ^
# select 2::money::numeric::double precision;
 float8 
--------
      2
(1 row)
于 2013-06-24T12:36:53.940 に答える