• Sage Crm的区域表结构


    是刚开始学SageCRM开发的时候自己整理的。不是很全面,先放上到mark一下。

    一、区域。表名:【territories】

    1我们先来看看区域表的结构。

    从图中前面都是不能为空的字段,都是很重要的。来介绍一下这些字段:

    Terr_territoryid: 这个字段就是区域码

    Terr_DBID:由于上面这个字段用来保存区域码了,所以用这个来做表的id

    Terr_Caption:区域码的中文名称,我们新建区域,只需要输入这个就可以了。

    Terr_ParentID:父区域的区域码。如果是根区域的话,父区域为空。

    Terr_RangeEnd:区域的范围码。具体含义下面会介绍。

    Terr_NextRangeStart:下一个子区域的区域码

    Terr_ChildCount:该区域的直接子区域个数

    Terr_Depth:该区域在区域树中的层数。

    2、系统对区域码的分配机制(以下讲解都是在系统默认情况下的)

    在进一步解释新建区域,系统往区域表插入记录之前,必须先讲讲系统对区域码的分配机制,这样我们才能更加明白,系统对这个区域表的设计。

           下面的内容比较理论,文件比较多,有兴趣的话,慢慢看就明白了。

    1)        从表的结构我们可以看到区域码的数据类型是整型的。数据库中int 类型的大小范围是:-2147483648至2147483647。他们的总和刚好是2的32次方。

    2)        系统在默认情况下是这样设置区域的:

    A,顶级区域的区域码肯定是:-2147483640 ,所以只要大于这个数的区域都是他的子区域。

    B, 系统会默认每个区域的子区域都是2的4次方个,即16个。这样的话,让我们看看我们的系统最终区域的划分结果:

    一,2 - 28 【268435454】

    二、2 - 24 【16777216】

    三、2 - 20 【1048576】

    四、2 - 16 【65536】

    五、2 - 12 【4096】

    六、2 - 8  【256】

    七、2 - 4  【16】

    一表示第一个级子区域,他的上面就是顶级区域了。2的32次方分为16个子区域之后,每个子区域的范围就是2的28次方,也就是 268435454。这样一直递减。

    C,上面的分析,我们知道我们的系统一共可以分为8个级别,每个级别(顶级除外)可以有16个区域。16的8次方就是 2的32次方了。

    3)        C、看到这里,我们会问两个问题:为什么是默认16呢?如果我的子公司不止16个或者我们的级别不止8个呢?

    问题1:首先,16刚好是2的倍数,容易计算和划分,可以最大限度的利用区域码,其次,我觉得16 对于二进制的装换有优势。这些是我个人的看法而已。可能是错的。

    问题2:当出现这种情况的时候,新建第15或者16个子区域的时候,系统会提示我们先平衡区域。我在252的crm 数据库做了一次平衡。一共有95步,可能我们的表太多了。平衡的过程其实就是在重新选一个基数,扩大了子区域个数表大之后,级别的就会表小,调整之后,还要修复已有数据的区域码。 其实一般的公司是很难达到这个数的。例如我们的国家:国家-省-市-县-镇-乡 也才六个级别。假设每个省下面也是23个市。 23 的 6次方也没有大于2的32次方。

    3,数据库的设计方面

           有了上面的机制之后,再来看看数据库表现。

    如图,

    a)         worldwide这个是顶级区域,所以他的父区域为0。而EIC总部的terr_parentid 就是 worldwide的区域码了。新建区域的时候系统会要求我们选择一个父区域的。

    b)        Terr_RangeEnd这个字段的值就是Terr_territoryid + 这个级别的区间的范围基数了。

    l  顶级区域当然是最大的区间 为-2147483648 + 2的32次方 = 2147483647

    l  EIC总部是二级区域所以 是 -1342177274 + 2的28次方 = -1073741820

    l  …………..

    l  所以我们可以理解为:所以自己的子区域都是在 [Terr_territoryid,Terr_RangeEnd] 这两个字段组成的区间之内的。

    c)         terr_caption 是新建时候的翻译而已,不多说。

    d)        Terr_nextRangeStart 这个字段的意思是下一个子区域的区域码,例如worldwide 只有一个子区域EIC总部,所以我们新建一个EIC总部的同级区域时,这个新区域的区域码就是-805306364了。本来子区域的第一个区域的区域码应该是父区域码加1的,由于我们的EIC总部是在以前的基础上删改的,所以…。从留学中心之后你就可以看到了。Terr_nextRangeStart 这个字段不但告诉我们下一个子区域的区域码,同时也是告诉我们本区域内的范围的区间可以缩小为:[Terr_territoryid,Terr_NextRangeStart]。

    e)         Terr_ChildCount:该区域的直接子区域个数。留学中心暂时有13个分公司,所以他的直接子区域是13

    f)         Terr_Depth:该区域在区域树中的层数。留学中心在第三层,但是数据库从0开始,所以显示为2。

    g)        这里还有一个字段要讲一下的:terr_rangeincrement,这个字段记录着子区域的 范围基数如图:

    二、配置文件 【TerritoryProfiles】

    只保存了基本信息而已。主要的配置信息保存在表【TerritoryPermissions】

    三.配置信息【TerritoryPermissions】

    这个配置表中保存了我们新建的配置文件的信息和直接权限的信息。每个配置文件,每个区域都会把所有的主要实体列出来给我们设置。 配置文件、区域和表就关联起来了。

    直接权限也一样,要求我们要选一个区域,然后才添加用户到这个区域,再设置表的权限。

    直接权限和配置表的数据的区别就在于  usrt_userid 和 usrt_profileid。usrt_userid不为空就是直接权限的数据。usrt_profileid不为空就是配置文件。

    四,使用实例

    当用户到机会模板的高级查找查询数据时:

    系统首先会找到登录用户的id 和 用户表里面的 配置配置文件id。

    然后到这个视图去找登录用户的权限:

    select * from dbo.vTerritoryPermissions where (usrt_userid = 630 or usrt_profileid = 10) and bord_tableid = 10167

    上图显示了查询结果是我在配置表中的一个直接权限 和 配置文件签约顾问或客服中的四个区域的权限。

    然后在去找机会表过滤数据。

    作者:Novus
    出处:http://www.cnblogs.com/novus/
    本文版权归作者和博客园共有,欢迎任何形式的转载,但请务必注明出处。

  • 相关阅读:
    网络传输协议 UDP & TCP 详解
    OSI 七层协议
    (01day)python接口测试
    Python2和Python3的区别,以及为什么选Python3的原因
    JAVA反编译工具
    JAR反编译工具
    webdriver19-witchto方法
    webdriver实例14-Xpath定位的几种方法
    webdirver实例1--查找元素
    Qt插件开发
  • 原文地址:https://www.cnblogs.com/novus/p/2569963.html
Copyright © 2020-2023  润新知