首先,让我们看一下一个 总体情况 的内容。 甲骨文BRM 账单 这个过程是这样的:
- 汇编过去一个月内发生的余额影响的总金额。这可以包括使用费和订阅费。
- 将与账单相关的所有账单项目的状态从待定改为开放,这样它们就不再累积费用,而且可以对它们进行支付。此外,账单上还增加了一个付款截止日期。
- 自动向信用卡处理器请求付款,或通过发送发票请求付款。
- 当付款被记录在BRM数据库中时,自动更新客户的账户余额。
那么,所有这些在实践中是如何做到的呢?
在生产中运行brm计费之前,有必要执行所有的先决步骤。第一步是准备一个生产环境的副本--这可以是预生产环境或一些测试环境。这个步骤包括在这个环境中安装最新的生产版本,并复制生产数据库。接下来,环境配置必须反映生产环境的配置。这里是主要的配置,应该进行适当的设置:
- 厘米 配置($HOME/pin/sys/cm/pin.conf)、
o 确认日志级别条目被设置为1
o 将agent_return参数的条目改为0。
o 将参数simulate_agent的条目改为1。
最后这两个变化是为了在账单运行期间不涉及任何供应行动。
- dm_oracle 配置($HOME/pin/sys/dm_oracle/pin.conf)、
o 设置dm_bigsize参数为8388608或更高。
o 设置dm_shmsize参数为33554432或更高。
o 设置dm_n_fe为8
o 设置dm_max_per_fe为16
o 设置dm_n_be为24
o 设置dm_trans_be_max为22
- 帐单_帐单_帐单 配置($HOME/pin/apps/pin_billd/pin.conf)、
o 核实日志级别。根据账单测试期间需要检查的内容,将其改为适当的值,可以是1或3。
o 将pin_billd和pin_mta的儿童参数改为5。
o 将pin_billd和pin_mta的per_batch参数改为20000。
o 将pin_billd和pin_mta的fetch_size参数改为150000。
- 钉子_inv_accts 配置($HOME/pin/apps/pin_inv/pin.conf)、
o 核实日志级别。根据账单测试期间需要检查的内容,将其改为适当的值,可以是1或3。
o 将pin_billd和pin_mta的儿童参数改为5。
o 将pin_billd和pin_mta的per_batch参数改为2000。
o 将pin_billd和pin_mta的fetch_size参数改为15000。
为了获得最佳的生产模拟,billrun pin_virtual_time必须设置为在生产中执行真实billrun的日期。一旦这样做了,就可以启动账单运行了。
我们每月用pin_bill_day脚本运行账单,每小时创建大约100.000张账单。该脚本为那些账单日期在我们运行账单的当天午夜之前的任何一天的账户创建账单。那么,pin_billd_day脚本究竟是干什么的呢?它运行下列账单工具:
- pin_deferred_act:执行延迟行动;例如,如果一个账户应该变得不活跃,这个工具在预定日期执行状态变化。
- pin_bill_accts:计算账户的应收余额,并为应收余额创建一个账单。
- pin_collect:为使用信用卡和直接借记支付方式的账户收取应付的余额。
- pin_refund:查找有退款项目的账户并进行在线退款交易。
- pin_inv_accts:为每个开票的账户创建一个发票。
- pin_cycle_fees:将周期性费用余额影响应用于客户的账户,并取消有过期待取消日期的产品。
为了验证pin_bill_day脚本的进度和性能,我们对数据库进行查询,以获得关于有多少账单已经完成,有多少尚未完成,是否有错误的账单等信息。
在brm计费部分结束后,所有的账单都创建完毕,开始开具发票。发票创建后,它们被导出为XML文件,然后被转换成PDF格式。
除了前面提到的查询外,还有其他一些查询需要在开票结束后执行,以验证这一过程所产生的数据的准确性。我们执行一批查询;以下是其中的一些:
- 计费失败了吗?
select * from billinfo_t where billing_state = 4 and bill_info_id' Bill Unit(1)';
-预期的结果:没有找到行
- 是否有任何未开票的账户?
select poid_id0, first_name,last_name,a.status from account_t a, account_nameinfo_t an where
a.poid_id0=an.obj_id0并且
创建_t<和
不存在(选择b.account_obj_id0 from bill_t b
其中end_t=和
b.account_obj_id0=a.poid_id0);
-预期的结果:没有找到行
- 是否有任何没有法案编号的法案?
select * from bill_t where end_t= and bill_no is null;
- 预期的:没有找到行
任何发现的问题都会通过版本控制系统进行调查和修正,修正后的版本会被纳入下一个发布版本。
你好、
我想知道,你使用的是哪个平台?支持这种实现方式的硬件尺寸是多少?
注意到。
嗨,阿亚祖尔、
我们的客户使用两台HP-UX Intanium服务器。
BRM服务器:
- 2 x HP Integrity RX6600
- 4 x Intel Itanium双核1.8 GHz
- 64GB内存
- HP UX B.11.23 64位
- 多个Gbit ETH和4Gb FC
BRM数据库服务器:
- 2 x IBM x36502
- 2x英特尔至强双核3.16 GHz
- 48GB内存;Red Hat Enterprise Linux 4(Nahant Update 8)。
- 分配的4TB磁盘存储空间
- 多个Gbit ETH和4Gb FC
- Oracle 10.2 EE RAC数据库
自动存储管理用于活动/待机模式下的BRM
二级BRM备用db RAC节点,用于调解、报告和其他目的
储存:
- 1 x HP XP 24000
- 用于BRM数据库ASM管理的专用磁盘
- 64 GB高速缓存4 Gbit FC带宽用于BRM数据库
最好的问候、
阿莱
你能澄清我在oracle brm中的疑惑吗?在同一账户中计费后,有些计划被录入,有些没有,如果有任何标志或一些其他字段数据被遗漏,它是如何发生的,如果这样的话,让我知道类别和字段类型 ........ 我们使用pin_bill_day进行计费 .......。
嗨,阿比拉米
可能有许多不同的原因导致一些交易、计划或产品在开票后不活跃。
计费脚本运行一个或多个计费工具,pin_bill_day运行以下计费工具:
* 递延的行动(pin_deferred_act
* pin_bill_accts
* Pin_collect
* pin_refund
* pin_inv_accts
* pin_deposit
* 销钉周期费用
你可以自定义pin_bill_day,指定运行哪些计费工具,并为每个计费工具设置参数,指定如何运行它们。
默认情况下,pin_deferred_act工具包含在pin_bill_day脚本中,用于执行推迟的行动。例如,如果CSR安排一个账户变得不活跃,pin_deferred_act工具会在预定日期执行状态改变。这应该是一些计划在你做完账单后变得不活跃的最常见原因。
第二个原因可能是运行了pin_cycle_fees工具,这个工具也包含在pin_bill_day脚本中。 pin_cycle_fees工具取消了有过期待取消日期的产品。例如,如果一个产品被设定为在未来某个日期取消,pin_cycle_fees工具会取消该产品。
正如我提到的,你可以为每个计费工具设置参数,以指定如何运行它们以及它们将执行什么动作。我建议你首先注意指定某些计划应该取消的日期,cycle_end_t(周期结束时间)和purchase_end_t(购买结束时间)是在你激活某些计划时设置的,它们在你运行计费时触发状态变化(在你的例子中为非活动)。
我希望我的回答对你有用,要想得到更详细的解释,我需要更多关于账户(计划)变得不活跃和关于计费工具配置的具体信息。
最好的问候,Ales Cvetic
嗨、
我这里有一个问题。在我的数据库中,有三种类型的产品--循环向前,一次性,循环欠款。循环拖欠的产品只是包括在产品列表中。然而,当我在下个月1日运行pin_bill_day时,系统中产生了两个重复的事件。结果,两行相同的字反映在发票上,产生的发票是双倍的金额。经过初步分析,我发现由于pin_bill_day的两个可执行文件,循环欠款产品出现重复的行。一个是pin_bill_accts,另一个是pin_cycle_fees。
所以,你能不能让我知道任何方法,以便我可以过滤周期拖欠的产品费用计算在pin_cycle_fees上执行的pin_bill_day of 1st of the next month。渴望从你那里知道或让我知道,如果需要进一步澄清。
注意到、
萨扬
你好、
我是Oracle BRM的新手,想学习它。请你帮助我从哪里开始。网上是否有任何相关的文件。
你好、
你可以尝试在互联网上搜索。你应该能找到一些YouTube视频;此外,你应该能找到一些Oracle BRM的文件。作为Oracle的金牌合作伙伴,我们有Oracle通信计费和收入管理(缩写为Oracle BRM、 OBRM、 OCBRM)书籍。我建议你从Oracle BRM精华版开始,然后根据你的需要继续学习(OCBRM开发、OCBRM管道开发、OCBRM定价、OBRM管理,等等)。
注意到、
阿莱
谢谢Ales,感谢你的建议。
我有一个关于 "缺乏前向循环 "的问题(日志中最多的错误是 "proto/hostname/port的错误解析"),我们再次发现存在几个 "缺乏前向循环 "的情况。
不再检测到""proto/hostname/port解析不良 "的错误。
为什么会发生这种情况?
能否请你给出这个问题的解决方案?
嗨,伙计们、
我有一个问题。这是关于延迟计费的问题。启用延迟计费会有什么影响?
目前,我们正面临着帐单运行的问题,因为我们必须运行两次帐单,部分帐单和最终的帐单,所以它的性能大大降低。到现在为止,完成第一阶段需要2天以上的时间,在数据库层面追踪到的问题是TX--通过这个语句 "select poid_DB, poid_ID0, poid_TYPE, poid_REV from bal_grp_t where bal_grp_t.billinfo_obj_ID0 = :1 order by bal_grp_t.poid_id0 for update of bal_grp_t.poid_id0",也是db文件顺序读取。
也许你能提供与这个问题有关的建议。
注意到。
嗨,Ayazul!
延迟计费基本上使你能对比你创建账单的账单周期更早的事件进行计费。如果你收到需要计费的事件,但这些事件是在已经完成计费运行的计费周期内发生的,你就可以使用它。例如,提供国际漫游的移动运营商可能会在事件/电话完成后30天内收到事件,因此他们需要对 "旧 "事件进行计费。
关于你的帐单性能问题和提到的SQL语句,这个TX - bal_grp_t上的行锁争用只是症状,不是问题的原因。上述SQL语句在BRM中被用作交易中的主要锁定机制。BRM默认情况下不会锁定所有在交易中被修改的对象。相反,它只是锁定被修改对象的账户的余额组。例如,在帐单运行过程中,或在收取事件的操作过程中。
这个行锁争夺只是向你表明,账户上的操作/交易还没有完成,另一个操作/交易已经开始了,并且正在请求同一个对象的锁,当然是在等待第一个操作完成它的工作,通过提交或回滚完成它的交易。
要诊断账单运行期间的缓慢SQL操作,只需使用Oracle数据库企业管理器,进入性能,顶级活动部分,观察当时运行的顶级SQL语句。注意那些消耗大量I/O或过多CPU的语句,它们可以成为调整的候选对象。有时,SQL优化器所使用的数据库统计数据已经过时,优化器选择了次优的计划。有时你需要建立一个新的索引,或者改变SQL语句,如果你正在做一些自定义的非开箱即用的计费程序。
由于你的里程可能不同,仅仅通过这个博客很难诊断出你的性能问题。有时,问题的根源在于更深层次,比如糟糕的架构设计、自定义代码、糟糕的数据库服务器(例如,没有足够的磁盘主轴用于数据库,因为在现代,IT销售人员只喜欢销售TB而忘记了IOPS)。
最好的问候、
奥格尼恩-安托尼奇
你好、
Pin_billd和Pin_bill_accts的功能有什么不同?它们的输入参数是什么?
需要知道balance_group和item以及event之间的区别?
你好、
目前的余额 "bal_sub_bals_t "表没有反映在客户中心的余额标签中。问题是什么?如何解决这个问题。请帮助。
我有一个客户取消了他们的订阅,我应该给他们退款,但他们的信用卡已经过期,所以我无法处理,它每个月都会出现在我的差异中,所以我应该做什么来解决这个问题,除了说给客户更新信用卡?
你好:在一个较早的帖子中(2011年10月28日,管理员),提到了Oracle金牌合作伙伴的Oracle BRM精华书。 能否请您提供更多信息,说明如何获得这些书籍? 这些书是由你还是Oracle出售的? 谢谢。
账单和发票总是以单一模式运行,因此per_batch值并不重要。
你好、
我想知道,在BRM中,一个账户可以生成多少张账单,是否有任何限制。
如果是的话,请让我们知道我们可以在哪里检查。
尊敬的各位领导
基本上没有任何限制,每个账户可以有很多账单。为了达到这个目的,你需要创建更多的余额组,并将每个余额组分配给新创建的账单单元(/billinfo)。
要了解更多信息,请阅读 http://ow.ly/TKGc308tB9F
嗨,拉纳、
我不同意帐单和发票总是以单一模式运行的说法。Per_batch属性
指定每个工作线程在批处理模式下处理的对象的数量。
如果要在更多的线程中运行,你需要将儿童属性设置为2或更多。
Children属性指定了为执行指定工作而产生的工作线程的数量。默认为5。
该例子显示了有10个线程的配置。
- pin_mta 儿童 10
- pin_mta per_batch 600
- 销路_mta每步1500
- pin_mta fetch_size 6000
谢谢、
伊戈尔
大家好、
你如何核实账单和发票?
你如何验证所有的票据都已创建?
你如何验证所有的发票都已创建?
谢谢、
卡尔
除了验证pin_bill_accts和pin_inv_accts实用程序运行的进度、性能和完成情况的查询外,还有一组查询可以在计费和开票完成后执行,以验证这些程序生成的数据的准确性。这些查询包括以下内容:
- 事件和项目之间有什么区别吗?
选择 i.account_obj_id0,i.poid_id0,i.name,item_total,sum(amount),sum(mount)-item_total
from event_bal_impacts_t eb,item_t i
where eb.item_obj_id0=i.poid_0
and i.bill_obj_id0 in (select poid_id0 from bill_t where start_t=)
和eb.resource_id=978
group by i.account_obj_id0,i.poid_id0,name, item_total
有sum(金额)-item_total0
按sum(amount)-item_total排序;
-预期:没有找到行
约翰
你如何应对Oracle BRM中的绩效挑战?
帕特里克
你好、
通过执行以下Oracle BRM MTA计费实用程序,得到以下错误:
[pin_billd]$ pin_bill_accts -v
pin_bill_accts:符号查找错误:pin_bill_accts:未定义的符号:
pcm_set_multithread
[pin_billd]$ pin_collect
pin_collect:符号查找错误:pin_collect:未定义的符号:
pcm_set_multithread
[ pin_billd]$ pin_inv_accts
pin_inv_accts:符号查找错误:pin_inv_accts:未定义的符号:
pcm_set_multithread
请帮助
我已经有一段时间没有发表我的最后一篇文章了。让我来分享一些SQL查询,这可能会对任何Oracle BRM操作者有所帮助。由于博客的安全限制,你必须把SLT改为select。
- 是否有任何账户有项目而没有账单?;
SLT a.poid_id0,first_name,last_name,a.status
from account_t a,account_nameinfo_t an
where an.obj_id0=a.poid_0
并不存在(SLT 1 from bill_t b
where bill_no is not null
和end_t=
和b.account_obj_id0=a.poid_0)
并存在(SLT 1 from item_t i
where a.poid_id0=i.account_obj_id0
和effective_t=
-而且 item_no 不是空的
和 item_total!=0.00)
和a.created_t<
- 预期的:没有找到行
- 还有一种方法;
SLT a.poid_id0,first_name,last_name,a.status
from account_t a,account_nameinfo_t an
where an.obj_id0=a.poid_0
并不存在(SLT 1 from bill_t b
where bill_no is not null
和end_t=
和b.account_obj_id0=a.poid_0)
并存在(SLT 1 from item_t i,billinfo_t bi
where a.poid_id0=i.account_obj_id0
和i.account_obj_id0=bi.account_obj_id0
和i.bill_obj_id0=bi.last_bill_obj_id0
和 item_total!=0.00)
和a.created_t<
- 预期的:没有找到行
- 项目和账单之间有什么区别吗?) b,
SLT poid_id0 bill,current_total bill_total,item_total
从(SLT poid_id0,current_total from bill_t
其中end_t=
(SLT bill_obj_id0,sum(round(item_total,2)) item_total
从 item_t
group by bill_obj_id0) i
where i.bill_obj_id0=b.poid_0
且abs(current_total-item_total)>0.01;
- 预期的:没有找到行
我正在添加一些SQL查询,以验证Oracle BRM的计费和开票:
- 是否有任何未结算的项目?) 或 status=1 或 ar_bill_obj_id0=0 或 ar_billinfo_obj_id0=0)
SLTdistinct account_obj_id0, bill_obj_id0 from item_t i
其中存在
(SLT1 from bill_t b
where b.poid_id0=i.bill_obj_id0
和end_t=
和(effective_t!=
;
- 是否有任何未结算的账户?
SLTpoid_id0, first_name,last_name,a.status
from account_t a, account_nameinfo_t an
where a.poid_id0=an.obj_id0
和创建_t<
且不存在(SLTb.account_obj_id0 from bill_t b
其中end_t=
和b.account_obj_id0=a.poid_id0);
-预期结果:没有找到行
- 其他方式);
SLT*来自billinfo_t bi
其中billing_state=0
和last_bill_t=
而不存在
(SLT1 from bill_t b where b.account_obj_id0=bi.account_obj_id0)
且bill_no不为空,end_t=
-预期的结果:没有找到行
- 是否有任何账户有两张账单
SLTcount(*),account_obj_id0
来自bill_t
其中end_t=
按account_obj_id0分组
有count(*)>1;
-预期的结果:没有找到行
- 是否有任何没有法案的法案?
SLT*来自bill_t
其中end_t=
并且bill_no为空;
- 预期的:没有找到行
ldd libcmpin.so,libportal.so,libportal64.so和libpcmcpp67.so的分析表明,这个错误的根本原因与(路径设置)有关。
libportal.so => /brmdata/opt/ifw/lib/libportal.so (0xf76c7000)
请检查变量$LD_LIBRARY_PATH ,默认情况下它是指向IFW的。
要解决这些错误,请运行:
source $PIN_HOME/source.me.csh
并继续开展行动。
你的Oracle BRM工具现在应该很好。
我也在使用附件中的查询来审查我的Oracle BRM的账单和发票。
- 是否有重复的帐单号?
SLT count(*),bill_no from invoice_t
按账单编号分组
有count(*)>1;
- 预期的:没有找到行
- 开单失败?
SLT *来自billinfo_t
其中billing_state = 4
- 和bill_info_id<>'账单单位(1)';
-预期的结果:没有找到行
- 法案有适当的法案信息吗?
SLT b.poid_0,b.account_obj_id0,current_total,due,total_due,subords_total,father_id0,bp.poid_0
from bill_t b,billinfo_t bi
where b.account_obj_id0=bi.account_obj_id0
和end_t=
和(b.billinfo_obj_id0<>bi.poid_id0或b.ar_billinfo_obj_id0<>bi.ar_billinfo_obj_id0);
- 预期的:没有找到行
- 儿童的账单有适当的父母账单吗?
SLT b.poid_id0,b.account_obj_id0,b.current_total,b.due,b.total_due,b.subords_total,b.parent_id0
from bill_t b,billinfo_t bi,billinfo_t bip,bill_t bp
where b.account_obj_id0=bi.account_obj_id0
and bi.poid_id0!=bi.ar_billinfo_obj_id0
和bi.ar_billinfo_obj_id0=bip.poid_id0
和bip.account_obj_id0=bp.account_obj_id0
和b.end_t=
和bp.end_t=
和b.parent_id0<>bp.poid_id0;
- 预期的:没有找到行
- 儿童的账单是正确的吗?
SLT b.poid_id0,b.account_obj_id0,current_total,due,total_due,subords_total,father_id0
from bill_t b,billinfo_t bi
where b.account_obj_id0=bi.account_obj_id0
and bi.poid_id0!=bi.ar_billinfo_obj_id0
和end_t=
和(current_total<>应收账款或分项账款_总数<>0或parent_id0=0);
- 预期的:没有找到行
- 真正的父母的账单是正确的吗?
SLT b.poid_id0,b.account_obj_id0,current_total,due,total_due,subords_total,father_id0,ar_hierarchy_size
from bill_t b,billinfo_t bi
where b.account_obj_id0=bi.account_obj_id0
且bi.poid_id0=bi.ar_billinfo_obj_id0
和end_t=
和subords_total<>0
和(current_total<>0 或 parent_id0<>0 或 subords_total<>由于或ar_hierarchy_size=0);
期待:没有找到行
- 儿童和父母的账单之和是相等的吗?
SLT poid_id0,subords_total,children.current_total
从bill_t b、
(SLT parent_id0,sum(current_total) current_total
from bill_t where parent_id0<>0
group by parent_id0) children
where b.poid_id0=children.parent_id0
和end_t=
和children.current_total<>subords_total;
- 预期的:没有找到行
- 账单信息last_bill_t是否正确设置? –01.01 ;
SLT distinct a.poid_id0,first_name,last_name,a.status,pin2date(last_bill_t)。
from billinfo_t bi,account_t a, account_nameinfo_t an
where account_obj_id0=a.poid_0
和an.obj_id0=a.poid_0
和bi.last_bill_t!
和billing_status在(0,4)
和a.created_t<
- 预期的:没有找到行
- 账单信息next_bill_t是否正确设置?;
SLT distinct a.poid_id0,first_name,last_name,a.status,pin2date(last_bill_t)。
from billinfo_t bi,account_t a, account_nameinfo_t an
where account_obj_id0=a.poid_0
和an.obj_id0=a.poid_0
和bi.next_bill_t!=1201820400 -01.02
和billing_status在(0,4)
和a.created_t<
- 预期的:没有找到行
- 账单信息future_bill_t是否正确设置?;
SLT distinct a.poid_id0,first_name,last_name,a.status,pin2date(last_bill_t)。
from billinfo_t bi,account_t a, account_nameinfo_t an
where account_obj_id0=a.poid_0
和an.obj_id0=a.poid_0
和bi.future_bill_t!=1204326000 -01.03
和billing_status在(0,4)
和a.created_t<
- 预期的:没有找到行
- 账单信息last_bill_obj_id0被生成?;
SLT a.poid_id0,first_name,last_name,a.status
from billinfo_t bi,account_t a,account_nameinfo_t an
where account_obj_id0=a.poid_0
和an.obj_id0=a.poid_0
而不存在
(SLT 1 from bill_t b
where b.poid_id0=last_bill_obj_id0
和b.account_obj_id0=bi.account_obj_id0
和last_bill_t=end_t)
和billing_status在(0,4)
和a.created_t<
- 预期的:没有找到行
- 账单信息 next_bill_obj_id0生成了吗?;
SLT a.poid_id0,first_name,last_name,a.status
from billinfo_t bi,account_t a, account_nameinfo_t an
where account_obj_id0=a.poid_0
和an.obj_id0=a.poid_0
而不存在
(SLT 1 from bill_t b
where b.poid_id0=bill_obj_id0
和b.account_obj_id0=bi.account_obj_id0
和bi.last_bill_t=b.start_t)
和billing_status在(0,4)
和a.created_t<
- 预期的:没有找到行
- 账单信息future_bill_obj_id0被生成?;
SLT a.poid_id0,first_name,last_name,a.status
from billinfo_t bi,account_t a, account_nameinfo_t an
where account_obj_id0=a.poid_0
和an.obj_id0=a.poid_0
而不存在
(SLT 1 from bill_t b
where b.poid_id0=next_bill_obj_id0
和b.account_obj_id0=bi.account_obj_id0
和bi.last_bill_t=b.start_t)
和billing_status在(0,4)
和a.created_t<
- 预期的:没有找到行
好了
- 是否有任何账单没有创建发票?
SLT b.poid_id0,b.account_obj_id0,bill_no,due
from bill_t b,billinfo_t bi
where b.account_obj_id0=bi.account_obj_id0
和b.end_t=
和pay_type在(10001,10007)
和b.billinfo_obj_id0=b.ar_billinfo_obj_id0
而不存在
(SLT 1 from invoice_t i
where i.bill_obj_id0 = b.poid_id0);
期待:没有找到行
- 是否有任何发票与账单不一致的情况?
SLT * from bill_t b,invoice_t i
where b.poid_id0=i.bill_obj_id0
和(b.bill_no<>i.bill_no或b.end_t<>i.bill_date_t);
- 预期的:没有找到行
- 是否有重复的账单号码的发票?
SLT count(*),bill_no from invoice_t
按账单编号分组
有count(*)>1;
- 预期的:没有找到行
最好的问候、
阿莱