function NewID(sYWID: string; sID: string; iInc: Integer; bUseNewConn: Boolean): String;
var
  qryTmp: TRSQuery;
  fValue, fOldValue: Extended;
  NewDB: TADOConnection;
begin
  fValue := 1;
  if Trim(sYWID) = '' then sYWID := ' ';
  if Trim(sID) = '' then sID := ' ';
  NewDB := TADOConnection.Create(nil);
  qryTmp := TRSQuery.Create(nil);
  try
    NewDB.LoginPrompt := False;
    NewDB.ConnectionString := MainDB.ConnectionString;
    if bUseNewConn then
      qryTmp.Connection := NewDB
    else
      qryTmp.Connection := MainDB;
    qryTmp.SQL.Add('select RSHAREID_VALUE from RSHAREID');
    qryTmp.SQL.Add('where RSHAREID_YWID=:pYWID and RSHAREID_ID=:pID');
    qryTmp.Parameters.ParamByName('pYWID').Value := sYWID;
    qryTmp.Parameters.ParamByName('pID').Value := sID;
    qryTmp.Open;
    if qryTmp.IsEmpty then
    begin
      try
        qryTmp.Close;
        qryTmp.SQL.Clear;
        qryTmp.SQL.Add('insert into RSHAREID(RSHAREID_YWID, RSHAREID_ID, RSHAREID_VALUE)');
        qryTmp.SQL.Add('values(:pYWID, :pID, :pVALUE)');
        qryTmp.Parameters.ParamByName('pYWID').Value := sYWID;
        qryTmp.Parameters.ParamByName('pID').Value := sID;
        qryTmp.Parameters.ParamByName('pVALUE').Value := iInc;
        qryTmp.ExecSQL;
      except
        NewID(sYWID, sID);
      end;
    end
    else
    begin
      fValue := qryTmp.FieldByName('RSHAREID_VALUE').AsFloat + 1;
      fOldValue := qryTmp.FieldByName('RSHAREID_VALUE').AsFloat;
      try
        qryTmp.Close;
        qryTmp.SQL.Clear;
        qryTmp.SQL.Add('update RSHAREID set RSHAREID_VALUE =:pVALUE');
        qryTmp.SQL.Add('where RSHAREID_YWID=:pYWID and RSHAREID_ID=:pID');
        qryTmp.SQL.Add('  and RSHAREID_VALUE =:pOldValue');
        qryTmp.Parameters.ParamByName('pYWID').Value := sYWID;
        qryTmp.Parameters.ParamByName('pID').Value := sID;
        qryTmp.Parameters.ParamByName('pOldValue').Value := fOldValue;
        qryTmp.Parameters.ParamByName('pVALUE').Value := fValue + iInc - 1;
        qryTmp.ExecSQL;
        if qryTmp.RowsAffected = 0 then
          NewID(sYWID, sID);
      except
        NewID(sYWID, sID);
      end;
    end;
    Result := FloatToStr(fValue);
  finally
    qryTmp.Close;
    FreeAndNil(qryTmp);
    NewDB.Close;
    FreeAndNil(NewDB);
  end;
end;

posted on 2013-07-16 10:56  倾天  阅读(219)  评论(0编辑  收藏  举报