【发布时间】:2017-11-01 23:14:59
【问题描述】:
【问题讨论】:
-
我认为管理员中没有任何关于此的选项/设置,如果您以编程方式制作自定义模块,那么这是可能的,我从未尝试过。
-
@Bhaskar 感谢重播,我已经制作了自定义模块,我想在 ID 字段中添加自动增量。
【问题讨论】:
根据我的经验,自动递增字段的目标通常是创建一个人性化的 ID 字段,例如案例 ID、报价 ID、帐号。这与 CRM 系统的 GUID 不同,尽管两者都是有效的唯一标识符。很简单,人性化的 ID 字段更容易与同事交流(“Hey Jim,打开帐户 1505”比“打开帐户 6ccd780c-baba-1026-9564-5b8c656024db”更容易)。
考虑到这一点,这里的目标是完全添加一个新的整数字段,并确保它自动递增。 SugarCRM 支持开箱即用的自动递增 integer 字段,但它是代码级别的自定义。这不适用于默认的 id 字段,因为这是一个 varchar 字段。
我们以专业版的报价栏“报价单号”为例,
vardef 因此在modules/Quotes/vardefs.php 中定义:
<?php
$dictionary['Quote']['fields'][] =
'quote_num' => array(
'name' => 'quote_num',
'vname' => 'LBL_QUOTE_NUM',
'type' => 'int',
'auto_increment' => true,
'readonly' => true,
'required' => true,
'unified_search' => true,
'full_text_search' => array('enabled' => true, 'boost' => 3),
'disable_num_format' => true,
'enable_range_search' => true,
'options' => 'numeric_range_search_dom',
);
vardefs 进一步定义了一个索引来设置数据库级别的自动增量功能:
<?php
$dictionary['Quote']['indices'][] =
array(
'name' => 'quote_num',
'type' => 'unique',
'fields' => array('quote_num', 'system_id')
);
请注意,您的自定义字段的索引可能不需要 system_id 引用,更典型的是将其定义为简单的 'fields' => array('quote_num')
另一个开箱即用的示例是在带有字段case_number 的案例模块中。它还使用 vardef 和索引定义。
可以将此策略提取到任何开箱即用或自定义模块上的新自定义字段中。可以在custom/Extension/modules/MyModule/Ext/Vardefs/customfield.php 中定义字段和索引。请注意,当使用 Extension 框架时,Studio 将在此目录中创建一个字段,例如 sugarfield_myfield.php,并且最好不要在同一个文件中定义您的 vardef,因为 Studio 会覆盖它们。此外,最好不要在您的文件中定义 Studio 可能会尝试生成的冲突,否则其中一项更改或另一项更改将被覆盖。在customfield.php 中仅定义实现目标所需的内容,并格式化数组,使其在执行代码时不会完全重新定义自己,例如
$dictionary['Quote']['fields']['quote_num']['auto_increment'] = true;
$dictionary['Quote']['fields']['quote_num']['disable_num_format'] = true;
【讨论】:
我在 SuiteCRM 中实现自增字段的方式是这样的:
使用 SuiteCRM Studio 创建 TextField 类型的自定义字段。例如,将字段product_number 添加到模块Products。这将在数据库表aos_products_cstm 中创建字段product_number_c。该字段不应为必填项。
从模块Products的EditView中删除新创建的字段product_number。
在您的数据库中,创建表product_number_seq,它只有字段id,这是一个自动递增字段。 product_number_seq 的名称可以更改为您喜欢的任何名称。
在表aos_products_cstm上创建触发器:
CREATE DEFINER=`root`@`localhost` TRIGGER product_number_insert
BEFORE INSERT ON aos_products_cstm
FOR EACH ROW
BEGIN
INSERT INTO product_number_seq VALUES (NULL);
SET NEW.product_number_c = LAST_INSERT_ID();
END
如果你这样做,在表aos_products_cstm上的每次插入之前,触发器将插入表product_number_seq并提供NULL作为值,所以下一个int将被插入(因为它是一个自增字段)。然后它将被插入到aos_products_cstm 中的记录的字段product_number_c 设置为LAST_INSERT_ID() 的结果 - 这将是最近插入到product_number_seq 的值。
这显然是 hack,所以你可能不喜欢它,但我已经使用它并且它有效。
【讨论】: