begin
messagebox(0,'ID長度不能大於10!','提示',0); abort; end; end;
end;
----------------------------------------------------------------------------------- 遍歷dbgrid數據集中是否存在重復記錄(定位法) var
mylist:Tstringlist;
mylist:=Tstringlist.Create; ads_idNoData.First;
while not ads_idNoData.Eof do begin
if mylist.IndexOf(ads_idNoData.fieldbyname('ID_NO').asstring)=-1 then //該值只能為-1或者非-1
mylist.Add(ads_idNoData.fieldbyname('ID_NO').asstring) else begin
result:=4; break; end;
ads_idNoData.Next; end;
------------------------------------------------------------------------------------- 該過程用于控制dbgrid里面的Enter鍵輸入
procedure TFrm_IdNoData.DBGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if key=13 then begin
if (sender as Tdbgrid).SelectedIndex=(sender as Tdbgrid).Columns.Count-1 then
begin
if (sender as Tdbgrid).DataSource.DataSet.Eof then begin
(sender as Tdbgrid).DataSource.DataSet.First; (sender as Tdbgrid).SelectedIndex:=0; end else begin
(sender as Tdbgrid).DataSource.DataSet.next; (sender as Tdbgrid).SelectedIndex:=0; end; end else
(sender as Tdbgrid).SelectedIndex:=(sender as Tdbgrid).SelectedIndex+1; end;
end;
------------------------------------------------------------------------------------- 控制鍵盤的輸入
//限制第一個欄位的鍵盤輸入 if DBGrid1.SelectedIndex = 0 then begin
if not (Key in ['0'..'9',#8,#13]) then Key := #0; end;
//限制第二個欄位的鍵盤輸入 if DBGrid1.SelectedIndex = 1 then begin
Key := #0; end;
//限制第五個欄位的鍵盤輸入 if DBGrid1.SelectedIndex = 4 then begin
if not (Key in ['0','1',#8,#13]) then Key := #0;
end;
-------------------------------------------------------------------------------------- Navigator刪除提示框:
if MessageBox(Handle,'該刪除動作會連同其下的關鍵控制點一同刪除,確定要刪除?','提示',MB_YESNO or MB_ICONQUESTION=ID_NO then Abort else begin
dm_CollectDevicedata.lc_procNavigatoraction;
dm_CollectDevicedata.ads_INF_COLLECT_SET.Delete; Abort; end;
---------------------------------------------------------------------------------------------------------------------
兩個dbgrid,根據dbgrid1的數據來查找dbgrid2里的數據
做法:在dbgrid1的AfterScroll事件里面,根據某個字段來過濾dbgrid2里面的數據
例子:
//數據採集器編號數據集的滾動事件 2011-11-1 cjr add
procedure Tdm_BMS_JSW_SetRpFieldIn.ads_jsw_fe_RpSetAfterScroll( DataSet: TDataSet); Var
Col_Seq:Integer; begin
Col_Seq := ads_jsw_fe_RpSet.fieldbyname('rp_seq').AsInteger; ads_jsw_fe_Field.Filtered :=False;
ads_jsw_fe_Field.Filter:=' rp_seq =' + IntToStr(Col_Seq); ads_jsw_fe_Field.Filtered :=True; end;
------------------------------------------------------
新增DBGRID記錄時,如果dbgrid2的某個字段的值來源於dbgrid1,則可以這樣賦值:
例子:
procedure Tdm_CollectDevicedata.ads_INF_COLLECT_DTLNewRecord( DataSet: TDataSet); begin
dataset.FieldByName('COL_SEQ').value :=ads_INF_COLLECT_SET.fieldbyname('COL_SEQ').asinteger; end;
----------------------------------------------------------------------------------------------------------------------------
sql語句:用于檢查數據表中是否存在重復記錄 例子:
//檢查相同數據採集器編號下是否存在相同的關鍵控制點 str_sql := ' SELECT col_seq,control_seq'
+' FROM #Temp_INF_COLLECT_DTL' +' GROUP BY col_seq,control_seq' +' HAVING COUNT(*) > 1'; ads_temp.Close;
ads_temp.CommandText := str_sql; ads_temp.Open;
if ads_temp.RecordCount > 0 then begin
result := 6;
exit; end;
---------------------------------------------------------------------------------------------------------------------------
制作遞增字段的過程: 例子:
function Tdm_CollectDevicedata.lc_funcGetseqnobytype(i_type: integer): integer; begin
with ads_temp do begin
close;
commandtext:='SELECT MAX(SEQ_NO) AS SEQ_NO FROM INF_CONTROL '
+'WHERE I_TYPE ='+inttostr(i_type); Open; if eof then result:=1 else
result:=Fields[0].asinteger+1;
if result=1 then begin
adc_temp.CommandText :='INSERT INTO INF_CONTROL VALUES('+inttostr(i_type)+','
+inttostr(result)+')'; adc_temp.Execute; end else begin
adc_temp.CommandText :='UPDATE INF_CONTROL SET SEQ_NO='+inttostr(result)
+' WHERE I_TYPE='+inttostr(i_type); adc_temp.Execute; end;
end; end;
------------------------------------------------------------------------------------------------------------------------------------------------------------ //設置默認值 2011-11-1 cjr add
procedure Tdm_CollectDevicedata.ads_INF_COLLECT_SETNewRecord( DataSet: TDataSet); begin
dataset.FieldByName('int_fact').Value := 0;
ads_INF_COLLECT_SET.FieldByName('COL_SEQ').value :=lc_funcGetseqnobytype(50); //這里進行遞增
end;
-----------------------------------------------------------------------------------------------------------------------------------------------------------
如果要在臨時表中插入一個字段,用於區分數據,可以使用自增字段
SEQ INT NOT NULL IDENTITY
-------------------------------------------------------------------------------------------------------------------
如果要去掉兩個表中相同的記錄,可以用EXCEPT,但前提是兩個表必須有相同的字段 例子:
SELECT * FROM AAA EXCEPT
SELECT * FROM BBB
得到的結果是:去掉AAA里面BBB的記錄后,剩下的AAA里面的記錄. -----------------------------------------------------------------------------------------------------------------------
Delphi 控制導出Excel文檔的所有列寬,字體樣式 例子:
App.ActiveSheet.Cells.Font.Name := '標楷體'; App.ActiveSheet.Cells.Font.Size := 12; App.ActiveSheet.Cells.ColumnWidth := 15;

