起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 284|回复: 2

[【搞定】请求]自动编号的几个简单问题,请指教!**

[复制链接]
发表于 2007-4-20 16:53:40 | 显示全部楼层 |阅读模式
这个问题已经有了一个解决方案:
1、建一个自动递增编码表,记录不同的表中的最新编号


[B]我这里:协同数据库--协同数据库下已有该表,但无值,请问还需建么?[/B]

2、有几个需要自动编号的表,就建几个业务参数,且填充OnGetValue事件,如下:
procedure TPublicParamGroup.ParamOAAutoCodeBizParamGetValue(Sender: TObject; var Value: Variant);
begin
  Value := TCommonUserUtils.GetAutoIncreaseID(TBizParam(Sender).ID, TBizParam(Sender).DisplayName);
  { 可根据需要定制Value的格式 }
  Value := TCommonUserUtils.StrToRightLenStr(Variants.VarToStr(Value), '0', 10);
end;


[B]这段代码除了StrToRightLenStr中最后两个参数,其他不需改动吧?[/B]

3、到相应模块中编写代码,如下:
{
功能:返回定长字符串,在S左边加上系列字符C,产生长度为Len的字符串。
  例如 s = '1', C = '0', Len = 10, 则Result = ‘0000000001’
}
static function TCommonUserUtils.StrToRightLenStr(S: string;C: Char;Len: Integer): string;
var
  i: Integer;
begin
  Result := S;
  i := Length(S);
  if i >= Len then Exit
  else Result := StringOfChar(C, Len - i)+ S;
end;

{
功能:根据传入的编码获得自动递增的值
参数:
  ACodeID:编码ID
  ACodeRemark:编码说明
  Result:编码值(字符串)

用法:例如,在业务参数的OnGetValue事件中
procedure ParamAutoIncreaseParamGetValue(Sender: TObject; var Value: Variant);
begin
  Value := CommonUserUtils.TCommonUserUtils.GetAutoIncreaseID(Self.Context,
    TBizParam(Sender).ID, TBizParam(Sender).DisplayName);
  // 设置参数字符串格式
  Value := CommonUserUtils.TCommonUserUtils.StrToRightLenStr(Value.ToString,
    '0', 10);
end;
}
static function TCommonUserUtils.GetAutoIncreaseID(ACUser, ACRemark: string): string;
const
  SQLText = 'SELECT * FROM AutoCode WHERE (ACUser = :ACUser)';
  UpdateSQLText = 'UPDATE AutoCode SET ACContent = :ACContent where (ACUser = :ACUser)';
  InsertSQLText = 'INSERT INTO AutoCode (ACUser, ACContent, ACRemark) VALUES (:ACUser, :ACContent, :ACRemark)';
  ACUSERFIELD = 'ACUser';
  ACCONTENTFIELD = 'ACContent';
  ACREMARKFIELD = 'ACRemark';
var
  lQuery: Business.Data.TQuery;
begin
  lQuery := Business.Data.TQuery.Create(nil);
  with lQuery do
  try
    ConnectionString := 'DATABASEURL=Biz:\CSEPDI_MIS\COMMONSPACE\CEDataBase.Database';
    Close;
    CommandText := SQLText;  // 从通用编码表中取出当前编号的数据
    Params.ParamByName(ACUSERFIELD).AsString := ACUser;
    Open;
    if (not lQuery.IsEmpty) then
    begin
      Result := SysUtils.IntToStr(lQuery.FieldByName(ACCONTENTFIELD).ASInteger + 1);  // 设置编码的自增量
      Close;
      CommandText := UpdateSQLText;
      Params.ParamByName(ACCONTENTFIELD).AsString := Result;
      Params.ParamByName(ACUSERFIELD).AsString := ACUser;
      Execute;
    end else
    begin
      Result := '1';   // 设置编码的初始值
      Close;
      CommandText := InsertSQLText;
      Params.ParamByName(ACUSERFIELD).AsString := ACUser;
      Params.ParamByName(ACCONTENTFIELD).AsString := Result;
      Params.ParamByName(ACREMARKFIELD).AsString := ACRemark;
      Execute;
    end;
  finally
    lQuery.Free;
  end;
end;


[B]这个是在什么地方写,功能?系统中没有默认写好么?是否可以通过引入不写这些?如果写,有哪些需要改动呢?[/B]
回复

使用道具 举报

发表于 2007-4-20 18:16:58 | 显示全部楼层
你这些从哪里找出来的,是bbs吗?如果是直接看那些帖子就可以了

我这里:协同数据库--协同数据库下已有该表,但无值,请问还需建么?
这是初始化后,系统提供的表吗?如果是不要做修改,升级会全部覆盖的,如果是你自己创建的表,也请不要这样做,升级一样会被覆盖的,自己的表,自己创建一个业务空间来存放
有表,还得在需要填充的字段上设置自动填充属性,把自增参数填进去,这请参考《用户手册》第5章 数据字典 的相关内容


这段代码除了StrToRightLenStr中最后两个参数,其他不需改动吧?
是否需要改动,取决于你要的东东,它表示一个十位的自增参数,如果不到十位用0补满10位



这个是在什么地方写,功能?系统中没有默认写好么?是否可以通过引入不写这些?如果写,有哪些需要改动呢?
在资源集和业务参数上做,平台有相关的代码,是否要修改也要看你实际的应用了,
参数组的位置: 业务模型\业务系统\公共\公共参数组\流水号参数组
资源集的位置:业务模型\业务系统\公共\公共函数\公共函数
回复 支持 反对

使用道具 举报

发表于 2007-9-15 15:15:24 | 显示全部楼层
由于楼主长时间未跟贴,此帖先结,有问题请开新帖.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-1-16 09:06 , Processed in 0.035941 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表