0

I have a database. In some tables there are columns of type money.

I'd like to use MS Access as a front-end.

But while linking the table in MS Access using postgres odbc driver, the columns of type money all have a value of 0. While trying to update the value an error is shown:

operator does not exist: money = double precision

The datatype in the linked table is NUMBER (FieldSize = DOUBLE)and it cannot be changed to currency.

I do not want to change the datatype in postgres from money to numeric. (But maybe, I have to?)

Hopefully some one can help.

Thanks.

4

3 回答 3

0

不幸的是,我认为最好的方法是将 PostgreSQL 中的列数据类型更改为数字。好消息是您可以在不丢失精度的情况下转换列。

我已经尝试过了,另一种方法是为每个包含货币值的表创建视图,将列转换为数字数据类型。然后,您可以定义更新、插入和删除 INSTEAD OF 触发器以使视图可更新,并将触发器函数中的类型转换为金钱。在这种情况下,PostgreSQL 引擎正在执行转换,而不是 ODBC 驱动程序或 Access。尽管此解决方案有效,但它比仅转换列数据类型更加复杂和脆弱。

上述两种解决方案都将使您的数据表可更新。

顺便说一句,您可以使用CCur(columnname).

于 2013-06-25T00:27:20.567 回答
0

我可以重新创建这个问题(至少部分地),它肯定似乎是 Access 用户界面、Access 数据库引擎和 PostgreSQL ODBC 驱动程序之间的一些奇怪的交互。我有一个名为 [public_table1] 的 Access 链接表,它链接到 PostgreSQL 表

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;

我可以在数据表视图中打开链接表,我确实看到了 [balance] 值,但我无法编辑它们(与您相同的错误)。如果我使用 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 回答