PDA

View Full Version : گفتگو: کنترل تکراری بودن و خالی نبودن فیلد ها با استفاده از DataSet



SayeyeZohor
پنج شنبه 08 خرداد 1393, 00:16 صبح
در اینجا از کامپوننت های UniTable , Cxgrid استفاده کردم


Uses
cxGridDBTableView, Vcl.Dialogs, BDE.DBTables, BDE;



چک خالی نبودن فیلد ها و focus روی سلول خالی بعد از اخطار :



FUNCTION CheckColumnNull(DataSet: TDataSet; FieldByName, FieldCaption: string; cxGrid: TcxGridDBTableView): Boolean;
var
col: TcxGridDBColumn;
BEGIN
Result := False;
IF Trim(DataSet.FieldByName(FieldByName).AsString) = '' THEN
BEGIN
MessageDlg('کاربر گرامی ، لطفاً '+FieldCaption+' را وارد کنید', mtError, [mbOK], 0);
col := cxGrid.GetColumnByFieldName(FieldByName);
IF col <> nil THEN col.Focused := True;
Result := True;
END;
END;





نحوه Call کردن این Function :
در BeforePost جدول (uniTable) :



procedure TD_Dm1.UT_KarfarmaPeymankarInfoBeforePost(DataSet: TDataSet);
begin
IF CheckColumnNull(DataSet, 'ShKargah', 'شماره کارگاه', F_KarfarmaPeymankarInfo.cxGrid1DBTableView1) THEN
BEGIN
System.sysutils.Abort;
Exit;
END;
end;

SayeyeZohor
پنج شنبه 08 خرداد 1393, 00:25 صبح
چک تکراری نبودن فیلد ها و focus روی سلول خالی بعد از اخطار :


در قسمت PostError از جدول (uniTable) :


procedure TD_Dm1.UT_KarfarmaPeymankarInfoPostError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction);
begin
IF Pos(LowerCase('duplicate key'), LowerCase(E.Message)) > 0 THEN
BEGIN
MessageDlg('کاربر گرامی ، فیلد '+' وارد شده '+' تکراری وارد شده است', mtError, [mbOK], 0);
System.sysutils.Abort;
END;
end;


یک مشکل وجود داره
در این قسمت اگه نام فیلدی که تکراری شده رو بشه بدست بیاریم می شه روی آن فوکوس کرد

اگه کسی می تونه کمک کنه :لبخندساده:

SayeyeZohor
جمعه 09 خرداد 1393, 08:20 صبح
FUNCTION CheckColumnDuplicate(Ucon: TUniConnection; DataSet: TDataSet; E: EDatabaseError; StrDB_NAME, StrTABLE_NAME: string; cxGrid: TcxGridDBTableView): Boolean;
var
StrSQL, FieldsName, FieldByName, FieldDiscription, StrCONSTRAINT_NAME: string;
MyStringList: TStringList;
col: TcxGridDBColumn;
I: Integer;
BEGIN
Result := False;


StrCONSTRAINT_NAME := '';


StrSQL := 'SELECT col.name FROM ' + StrDB_NAME + '.sys.objects AS obj INNER JOIN ';
StrSQL := StrSQL + StrDB_NAME + '.sys.columns AS col ON col.object_id = obj.object_id INNER JOIN ';
StrSQL := StrSQL + StrDB_NAME + '.sys.index_columns AS idx_cols ON idx_cols.column_id = col.column_id AND idx_cols.object_id = col.object_id INNER JOIN ';
StrSQL := StrSQL + StrDB_NAME + '.sys.indexes AS idx ON idx_cols.index_id = idx.index_id AND idx.object_id = col.object_id ';


IF Pos(LowerCase('duplicate key'), LowerCase(E.Message)) > 0 THEN
BEGIN
Result := True;


StrCONSTRAINT_NAME := GetPrimaryOrUniqueIndexKeyName(E.Message);
StrSQL := StrSQL + 'WHERE (obj.name = '+QuotedStr(StrTABLE_NAME)+') AND (idx.is_unique = 1) AND (idx.Name = '+QuotedStr(StrCONSTRAINT_NAME)+')';
MyStringList := GetStringlistWithSqlCommand(UCon, StrSQL);


IF MyStringList.Count = 1 THEN
BEGIN
FieldByName := MyStringList[0];
IF GetDiscriptionFromColumn(UCon, StrDB_NAME, StrTABLE_NAME, FieldByName, FieldDiscription) THEN
MessageDlg('کاربر گرامی ، فیلد زیر تکراری وارد شده است' + #13 + '[' + FieldDiscription + ']', mtError, [mbOK], 0)
ELSE
MessageDlg('کاربر گرامی ، فیلد زیر تکراری وارد شده است' + #13 + '[' + FieldByName + ']', mtError, [mbOK], 0);
col := cxGrid.GetColumnByFieldName(FieldByName);
IF col <> nil THEN col.Focused := True;
MyStringList.Free;
System.sysutils.Abort;
END
ELSE
BEGIN
FOR I := 0 TO MyStringList.Count - 1 DO
BEGIN
IF I = 0 THEN
BEGIN
IF GetDiscriptionFromColumn(UCon, StrDB_NAME, StrTABLE_NAME, MyStringList[I], FieldDiscription) THEN
FieldsName := FieldDiscription
ELSE
FieldsName := MyStringList[I];
END
ELSE
BEGIN
IF GetDiscriptionFromColumn(UCon, StrDB_NAME, StrTABLE_NAME, MyStringList[I], FieldDiscription) THEN
FieldsName := FieldsName + ' و ' + FieldDiscription
ELSE
FieldsName := FieldsName + ' و ' + MyStringList[I];
END;
END;
FieldByName := MyStringList[0];
MessageDlg('کاربر گرامی ، ترکیب فیلدهای زیر تکراری وارد شده است' + #13 + '[' + FieldsName + ']', mtError, [mbOK], 0);
col := cxGrid.GetColumnByFieldName(FieldByName);
IF col <> nil THEN col.Focused := True;
MyStringList.Free;
System.sysutils.Abort;
END;
MyStringList.Free;
System.sysutils.Abort;
END;
MessageDlg('ایراد زیر رخ داده است '+E.ClassName+#13+'-'+#13+' متن ایراد : '+E.Message, mtError, [mbOK], 0);
System.sysutils.Abort;
END;




پوست کن بود ولی نوشتمش:متفکر::تشویق:

hadisalahi2
جمعه 09 خرداد 1393, 12:16 عصر
عزیزم دستت درد نکنه زحمت کشیدی
اما یک جای کار اشکال داره و اون هم :cxGridDBTableView

بهتر بود از یک کنترل استاندارد استفاده کنی تا عمومیت داشته باشه
اینطوری فقط انحصاری میشه
و همه که نمیدونند این یونیت چیه و چطوری باید استفاده کنند ازش
گرفتی ؟ :لبخند:

SayeyeZohor
جمعه 09 خرداد 1393, 13:21 عصر
عزیزم دستت درد نکنه زحمت کشیدی
اما یک جای کار اشکال داره و اون هم :cxGridDBTableView

بهتر بود از یک کنترل استاندارد استفاده کنی تا عمومیت داشته باشه
اینطوری فقط انحصاری میشه
و همه که نمیدونند این یونیت چیه و چطوری باید استفاده کنند ازش
گرفتی ؟ :لبخند:


بله گرفتم

این کامپوننت مربوط به devexpress هستش
کامپوننت هدف من این بود
انشالله توضیح می دم

SayeyeZohor
جمعه 09 خرداد 1393, 15:14 عصر
خب اگه خدا بخواد تکمیل شد

می پردازیم به توضیح کار هر فانکشن و ...


در اینجا از کامپوننت های UniTable, Cxgrid استفاده کردم

Uses
cxGridDBTableView, Vcl.Dialogs, BDE.DBTables, BDE, System.StrUtils;

* کار این فانکشن : استخراج یک فایل متنی از فایل متنی دیگر


FUNCTION ExtractText(const Str: string; const Delim1, Delim2: string): TStringList;
var
c, pos1, pos2: integer;
BEGIN
result := TStringList.Create;
c := 1;
pos1 := 1;


WHILE pos1 > 0 DO
BEGIN
pos1 := PosEx(Delim1, Str, c);
IF pos1 > 0 THEN
BEGIN
pos2 := PosEx(Delim2, Str, pos1 + 1);
IF pos2 > 0 THEN result.Add(Copy(Str, pos1 + length(delim1), pos2 - (length(delim1) + pos1)));
c := pos1 + 1;
END;
END;
END;

SayeyeZohor
جمعه 09 خرداد 1393, 15:17 عصر
* کار این فانکشن : تشخیص نام فیلد کلید اصلی یا ایندکس



FUNCTION GetPrimaryOrUniqueIndexKeyName(StrMessage: string): string;
var
MyStringList: TStringList;
I: Integer;
BEGIN
Result := '';
MyStringList := TStringList.Create;
MyStringList := ExtractText(StrMessage, '''', '''');


IF Pos(LowerCase('primary key'), LowerCase(StrMessage)) > 0 THEN Result := MyStringList[0] ELSE Result := MyStringList[2];


MyStringList.Free;
END;

SayeyeZohor
جمعه 09 خرداد 1393, 15:30 عصر
* کار این فانکشن : خروجی دستور اسکیوال شما رو در یک TStringList ذخیره می کند


FUNCTION GetStringlistWithSqlCommand(Ucon: TUniConnection; StrSQL: string): TStringList;
var
UQ_KarfarmaPeymankar: TUniQuery;
I: Integer;
BEGIN
Result := TStringList.Create;
UQ_KarfarmaPeymankar := TUniQuery.Create(D_Dm1);
WITH UQ_KarfarmaPeymankar DO
BEGIN
Connection := Ucon;
SQL.Text := StrSQL;
ExecSQL;
END;


FOR I := 0 TO UQ_KarfarmaPeymankar.RecordCount - 1 DO
BEGIN
Result.Add(UQ_KarfarmaPeymankar.FieldByName('name' ).AsString);
UQ_KarfarmaPeymankar.Next;
END;
UQ_KarfarmaPeymankar.Free;
END;

SayeyeZohor
جمعه 09 خرداد 1393, 15:33 عصر
* کار این فانکشن : بدست آوردن Discription فیلدهای جدول دلخواه


FUNCTION GetDiscriptionFromColumn(Ucon: TUniConnection; StrDB_NAME, StrTABLE_NAME, StrColumnName: string; Var StrDiscription: string): Boolean;
var
UQ_KarfarmaPeymankar: TUniQuery;
StrSQL: string;
BEGIN
StrDiscription := '';
Result := False;


StrSQL := 'SELECT st.name [Table], sc.name [Column], sep.value [Description] FROM ' + StrDB_NAME + '.sys.tables st ';
StrSQL := StrSQL + 'inner join ' + StrDB_NAME + '.sys.columns sc on st.object_id = sc.object_id left join ';
StrSQL := StrSQL + StrDB_NAME + '.sys.extended_properties sep on ';
StrSQL := StrSQL + 'st.object_id = sep.major_id and sc.column_id = sep.minor_id and sep.name = '+QuotedStr('MS_Description');
StrSQL := StrSQL + 'WHERE (st.name = '+QuotedStr(StrTABLE_NAME)+') AND (sc.name = '+QuotedStr(StrColumnName)+') AND (NOT(sep.value IS NULL)) AND (sep.value <> '''')';


UQ_KarfarmaPeymankar := TUniQuery.Create(D_Dm1);
WITH UQ_KarfarmaPeymankar DO
BEGIN
Connection := Ucon;
SQL.Text := StrSQL;
ExecSQL;
END;


IF UQ_KarfarmaPeymankar.RecordCount > 0 THEN
BEGIN
StrDiscription := UQ_KarfarmaPeymankar.FieldByName('Description').As String;
Result := True;
END;
END;

SayeyeZohor
جمعه 09 خرداد 1393, 15:36 عصر
* کار این فانکشن : بدست آوردن فیلدهای Identity جدول دلخواه


FUNCTION GetIdentityFromColumn(Ucon: TUniConnection; StrDB_NAME, StrTABLE_NAME, StrColumnName: string): Boolean;
var
UQ_KarfarmaPeymankar: TUniQuery;
StrSQL: string;
BEGIN
Result := False;


StrSQL := 'SELECT SCHEMA_NAME(schema_id) AS schema_name , t.name AS table_name , c.name AS column_name ';
StrSQL := StrSQL + 'FROM '+StrDB_NAME+'.sys.tables AS t JOIN '+StrDB_NAME+'.sys.identity_columns c ON t.object_id = c.object_id ';
StrSQL := StrSQL + 'WHERE (t.name = '+QuotedStr(StrTABLE_NAME)+') AND (c.name = '+QuotedStr(StrColumnName)+')';


UQ_KarfarmaPeymankar := TUniQuery.Create(D_Dm1);
WITH UQ_KarfarmaPeymankar DO
BEGIN
Connection := Ucon;
SQL.Text := StrSQL;
ExecSQL;
END;


IF UQ_KarfarmaPeymankar.RecordCount > 0 THEN Result := True;
END;

SayeyeZohor
جمعه 09 خرداد 1393, 15:46 عصر
* کار این فانکشن : کنترل تکراری بودن فیلدهای یک جدول دلخواه



FUNCTION CheckColumnDuplicate(Ucon: TUniConnection; DataSet: TDataSet; E: EDatabaseError; StrDB_NAME, StrTABLE_NAME: string; cxGrid: TcxGridDBTableView): Boolean;
var
StrSQL, FieldsName, FieldByName, FieldDiscription, StrCONSTRAINT_NAME: string;
MyStringList: TStringList;
col: TcxGridDBColumn;
I: Integer;
BEGIN
Result := False;


StrCONSTRAINT_NAME := '';


StrSQL := 'SELECT col.name FROM ' + StrDB_NAME + '.sys.objects AS obj INNER JOIN ';
StrSQL := StrSQL + StrDB_NAME + '.sys.columns AS col ON col.object_id = obj.object_id INNER JOIN ';
StrSQL := StrSQL + StrDB_NAME + '.sys.index_columns AS idx_cols ON idx_cols.column_id = col.column_id AND idx_cols.object_id = col.object_id INNER JOIN ';
StrSQL := StrSQL + StrDB_NAME + '.sys.indexes AS idx ON idx_cols.index_id = idx.index_id AND idx.object_id = col.object_id ';


IF Pos(LowerCase('duplicate key'), LowerCase(E.Message)) > 0 THEN
BEGIN
Result := True;


StrCONSTRAINT_NAME := GetPrimaryOrUniqueIndexKeyName(E.Message);
StrSQL := StrSQL + 'WHERE (obj.name = '+QuotedStr(StrTABLE_NAME)+') AND (idx.is_unique = 1) AND (idx.Name = '+QuotedStr(StrCONSTRAINT_NAME)+')';
MyStringList := GetStringlistWithSqlCommand(UCon, StrSQL);


IF MyStringList.Count = 1 THEN
BEGIN
FieldByName := MyStringList[0];
IF GetDiscriptionFromColumn(UCon, StrDB_NAME, StrTABLE_NAME, FieldByName, FieldDiscription) THEN
MessageDlg('کاربر گرامی ، فیلد زیر تکراری وارد شده است' + #13 + '[' + FieldDiscription + ']', mtError, [mbOK], 0)
ELSE
MessageDlg('کاربر گرامی ، فیلد زیر تکراری وارد شده است' + #13 + '[' + FieldByName + ']', mtError, [mbOK], 0);
col := cxGrid.GetColumnByFieldName(FieldByName);
IF col <> nil THEN col.Focused := True;
MyStringList.Free;
System.sysutils.Abort;
END
ELSE
BEGIN
FOR I := 0 TO MyStringList.Count - 1 DO
BEGIN
IF I = 0 THEN
BEGIN
IF GetDiscriptionFromColumn(UCon, StrDB_NAME, StrTABLE_NAME, MyStringList[I], FieldDiscription) THEN
FieldsName := FieldDiscription
ELSE
FieldsName := MyStringList[I];
END
ELSE
BEGIN
IF GetDiscriptionFromColumn(UCon, StrDB_NAME, StrTABLE_NAME, MyStringList[I], FieldDiscription) THEN
FieldsName := FieldsName + ' و ' + FieldDiscription
ELSE
FieldsName := FieldsName + ' و ' + MyStringList[I];
END;
END;
FieldByName := MyStringList[0];
MessageDlg('کاربر گرامی ، ترکیب فیلدهای زیر تکراری وارد شده است' + #13 + '[' + FieldsName + ']', mtError, [mbOK], 0);
col := cxGrid.GetColumnByFieldName(FieldByName);
IF col <> nil THEN col.Focused := True;
MyStringList.Free;
System.sysutils.Abort;
END;
MyStringList.Free;
System.sysutils.Abort;
END;
MessageDlg('ایراد زیر رخ داده است '+E.ClassName+#13+'-'+#13+' متن ایراد : '+E.Message, mtError, [mbOK], 0);
System.sysutils.Abort;
END;

SayeyeZohor
جمعه 09 خرداد 1393, 15:52 عصر
* کار این فانکشن : چک خالی نبودن فیلد ها و focus روی سلول خالی بعد از اخطار


FUNCTION CheckColumnNull(DataSet: TDataSet; FieldByName, FieldCaption: string; cxGrid: TcxGridDBTableView): Boolean;
var
col: TcxGridDBColumn;
BEGIN
Result := False;
IF Trim(DataSet.FieldByName(FieldByName).AsString) = '' THEN
BEGIN
MessageDlg('کاربر گرامی ، لطفاً '+FieldCaption+' را وارد کنید', mtError, [mbOK], 0);
col := cxGrid.GetColumnByFieldName(FieldByName);
IF col <> nil THEN col.Focused := True;
Result := True;
END;
END;



FUNCTION CheckAllColumnNull(UCon: TUniConnection; StrDB_NAME, StrTABLE_NAME: string; DataSet: TDataSet; cxGrid: TcxGridDBTableView): Boolean;
var
I: Integer;
FieldName, FieldDiscription: string;
BEGIN
FOR I := 0 TO DataSet.FieldCount - 1 DO
BEGIN
FieldName := DataSet.Fields[I].FieldName;
IF GetIdentityFromColumn(UCon, StrDB_NAME, StrTABLE_NAME, FieldName) = True THEN Continue;
IF Assigned(TcxGridDBColumn(cxGrid.GetColumnByFieldNa me(FieldName))) THEN
BEGIN
IF NOT TcxGridDBColumn(cxGrid.GetColumnByFieldName(FieldN ame)).Visible THEN Continue;
END
ELSE
Continue;


IF GetDiscriptionFromColumn(UCon, StrDB_NAME, StrTABLE_NAME, FieldName, FieldDiscription) THEN
BEGIN
IF CheckColumnNull(DataSet, FieldName, FieldDiscription, cxGrid) THEN
System.sysutils.Abort;
END
ELSE
BEGIN
IF CheckColumnNull(DataSet, FieldName, FieldName, cxGrid) THEN
System.sysutils.Abort;
END;
END;
END;

SayeyeZohor
جمعه 09 خرداد 1393, 16:55 عصر
حالا نوبت می رسه به اصل مطلب اونم نحوه استفاده از این هاست


http://barnamenevis.org/attachment.php?attachmentid=119617&stc=1&d=1401309022


Ucon: TuniConnection;
UT_KarfarmaPeymankarInfo: TuniTable;

تنها کاری که باید انجام بدیم ، اینه که این قطعه کد رو برای "چک خالی نبودن فیلد ها" در پروسیجر "BeforePost" از جدول "UT_KarfarmaPeymankarInfo" کپی کنیم و بسته به جدول خودمون اطلاعات خواسته شده رو تغییر بدیم :


procedure TD_Dm1.UT_KarfarmaPeymankarInfoBeforePost(DataSet: TDataSet);
begin
CheckAllColumnNull(UCon, 'TaminDB93', TUniTable(DataSet).TableName, DataSet, F_KarfarmaPeymankarInfo.cxGrid1DBTableView1);
end;




و برای "چک تکراری نبودن فیلد های جدول" (که شامل فیلدهای کلید ، کلید ترکیبی و ایندکس های Unique) می شه باید این قطعه کد رو در پروسیجر "PostError" از جدول "UT_KarfarmaPeymankarInfo" کپی کنیم و بسته به جدول خودمون اطلاعات خواسته شده رو تغییر بدیم :


procedure TD_Dm1.UT_KarfarmaPeymankarInfoPostError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction);
begin
IF CheckColumnDuplicate(UCon, DataSet, E, 'TaminDB93', TUniTable(DataSet).TableName, F_KarfarmaPeymankarInfo.cxGrid1DBTableView1) THEN System.sysutils.Abort;
end;

SayeyeZohor
جمعه 09 خرداد 1393, 16:56 عصر
از دوستان مخصوصاً اساتید تقاضا می شود کد ها رو چک کنند و در صورتی که ایراد داره ، مطرح کنند

:متفکر:

hadisalahi2
شنبه 10 خرداد 1393, 16:40 عصر
داداش گلم شما اومدی این همه زحمت کشیدی و کد نوشتی
اما متاسفانه کد های شما یک اشکال بزرگ داره
اولین و مهمترین اونا استفاده از این کامپوننت هستش : Cxgrid

شما میتونستی اون رو با Dbgrid توضیح بدی که جامع باشه و برای همه قابل استفاده

اون کد چک کردن کد تکراری خیلی طولانیه و من اصلا سر در نیاوردن برای چی Inner Join کردی
من یک فانکشن دارم که خلی ساده تر و بدون این همه کد این کار رو انجام میده
به اندازه یک Select ساده.

مشکل بعدی اینه که شما ، مطالبت یک سناریوس خاص و مشخصی نداره.
مثلا شما اومدی چند تا فیلد با چند تا اسم دلخواه گذاشتی که مشخصا مال برنامه خودته
این شاید توی برنامه خودت جواب بده

ولی متاسفانه شاید خیلی ها باهاش با مشکل مواجه بشن.

شما قبل از ارائه یک مطلب آموزشی اول باید سناریوی اون رو معرفی کنی و بعد بیای در قالب اون مطالب رو ارائه کنی

ببخشید اگه طولانی شد و رک حرف زدم

موفق باشی

SayeyeZohor
شنبه 10 خرداد 1393, 20:54 عصر
داداش گلم شما اومدی این همه زحمت کشیدی و کد نوشتی
اما متاسفانه کد های شما یک اشکال بزرگ داره
اولین و مهمترین اونا استفاده از این کامپوننت هستش :
Cxgrid

دادا سلام

درسته و گفتم که کامپوننت هدف :
UniTable, Cxgrid

برای Dbgrid هم می نویسم زدن نداره :چشمک:





اون کد چک کردن کد تکراری خیلی طولانیه و من اصلا سر در نیاوردن برای چی Inner Join کردی
من یک فانکشن دارم که خلی ساده تر و بدون این همه کد این کار رو انجام میده
به اندازه یک Select ساده.


شما فانکشنت رو بذار تا بگم چرا ؟...

فرض کنیم دو سه تا فیلد داریم که با هم کلید هستند ، حالا اگه ترکیب استفاده شده تکراری بود می خواین چطوری مشخص کنین کدوم فیلد تکرار شده ؟
یا چطوری می تونی از تکراری بودن یک فیلد ایندکس که اتفاقی Uniqiue هم هست جلوگیری کنی؟
فانکشنت این کارا رو می کنه ؟
من حال جر و بحث ندارم رک گفتی رک جواب دادم




مشکل بعدی اینه که شما ، مطالبت یک سناریوس خاص و مشخصی نداره.
مثلا شما اومدی چند تا فیلد با چند تا اسم دلخواه گذاشتی که مشخصا مال برنامه خودته
این شاید توی برنامه خودت جواب بده

ولی متاسفانه شاید خیلی ها باهاش با مشکل مواجه بشن.


فیلد ها ربطی به برنامه خودم نداره تمام این فانکشن ها رو کاربر در یک یونیت قرار می ده و آن رو در DataModule خودش Use می کنه و با کد زیر ازش برای تکراری نبودن استفاده می کنه


IFCheckColumnDuplicate(UCon, DataSet, E, 'TaminDB93', TUniTable(DataSet).TableName, F_KarfarmaPeymankarInfo.cxGrid1DBTableView1) THENSystem.sysutils.Abort;


انشالله کامل می کنم و یه فیلم هم برای آموزش کار باهاش آپلود می کنم


شما که رک گفتی منم رک بگم
بنده سناریویی بلد نیستم کارکنم اگرم کدی منتشر کردم فقط برای کمک به دوستانی بوده که مثل خودم تو بعضی جاها لنگ می زنند و حتماً برای برنامه نویسان حرفه ای مثل شما کارایی نداره

SayeyeZohor
یک شنبه 11 خرداد 1393, 00:34 صبح
119745

توجه : کامپوننت های استفاده شده : UniTable, UniConnection, CxGrid


این فایل رو کنار سورس پروژتون Extract کنین و بعد اون رو به پروژه Add کنین بعد این فرم رو در دیتاماژولتون که Table هاتون اونجاست Use کنید و در قسمت BeforePost و PostError از خصوصیات UniTable این دو تا کد رو کپی کنید و تغییرات خودتون رو بدید


Form1 = نام دیتاماژول که Table هاتون اونجاست
UCon =نام UniConnection شماست
'TaminDB93' = نام دیتابیس شماست که در اسکیوال سرور ایجاد شده
cxGrid1DBTableView1 = اینم نام CxGrid شماست





procedure TForm1.UniTable1BeforePost(DataSet: TDataSet);
begin
FTools.CheckAllColumnNull(Form1, UCon, 'TaminDB93', TUniTable(DataSet).TableName, DataSet, cxGrid1DBTableView1);
end;




procedure TForm1.UniTable1PostError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction);
begin
IF FTools.CheckColumnDuplicate(Form1, UCon, DataSet, E, 'TaminDB93', TUniTable(DataSet).TableName, cxGrid1DBTableView1) THEN System.sysutils.Abort;
end;

SayeyeZohor
یک شنبه 11 خرداد 1393, 01:09 صبح
اینم مربوط به کامپوننت هدف مورد علاقه
hadisalahi2 (http://barnamenevis.org/member.php?54383-hadisalahi2) عزیز


119746


توجه : کامپوننت های استفاده شده : UniTable, UniConnection, DBGrid



این فایل رو کنار سورس پروژتون Extract کنین و بعد اون رو به پروژه Add کنین بعد این فرم رو در دیتاماژولتون که Table هاتون اونجاست Use کنید و در قسمت BeforePost و PostError از خصوصیات UniTable این دو تا کد رو کپی کنید و تغییرات خودتون رو بدید






Form1 = نام دیتاماژول که Table هاتون اونجاست


UCon =نام UniConnection شماست


'TaminDB93' = نام دیتابیس شماست که در اسکیوال سرور ایجاد شده

DBGrid1
= اینم نام DBGrid شماست





[PASCAL]

procedure TForm1.UniTable1BeforePost(DataSet: TDataSet);
begin
FTools.CheckAllColumnNull(Form1, UCon, 'TaminDB93', TUniTable(DataSet).TableName, DataSet, DBGrid1);
end;


procedure TForm1.UniTable1PostError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction);
begin
IF FTools.CheckColumnDuplicate(Form1, UCon, DataSet, E, 'TaminDB93', TUniTable(DataSet).TableName, DBGrid1) THEN System.sysutils.Abort;
end;

hadisalahi2
چهارشنبه 14 خرداد 1393, 11:45 صبح
در ضمن نگفتی مشکل راست چین فیلدها توی CXGrid رو چطوری حل کردی؟
یا باهاش کنار اومدی؟

SayeyeZohor
چهارشنبه 14 خرداد 1393, 14:29 عصر
ما کوچیک شما و همه هم هستیم


سلام ما مخلصیم




بازم دستت طلا
زحمت کشیدی
من همون اولش تاپیک رو ذخیره کرده تا در موقع لزوم ازش استفاده کنم


ممنون لطف داری ولی کاش یک کم دلداری بیشتر بود آدم ذوقش رو از دست نمی داد

ما که کوچیکتر از اونیم که ...

ولی حداقل بقیه هوای دوستان رو داشته باشین اگه این فاروم رو ترک کنند دیگه ....:ناراحت:

SayeyeZohor
چهارشنبه 14 خرداد 1393, 14:31 عصر
در ضمن نگفتی مشکل راست چین فیلدها توی CXGrid رو چطوری حل کردی؟
یا باهاش کنار اومدی؟


دادا شما که با ehlib کار می کنی

بعدم بابا به پیر به پیغمبر من کاری نکردم فقط از کد دوستان استفاده کردم


http://barnamenevis.org/showthread.php?448729-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-%D8%B3%D8%A7%D8%B2%DB%8C-%DA%A9%D8%A7%D9%85%D9%BE%D9%88%D9%86%D9%86%D8%AA-cxGrid-%D8%A7%D8%B2-%D8%B3%D8%B1%DB%8C-%DA%A9%D8%A7%D9%85%D9%BE%D9%88%D9%86%D9%86%D8%AA-%D9%87%D8%A7%DB%8C-%D8%B4%D8%B1%DA%A9%D8%AA-DevExpress