انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید

نویسنده موضوع: برنامه نویسی با Lazarus (پست اول ویرایش شد ۹۳/۰۴/۲۳ )  (دفعات بازدید: 203882 بار)

0 کاربر و 3 مهمان درحال مشاهده موضوع.

آفلاین امیر شهریاری

  • Sr. Member
  • *
  • ارسال: 323
  • جنسیت : پسر
پاسخ : برنامه نویسی با Lazarus
« پاسخ #60 : 06 آذر 1391، 08:58 ب‌ظ »

من اگه بخوام query های دیتابیس رو اجرا کنم مثل شما تو مثالی که گذاشتین از کدوم کامپوننت باید استفاده کنم؟ TZquery یا ZUpdateSQL1 ؟

ZQuery1.SQL.Clear;
  ZQuery1.SQL.Add('SELECT * FROM amahi.persian');
 ZQuery1.ExecSQL;

مثلا  دستور اس کیو ال بالا اجرا نمیشه اما هر وقت همین دستور اس کیو ال رو توی بخش SQL کامپوننت TZquery کپی کنم کار میکنه؟

سلام
دستورات sql در دوحالت خروجی می دن
اولین نوع خروجی یک جدول است که دستور sql که شما نوشته اید از آن نوع هست و باید با دستور زیر اطلاعات رو فراخوانی کنید
ZQuery1.Open;حالت دوم نوعی دستورات هست که اطلاعات پایگاه داده را تغییر می دهد و خروجی ندارد یا به صورت تابع خروجی خود را بر می گردانند این دستورات باید با ExecSQL اجرا شوند. (مثل stored prosedure ها  )
اگه خوب متوجه نشدی بگو تا بیشتر توضیح بدم   :)
موفق باشی  ;)

آفلاین aliboy

  • High Sr. Member
  • *
  • ارسال: 558
  • جنسیت : پسر
پاسخ : برنامه نویسی با Lazarus
« پاسخ #61 : 08 آذر 1391، 12:14 ب‌ظ »

سلام

تشکر

خوب اگر بیشتر توضیح بدید بحث کاملتر میشه.ولی هنوز به جواب نرسیدم.

نقل‌قول
اولین نوع خروجی یک جدول است که دستور sql که شما نوشته اید از آن نوع هست و باید با دستور زیر اطلاعات رو فراخوانی کنید

من با همین دستور ZQuery1.Open; هم امتحان کردم ولی به جواب نرسیدم.باز هم خطای sql query is empty  رو میده. مشکل من تو همین قسمت همینه شده؟


نقل‌قول
حالت دوم نوعی دستورات هست که اطلاعات پایگاه داده را تغییر می دهد و خروجی ندارد یا به صورت تابع خروجی خود را بر می گردانند این دستورات باید با ExecSQL اجرا شوند. (مثل stored prosedure ها  )

در مورد stored prosedure من تجربه ای ندارم ولی اگه توضیح بدین فک کنم خیلی خوب بشه.
بخصوص اگه نمونه کدی مثال بزنید
سپاس
و ما میطوانیم

آفلاین امیر شهریاری

  • Sr. Member
  • *
  • ارسال: 323
  • جنسیت : پسر
پاسخ : برنامه نویسی با Lazarus
« پاسخ #62 : 08 آذر 1391، 04:15 ب‌ظ »
سلام
من با همین دستور ZQuery1.Open; هم امتحان کردم ولی به جواب نرسیدم.باز هم خطای sql query is empty  رو میده. مشکل من تو همین قسمت همینه شده؟
پس شاید اصلا دستور sql شما خروجی نداره ??? اول برو تو mysql workbench دستور sql رو بزن و ببین خروجی داره یا نه!
در مورد stored prosedure من تجربه ای ندارم ولی اگه توضیح بدین فک کنم خیلی خوب بشه.
بخصوص اگه نمونه کدی مثال بزنید
چشم یک مثال با کد برای procedure های mysql بزودی اینجا میزارم. ;)

آفلاین aliboy

  • High Sr. Member
  • *
  • ارسال: 558
  • جنسیت : پسر
پاسخ : برنامه نویسی با Lazarus
« پاسخ #63 : 08 آذر 1391، 06:34 ب‌ظ »
سلام

نقل‌قول
پس شاید اصلا دستور sql شما خروجی نداره  اول برو تو mysql workbench دستور sql رو بزن و ببین خروجی داره یا نه!

تو پست قبلی اشاره کردم که اگه کد رو توی Sql کامپوننت Tzquery کپی کنم جواب میگیرم اما با کد نویسی نه؟خرروجی داره.

باز هم میگردم و امتحان کنم ببینم چی میشه.


(نمایش ساده اطلاعات)

http://pastebin.com/AY0pau8B

*****************************************************************************

پست رو ویرایش کردم چون بخش اتصال حل شد (بخش اول).  :D  ;) تشکر از راهنمایی
در واقع در onCreate فرم باید این کد اضافه بشه:


zq.SQL.clear;
  zq.SQL.add:='SELECT * FROM  persian';
  zq.open;

بخش دوم مونده -procedure ،اگه مثالی بیارید کامل میشه.البته باید ثبت و حذف و ویرایش رو هم تست کنم ببینم چه کدی نیاز دارن.
تشکر از شما   :)
« آخرین ویرایش: 09 آذر 1391، 01:14 ق‌ظ توسط aliboy »
و ما میطوانیم

آفلاین امیر شهریاری

  • Sr. Member
  • *
  • ارسال: 323
  • جنسیت : پسر
پاسخ : برنامه نویسی با Lazarus
« پاسخ #64 : 09 آذر 1391، 07:54 ق‌ظ »

(نمایش ساده اطلاعات)

http://pastebin.com/AY0pau8B

*****************************************************************************

پست رو ویرایش کردم چون بخش اتصال حل شد (بخش اول).  :D  ;) تشکر از راهنمایی
در واقع در onCreate فرم باید این کد اضافه بشه:

zq.SQL.clear;
  zq.SQL.add:='SELECT * FROM  persian';
  zq.open;

سلام
تو لینکی که گذاشته بودید کد ها رو دیدم.
شما چرا قبل از قرار دادن کد sql تو query اونو active کردید؟؟؟؟
اینجوری query نمیتونه کد sql رو اجرا کنه. باید اول query رو close  کنید (اگه open شده ولی محض احتیاط close بشه بهتره) بعد کد sql رو پاک کنید و بعد کد sql جدید رو داخل اون قرار بدید و حالا اگه خواستید active کنید یا open کنید یا exesql کنید.
  zq.close;
  zq.sql.clear;
  zq.SQL.Text:='SELECT * FROM  persian';
  zq.open; یا zq.active:=true یا zq.ExecSQL;
قرار دادن این کدها توی فرم create باعث میشه همون ابتدا که فرم در حال ساخت است اجرا بشن و اطلاعات نمایش داده بشه و تا زمانی که برنامه باز هست اطلاعات داخل query به روز نمیشه. اگه اونها رو تو form.show قرار بدید و فرم اصلی برنامه نباشه بدون خارج شدن از برنامه و با بستن فرم و باز کردن مجدد اون اطلاعات فرم به روز میشه.
برای درج و ویرایش و حذف اطلاعات از این query استفاده نکنید خیلی بهتره.
برای این کار از دستورات sql تو یک query دیگه استفاده کنید.

آفلاین امیر شهریاری

  • Sr. Member
  • *
  • ارسال: 323
  • جنسیت : پسر
پاسخ : برنامه نویسی با Lazarus
« پاسخ #65 : 09 آذر 1391، 08:15 ق‌ظ »
برای ایجاد یک stored procedure در MYSQL  باید اول کد ایجاد اونو تو پایگاه داده بنویسید و در حقیقت اون رو در پایگاه داده قرار بدید و از طریق برنامه اون procedure رو فراخونی کنید.
procedure ها بیشتر برای انجام عملیات روی داده ها و دستکاری اونها در پایگاه داده استفاده می شن.مثلا ویرایش یا درج یا حذف یا پردزاش و .....
یک مثال کوچک برای ایجاد یک procedure جهت درج اطلاعات در یک جدول.
USE `database`;

DROP procedure IF EXISTS `insert_p`;


CREATE PROCEDURE `database`.`insert_p` (IN `p_name` varchar(15),IN `p_family` varchar(20),IN `p_telephon` varchar(15),IN `p_mobile` varchar(11))

BEGIN


INSERT INTO  table1 (`name`,family,telephon,mobile)

VALUES (p_name,p_family,p_telephon,p_mobile);


END


با اجرای این کد در پایگاه داده mysql و داخل database یک procedure با نام insert_p ایجاد می شود که با گرفتن ۴ ورودی نام و نام خانوادگی و تلفن و موبایل آنها را داخل جدول table1 درج می کند.
برای امتحان آن در mysql workbench این کد را وارد کنید و اجرا نمایید .
CALL database.insert_p('amir','shahriary','0511999999','09159999999');
با این کار باید یک سطر در جدول با اطلاعات وارد شده درج گردد.
برای استفاده از این procedure در lazarus ۲ راه وجود دارد.
یکی اینکه کد شبیه به کد بالا را در یک query ایجاد کنید و سپس query را EXEsql کنید (نه open) .
راه دوم باید از طریق پارامتر ها این کد را در query ایجاد کنید (تو پست بعد توضیح میدم  ;) )
یا حق

آفلاین aliboy

  • High Sr. Member
  • *
  • ارسال: 558
  • جنسیت : پسر
پاسخ : برنامه نویسی با Lazarus
« پاسخ #66 : 09 آذر 1391، 12:19 ب‌ظ »

سلام


(نمایش ساده اطلاعات)

http://pastebin.com/AY0pau8B

*****************************************************************************

پست رو ویرایش کردم چون بخش اتصال حل شد (بخش اول).  :D  ;) تشکر از راهنمایی
در واقع در onCreate فرم باید این کد اضافه بشه:

zq.SQL.clear;
  zq.SQL.add:='SELECT * FROM  persian';
  zq.open;

سلام
تو لینکی که گذاشته بودید کد ها رو دیدم.
شما چرا قبل از قرار دادن کد sql تو query اونو active کردید؟؟؟؟
اینجوری query نمیتونه کد sql رو اجرا کنه. باید اول query رو close  کنید (اگه open شده ولی محض احتیاط close بشه بهتره) بعد کد sql رو پاک کنید و بعد کد sql جدید رو داخل اون قرار بدید و حالا اگه خواستید active کنید یا open کنید یا exesql کنید.
  zq.close;
  zq.sql.clear;
  zq.SQL.Text:='SELECT * FROM  persian';
  zq.open; یا zq.active:=true یا zq.ExecSQL;
قرار دادن این کدها توی فرم create باعث میشه همون ابتدا که فرم در حال ساخت است اجرا بشن و اطلاعات نمایش داده بشه و تا زمانی که برنامه باز هست اطلاعات داخل query به روز نمیشه. اگه اونها رو تو form.show قرار بدید و فرم اصلی برنامه نباشه بدون خارج شدن از برنامه و با بستن فرم و باز کردن مجدد اون اطلاعات فرم به روز میشه.
برای درج و ویرایش و حذف اطلاعات از این query استفاده نکنید خیلی بهتره.
برای این کار از دستورات sql تو یک query دیگه استفاده کنید.

تشکر

منم تصحیح کردم ولی یادم رفت کد رو کامل بذارم...همین طور بود که شما میگید.تشکر

ZQuery1.SQL.Clear;
  ZQuery1.SQL.Add('select * from s');
  ZQuery1.Open;
  ZQuery1.Active:=true;

بایت پست stored procedure خیلی ممنون.
منم تست میکنم و تا پست بعدی منتظر میمونم تا کامل تر بشن.

تشکر مفید بودن
و ما میطوانیم

آفلاین aliboy

  • High Sr. Member
  • *
  • ارسال: 558
  • جنسیت : پسر
پاسخ : برنامه نویسی با Lazarus
« پاسخ #67 : 10 آذر 1391، 08:49 ب‌ظ »
سلام

 :D

اینجا چرا فقط فیلد نام رو توی ' ' قرار دادین  ؟ ! در حالی که varchar به جز اون داریم.

INSERT INTO  table1 (`name`,family,telephon,mobile)

کد شما خطا میده (نام دیتابیس و اطلاعات لازم رو وارد میکنم)
syntax error,...,expecting ';'
نقل‌قول
    VALUES (p_name,p_family,p_telephon,p_mobile);


END


من این کد رو زدم و تایید کرد:(بدون خطا اجرا شد)

DELIMITER // 

USE `amahi`;

//

CREATE PROCEDURE `amahi`.`insert_p` (IN `p_id` int(10),IN `p_name`

varchar(20),IN `p_family` varchar(30))

BEGIN


INSERT INTO  persian(id,name,family)

VALUES (p_id,p_name,p_family);


END //



سوال:
1- برای فارسی نویسی باید utf رو به پراسجر معرفی کنیم؟ توی call بالا که فارسی به جای انگلیسی مینویسیم خطا میده.

2-

من این کد رو به فرم اضافه کردم:


ZQuery2.sql.Clear;
  ZQuery2.sql.Add('call `amahi`.`insert_p`('8520010','samad','jalali');');
  ZQuery2.ExecSQL;

ولی میگه:

نقل‌قول
unit1.pas(46,45) Fatal: Syntax error, ")" expected but "ordinal const" found

اگر ' ' هر فیلد رو بردارم و اجرا کنم میگه فیلد samad نداریم؟ (مقدار فیلد name محسوب میشه)

به این صورت:

ZQuery2.sql.Clear;
  ZQuery2.sql.Add('call `amahi`.`insert_p`(852055010,samad,jalali);');
  ZQuery2.ExecSQL;



نظر شما در این موارد چیه ؟

 :)   سپاس
« آخرین ویرایش: 03 دی 1391، 06:19 ب‌ظ توسط aliboy »
و ما میطوانیم

آفلاین امیر شهریاری

  • Sr. Member
  • *
  • ارسال: 323
  • جنسیت : پسر
پاسخ : برنامه نویسی با Lazarus
« پاسخ #68 : 11 آذر 1391، 08:42 ق‌ظ »
سلام
 :)
اینجا چرا فقط فیلد نام رو توی ' ' قرار دادین  ؟ ! در حالی که varchar به جز اون داریم.
INSERT INTO  table1 (`name`,family,telephon,mobile)
فیلد نام رو تو '' قرار ندادم اون `` هستش . (علامت ~ کنار عدد ۱)
کلمه name تو mysql و sql یک کلمه تعریف شده هستش و بهتره برای اشتباه نشدن تو `` قرار بگیره (نه '').
سوال:
1- برای فارسی نویسی باید utf رو به پراسجر معرفی کنیم؟ توی call بالا که فارسی به جای انگلیسی مینویسیم خطا میده.
نیازی به utf نیست . همین که در زمان connect شدن روی connection خودتون codepage رو در حالت utf8 قرار بدید درست عمل میکنه.
۲-من این کد رو به فرم اضافه کردم:


ZQuery2.sql.Clear;
  ZQuery2.sql.Add('call `amahi`.`insert_p`('8520010','samad','jalali');');
  ZQuery2.ExecSQL;
پارامتر های ورودی تابع رو اشتباه وارد کردید.
خط اول و سوم که مشکلی ندارن ولی خط وسط که کد sql  رو ساختین یک مقدار اشتباه داره.
باید اینجوری باشه .
  ZQuery2.sql.Add('call `amahi`.`insert_p`(8520010,')+QuotedStr('samad')+','+QuotedStr('jalali')+');');

آفلاین علی هردان

  • Full Member
  • *
  • ارسال: 243
  • جنسیت : پسر
پاسخ : برنامه نویسی با Lazarus
« پاسخ #69 : 11 آذر 1391، 11:13 ب‌ظ »
سلام. ورودم رو به انجمن های اوبونتو خیر مقدم عرض میکنم. امیدوارم لحظه های خوبی رو اینجا سپری کنم. من زیاد اینکاره نیستم ولی خب گویا باید توی ترویج علم یه سهم کوچولیی داشته باشیم. منم به لازاروس علاقه مند هستم و دیگه تمام پروژه هام رو با اون مینویسم. الانم اومدم اینجا تا چیزایی که بلدم رو به اشتراک بذارم ولی خب الان نمیتونم. فردا امتحان زیست دارم :) دوباره میام...

آفلاین امیر شهریاری

  • Sr. Member
  • *
  • ارسال: 323
  • جنسیت : پسر
پاسخ : برنامه نویسی با Lazarus
« پاسخ #70 : 11 آذر 1391، 11:27 ب‌ظ »
سلام. ورودم رو به انجمن های اوبونتو خیر مقدم عرض میکنم. امیدوارم لحظه های خوبی رو اینجا سپری کنم. من زیاد اینکاره نیستم ولی خب گویا باید توی ترویج علم یه سهم کوچولیی داشته باشیم. منم به لازاروس علاقه مند هستم و دیگه تمام پروژه هام رو با اون مینویسم. الانم اومدم اینجا تا چیزایی که بلدم رو به اشتراک بذارم ولی خب الان نمیتونم. فردا امتحان زیست دارم :) دوباره میام...
سلام
خیلی خوش اومدی  ;)
راستی گفتی امتحان زیست؟ ??? ببخشید فضولی نباشه شما مگه کلاس چندی؟ چی می خونی؟

آفلاین علی هردان

  • Full Member
  • *
  • ارسال: 243
  • جنسیت : پسر
پاسخ : برنامه نویسی با Lazarus
« پاسخ #71 : 12 آذر 1391، 12:51 ق‌ظ »
سلام. ورودم رو به انجمن های اوبونتو خیر مقدم عرض میکنم. امیدوارم لحظه های خوبی رو اینجا سپری کنم. من زیاد اینکاره نیستم ولی خب گویا باید توی ترویج علم یه سهم کوچولیی داشته باشیم. منم به لازاروس علاقه مند هستم و دیگه تمام پروژه هام رو با اون مینویسم. الانم اومدم اینجا تا چیزایی که بلدم رو به اشتراک بذارم ولی خب الان نمیتونم. فردا امتحان زیست دارم :) دوباره میام...
سلام
خیلی خوش اومدی  ;)
راستی گفتی امتحان زیست؟ ??? ببخشید فضولی نباشه شما مگه کلاس چندی؟ چی می خونی؟
واو  \\:D/ کلاس اول هستم. چی میخونی نداره دیگه. توی کلاس اول که همه عمومی میخونن  8)

آفلاین امیر شهریاری

  • Sr. Member
  • *
  • ارسال: 323
  • جنسیت : پسر
پاسخ : برنامه نویسی با Lazarus
« پاسخ #72 : 12 آذر 1391، 07:09 ق‌ظ »
کلاس اول هستم.
آفرین  :o خیلی نسبت به سنت جلو هستی. برنامه نویسی کار آسونی نیست و بیشتر جوووونا تو سن شما ترجیح میدن با سیستمشون بازی کنن تا بشینن و برنامه بنویسن اونم بدون آموزش قبلی یا اجبار کلاس درس !  ;)
موفق باشی

آفلاین aliboy

  • High Sr. Member
  • *
  • ارسال: 558
  • جنسیت : پسر
پاسخ : برنامه نویسی با Lazarus
« پاسخ #73 : 12 آذر 1391، 01:08 ب‌ظ »

@ Delphi887

سلام

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

وقتی کد زیر رو میزنیم :

  ZQuery2.sql.Add('call `amahi`.`insert_p`(8520010,')+QuotedStr('samad')+','+QuotedStr('jalali')+');');

این خطا رو میده:

unit1.pas(46,104) Error: Illegal expression
unit1.pas(46,12) Error: Incompatible types: got "LongInt" expected "AnsiString"
unit1.pas(46,104) Fatal: Syntax error, ";" expected but ")" found


خطای اول به آخرین ' گیر میده.

خطای بعدی اخره .ZQuery2 نشون میده.

مثل خطال اول به همون گیر میده.


شاید یه

');

انتها اضافه باشه؟
و ما میطوانیم

آفلاین امیر شهریاری

  • Sr. Member
  • *
  • ارسال: 323
  • جنسیت : پسر
پاسخ : برنامه نویسی با Lazarus
« پاسخ #74 : 12 آذر 1391، 01:20 ب‌ظ »
راحت ترین کار اینه که قبل از اینکه query رو اجرا کنی متن sql اونو نشون بدی بعد ببین درست ایجاد شده یا نه.
یعنی خط ZQuery2.ExecSQL; رو غیر فعال کن و بجاش بنویس showmessage(ZQuery2.sql.text); و وقتی متن sql رو نشون داد باید یه چیزی شبیه به اونی که تو workbench برای درج جدول زدی ساخته باشه. اگه جایی , یا ; یا پانتز کم و زیاد بود اصلاحش کن و دوباره امتحان کن .
 ;)