PDA

View Full Version : مشكل در برنامه و پيغام خطا



DlphIran
شنبه 11 مهر 1388, 11:22 صبح
سلام
در برنامه كتابداري من وقتي چند خط زير مي خواد اجرا بشه پيام خطا مي ده،

if combobox3.Text='شماره ثبت' then
begin
dblookupcombobox1.keyField:='';
dblookupcombobox1.listField:='';
with adoquery6 do
begin
sql.Clear;
sql.Add('select sabt from ket');
sql.Add('union');
sql.Add('select sabt from ket');
execsql;
active:=true;
end;
dblookupcombobox1.keyField:='sabt';
dblookupcombobox1.listField:='sabt';
adoquery6.Sort:='sabt';
end
else if combobox3.Text='عنوان كتاب' then
begin
dblookupcombobox1.keyField:='';
dblookupcombobox1.listField:='';
with adoquery6 do
begin
sql.Clear;
sql.Add('select o1 from ket');
sql.Add('union');
sql.Add('select o1 from ket');
execsql;
active:=true;
end;
dblookupcombobox1.keyField:='o1';
dblookupcombobox1.listField:='o1';
adoquery6.Sort:='o1';
end
.
.
.
.
form3.ActiveControl:=dblookupcombobox1;
dblookupcombobox1.DropDown;




البته من يه قسمت كوچيكي رو بعنوان نمونه گذاشتم ، ولي نمي دونم چرا در برنامه براي بار اول كه مي خواد اين خطوط رو اجرا كنه مشكلي نداره ،‌اما براي بار دوم پيغام خطا ميده ، اينم متن پيام خطا


multiple-step operation generated errors. check each status value

وقتي هم بصورت خط به خط اين كدها رو تست مي كنم پنجره اي ظاهر ميشه كه ميگه آدرس سورس فايلي رو پيدا نكرده و از من مي خواد آدرس سورس اون فايل رو تعيين كنم ،‌اينم اسم فايل winsubclass.pas

ghasemshami
یک شنبه 12 مهر 1388, 07:37 صبح
اولام مشکلی که داره اینه که وقتی شما سه خط برای پاس دادن به Query نوشتید آخرین خط اضافه می شه

و برای پیغام خطای شما میگه که داده های ورودی یا خالی است و انجام عملیات میشه و یا اینکه همچنین نوع داده های پاس داده شده معتبر نیست

Saeed_m_Farid
یک شنبه 12 مهر 1388, 08:56 صبح
دوست عزیز :


فکر کنم تا حالا یه 100 باری شده که آقای کشاورز گفتن برای دستور Select از ExecSQL استفاده نمی کنن، چون خروجی یک مقدار نیست و شامل DataSet هست. پس : برای Select از Open استفاده کنید.



هیچ معنی نداره که هم اکتیو query رو True کنید و هم ExecSQL! ضمناً اگه هر دفعه قبل تعویض SQL کوئری رو Close کنید (یا Active := False) مشکلتون حل میشه ...



نمیدونم منظورتون از UNION کردن یه جدول با خودش چیه، اونم با همون فیلد تکراری! هرچی که هست به اینجا مربوط نمیشه، چون اینجا بخش دلفی هست. ولی درخواست SQL غلط به نظر میرسه.



برای حل یک مساله سعی نکنید فقط یه جوری از سر بازش کنید، این نام کامپوننت ها (adoquery6، ComboBox3، form3 و ...) اصلاً قشنگ نیست و هر کسی کدتون رو ببینه ازتون نا امید میشه؛ از طرف دیگه Copy/Paste یک کد تکراری و تعویض یک کلمه تو هر قسمت مزید علت بدنویسی کد هست، منظورم بی احترامی نیست ولی فردا کسی این کد رو بعنوان نمونه از شما ببینه، زیاد به الگوریتم و روش کار شما دیگه فکر نمی کنه و از کل کد زده میشه! شما تمام این کد (و اون قسمتهایی رو که نیاوردین) رو بعنوان نمونه، می تونستید تو کد زیر خلاصه کنید :

procedure TForm3.Button1Click(Sender: TObject);
const
Key_Values: array[0..7] of String = ('key1',
'key2',
'key3',
'key4',
'key5',
'key6',
'key7',
'key8');
begin
with adoquery6 do begin
Close;
SQL.Clear;
SQL.Text:= 'SELECT '
+ Key_Values[ComboBox3.ItemIndex]
+ ' FROM ket UNION SELECT '
+ Key_Values[ComboBox3.ItemIndex] + ' FROM ket';
Open;
end;
dblookupcombobox1.keyField := Key_Values[ComboBox3.ItemIndex];
dblookupcombobox1.listField := Key_Values[ComboBox3.ItemIndex];
adoquery6.Sort := Key_Values[ComboBox3.ItemIndex];

form3.ActiveControl:=dblookupcombobox1;
dblookupcombobox1.DropDown;
end;


موفق باشید.

khoshblagh
یک شنبه 12 مهر 1388, 11:36 صبح
دوست عزیز :


بعنوان نمونه، می تونستید تو کد زیر خلاصه کنید :
procedure TForm3.Button1Click(Sender: TObject);
const
Key_Values: array[0..7] of String = ('key1',
'key2',
'key3',
'key4',
'key5',
'key6',
'key7',
'key8');
begin
with adoquery6 do begin
Close;
SQL.Clear;
SQL.Text:= 'SELECT '
+ Key_Values[ComboBox3.ItemIndex]
+ ' FROM ket UNION SELECT '
+ Key_Values[ComboBox3.ItemIndex] + ' FROM ket';
Open;
end;
dblookupcombobox1.keyField := Key_Values[ComboBox3.ItemIndex];
dblookupcombobox1.listField := Key_Values[ComboBox3.ItemIndex];
adoquery6.Sort := Key_Values[ComboBox3.ItemIndex];

form3.ActiveControl:=dblookupcombobox1;
dblookupcombobox1.DropDown;
end;


موفق باشید.
با تشکر از ارائه نمونه
در صورت امکان یک توضیح مختصر در رابطه با کد بفرمائید. متشکرم

DlphIran
یک شنبه 12 مهر 1388, 16:13 عصر
ممنون از راهنماييتون ،‌ البته من 6 ساله با اين روش برنامه نويسي ميكنم و فرصت اين رو ندارم كه روشم رو عوض كنم چون ممكنه بعدها براي رفع خطا مشكل داشته باشم،البته ظاهر كد نويسي بحث جداييه . كاش در كنارش راهنمايي هم بابت پيغام خطاي من ميكردين .

مي دونيد كه استفاده از union براي جدولهايي بكار ميره كه اطلاعات تكراري درونشون هست،‌بعنوان مثال نويسندگان كتاب يا مترجمان ،‌منم بجاي اينكه براي هركدوم يه جدول جدا داشته باشم ميام و فقط از فيلد مربوطه از جدول اصلي استفاده ميكنم البته فيلد sabt فيلد كليد هست و لازم نيست از union استفاده كنم.
دوستان حالا بفرمايين مشكل از كجاست ،‌البته در برنامه ام قبل از شرط اول adoquery رو close كردم . منتظر راهنماييتون هستم

Saeed_m_Farid
سه شنبه 14 مهر 1388, 10:15 صبح
من 6 ساله با اين روش برنامه نويسي ميكنم و فرصت اين رو ندارم كه روشم رو عوض كنم چون ممكنه بعدها براي رفع خطا مشكل داشته باشم
مطمئن باشید Debug چندین if...else تودرتو با مضمون مشابه (تفاوت فقط در یک کلید) خیلی سخت تر از یه خط برای همشون هست، از طرف دیگه اگه 100 سال هم اشتباه کد بنویسین (نمی گم زیبانویسی یا کد جذاب، چون این نوع کد نوشتن اشتباه هست نه بدترکیب) دلیل نمیشه عوضش نکنید؛ بزرگترین مشکلش هم (علیرغم نظر شما) این هست که رفع خطا توش سخت تره! تنها کاری که شما باید تو کد بنده می کردین، قرار دادن فیلدهای جدول ket تو Key_Values هاتون بود...

كاش در كنارش راهنمايي هم بابت پيغام خطاي من ميكردين .

مشکل شما رو اوّلش عرض کردم :

برای دستور Select از ExecSQL استفاده نمی کنن، چون خروجی یک مقدار نیست و شامل DataSet هست. پس : برای Select از Open استفاده کنید.ضمناً من کدی رو که واسه شما فرستادم، چندین بار تست کردم و مورد خطای مشابهی ندیدم.

مي دونيد كه استفاده از union براي جدولهايي بكار ميره كه اطلاعات تكراري درونشون هست،‌بعنوان مثال نويسندگان كتاب يا مترجمان ،‌منم بجاي اينكه براي هركدوم يه جدول جدا داشته باشم ميام و فقط از فيلد مربوطه از جدول اصلي استفاده ميكنم البته فيلد sabt فيلد كليد هست و لازم نيست از union استفاده كنم.

چیزی که من می دونم اینه که UNION برای الحاق (ترکیب یا جمع کردن) دو یا چند دستور SELECT در یک مجموعه جواب استفاده میشه، و ربطی به "جدولهايي كه اطلاعات تكراري درونشون هست" نداره؛ فقط باید دستورات SELECT ساختار، تعداد ستون و همچنین نوع داده مشابهی داشته باشند.
منظور من اینه که شما 2 تا مجموعه داده (result set) عیناً مشابه رو دارید با هم UNION می کنید! من دلیل این رو نتونستم بفهمم؟! این موضوع ربطی به کلید و غیر کلید نداره ...

برای Detail شروط UNION هم :


All select lists in the statements being combined with UNION must have the same number of expressions (column names, arithmetic expressions, aggregate functions, and so on).
Corresponding columns in the result sets being combined with UNION, or any subset of columns used in individual queries, must be of the same data type, have an implicit data conversion possible between the two data types, or have an explicit conversion supplied. For example, UNION is not possible between a column of datetime data type and one of binary data type unless an explicit conversion is supplied, while UNION is possible between a column of money data type and one of int data type because they can be implicitly converted.
Corresponding result set columns in the individual statements being combined with UNION must occur in the same order because UNION compares the columns one-to-one in the order given in the individual queries.
The column names in the table resulting from UNION are taken from the first individual query in the UNION statement. To refer to a column in the result set by a new name (for example, in an ORDER BY clause), the column must be referred to that way in the first SELECT:

Saeed_m_Farid
سه شنبه 14 مهر 1388, 10:41 صبح
با تشکر از ارائه نمونه
در صورت امکان یک توضیح مختصر در رابطه با کد بفرمائید. متشکرم
اینکه برنامه چکار میکنه رو DlphIran باید بگن، ولی تغییری که من تو برنامه دادم این بود که بجای تعداد زیادی if else if تو برنامه، یه آرایه ای از ثابت ها، برای فیلدهایی که قرار بود در هر if کلید درنظر گرفته بشن، قرار دادم که بجای شرط های اضافی فقط کافیه مقدار موردنظر از این ثابت ها (برحسب ItemIndex کامبوباکس) جایگزین بشه، روش انجامش هم اینطوری هست که بجای Text کامبوباکس به ItemIndex اون نگاه می کنیم ...

موفق باشید.

Saeed_m_Farid
سه شنبه 14 مهر 1388, 10:49 صبح
اینم نمونه یه UNION که کاربرد اون رو نشون میده، البته من از Northwind استفاده کردم و مثلاً برای نمونه لیست کارمندایی هست که بچه واشنگتون (Region = 'WA') هستند! بعلاوه یکی از کارمندان که میدونم Region اش 'WA' نیست ولی میخوام تو لیستم باشه، اونم EmployeeID اش 6 هست :
SELECT * FROM Employees Where Region = 'WA'
UNION ALL
SELECT * FROM Employees Where EmployeeID = 6
ORDER BY EmployeeID

DlphIran
سه شنبه 14 مهر 1388, 18:05 عصر
حالا كسي نيست رو كد نويسي خودم پاسخ بده؟

DlphIran
شنبه 18 مهر 1388, 14:44 عصر
دوستان كسي نيست منو راهنمايي كنه ؟

دوباره ميگم مشكلم رو ، كدي كه نوشتم مياد و براساس موضوعي مقادير keyfiled & listfield‌ مربوط به dblookupcombobox‌ عوض ميكنه ،‌مثلا اگه موضوع جستجو نام مترجم انتخاب شد مقدار نام فيلد مترجم به dblookupcombobox داده ميشه تا كاربر بجاي تايپ مورد جستجوي خود ،‌از بين اطلاعات ذخيره شده يكي رو انتخاب كنه.

در هنگام تغيير مقادير براي بار اول و بعضي وقتها براي بار دوم مشكلي پيش نمياد، بعد از يك يا دو بار جستجو در هنگام تغيير موضوع مورد جستجو مثلا از نام مترجم به نام نويسنده اين پيغامي كه بالا نوشتم ظاهر ميشه . و طوري كه من متوجه شدم مشكلي با تعويض مقدار listfield نداره اما موقعيكه مياد keyfiled رو عوض كنه ،‌پيغام خطا ميده.

لطفا راهنماييم كنيد خيلي فوريه