我用的是SQL SERVER2000,怎样用DELPHI建一个主从表的程序;几个Tdbedit用来向主表中输入数据,再就是一个dbgrid1,用dbnavigator1向dbgrid中输入若干条数据并显示于dbgrid1中,单击保存便会把主表中数据和dbgrid1中显示的若干条数据存入sql server2000中不同的两个表中,其中还包括一个主表中的单号,此单号在每次点“新单”时都不可能与以前的单号重复。若有较好的例子也可以,发到[email protected]
数据库及服务器名及各项要注意的事项尽量清楚一些,因为本人为DELPHI方面的菜鸟。
现在急需此方面的程序或例子或详细介绍此样程式编写的书(电子书更好),请各位高手伸出缓助之手。托各位了。

解决方案 »

  1.   

    看看delphi 的demo, ado ,dbe的都有,
    再用dts转到sqlserver中
      

  2.   

    写一个事务,来保证数据的一致性
    给你一个实际的例子
    procedure TFrmFFD.ActionSaveExecute(Sender: TObject);
    var
      i,j:integer;
    begin
      //********************************
      //***  判断能否存盘
      //********************************
      Dtp1.SetFocus;
      if Trim(Dtp1.Text)='' then
        begin
          showmessage('请输入日期!');
          Dtp1.SetFocus;
          Exit;
        end;  if Edit_JH.Text='' then
        begin
          showmessage('请选择井队!');
          wwDBLookupCombo_JDMC.SetFocus;
          wwDBLookupCombo_JDMC.DropDown;
          Exit;
        end;  if Edit_JH.Text='' then
        begin
          showmessage('请选择井号!');
          wwDBLookupCombo_JHMC.SetFocus;
          wwDBLookupCombo_JHMC.DropDown;
          Exit;
        end;  if (Edit_JBRBH.Text='')or(wwDBLookupCombo_JBRMC.Text='') then
        begin
          showmessage('请选择经办人!');
          wwDBLookupCombo_JBRMC.SetFocus;
          wwDBLookupCombo_JBRMC.DropDown;
          Exit;
        end;  for i:=2 to EG.RowCount-1 do
        begin
          if EG.Cells[2,i].ForeText<>'' then
            begin
              if (EG.Cells[8,i].ForeText='')and(EG.Cells[9,i].ForeText='')and(EG.Cells[10,i].ForeText='') then
                begin
                  showmessage('表格填写不完整不能存盘!');
                  EG.Col:=8;
                  EG.Row:=i;
                  EG.SetFocus;
                  Exit;
                end;//end if EG.Cells[2,i].ForeText<>''
              for j:=8 to 10 do
                if EG.Cells[j,i].ForeText='' then EG.Cells[j,i].ForeText:='0'
            end;//end if EG.Cells[2,i].ForeText<>''
        end;//end for i  if Edit_DocuNo.Text ='' then Edit_DocuNoDblClick(ActionSave);
      Dm.Database_ZJCJ.StartTransaction;
      try
      //********************************
      //***  增加存盘
      //********************************
      if Label_State.Caption ='增加' then
        begin
          Add_FFD;
        end;//end if Label_State.Caption ='增加'  //********************************
      //***  修改存盘
      //********************************
      if Label_State.Caption ='修改' then
        begin
          //先删除,后添加
          Del_FFD;
          Add_FFD;
        end;//end if Label_State.Caption ='修改'  Dm.Database_ZJCJ.Commit;
      except
      Dm.Database_ZJCJ.Rollback;
      raise;
      //showmess0age('操作失败,网络错误!');
      Exit;
      end;   //end try  //存盘以后
      BtnControls('Save');
      Panel_DocuNo.Enabled :=True;
    end;
      

  3.   

    procedure TFrmFFD.Add_FFD;
    var
      i:integer;
    begin  for i:=2 to EG.RowCount-1 do
        begin
          if EG.Cells[2,i].ForeText='' then Break;
          with Dm.Query_Query do
            begin
              Close;
              SQL.Clear;
              SQL.Add('select YJSL,EJSL,SJSL from TZJCJ_KC where ZJBH='''+EG.Cells[1,i].ForeText+'''');
              SQL.Add('and PH='''+EG.Cells[7,i].ForeText+'''');
              Open;          //判断库存够不够,若不够就触发一个异常
              if FieldByName('YJSL').asinteger<StrToFloat(Trim(EG.Cells[8,i].ForeText)) then
                raise ERangeError.Create('批号为[ '+EG.Cells[7,i].ForeText+' ]的钻具[ '+EG.Cells[1,i].ForeText+' '+EG.Cells[2,i].ForeText+' ]的一级库存量只剩下 '+FieldByName('YJSL').asstring);
              if FieldByName('EJSL').asinteger<StrToFloat(Trim(EG.Cells[9,i].ForeText)) then
                raise ERangeError.Create('批号为[ '+EG.Cells[7,i].ForeText+' ]的钻具[ '+EG.Cells[1,i].ForeText+' '+EG.Cells[2,i].ForeText+' ]的二级库存量只剩下 '+FieldByName('EJSL').asstring);
              if FieldByName('SJSL').asinteger<StrToFloat(Trim(EG.Cells[10,i].ForeText)) then
                raise ERangeError.Create('批号为[ '+EG.Cells[7,i].ForeText+' ]的钻具[ '+EG.Cells[1,i].ForeText+' '+EG.Cells[2,i].ForeText+' ]的三级库存量只剩下 '+FieldByName('SJSL').asstring);        end;//end with Dm.Query_Query
        end;//end for i  for i:=2 to EG.RowCount-1 do
        begin
          //当这一行为空时,结束存盘
          if EG.Cells[2,i].ForeText<>'' then
            begin
            
              //自动编写ID
              with Dm.Query_MaxNo do
                begin
                  Close;
                  SQL.Clear;
                  SQL.Add('select isnull(max(ID),0)+1 as MaxNo from TZJCJ_FF');
                  Open;
                end;
              Edit_ID.Text:=Dm.Query_MaxNo.FieldByName('MaxNo').asstring;          with Dm.Query_Add do
                begin
                  Close;
                  SQL.Clear;            //  0       1     2     3    4    5       6       7      8     9     10     11  12
                  SQL.Add('PTZJCJ_FF_Add :@DocuNo,:@ID,:@ZJBH,:@PH,:@RQ,:@JDBH,:@JBRBH,:@YJSL,:@EJSL,:@SJSL,:@BZ,:@ZB,:@JHBH');
                  Params.Clear;
                  Params.CreateParam(ftstring,'DocuNo',ptInput);
                  Params.CreateParam(ftinteger,'ID',ptInput);
                  Params.CreateParam(ftstring,'ZJBH',ptInput);
                  Params.CreateParam(ftstring,'PH',ptInput);
                  Params.CreateParam(ftDate,'RQ',ptInput);
                  Params.CreateParam(ftstring,'JDBH',ptInput);
                  Params.CreateParam(ftstring,'JBRBH',ptInput);
                  Params.CreateParam(ftfloat,'YJSL',ptInput);
                  Params.CreateParam(ftfloat,'EJSL',ptInput);
                  Params.CreateParam(ftfloat,'SJSL',ptInput);
                  Params.CreateParam(ftstring,'BZ',ptInput);
                  Params.CreateParam(ftstring,'ZB',ptInput);
                  Params.CreateParam(ftstring,'JHBH',ptInput);
                  Prepare;
                  ParamByName('DocuNo').asstring:=Edit_DocuNo.Text;
                  ParamByName('ID').asstring:=Edit_ID.Text;
                  ParamByName('ZJBH').asstring:=Trim(EG.Cells[1,i].ForeText);
                  ParamByName('PH').asstring:=Trim(EG.Cells[7,i].ForeText);
                  ParamByName('RQ').asstring:=formatdatetime('yyyy-mm-dd',Dtp1.Date);
                  ParamByName('JDBH').asstring:=Trim(Edit_JDBH.Text);
                  ParamByName('JBRBH').asstring:=Edit_JBRBH.Text;
                  ParamByName('YJSL').asstring:=Trim(EG.Cells[8,i].ForeText);
                  ParamByName('EJSL').asstring:=Trim(EG.Cells[9,i].ForeText);
                  ParamByName('SJSL').asstring:=Trim(EG.Cells[10,i].ForeText);
                  ParamByName('BZ').asstring:=Trim(EG.Cells[11,i].ForeText);
                  ParamByName('ZB').asstring:=Edit_WorkMan.Text;
                  ParamByName('JHBH').asstring:=Edit_JH.Text;
                  ExecSQL;
                end; //end with Dm.Query_Add
            end;//end if EG.Cells[2,i].ForeText<>''
        end;//end for i
    end;
      

  4.   

    procedure TFrmFFD.Del_FFD;
    var
      i:integer;
    begin
          with Dm.Query_Del do
            begin
              Dm.Query_Modi.Close;
              Dm.Query_Modi.SQL.Clear;
              Dm.Query_Modi.SQL.Add('select DocuNo,PH,ZJBH,ID,YJSL,EJSL,SJSL from TZJCJ_FF where DocuNo='''+Edit_DocuNo.Text+'''');
              Dm.Query_Modi.Open;
              for i:=1 to Dm.Query_Modi.RecordCount do
                begin
                  Close;
                  SQL.Clear;
                  SQL.Add('PTZJCJ_FF_Del :@DocuNo,:@PH,:@ZJBH,:@ID,:@YJSL,:@EJSL,:@SJSL');
                  Params.Clear;
                  Params.CreateParam(ftstring,'DocuNo',ptInput);
                  Params.CreateParam(ftstring,'PH',ptInput);
                  Params.CreateParam(ftstring,'ZJBH',ptInput);
                  Params.CreateParam(ftinteger,'ID',ptInput);
                  Params.CreateParam(ftFloat,'YJSL',ptInput);
                  Params.CreateParam(ftFloat,'EJSL',ptInput);
                  Params.CreateParam(ftFloat,'SJSL',ptInput);
                  Prepare;
                  ParamByName('DocuNo').AsString :=Dm.Query_Modi.FieldByName('DocuNo').asstring;
                  ParamByName('PH').AsString :=Dm.Query_Modi.FieldByName('PH').asstring;
                  ParamByName('ZJBH').AsString :=Dm.Query_Modi.FieldByName('ZJBH').asstring;
                  ParamByName('ID').AsString :=Dm.Query_Modi.FieldByName('ID').asstring;
                  ParamByName('YJSL').AsString :=Dm.Query_Modi.FieldByName('YJSL').asstring;
                  ParamByName('EJSL').AsString :=Dm.Query_Modi.FieldByName('EJSL').asstring;
                  ParamByName('SJSL').AsString :=Dm.Query_Modi.FieldByName('SJSL').asstring;
                  ExecSQL;
                  Dm.Query_Modi.Next;   //Dm.Query_Modi.Next
                end;  //end for i
            end;//end with Dm.Query_Modi
    end;
      

  5.   

    上面太复杂了一点了吧!
    我需一个程序有如下功能:每次点“新单”,几个TDBEDIT中数据存入SQL SERVER2000中的MAINTABEL表中,同时一个DBGRID1中的若干条数据也同时存入SQL SERVER2000中另一个名为SIDE的表中,主从表关联字段为'danhao'这个字段,这个字段是显示在一个DBTEXT中或RZDBLABEL1中,就相当于单号了吧!当然,这个单号永远不重复,每点一次“新单”都会不同,可能要自已写一个函数来生成这个单号了。数据库方面我用ADO连,但总是单号方面有问题,主从表也出问题呀!
    麻烦高手帮小弟做一个这样的例子或别人写好的这样类似结构的程序发给[email protected]先谢了!
    OICQ:184486517