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;