TMD的那个王八蛋地中海居然还说有项目奖加班费就免了,想马上走人了,散分
同时也把经常会碰到的一些问题贴出来和大家交流一下,这些方法感觉不大理想,我想了解一下大家通常是怎么处理的{~~~~~~~~~~~~~~~~~~~ 取得下一个单号~~~~~~~~~~~~~~~~~~~~~~~~~ }
{ parameters:iFlag := 0 只读出单号 iFlag := 1 更新下一个单号 }
function TFrmEdit.GetSerialNo(cds: TClientDataSet; iFlag: Integer): OleVariant;
var
  sTemp, sTableName: string;
  cdsTemp: TClientDataSet;
begin
  sTableName := GetTableNameByCds(cds);
  sTemp := 'Declare @No varchar(20) ' + #13 + 'Exec GetNo @No output , %s ,%d '
    + #13 + 'select @No as SerialNo';
  sTemp := Format(sTemp, [sTableName, iFlag]);
  cdsTemp := TClientDataSet.Create(Self);
  with cdsTemp do
  begin
    RemoteServer := (Self.FindComponent('cdsX') as TClientDataSet).RemoteServer;
    ProviderName := (Self.FindComponent('cdsX') as TClientDataSet).ProviderName;
    SetCdsCmdTxt(cdsTemp, sTemp, 2);
    Result := cdsTemp.FieldByName('SerialNo').AsString;
    Free;
  end;
end;{ 设置ClientDataSet组件CommandText属性 }
procedure TFrmEdit.SetcdsCmdTxt(cds: TClientDataSet; StrSQL: string;
  iFlag: Integer);
begin
  with cds do
  begin
    if Active then Close;
    CommandText := StrSQL;
    if iFlag = 1 then Execute
    else if iFlag = 2 then Open
    else
    begin
      Execute;
      Open;
    end;
  end;
end;{ 从简单的SQL语句取得数据表名称 }
function TFrmEdit.GetTableNameFromSQLText(SQLTxt: string): string;
var
  I: Integer;
  sTemp: string;
begin
  I := Pos('from', LowerCase(SQLTxt)) + 4;
  sTemp := TrimLeft(Copy(SQLTxt, I, StrLen(PChar(SQLTxt))));
  I := Pos(' ', sTemp);
  if I = 0 then
    Result := sTemp
  else
    Result := Copy(sTemp, 0, I);
end;{ 从ClientDataSet组件CommandText属性取得连接的数据表名称 }
function TFrmEdit.GetTableNameByCds(cds: TClientDataSet): string;
var
  StrSQL: string;
begin
  StrSQL := cds.CommandText;
  Result := GetTableNameFromSQLText(StrSQL);
end;{说明:建立附加数据表PutNo,根据数据表名称读取下一个单号
SQL脚本
Create Table PutNo(sNo Varchar(12), sTableName Varchar(20), ab Varchar(20), sExplain Varchar(20))
--参数说明 sNo:日期码 sTableName:数据表名称 ab:区分码 sExplain:中文说明
--例:在数据表写入一条记录:200209010001, EmployeeData,YGZLB,员工资料表
执行存储过程传入表名称参数’EmployeeData’,则返回单号’ YGZLB200209010001’ 
因考虑到用户处理数据的过程中该表单的最新单号有可能已更改,所以在用户提交数据之前需重新读取一次,若新表单保存完毕,则更新下一个单号,例:
procedure TFrmEdit.GetSerialNoEx(iFlag: Integer);
begin
  cdsX.FieldByName('sSerialNo').AsString := GetSerialNo(cdsX, iFlag);
end;procedure TFrmEdit.cdsXBeforePost(DataSet: TDataSet);
begin
  if cdsX.State = dsInsert then GetSerialNoEx(0);
end;procedure TFrmEdit.cdsXAfterInsert(DataSet: TDataSet);
begin
  GetSerialNoEx(0);
end;procedure TFrmEdit.cdsXAfterApplyUpdates(Sender: TObject;
  var OwnerData: OleVariant);
begin
  GetSerialNo(cdsX, 1);
end;}{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}创建存储过程GetNo SQL脚本CREATE PROCEDURE GetNo
    @No varchar(20) output ,
    @TableName varchar(50),
    @Flag intAS
declare @Year Int,
        @Month int,
       -- @Day int,
        @Temp_No varchar(10),
        @RandNo varchar(4),
        @No1 varchar(10),
       @ab Varchar(30)
BEGIN
  select @year=Year(GetDate())
  select @Month=Month(GetDate())
  select @No=Str(@Year,4,0)+
                 (select
                  case
                   when @Month>=10 then Str(@Month,2,0)
                   when @Month<10 Then '0'+Str(@Month,1,0)
                  end
                 )
  select @tablename = Rtrim(@tablename) 
  select @tablename = Ltrim(@tablename) 
  SELECT @Temp_No = sNo FROM Number where  sTableName= @TableName
  SELECT @ab = ab  FROM Number where  sTableName= @TableName
 
 IF @No <> SUBSTRING( @Temp_No,1,6)
  begin
     SELECT @No1 = @No+'0001'
     SELECT @No = @ab+@No+'0001'
 end
  ELSE
   BEGIN
     SELECT @RandNo = STR( CONVERT(int,(SUBSTRING( @Temp_No ,7,4) )+1) , 4, 0 )
     SELECT @RandNo = REPLACE( @RandNo,' ','0')
     SELECT @No = @No + @RandNo
    SELECT @No1 = @No
     SELECT @No =@ab  + @No
   END if @Flag=1
   UPDATE Number  SET  sNo = @No1 where sTableName = @TableName
END
GO{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}

解决方案 »

  1.   

    2,DBGrid,DBEdit中的DateTime数据类型字段处理
    { EditMask + TMonthCalendar,动态生成TMonthCalendar不好控制该组件的释放,新给一个窗体,给窗体一个TMonthCalendar组件MC,设置窗体属性:AutoSize := True;BorderStyle := bsNone }
    { UnitEdit.pas }
    var
      vSender: TObject;implementationuses UnitGetCalendar;procedure TFrmEdit.ShowCalendar(Sender: TObject);
    var
      PT: TPoint;
      vDS: TDataSource;
    begin
      vSender := Sender;
      if vSender is TDBEdit then vDS := (vSender as TDBEdit).DataSource
      else if vSender is TDBGrid then vDS := (vSender as TDBGrid).DataSource
      else Exit;
      if vDS.State in [dsEdit, dsInsert] then
      begin
        GetCursorPos(PT);//取得鼠标位置
        Application.CreateForm(TFrmGetCalendar, FrmGetCalendar);
        with FrmGetCalendar do
        begin
          Top  := PT.Y + 10;
          Left := PT.X - 150;
          Show;
        end;
      end;
    end;procedure TFrmEdit.SelectDate(sDate: string);
    begin
      if vSender is TDBEdit then
        SendMessage((vSender as TDBEdit).Handle, WM_SETTEXT, 0, LongInt(PChar(sDate)));
      if vSender is TDBGrid then
        (vSender as TDBGrid).SelectedField.AsString := sDate;
    end;{ UnitGetCalendar.pas }var
      xSelected: Boolean;uses UnitEdit;procedure TFrmGetCalendar.MCDblClick(Sender: TObject);
    begin
      xSelected := True;
      Close;
    end;procedure TFrmGetCalendar.FormDeactivate(Sender: TObject);
    begin
      Close;
    end;procedure TFrmGetCalendar.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      if xSelected then
        FrmEdit.SelectDate(DateToStr(MC.Date));
    end;{ 说明:因DBGird,DBEdit组件有时是放置在TPanel之类的其他组件上,所以只好以非固定位置显示TmonthCalendar组件,这里考虑是否有好的解决方法
    DBEidt:设置OnDblClick事件为ShowCalendar;DBGrid: 在Columns Editor 中添加Column,对应日期类型字段,在Column属性编辑器中设置属性ButtonStyle := cbsEllipsis,设置DBGrid的OnEditButtonClick事件为ShowCalendar }
      

  2.   

    3,DBComboBox,ComboBox,DBGrid中的初始化数据及筛选数据处理
    { 说明:进入界面时,从指定数据表中相应字段读取记录初始化DBComboBox,ComboBox 的Itmes属性或DBGrid的Column.PickList属性,因这些数据记录有时比较庞大,在用户输入字符串时,对这些数据进行筛选,更新Itmes属性,只显示出以该字符串开头的数据记录 }{ 取得指定数据表指定字段值列表 }
    procedure TFrmEdit.GetFieldValueList(TableName,
      FieldValue: string; var SL: TStringList);
    var
      I: Integer;
      sTemp: string;
      cds: TClientDataSet;
    begin
      cds := TClientDataSet.Create(Self);
      cds.RemoteServer := (Self.FindComponent('cdsX') as TClientDataSet).RemoteServer;
      cds.ProviderName := (Self.FindComponent('cdsX') as TClientDataSet).ProviderName;
      sTemp := Format('select * from %s', [TableName]);
      SetCdsCmdTxt(cds, sTemp, 2);
      SL.Clear;
      for I := 0 to cds.RecordCount - 1 do
      begin
        sTemp := cds.FieldByName(FieldValue).AsString;
        SL.Append(sTemp);
        cds.Next;
      end;
      cds.Free;
    end;procedure TFrmEdit.GetFieldValueListEx(TableName, FieldValue: string;
      cbb: TCustomComboBox);
    var
      SL: TStringList;
    begin
      SL := TStringList.Create;
      try
        GetFieldValueList(TableName, FieldValue, SL);
        cbb.Items.Assign(SL);
      finally
        SL.Free;
      end;
    end;
    { DBComboBox }
    procedure TFrmEdit.dbcsNameChange(Sender: TObject);
    var
      sText: string;
      iSelStart: Integer;
    begin
      iSelStart := Length((Sender as TDBComboBox).Text);
      sText := (Sender as TDBComboBox).Text;
      GetFieldValueListEx(Format('EmployeeData where sName like ''%s%%''',
        [sText]), 'sName', Sender as TCustomComboBox);
      (Sender as TDBComboBox).SelStart := iSelStart;{ 很不乐意加上这一句,但不这样每次光标都会跑到最左边 }
    end;{ DBGrid }
    procedure TFrmEdit.dbgXKeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    var
      sText: string;
      SL: TStringList;
    begin
      with Sender as TDBGrid do
      begin
        SL := TStringList.Create;
        if SelectedField <> DataSource.DataSet.FieldByName('sName') then Exit;
        if DataSource.State in [dsInsert, dsEdit] then
        begin
            sText := ((Controls[0] as TInPlaceEdit).Text);{这一句很关键,用SelectedField.AsString无法实时取得文本改动 }
          try
            GetFieldValueList(Format(' EmployeeData where sName like ''%s%%''',
              [sText]), 'sName', SL);
            Columns[0].PickList := SL;
          finally
            SL.Free;
          end;
        end;
      end;
    end;
      

  3.   

    非常同情你的处境,同时学习你的代码!
    现在公司真TMD的不是东西,骂出来,爽!(也只能如此了:)
      

  4.   

    同意 youlinkr(幽林狂人) 的观点!
      

  5.   

    sign in....
    然后再仔细看!
      

  6.   

    TMD, 吸血的资本家!同情中。
    祝你好运!
      

  7.   


           ((),).
          ))) 6(6
         ((c` _e/
         )))'(
        ((( , \
         )\ \ _o___,-
        ( )\.__,-._\
         / -/   \ |(
     ___(      /_)\ \ _____ _____
         '.__,'  \_\ -没时,加班累了,我叫她去陪陪你~~~
      

  8.   

    同感同感,去年老子国庆节就放一天假期(那哪能叫放假啊,惨),听说今年也如此。私营单位啊,干得不爽就GO AWAY。
      

  9.   

    靠,项目奖要拿,加班费也不能少!!!
    TNND,真是TLLD的剥削!!
      

  10.   

    怎么没人给我提建议,我更关心这些,没放假就没放假没加班费也无所谓,都没什么大不了的,只是一时不快,反正要离开这家公司了,就当作是晚上睡觉的时候被蚊子叮了几口吧。另外请大家帮我看一下一个Delphi的很讨厌的继承问题:
    我把父窗体的一个Panel组件删除,改用Label组件,程序调式时出现class TPanel not found 错误,在出错的地方打开那个窗体,出来‘ancestor component not found’提示框,按照默认的选项删除在父窗体中已被删掉的组件,再运行程序,一切正常,保存后关闭所有,再打开时居然同样的问题又出来了!!而且很奇怪有很多个子窗体,就那一个会出错,按理说删除父窗体的组件子窗体的该组件也会自动完全删除掉,不知道是不是Delphi自己的原因,这个问题实在是很讨厌,大家快帮我看一下,解决了我另外贴个帖子给分
      

  11.   

    不是散分吗, 我来接分的 十一放七天,事儿都排满了
    --------------------------------------------
                   ,%%%%%%%,
                  ,%%/\%%%%/\%,
                 ,%%%\c "" J/%%,
       %.          %%%%/ D L \%%%
       `%%.     __   %%%%  _ |%%%
       `%%   .-' `"~--"`%%%%(=_Y_=)%%' ~~~
        //  .'   `.   `%%%%`\7/%%%'____
       ((  /     ;   `%%%%%%%'____)))
       `.`--'     ,'  _,`-._____`-, 热爱生活 不爱美女 关注大众 无视权贵 一奋青