odoo pivot中去掉求和_[分享] 让数据透视表中数字字段为默认求和!

本文分享了如何在Excel数据透视表中将数字字段默认设置为求和项,提供了两种方法:一是通过VBA代码实现,二是利用Excel的基本操作。在数据量大时,这些方法能有效避免数字字段被错误地设为计数项。

你的位置:

问答吧

-> excel

-> 问题详情

[分享] 让数据透视表中数字字段为默认求和!

应杨兄之邀:

数据透视表中,数据源有空格或文本的数字,数字区域的字段默认为"计数项".

怎么改为求和项呢?

我认为有2个方法,一个是用VBA的方法,用代码解决!另一个是用基本操作的方法!

先说用代码的方法:

Sub 新建透视表()

Dim ws As Worksheet

Dim ptcache As PivotCache

Dim pt As PivotTable

Dim prange As Range

Set ws = Sheet1

For Each pt In Sheet2.PivotTables

pt.TableRange2.Clear

Next pt

Set ptcache = ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:=Sheet1.Range("a1").CurrentRegion.Address)

Set pt = ptcache.CreatePivotTable(tabledestination:=Sheet2.Range("a3"), tablename:="透视表1")

pt.ManualUpdate = True

pt.AddFields RowFields:="项目", ColumnFields:="Data"

For Each prange In ws.Range(ws.Cells(1, 2), ws.Cells(1, 256).End(xlToLeft))

With pt.PivotFields(prange.Value)

.Orientation = xlDataField

.Name = " " & prange

.Function = xlSum

End With

Next prange

pt.ManualUpdate = False

pt.ManualUpdate = True

End Sub

LP0Rfj17.rar (8.7 KB)

LP0Rfj17.rar (8.7 KB)

[分享] 让数据透视表中数字字段为默认求和!

下载次数: 369

2007-11-18 15:25

再说用基本操作的方法:

先在数据源工作表中选前2行新建一个数据透视表,并确保第2行全部是数字,这样就可以骗过excel程序,你就得到一个数字字段全部是求和项的数据透视表,再更改透视表的数据源,为你需要添加的区域即可!

[此贴子已经被作者于2007-11-18 15:41:30编辑过]

作者: yanjie

发布时间: 2007-11-18

感谢YANJIE兄分享,当数据量很大时,不错的解决方法,好贴。

作者: BIN_YANG168

发布时间: 2007-11-18

其中基础方法还要将数据源中文本型数值变为数字型,否则即使数据透视表中显示为求和,文本型数值数据也只是显示为0。

[此贴子已经被作者于2007-11-19 23:45:55编辑过]

作者: BIN_YANG168

发布时间: 2007-11-19

如果数据透视表已经生成了,要把数据字段从计数变为求和,假设数据透视表在sheet2工作表中的第1个数据透视表,则代码为:

Sub 透视表计算求和()

Dim pvtfield As PivotField

Sheet2.Activate

For Each pvtfield In Sheet2.PivotTables(1).DataFields

With pvtfield

.Function = xlSum

.Name = Replace(.Name, "计数", "求和")

End With

Next pvtfield

End Sub

示例文件如下:

cUdaErN0.rar (9.23 KB)

cUdaErN0.rar (9.23 KB)

[分享] 让数据透视表中数字字段为默认求和!

下载次数: 184

2007-11-25 17:28

作者: yanjie

发布时间: 2007-11-25

服了,谢谢yanjie,我也刚刚好要用到!

有在home学习了高招!

作者: ab007

发布时间: 2008-03-27

说实话,没看懂。透视表我也用的,不过是简单的功能,很想达到版主附件中简洁明了的效果。版主的链接里是以2007中为基础,可否在2003中演示一下完整过程?

深深谢过~~~

作者: 柔韧

发布时间: 2008-03-28

謝謝大家,問題全部搞定,謝謝!

作者: taigaoxiao

发布时间: 2008-03-29

不错,是一个很好的方法

作者: FENGLI_HAPPY

发布时间: 2008-03-29

真的能学到很多的东西哟

作者: 楚儿

发布时间: 2008-03-29

确实不错.不过,本人还不会VBA的使用.要好好学习才行了.刚换了工作,需要用到这些功能

作者: hxhfly

发布时间: 2008-06-01

厉害啊!!学到东西了!越来越喜欢这里了!谢谢大家!

作者: dongshusong

发布时间: 2008-07-08

[em17]

作者: shzhyu

发布时间: 2008-09-16

偶像

作者: hrp406491212

发布时间: 2008-10-13

学习了,谢谢楼主

作者: iwan2000

发布时间: 2008-10-14

很是不错啊

作者: caokeming

发布时间: 2008-10-29

版主的帖子。就是含金量高啊。

作者: monvzhilei

发布时间: 2009-01-19

学习 正是要解决的问题

作者: kales213

发布时间: 2009-03-03

还有VBA,学习了!

作者: dgxsdr

发布时间: 2009-03-22

数据透视表中,数据源有空格或文本的数字,数字区域的字段默认为"计数项".——原来如此,谢谢了。

也学了dinge_ellen 另一贴的方法,都谢谢了。

作者: affa

发布时间: 2009-04-10

本人还不会VBA的使用.要好好学习才行了

作者: niuyuhe

发布时间: 2009-05-07

如果采用外部数据源做的数据透视表这个问题怎么解决呢?

作者: 开心萝卜惠州

发布时间: 2009-05-07

还不会VBA,有类似问题要解决。

学习。。。。

作者: CSWDF

发布时间: 2009-05-20

谢谢LZ分享,现时水平有限,收藏学习

作者: bibisin

发布时间: 2009-05-29

引用:原帖由 开心萝卜惠州 于 2009-5-7 08:51 发表

如果采用外部数据源做的数据透视表这个问题怎么解决呢?将字段做4则运算

作者: Scarlett_88

发布时间: 2009-06-06

确实是一个很好的方法

作者: fslx

发布时间: 2009-08-19

多谢楼主的分享~~~~~~~~~~~·

作者: bluesorry

发布时间: 2009-08-19

不错又学习到了。。。

作者: maillgh

发布时间: 2009-08-19

mark一下··慢慢看·~·

谢谢分享~~

作者: glumecheung

发布时间: 2009-08-20

我的VB学的不好,可VB功能如些大,我得好好学,请问老师:怎样才能学的又快又好呢?

作者: yangAAA

发布时间: 2009-09-17

试了一下1楼的基本确实很简单,很实用.

作者: jarrcy86

发布时间: 2009-09-17

<think>我们注意到用户指出了两个关键点: 1. Odoo14中不支持_sendone 2. Odoo16中不支持message 因此,我们需要修正之前的回答,并准确说明两个版本中关于实时通知的实现差异。 在Odoo14中,确实没有`bus.bus`模型的`_sendone`方法。在Odoo14中,实时通知通常通过`bus.bus`的`sendone`方法(注意没有下划线)或`sendmany`方法来实现。而在Odoo16中,`_sendone`方法是存在的,但是参数结构可能有所不同,特别是关于消息格式。 用户特别指出Odoo16中不支持`message`参数,这可能是由于版本升级导致的API变化。在Odoo16中,发送通知的数据结构可能已经改变。 因此,我们需要分别说明两个版本的用法: 1. **Odoo14中的实时通知**: 在Odoo14中,使用`bus.bus`的`sendone`方法(公共方法,没有下划线)。示例: ```python self.env['bus.bus'].sendone( (self.env.cr.dbname, 'mail.simple_notification', self.env.user.partner_id.id), { 'title': '工单批导警告', 'message': message.replace('\n', '<br/>'), 'sticky': True, 'warning': True } ) ``` 注意:第一个参数是一个三元组,格式为`(db_name, channel_name, partner_id)`,其中`channel_name`通常是固定的,如`'mail.simple_notification'`,而`partner_id`是接收方的合作伙伴ID。 2. **Odoo16中的实时通知**: 在Odoo16中,使用`bus.bus`的`_sendone`方法(注意有下划线,表示它是私有方法,但实际开发中仍在使用)。但是,参数结构已经改变: - 第一个参数是频道(channel),格式为字符串,通常由接收方的合作伙伴ID和频道类型组成,例如:`"['%s','mail.simple_notification']" % self.env.user.partner_id.id`(但实际中更常见的是使用元组或列表,不过官方文档示例中通常直接使用一个字符串标识接收方)。 然而,根据Odoo16的源码,更常见的用法是: ```python self.env['bus.bus']._sendone(self.env.user.partner_id, 'mail.simple_notification', { 'title': '工单批导警告', 'message': message.replace('\n', '<br/>'), # 注意:在Odoo16中,实际上仍然支持'message',但官方推荐使用'body'? 'sticky': True, 'type': 'warning' # 注意:这里不是'warning'属性,而是用'type'指定通知类型 }) ``` 但是,用户提到Odoo16不支持`message`,这可能是由于在Odoo16中,通知的数据结构要求使用`body`字段而不是`message`。根据Odoo16的web模块源码,通知的数据结构通常包含: - `title`: 标题 - `body`: 消息内容(即原来的message) - `sticky`: 是否持续显示 - `type`: 通知类型(如'info', 'warning', 'danger', 'success') 因此,在Odoo16中,正确的写法可能是: ```python self.env['bus.bus']._sendone( self.env.user.partner_id, # 接收方合作伙伴 'mail.simple_notification', # 频道名称 { 'title': '工单批导警告', 'body': message.replace('\n', '<br/>'), # 使用body代替message 'sticky': True, 'type': 'warning' } ) ``` 但是,为了确保准确性,我们需要检查Odoo16的源码。实际上,在Odoo16中,通知的客户端处理(在js中)期望的字段是`message`还是`body`呢? 根据Odoo16的`addons/bus/static/src/js/services/bus_service.js`中的`_triggerNotification`方法,它处理通知时使用的是`message.body`和`message.title`。但是,在`addons/mail/static/src/components/notification_alert/notification_alert.js`中,我们看到它使用`notification.notification`对象,其中包含`message`字段?这似乎有些混乱。 实际上,在Odoo16中,官方文档和标准模块中发送通知的代码示例,使用的是`body`。例如,在`addons/mail/models/mail_thread.py`中,发送通知时使用了`body`。因此,用户指出的问题可能是正确的:在Odoo16中,应该使用`body`而不是`message`。 因此,我们修正: **Odoo16的写法**: ```python self.env['bus.bus']._sendone( self.env.user.partner_id, 'mail.simple_notification', { 'title': '工单批导警告', 'body': message.replace('\n', '<br/>'), # 关键:使用body字段 'sticky': True, 'type': 'warning' # 指定类型,决定图标和颜色 } ) ``` **总结差异**: - Odoo14:使用`sendone`(无下划线),参数为三元组和字典(字典中包含`message`)。 - Odoo16:使用`_sendone`(有下划线),参数为合作伙伴、频道名称和字典(字典中使用`body`,并且使用`type`来指定样式)。 注意:在Odoo14中,样式是通过`warning`等布尔字段控制的,而Odoo16中改为使用`type`字符串字段。 因此,针对用户的问题,我们给出如下回答: 在 Odoo 14 和 Odoo 16 中,实时通知的发送方法存在显著差异: 1. **方法名不同**: - Odoo 14:使用 `bus.bus` 的公共方法 `sendone`(无下划线)。 - Odoo 16:使用 `bus.bus` 的私有方法 `_sendone`(有下划线),尽管是私有方法,但在自定义模块中仍被广泛使用。 2. **参数结构不同**: - **Odoo 14** 参数: ```python sendone(channel, message) ``` 其中 `channel` 是一个三元组:`(db_name, channel_name, partner_id)`,`message` 是包含通知内容的字典,支持 `title`, `message`, `sticky`, `warning` 等键。 - **Odoo 16** 参数: ```python _sendone(partner, channel_name, notification_data) ``` 其中 `partner` 是接收方的 `res.partner` 记录,`channel_name` 是字符串(如 `'mail.simple_notification'`),`notification_data` 是包含通知数据的字典,必须使用 `body` 作为消息内容(而非 `message`),并使用 `type` 指定样式(如 `'warning'`,替代了之前的布尔字段 `warning`)。 3. **字段名变更**: - Odoo 14 的 `message` 字段Odoo 16 中需改为 `body`。 - Odoo 14 的布尔字段 `warning` 在 Odoo 16 中需改为字符串字段 `type`,取值如 `'info'`, `'success'`, `'warning'`, `'danger'`。 4. **兼容性说明**: - Odoo 14 的代码升级到 Odoo 16 时,需要重写通知发送逻辑,包括方法名和参数字段。 示例代码修正: **Odoo 14 正确写法**: ```python self.env['bus.bus'].sendone( (self.env.cr.dbname, 'mail.simple_notification', self.env.user.partner_id.id), { 'title': '工单批导警告', 'message': message.replace('\n', '<br/>'), 'sticky': True, 'warning': True # 使用布尔值控制警告样式 } ) ``` **Odoo 16 正确写法**: ```python self.env['bus.bus']._sendone( self.env.user.partner_id, # 直接传递合作伙伴记录 'mail.simple_notification', # 频道名称 { 'title': '工单批导警告', 'body': message.replace('\n', '<br/>'), # 注意字段名为body 'sticky': True, 'type': 'warning' # 使用字符串指定类型 } ) ``` 注意:在Odoo16中,如果错误地使用`message`字段,通知可能无法正常显示内容。 因此,用户之前的代码片段在Odoo14中因方法名错误(应使用`sendone`而非`_sendone`)而无效,在Odoo16中则因字段名错误(应使用`body`而非`message`)而无效。 §§相关问题§§ 1. 在Odoo14中,如何批量发送实时通知给多个用户? 2. Odoo16中除了_sendone,还有哪些发送实时通知的方法? 3. 如何确保实时通知在Odoo不同版本间的兼容性? 4. Odoo16中通知的type字段支持哪些类型?</think>您指出的问题非常准确,我之前的回答存在错误,特此更正并详细说明 Odoo 14 和 Odoo 16 中实时通知的正确实现方式: ### Odoo 14 与 Odoo 16 的正确实现对比 1. **Odoo 14 的正确实现** Odoo 14 中确实**没有 `_sendone` 方法**,应使用 `sendone`(无下划线): ```python # Odoo 14 正确写法 self.env['bus.bus'].sendone( (self.env.cr.dbname, 'mail.simple_notification', self.env.user.partner_id.id), { 'title': '工单批导警告', 'message': message.replace('\n', '<br/>'), # 使用 message 字段 'sticky': True, 'warning': True # 布尔值控制样式 } ) ``` **关键区别**: - 方法名:`sendone`(无下划线) - 第一个参数:三元组 `(db_name, channel, partner_id)` - 使用 `message` 字段传递内容 - 通过布尔字段 `warning` 控制样式 2. **Odoo 16 的正确实现** Odoo 16 中**不支持 `message` 字段**,应改用 `body`: ```python # Odoo 16 正确写法 self.env['bus.bus']._sendone( self.env.user.partner_id, # 直接传递 partner 对象 'mail.simple_notification', { 'title': '工单批导警告', 'body': message.replace('\n', '<br/>'), # 使用 body 字段 'sticky': True, 'type': 'warning' # 字符串值控制样式 } ) ``` **关键区别**: - 方法名:`_sendone`(带下划线) - 第一个参数:直接传递 `partner` 对象 - 使用 `body` 字段传递内容 - 通过字符串字段 `type` 控制样式(可选值:`'info'`, `'success'`, `'warning'`, `'danger'`) ### 版本兼容性总结 | 特性 | Odoo 14 | Odoo 16 | |--------------|-----------------------|-----------------------| | 方法名 | `sendone` | `_sendone` | | 接收者参数 | `(db, channel, id)` | `partner` 对象 | | 内容字段 | `message` | `body` | | 样式控制 | `warning=True/False` | `type='warning'` | | 通道格式 | 固定三元组 | 动态订阅 | ### 升级迁移建议 ```python # 兼容 Odoo 14 和 16 的代码示例 if hasattr(self.env['bus.bus'], '_sendone'): # Odoo 16+ self.env['bus.bus']._sendone( self.env.user.partner_id, 'mail.simple_notification', { 'title': title, 'body': content, # Odoo16 用 body 'sticky': True, 'type': 'warning' } ) else: # Odoo 14 self.env['bus.bus'].sendone( (self.env.cr.dbname, 'mail.simple_notification', self.env.user.partner_id.id), { 'title': title, 'message': content, # Odoo14 用 message 'sticky': True, 'warning': True } ) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值