ورود

View Full Version : یادگیری SQL استاندارد با استفاده از SQLite



rezaTavak
چهارشنبه 28 آذر 1386, 11:45 صبح
سلام

آیا مایلید با هم SQL استاندارد را بیاموزیم؟

اگر مایل باشید بحثی مانند MySQL می توانیم با هم داشته باشیم و تمام دستورات و توابع و پروسیجرهای SQL را و یا حتی زبان P-SQL را با هم بررسی کنیم؟

آیا از قبل با SQLite که اینروزها دارد جای زیادی باز میکند آشنا بوده اید؟
به نظر شما وقت آن نیست که فراگیری SQL را به طور جدی دنبال کنید؟

خب برای شروع کار ODBC را از http://www.ch-werner.de/sqliteodbc/ دانلود کرده و در صورتیکه یک محیط گرافیکی برای کار می خواهید از اینجا یک GUI گرافیکی دریافت کنید:
http://sqliteadmin.orbmu2k.de/

بعد از دریافت آنها را نصب کنید.

و منتظر پست بعدی باشید.

rezaTavak
پنج شنبه 29 آذر 1386, 08:13 صبح
ابتدا خاطر نشان کنم که هدف من یاد دادن استاندارد SQL92 از طریق SQLite است.

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

مرجع SQL92 : http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt (http://www.contrib.andrew.cmu.edu/%7Eshadow/sql/sql1992.txt)


خب سایت اصلی http://www.sqlite.org/ است که از http://www.sqlite.org/docs.html برای راهنمایی می توانید استفاده کنید.


خب بهتر است دست به کار شویم. من راجع به محیط گرافیکی sqliteadmin چیزی نخواهم گفت آنرا خودتان تست کنید. اما کلیه چیزهایی که می گویم برای نداشتن ابزار فوق است.


خب ابتدا در هر بانک اطلاعاتی که کار میکنید باید دو مورد را به خاطر بسپارید:
۱ - مجوز دسترسی داشته باشید مانند MySQL و SQL Server که کاربر تعریف میکنید اما بانک مورد بحث ما نیاز ندارد.
۲ - یک بانک اطلاعاتی از قبل تعریف شده باشد (جداول نیاز نیست فقط بانک) مثلا شما در mysql همیشه بانک mysql را دارید. خب برای این مورد باید فقط یک فایل خالی ایجاد کنیم. با هر روشی یک فایل خالی در هر جایی خواستید ایجاد کنید. یکی از این روشها در foxpro مانند زیر است:


FUNCTION CreateSQLiteDatabase
LPARAMETERS lcDatabaseName
LOCAL lnFileHandle
lnFileHandle = FCREATE(lcDatabaseName)
IF lnFileHandle > 0
FCLOSE(lnFileHandle)
RETURN .T.
ELSE
RETURN .F.
ENDIF
ENDFUNC

خب با فرستادن نام به این تابع یک فایل خالی ساخته میشود اگر بازگشت .t. بود فایل ساخته شده در غیر اینصورت خیر. مهم نیست پسوند چه چیزی باشد.

با این تابع یک فایل خالی به اسم c:\db1.db می سازیم.

حال یک ارتباط بین بانک و فاکس می سازیم:


FUNCTION CreateConnectionSQLite
LPARAMETERS lcDatabaseName
RETURN SQLSTRINGCONNECT("DSN=SQLite3 Datasource;Database="+lcDatabaseName+;
";StepAPI=0;SyncPragma=NORMAL;NoTXN=0;Timeout=10000 0;ShortNames=0;LongNames=0;NoCreat=0;NoWCHAR=0;Loa dExt=;")
ENDFUNC

کار تمام است. حال تک تک دستورات SQL را با هم تست میکنیم:

اولین دستور ساخت جدول است مانند فاکس پرو دستور ساخت به قرار زیر است:
http://www.sqlite.org/lang_createtable.html
توجه کنید هر دیتابیسی انواع مختلفی از داده را پشتیبانی میکند و نوع داده در دیتابیس مشخص است.

rezaTavak
یک شنبه 02 دی 1386, 12:07 عصر
متاسفانه FOXPRO در ارتباط با بانکهای اطلاعاتی به خوبی عمل نمی کند.

چون تمام کارهایی که در یک بانک قابل انجام است را من توسط جاوا به راحتی انجام می دهم.

بنابراین برای ساخت بانک اطلاعاتی و جداول اطلاعاتی بهتر است از درون خود نرم افزار مدیریت بانک اینکار را انجام دهیم.

اگر کسی راه بهتری دارد در اینجا عنوان کند.

چون SQLite خط دستوری است کار از طریق FOXPRO با فرمان RUN به راحتی قابل انجام است. همچنین در حین نصب ODBC یک شاخه در Program file\SQLite ODBC Driver\ ساخته می شود. که دارای فایلهایی است. مثلا sqlite.exe که مدیریت این نوع دیتابیس است.

آنرا در فاکس پرو با فرمان زیر اجرا کنید:


RUN /n "D:\Program Files\SQLite ODBC Driver\sqlite.exe" "d:\db1.db" "create table tbl1 (cName varchar(20), iId integer);"
پارامتر اول نام فایل اجرایی است که آنرا بسته به مسیر عوض کنید.
پارامتر دوم هم نام بانک اطلاعاتی است که با آن کار میکنید اگر بانک وجود نداشته باشد ساخته خواهد شد.
پارامتر سوم هم دستور SQL است که باید انجام شود.

با این دستور یک جدول اطلاعاتی از داخل فاکس ساخته اید. البته می توانید SQLite را اجرا و از داخل آن نیز بانک را بسازید. اما اینجا هدف من آموزش است و نیازی به ورود به این محیط نمی بینم.

خب دستور اصلی که امروز بررسی کردیم Create Table است اما راجع به آن بیشتر بدانیم.

این دستور برای ساخت جدول بکار می رود و دارای پارامترهایی است که یک جدول قدرتمند رابرای شما به ارمغان می آورد.

من بقیه دستور را با توجه به توضیحات فوق ادامه می دهم یعنی اینکه فقط روی این دستور مانور می دهیم.

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

یعنی :


create table tbl1 (cname varchar(20));
حال ممکن است بخواهیم که فیلد تهی نباشد:


create table tbl1 (cname varchar(20) not null);
حال ممکن است بخواهیم که بین فاکس و SQLite ارتباط بر قرار کرده و بانکها را به روز کنیم باید یک فیلد PRIMARY داشته باشیم گرچه خود SQLite همیشه یکی می سازد اما شما نیز میتوانید اینکار را انجام دهید.


create table tbl1 (cname varchar(20) ,id integer primary key);
یا ممکن است بخواهید یک فیلد اتوماتیک اضافه شود:


create table tbl1 (cname varchar(20) ,id integer autoincrement);
توجه در فاکس پرو برای بروز رسانی جدوال باید حتما یک فیلد Primary key unique وجود داشته باشد. )منحصر به فرد(



create table tbl1 (cname varchar(20) ,id integer primary key unique);
توجه توجه: فقط یک فیلد باید primary key باشد.



اما انواع داده در SQLite:

انواع عددی:
Integer, Float, Real, Numbric
بسته به چیزی که ذخیره می کنید طول متفاوت است.

انواع کاراکتری:
varchar,nvarchar
که در آنها طول نیز باید مشخص باشد مثلا cName varchar(20) طول را 20 عنوان میکنید.

انواع متنی بلند:
Text مانند Memo در فاکس پرو است.

انواع زمان:
time,date,timestamp که خود گویای چیزی که در آن ذخیره میکند می باشد.

نوع برای Object:
BLOB که مانند general در فاکس پرو است.

نوع منطقی:
Boolean که مانند logical در فاکس پرو است.




SQLite محدودیتی در تعداد فیلد ندارد. و همچنین در طول هر رکورد فقط در نگارش 2 داشت که در نگارش 3 هیچ محدودیتی نیست. )جالب است که فاکس پرو 254 فیلد در هر ردیف دارد(






این دستور میتواند یک جدول موقت هم بسازد با CREATE [TEMP | TEMPORARY] TABLE که فقط برای کسی که با آن Connection کار میکند قابل نمایش است و به محض بسته شدن connection آن جدول هم از بین می رود. مانند view یا query.



همچنین می توانید از خروجی یک جدول جدول جدید با دستور select بسازید.

rezaTavak
یک شنبه 02 دی 1386, 13:11 عصر
آیا می دانید varchar چه تفاوتی با nvarchar دارد؟

تفاوت فقط در پشتیبانی از یونیکد است که در nvarcahr انجام میشود و این به مرتب کردن یک فیلد کمک می کند.

naderigh
پنج شنبه 06 دی 1386, 07:07 صبح
اقای توکل ممنون از لطف شما
لطفا ادامه دهید این موضوع را و اگر لطف کنید این بانک را با فاکس مقایسه فرمائید (از لحاظ امنیت سرعت و مخصوصا برای استفاده کنندگان نیاز به نصب چه امکاناتی میباشد)

rezaTavak
پنج شنبه 06 دی 1386, 08:15 صبح
چشم حتما اما هدف من SQL-92 است نه SQLite چون باید کم کم دیگه دستورات قدیمی را فراموش کنیم.
در مورد SQLite این را بدانیم که یک چیزی در حد فایلهای MDB فقط جدول اطلاعاتی دارد. و چیزی بزرگی مانند MySQL نیست بنابراین با نصب ODBC به تنهایی در فاکس پرو نیاز به چیزی دیگر ندارد.
این روزها بذل توجه بسیاری از برنامه نویسان است بخصوص python که کار را در این زبان اسکریپتی راحت کرده است.


راستی یادم رفته بگم که SQL یک استاندارد ISO هم هست:
ISO/IEC 9075:1992
شماره استانداردی است که من از آن بحث میکنم.



خب ادامه بحث:






بعد از ساخت جدول شما به راحتی می توانید به اطلاعات آن دسترسی داشته باشید.

دو گزینه در فاکس پرو داریم:
۱ - اضافه کردن به یک دیتابیس فاکس و ساختن ویوی راه دور به طور ویژوال که مانند یک جدول فاکس پرو خواهد شد.
۲ - استفاده محض از دستورات SQL

هدف من دومی است چراکه اولی را قبلا در MySQL توضیح داده ام.


خب برای ارتباط با یک جدول:
ابتدا یک Connection باید ساخته شود.
سپس یک ویو ساخته شود.
FUNCTION CreateConnectionSQLite
در پستهای قبلی اینکار را انجام خواهد داد. ویک عدد بر می گرداند این عدد دو حالت دارد:
بالاتر از صفر یعنی ارتباط انجام شده و شماره ارتباط که این شماره برای موارد بعدی کاربرد دارد.
منهای یک یعنی به عللی خطا رخ داده است.


و برای ساخت ویو دستور SQLEXEC بکار می رود. که شکل آن اینگونه است:


a=CreateConnectionSQLite("d:\db1.db")
?SQLEXEC(a,"Select ABS(10);")


البته نوشتن تابع فقط به این منظور بود که بدانید تابع هم میشود به عنوان نتیجه باشد.

اگر نتیجه عدد بود یعنی اینکه SQLEXEC به درستی انجام شده است و یک cursor ساخته خواهد شد.



SQLEXEC(a,"select * from tbl1","tbl1")


در اینجا یک cursor با نام tbl1 ساخته می شود.

rezaTavak
پنج شنبه 06 دی 1386, 09:22 صبح
تذکر نکته ای که اکنون به آن رسیدم این است که اگر با SQLiteAdmin بسازید در فاکس خطا ندارید اما از طریق خود sqlite خطا دارید!

rezaTavak
شنبه 15 دی 1386, 08:27 صبح
شما می توانید این مباحث را در MDB هم دنبال کنید پس یک فایل mdb هر جایی که راحتید بسازید. و هر جدولی که خواستید در آن تعریف کنید.

توجه: فیلد primary key باید داشته باشد.

با تابع زیر با بانک ارتباط بر قرار کنید:


FUNCTION CreateConnectionMdb
LPARAMETERS lcDatabaseName
RETURN SQLSTRINGCONNECT("DSN=mdb;DBQ="+lcDatabaseName+;
";DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;PWD=a;UID= admin;")
ENDFUNC



البته هر طور که خواستید بقیه پارامترها را نیز تنظیم کنید. من فقط دیتابیس را تنظیم می کنم.

و به طریقه زیر مثلا فایل d:\db1.mdb را فرا می خوانم:


a=CreateConnectionMdb("d:\db1.mdb")

که البته ابن فایل قبلا توسط MS Access ایجاد شده است.

rezaTavak
شنبه 15 دی 1386, 12:53 عصر
خب حالا فرض کنیم connection ایجاد شده با نام a طبق توابع فوق. اول تست کنید که a یک عدد بزرگتر از صفر باشد. (به ازای ساخت هر کانکشن یک عدد اختصاص می یابد. که از یک شروع می شود.)

حالا دستور امروز:

برای اینکه در یک بانک اطلاعاتی اطلاعات وارد شود و مانند append در فاکس از دستور insert into استفاده می شود. که دقت کنید جدول بانکی قابل insert است که دارای فیلد primary باشد.

نمونه اول تمام فیلدها بروز شوند:
فرض کنید دو فیلد id,cName وجود دارد



?SQLEXEC(a,"insert into tbl1 values (1,'k')")

نمونه دوم:
فقط یک فیلد تعیین شود:




?SQLEXEC(a,"insert into tbl1 (cname) values ('k')")








**** میتوانید جداول MDB را هم از داخل فاکس پرو درست کنید همان دستور create table

مثال:


?SQLEXEC(a,"create table tbl2 ( a TEXT(30))")
علامت ? در دستورات فوق بدین معنی است که اگر عدد منهای یک بود خطا رخ داده در غیر اینصورت خطا رخ نداده است.

naderigh
یک شنبه 16 دی 1386, 09:34 صبح
جناب اقای توکل با سلام و تشکر
شما فرمودید که فاکس در ارتباط با بانکهای اطلاعاتی به خوبی عمل نمی کند منظورتان چیست
و میخوام بدانم که بین Access و SQLite کدام بهتر است از لحاظ سرعت و امنیت و حجم اطلاعات و شبکه و .....
و چگونه میشود همانند بانکهای خود فاکس use و brow و ... در command فاکس برای اینگونه بانکها انجام داد

javad_1349
یک شنبه 16 دی 1386, 10:13 صبح
**** میتوانید جداول MDB را هم از داخل فاکس پرو درست کنید همان دستور create table

ضمن تشکر از آقای توکل
برای ایجاد بانک اطلاعاتی درون اکسس پیغام ذیل ظاهر میگردد
Connection handle is invalid
می دهد
اگر میشود طریقه فراخوانی table را از دورن database اکسس توضیح دهید آیا مثل visual پس از فراخوانی میشود use کرد یا نه
لطفا راهنمایی فرمایید

rezaTavak
یک شنبه 16 دی 1386, 12:12 عصر
جناب اقای توکل با سلام و تشکر
شما فرمودید که فاکس در ارتباط با بانکهای اطلاعاتی به خوبی عمل نمی کند منظورتان چیست
و میخوام بدانم که بین Access و SQLite کدام بهتر است از لحاظ سرعت و امنیت و حجم اطلاعات و شبکه و .....
و چگونه میشود همانند بانکهای خود فاکس use و brow و ... در command فاکس برای اینگونه بانکها انجام داد

دلیل این است که خود فاکس پرو در اصل برای کار با بانک خارجی طراحی نشده بود. و این امکان بعدا اضافه شد.

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

Access یک دیتابیس سبک است و قابلیت رمز گذاری و... دارد. ساختار پیچیده ای دارد.

(یعنی مانند dbf ساده نیست.) سرعتش در بانک بزرگ کم است. و امنیتش هم خوب نیست.

همینطور دیگر مدلهای مانند paradox,SQLite و...

برای امنیت و سرعت از بانکهای بزرگ استفاده کنید مانند:
MySQL,PostgreSQL,M$SQLServer,Db2,Sybase,Oracle و...


اینجا فقط آموزشی است من برای این این دو را انتخاب کرده ام که بهرحال شما حجم کمی دانلود کنید (یا اصلا دانلود نکنید.)


می توانید از browse استفاده کنید بعد از فرمان SQLEXEC یک جدول یا بهتر بگوییم یک query مانند خود فاکس بر می گرداند. اما برای update باید از دستوراتی مانند INSERT INTO,UPDATE و... توسط تابع SQLEXEC به بانک داده شود.

use نمیتوانید استفاده کنید چون باید اول Connection ساخته شود و بعد ...

rezaTavak
یک شنبه 16 دی 1386, 12:37 عصر
**** میتوانید جداول MDB را هم از داخل فاکس پرو درست کنید همان دستور create table

ضمن تشکر از آقای توکل
برای ایجاد بانک اطلاعاتی درون اکسس پیغام ذیل ظاهر میگردد
Connection handle is invalid
می دهد
اگر میشود طریقه فراخوانی table را از دورن database اکسس توضیح دهید آیا مثل visual پس از فراخوانی میشود use کرد یا نه
لطفا راهنمایی فرمایید


خب شما باید از ایجاد شدن کانکشن مطمئن شوید یعنی باید حتما عدد a را مثلا در مثال تست کنید بزرگتر از ۰ با شد.

بعد از کانکت هر کاری می توانید بکنید. مثلا با SQLEXEC می توانید یک کوئری بسازید و اطلاعات را مشاهده کنید. یا ...

پس از فراخوانی use نیست بلکه فقط Remote View که ممکن است قابل بروز رسانی باشد.

rezaTavak
یک شنبه 16 دی 1386, 12:47 عصر
اما دستور امروز:

ساده است برای حذف یک جدول از بانک:



DROP TABLE tbl1





اما یک چیز کلی هم بدانید بد نیست.



در SQL Server می‌توانید چندین بانک داشته باشید که بعد از ایجاد کانکشن به یک بانک می توانید (اگر حق دسترسی داشتید.) به بانکهای دیگر هم دسترسی داشته باشید. در این صورت این قانون کلی را به خاطر بسپارید:
برای دسترسی به یک جدول از بانک ابتدا نام بانک و سپس نام جدول را ذکر کنید.
یعنی برای حذف یک جدول در بانکی به نام Personal و جدول tbl1 مانند زیر باید عمل شود:


DROP TABLE Personal.tbl1


یا برای اضافه کردن رکورد قبل از نام جدول نام بانک را ذکر کنید.






توجه داشته باشید باید مجوز مورد نیاز برای اینکار را داشته باشید.

rezaTavak
یک شنبه 16 دی 1386, 13:31 عصر
راستی یادم رفت اما از این به بعد تمام دستورات به صورت زیر در فاکس پرو بکار ببرید:



?SQLEXEC(nConnectionNumber,"STATEMENT")


که در آن STATEMENT دستورات SQL است و nConnectionNumber شماره کانکشن ساخته شده.

rezaTavak
دوشنبه 17 دی 1386, 08:40 صبح
دوستانی که مباحث را در MS Access دنبال می کنند می توانند از راهنمای D:\Program Files\Microsoft Office\OFFICE11\1033\acmain11.chm

استفاده کنند. البته مشخص است که من Office را در مسیر
D:\Program Files\Microsoft Office\OFFICE11\

نصب کرده ام. شما مسیر خودتان را بدهید.


اما برای رفتن به یک صفحه در chm ابتدا Internet Explorer را باز کنید و مثلا آدرس زیر را بزنید:

mk:@MSITStore:D:\Program%20Files\Microsoft%20Offic e\OFFICE11\1033\acmain11.chm::/html/dasqlcreatetable.htm
البته باز هم متذکر می شوم مسیر فایل را درست بدهید و فقط از Internet Explorer استفاده کنید.

rezaTavak
دوشنبه 17 دی 1386, 13:32 عصر
دستور امروز :

شما با دستور replace در فاکس پرو محتویات جداول را عوض می کنید در SQL این دستور به شکل


UPDATE table SET fields WHERE condition
مثلا فرض کنید که شما می خواهید محتویات یک رکورد را عوض کنید:


UPDATE tbl1 SET cName="reza" WHERE "id=4"
اگر چند فیلد بود بین هر کدام ویرگول بگذارید.


UPDATE tbl1 SET cName="reza",cFamily="tavakol" WHERE "id=4"
شرط WHERE را هر طور صلاح دیدید بگذارید. در اینجا where مانند FOR در دستور REPLACE است. و متاسفانه معادلی برای WHERE,REST هم نداریم. برای ALL هم می توانید از شرط همیشه درست استفاده کنید یا شرط نگذارید.

مثالهایی هم در راهنمای فاکس پرو وجود دارد.

rezaTavak
سه شنبه 18 دی 1386, 07:53 صبح
چون من همیشه DNS می سازم یادم نبود که نام DNS را ذکر نکنم. برای ارتباط با mdb تابع را به صورت زیر اصلاح کنید:



FUNCTION CreateConnectionMdb
LPARAMETERS lcDatabaseName
RETURN SQLSTRINGCONNECT("Driver={Microsoft Access Driver (*.mdb)};DBQ="+lcDatabaseName+;
";DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;PWD=a;UID= admin;")
ENDFUNC


برای SQLite



FUNCTION CreateConnectionSQLite
LPARAMETERS lcDatabaseName
RETURN SQLSTRINGCONNECT("Driver={SQLite ODBC (UTF-8) Driver};Database="+lcDatabaseName+;
";StepAPI=0;SyncPragma=NORMAL;NoTXN=0;Timeout=10000 0;ShortNames=0;LongNames=0;NoCreat=0;NoWCHAR=0;Loa dExt=;")
ENDFUNC




همینطور برای SQL server



DRIVER=SQL Server;SERVER=ُServerName;APP=Microsoft Visual FoxPro;WSID=SRV2;DATABASE=DatabaseName;Trusted_Con nection=Yes


و...

rezaTavak
سه شنبه 18 دی 1386, 10:16 صبح
دستور امروز ساده است. برای حذف یک یا چند رکورد :



DELETE FROM [database-name .]table-name[WHERE expr]

که ذر آن رکوردهای حایز شرط پاک خواهند شد. اگر هم شرطی نباشد همه رکوردها پاک خواهند شد.

مثال:
حذف تمام رکوردهای یک جدول:


DELETE FROM tbl1


حذف تمام کسانی که نام آنها علی است:



DELETE FROM tbl1WHERE cName='ali'

rezaTavak
چهارشنبه 19 دی 1386, 08:18 صبح
امروز پر استفاده ترین دستور Sql را با هم مرور می کنیم یعنی SELECT که از قبل هم کلی با آن کار کرده اید.

در ساده ترین حالت ممکن:


SELECT * FROM tbl1

تمام رکوردهای یک جدول را بر می گرداند. میدانید * معنی کل فیلدها را میدهد. اما ممکن است بانکی مانند SQLite که محدودیتی در تعداد فیلد در هر رکورد ندارد در FOXPRO ایجاد خطا کند. چراکه فاکس پرو فقط ۲۵۴ فیلد در هر رکورد می تواند داشته باشد.

مثال دوم:

فقط فیلدهایی که مشخص میکنیم:



SELECT cName,cFamily FROM tbl1


فقط فیلدهای cName,cFamily برگشت داده می شود.

یک نکته: در فاکس پرو انتهای هر خط اگر ; سمیکالن باشد ادامه خط در خط بعدی هم دنبال می شود اما اکثر زبانهای SQL از سمیکالن به عنوان پایان خط استفاده میکنند. (مانند زبانها سی و پاسکال و جاوا ) بنابراین دقت کنید در این مورد اشتباه نکنید.

rezaTavak
پنج شنبه 20 دی 1386, 10:43 صبح
نامهای alias یا مستعار:

برای دو جدول می توانیم دستوری مانند زیر داشته باشیم:


SELECT a.cName,b.Salary FROM tbl1 AS a, tbl2 AS b
در اینجا نامهای a به tbl1 و b به tbl2 اشاره می کند. که با کلمه کلید AS نام مستعار تعریف می شود. همینطور در مورد فیلدها هم نام مستعار داریم:


SELECT a.cName AS 'Nam',b.Salary AS 'Hoghoogh' FROM tbl1 AS a, tbl2 AS b
پس از ساخت Query نام فیلدها Nam و Hoghoogh خواهد بود. اما این بیشتر به این درد می خود که ممکن است شما در پرس و جو فیلد محاسبات داشته باشید:


SELECT a.cName AS 'Nam',b.Salary-b.Tax AS 'PureSalary' FROM tbl1 AS a, tbl2 AS b
پس نکته دیگر هم اینکه محاسبات فیلدها هم در این دستور جایز است.



اما دقت کنید دستور فوق اگر در جدول اول ۲۰۰ رکورد و دومی ۱۰۰ رکورد باشد ۲۰۰۰۰ رکورد نتیجه آن خواهد بود. و به ازای هر ردیف جدول اول تمامی ردیفهای جدول دوم برگردانیده می شود.



محاسبات:

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


SELECT SIN(2)
که سینوس زاویه ۲ رادیان را بر می گرداند. (در SQL Server محاز است) اما در SQLite این توابع مجاز هستند:
http://sqlite.org/lang_expr.html

در اکسل:
mk:@MSITStore:D:\Program%20Files\Microsoft%20Offic e\OFFICE11\1033\acmain11.chm::/html/FunctionsAvailableInAPageOrInPivotta.htm

rezaTavak
یک شنبه 23 دی 1386, 13:35 عصر
چیزی که مهم است این است که جداول در بانک رابطه داشته باشند. و چنین مدیری را RDBM می گویند.

فرض کنید مشخصات پرسنل در یک جدول به نام preson و حقوق آنها در salary است و فیلد رابطه‌ای آنها nRelate است برای لیست حقوقی بر اساس نام دستور زیر را بکار می بریم:


SELECT a.cName , b.nPay FROM Person AS a LEFT JOIN Salary AS b ON a.nRelate=b.nRelate


خب دیدید که برای ارتباط از JOIN استفاده کردیم و شرط را با On نوشتیم. اما ارتباط از چند نوع است:
[NATURAL][LEFT | RIGHT | FULL][OUTER | INNER | CROSS] JOIN


Left در جدول اول وجود دارد مهم نیست جدول دوم وجود داشته باشد اگر باشد که مقدار مناسب اگر نباشد NULL
Right برعکس بالاست.
FULL باید در هر دو جدول وجود داشته باشد.

علی اکبر
سه شنبه 25 دی 1386, 07:43 صبح
همیشه این مشکلو داشتم با این select که فوق رکوردهایی رو نمایش می داد که در هردو تا وجود
داشته باشد اما مطلب فوق شما مشکل منو حل کرد
من با این کد کار می کردم


select a.per,b.fname from a,b where a.per=b.per

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


select cod,sharh,(select sum(mab) from table2 where table1.cod=table2.cod) from table1

قطعا منظور دستور منو متوجه می شوید می خواهم جلوی بانک اول میزان مبالغ موجود در بانک دوم مرتبط با فیلد کد بانک اول قرار دهم
اما مشکل چیه
cpu داغ می کنه کل سیستم به حالت هنگ از کار می افته تا زمانی که کار تمام بشه
حالا اگه همین دستور با کد زیر که همون کارو انجام می ده انجام بدم کلی مشکلات حل میشه


select cod,sharh,cod as mab from table1
go top
do whil.not.eof()
_cod=cod
select sum(mab) as a1 from table2 were cod=_cod
select table1
repl mab with table2.a1
skip
enddo

البته این کد قطعا در فاکس باید با sqlexec اجرا بشه ویه کمی کد خلاصه شده تا منظورم رو بگم
این کد با کد اول دقیقا یه کار انجام میده ولی سرعت انجام دومی نسبت به اولی اصلا قابل قیاس نیست
به نظر شما مشکل چیه

rezaTavak
سه شنبه 25 دی 1386, 08:20 صبح
خب ما هنوز وارد بحث GROUP BY نشدیم. sum,count,avg و... نیاز به GROUP BY دارد که در دستورات شما نیست. اجازه بدهید بحث دنبال شود و ببینید با GROUP BY مشکل شما حل می‌شود؟

یعنی من کد اول را به صورت زیر اصلاح می کنم:



SELECT a.cod,a.Sharh,SUM(b.mab) AS mab;
FROM Table1 AS a INNER JOIN Table2 ON a.cod = b.cod;
GROUP BY a.cod,a.Sharh
البته تست کنید ببینید درست نوشتم؟

rezaTavak
سه شنبه 25 دی 1386, 08:58 صبح
خب داشتم دستور Join را توضیح میدادم سرویسمان داشت می رفت نیمه کاره رها شد اما بهتر است مطلب را با مثال بیان کنم:
http://en.wikipedia.org/wiki/Join_(sql (http://en.wikipedia.org/wiki/Join_%28sql))

توضیح کاملی در این خصوص داده که آنرا پی می گیرم.


Department Table DepartmentID DepartmentName
31 Sales
33 Engineering
34 Clerical
35 Marketing


Employee Table LastName DepartmentID
Rafferty 31
Jones 33
Steinberg 33
Robinson 34
Smith 34
Jasper 36
جداول مثال است که با هم بررسی میکنیم:
۱ - INNER JOIN
مفهوم کلی آن این است که رکوردهایی که در جدول یک است باید در جدول دوم هم نظیر داشته باشد یعنی اینکه اگر در جدول اول رکوردی بود اما در دومی نبود یا برعکس در این پرس و جو نمایش داده نخواهد شد به مثال توجه کنید:


Example of an explicit inner join:
SELECT *
FROM employee
INNER JOIN department
ON employee.DepartmentID = department.DepartmentID


Example of an implicit inner join:
SELECT *
FROM employee, department
WHERE employee.DepartmentID = department.DepartmentID


Employee.LastName Employee.DepartmentID Department.DepartmentName Department.DepartmentID
Smith 34 Clerical 34
Jones 33 Engineering 33
Robinson 34 Clerical 34
Steinberg 33 Engineering 33
Rafferty 31 Sales 31


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

اما دو نوع INNER داریم یکی
Equi-join


و دیگری

Natural join


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

rezaTavak
سه شنبه 25 دی 1386, 11:54 صبح
Cross join

این مانند این است که به ازای هر رکورد در جدول اول جدول دوم هر قرار گیرد. و مانند این است که اصلا اینطور دستور را صادر کنیم:


SELECT * FROM employee, department


معادل است با :


SELECT * FROM employee CROSS JOIN department


یعنی تعداد رکوردی که بر می‌گردد مساوی تعداد رکورد جدول اول در تعداد رکورد جدول دوم.

rahro
چهارشنبه 26 دی 1386, 07:00 صبح
مفهوم کلی آن این است که رکوردهایی که در جدول یک است باید در جدول دوم هم نظیر داشته باشد یعنی اینکه اگر در جدول اول رکوردی بود اما در دومی نبود یا برعکس در این پرس و جو نمایش داده نخواهد شد
اگر بخواهم عکس اینعمل را انجام دهم باید چگونه این دستور را بنویسم
برای توضیح بیشتر , دو جدول با یک فیلد مشترک ولی در جدول اول تنها رکوردهایی را میخوام که در جدول دومی وجود نداشته باشد.!!

rezaTavak
چهارشنبه 26 دی 1386, 07:31 صبح
Outer joins


در مقابل بالاست و یعنی اینکه لازم نیست به ازای هر رکورد در یک جدول در دیگر هم وجود داشته باشد.

و به صورتهای زیر است:
left outer joins, right outer joins, and full outer joins
حالات ممکنLeft outer join:


تمام رکوردهای جدول اول بر می گردد و در صورتیکه رکورد متناظر در جدول دوم باشد مقدار آن در غیر اینصورت مقدار NULL بر می گردد. به مثال توجه کنید:



SELECT *
FROM employee
LEFT OUTER JOIN department
ON employee.DepartmentID = department.DepartmentID


Employee.LastName Employee.DepartmentID Department.DepartmentName Department.DepartmentID
Jones 33 Engineering 33
Rafferty 31 Sales 31
Robinson 34 Clerical 34
Smith 34 Clerical 34
Jasper 36 NULL NULL
Steinberg 33 Engineering 33می بینید که رکوردهایی که در جدول اول بود همه انتخاب شدند اما در جدول دوم آنهایی که بودند و حائز شرط در جای مناسب قرار گرفتند و آنهایی که در جدول اول نظیر نداشتند NULL شدند.

Right outer join

این یکی برعکس بالایی است یعنی تمام رکوردهای جدول دوم بر میگردد و اگر رکورد منتناظری در جدول اول بود بر می‌گردد در غیر اینصورت آن فیلدها NULL خواهد بود مثال:


SELECT *
FROM employee
RIGHT OUTER JOIN department
ON employee.DepartmentID = department.DepartmentID



Employee.LastName Employee.DepartmentID Department.DepartmentName Department.DepartmentID
Smith 34 Clerical 34
Jones 33 Engineering 33
Robinson 34 Clerical 34
Steinberg 33 Engineering 33
Rafferty 31 Sales 31
NULL NULL Marketing 35

Full outer join


این یکی ترکیب حالات فوق است یعنی تمام رکوردهای جدول اول و دوم بر می گردد. اگر متناظر در جدول دیگر وجود داشت مقدار مناسب در غیر اینصورت NULL جایگزین فیلدها خواهد شد. مثال:




SELECT *
FROM employee
FULL OUTER JOIN department
ON employee.DepartmentID = department.DepartmentID




Employee.LastName Employee.DepartmentID Department.DepartmentName Department.DepartmentID
Smith 34 Clerical 34
Jones 33 Engineering 33
Robinson 34 Clerical 34
Jasper 36 NULL NULL
Steinberg 33 Engineering 33
Rafferty 31 Sales 31
NULL NULL Marketing 35

rezaTavak
چهارشنبه 26 دی 1386, 07:42 صبح
اگر بخواهم عکس اینعمل را انجام دهم باید چگونه این دستور را بنویسم
برای توضیح بیشتر , دو جدول با یک فیلد مشترک ولی در جدول اول تنها رکوردهایی را میخوام که در جدول دومی وجود نداشته باشد.!!

باید ازLEFT Outer Join استفاده کنید و شرط را بگذارید و Where که هنوز به آن نرسیدم را طوری تنظیم کنید که مقدارهای جدول دوم NULL باشد.

rezaTavak
چهارشنبه 26 دی 1386, 08:18 صبح
Where

در بیشتر دستورات SQL وجود دارد و برای محدود کردن محدوده عمل یا شرط گذاری بکار می‌رود.

در SELECT هم همین است اگر بخواهیم رکوردهایی که نمایش داده می‌شوند محدود شوند این دستور کاربرد دارد.

در جلوی Where باید یک عبارت منطقی باشد که همانطور که میدانید عبارت منطقی شامل مقادیری عملگرهای منطقی مانند < > = و عملگرهای رابطه‌ای مانند AND OR است.

اما برخی از چیزهایی که ممکن است جالب باشند:
IS NULL
IS NOT NULLبرای بررسی خنثی بودن.expr BETWEEN min AND max
بخواهیم فیلدی یاعبارتی بین دو مقدار باشد

NOT

عذم برقراری شرط

expr IN (value,...)

وچود یک چیز را در یک مجموعه خواستار باشیم.

ISNULL(expr)

عبارتی مقدار خنثی داشته باشد.

expr LIKE pat [ESCAPE 'escape-char']

مقدار رشته‌ای شبیه یک الگو باشد اگر در الگو % باشد میتواند هر چیزی به جای آن قرار گیرد.

anubis_ir
چهارشنبه 26 دی 1386, 08:48 صبح
من مدتی با sqlite‌ کار کردم. چون thread safe ساخته نشده در محیط‌های چند ریسمانی مشکلات عدیده‌ای رو ایجاد میکنه.
اگر برنامه شما تک ریسمانی است انتخاب خوبی خواهد بود.

rezaTavak
پنج شنبه 27 دی 1386, 08:54 صبح
خب حال چند مثال از کار با دستور SELECT:

کارهای ریاضی:
میدانید برای محاسبات در SELECT به صورت زیر باید عمل کرد. به بقیه مثالها هم توجه کنید.:


SELECT 1+2*3;

SELECT (1+2)*3;

SELECT 1 = 0;

SELECT '.01' = 0.01;

SELECT '.01' <> '0.01';


SELECT 0.1 <= 2;

SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;

SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL;

SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;

SELECT * FROM tbl_name WHERE auto_col IS NULL;

SELECT 1 BETWEEN 2 AND 3;

SELECT 'b' BETWEEN 'a' AND 'c';

SELECT 2 BETWEEN 2 AND '3';

SELECT 2 BETWEEN 2 AND 'x-3';

SELECT 2 IN (0,3,5,'wefwf');

SELECT 'wefwf' IN (0,3,5,'wefwf');

SELECT ISNULL(1+1);

SELECT ISNULL(1/0);

SELECT NOT 10;

SELECT NOT 0;

SELECT NOT NULL;

SELECT ! (1+1);

SELECT ! 1+1;

SELECT 1+"1";

SELECT 10 LIKE '1%';

SELECT 'David!' LIKE 'David_';

SELECT 'David!' LIKE '%D%v%';

SELECT 'David!' LIKE 'David\_';

SELECT 'David_' LIKE 'David\_';

SELECT 'David_' LIKE 'David|_' ESCAPE '|';

SELECT 'abc' LIKE 'ABC';

SELECT 'abc' LIKE BINARY 'ABC';

ELECT 10 LIKE '1%';





معمولا اگر یک نتیجه یک مقدار منطقی باشد عدد یک بعنوان درست و عدد صفر به عنوان نادرست بعنوان نتیجه بر گردانیده می شود.

rezaTavak
یک شنبه 30 دی 1386, 09:47 صبح
ممکن است بخواهیم که محاسباتی مانند مجموع، شمارش، کمینه و... داشته باشیم در اینصورت مجبوریم که GROUP BY را بکار بریم. مثلا برای محاسبه مجموع ساعات حضور یک پرسنل:



SELECT a.cName, SUM(b.nTime) FROM PERSONAL AS a LEFT JOIN tblTime AS b GROUP BY a.cName
ممکن است بخواهیم شرطی در موقع گروه بندی باشد از HAVING استفاده میکنیم:



SELECT a.cName, SUM(b.nTime) FROM PERSONAL AS a LEFT JOIN tblTime AS b GROUP BY a.cName HAVING b.nTime > 0
در اینجا مثلا فرض شده که اعداد منفی معنای خاصی دارند ونباید در محاسبات وارد شوند.

در حقیقت این دستور برای این است که چند ردیف را یکی کند. حتی بدون استفاده از توابع محاسباتی ذیل می توانید چند رکورد یکجور را یکی کنید.

اما نوع محاسبات:



avg(X) Return the average value of all non-NULL X within a group. String and BLOB values that do not look like numbers are interpreted as 0. The result of avg() is always a floating point value even if all inputs are integers.
count(X)
count(*) The first form return a count of the number of times that X is not NULL in a group. The second form (with no argument) returns the total number of rows in the group.
group_concat(X)
group_concat(X,Y) The result is a string which is the concatenation of all non-NULL values of X. If parameter Y is the separator between instances of X. A comma (",") is used as the separator if Y is omitted.
max(X) Return the maximum value of all values in the group. The usual sort order is used to determine the maximum.
min(X) Return the minimum non-NULL value of all values in the group. The usual sort order is used to determine the minimum. NULL is only returned if all values in the group are NULL.
sum(X)
total(X)
Return the numeric sum of all non-NULL values in the group. If there are no non-NULL input rows then sum() returns NULL but total() returns 0.0. NULL is not normally a helpful result for the sum of no rows but the SQL standard requires it and most other SQL database engines implement sum() that way so SQLite does it in the same way in order to be compatible. The non-standard total() function is provided as a convenient way to work around this design problem in the SQL language. The result of total() is always a floating point value. The result of sum() is an integer value if all non-NULL inputs are integers. If any input to sum() is neither an integer or a NULL then sum() returns a floating point value which might be an approximation to the true sum.
Sum() will throw an "integer overflow" exception if all inputs are integers or NULL and an integer overflow occurs at any point during the computation. Total() never throws an exception.

rezaTavak
دوشنبه 01 بهمن 1386, 12:36 عصر
اما اگر چند فیلد بخواهیم گروه بندی شود از کاما بین هر فیلد استفاده میکنیم.



گروه بندی خاصیتی دارد که ابتدا مرتب شده سپس بازگردانیده خواهند شد. (چون برای حذف میبایست مرتب باشند.)

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

اما برای مرتب سازی در SELECTاز ORDER BY و ذکر فیلدها که بین آنها کاما آمده (یا ذکر عبارات) عمل کنید.

مثال:


SELECT * FROM Personal ORDER BY cName,cFamily

rahro
سه شنبه 02 بهمن 1386, 09:02 صبح
این دستور کجاش مشکل داره که بعد از EXE شدن ارور میده!!!

N_FILE='D:\101\MKOL.DBF' && PATH FILE
DAT_NEW1='1386/01/01' && DATE1
DAT_NEW2='1386/05/31' &&DATE2
SQLRUNED=' FZ1,FZ6 FROM '+N_FILE+' WHERE FZ1 > 0 AND FZ5 > 0 AND FZ6 BETWEEN "'+DAT_NEW1+'" AND "'+DAT_NEW2+'" ORDER BY FZ1 INTO CURSOR TEMP'
SELECT &SQLRUNED

rezaTavak
سه شنبه 02 بهمن 1386, 12:22 عصر
خطا چیه؟

اگر کمپایل نشده باشه خطا ندارد؟

rezaTavak
یک شنبه 07 بهمن 1386, 09:52 صبح
محدود کردن رکوردها:


می توانید میزان رکوردی که نمایش داده می شود را محدود کنید. مثلا برای حذف رکوردهای تکراری از DISTINCT استفاده کنید:




SELECT DISTINCT * FROM tbl1



کد فوق ردیف به ردیف بررسی میکند و اگر هر ردیفی در تمام فیلدها تکراری بود آنرا فقط یکبار نمایش میدهد.
دقت کنید این فرمان هم ابتدا خروجی را مرتب می‌کند.
در برابر دستور فوق ALL وجود دارد که پیش فرض هم همین است یعنی تکراریها حذف نخواهند شد.

در محصولات میکروسافت TOP و بعد از آن عدد تعداد رکوردی که باید ندر خروجی برگردانیده شود را نشان میدهد البته از ابتدای رکوردها حتی کلمه کلیدی Percent هم بعد از عدد برای نمایش درصد می تواند بکار رود اما دقت کنید این کلمه در محصولات میکروسافت است.
(وجود ORDER BY فراموش نشود.)

در عوض در دیگر بانکها کلمه کلیدی LIMIT وجود دارد که اینکار را انجام می‌دهد. دقت کنید حتما باید در انتهای دستور select قرار گیرد و اگر از کلمه کلیدی OFFSET استفاده شود از رکوری که گفته شده جداسازی انجام می‌شود. همچنین اینکار پس از ساخت پس و جو در آخر کار انجام می‌شود.

به مثالها دقت کنید:


SELECT * FROM tbl1 LIMIT 10


فقط ده رکورد اول



SELECT * FROM tbl1 LIMIT 10,20


از رکورد ۱۰ و ۲۰ رکورد.



SELECT * FROM tbl1 LIMIT 10 OFFSET 20


از رکورد ۲۰ و ۱۰ رکورد.

(تفاوت OFFSET و کاما را ببینید.)

تفاوت در دیتابیسهای معروف:




SELECT * FROM T LIMIT 10
PostgreSQL (http://en.wikipedia.org/wiki/PostgreSQL), MySQL (http://en.wikipedia.org/wiki/MySQL), SQLite (http://en.wikipedia.org/wiki/SQLite), H2 (http://en.wikipedia.org/wiki/H2_%28DBMS%29)
SELECT * from T WHERE ROWNUM <= 10 Oracle (http://en.wikipedia.org/wiki/Oracle_database) (also supports the standard, since Oracle8i)

SELECT * FROM T FETCH FIRST 10 ROWS ONLY DB2 (http://en.wikipedia.org/wiki/IBM_DB2) (also supports the standard, since DB2 v8)


SELECT TOP 10 * FROM T
MS SQL Server (http://en.wikipedia.org/wiki/Microsoft_SQL_Server) (also supports the standard, since SQL Server 2005), Sybase ASE (http://en.wikipedia.org/wiki/Adaptive_Server_Enterprise), SQL_Anywhere (http://en.wikipedia.org/wiki/SQL_Anywhere), MS Access (http://en.wikipedia.org/wiki/Microsoft_Access)


دقت کنید که این جزئی از استاندارد نیست.

rahro
یک شنبه 07 بهمن 1386, 12:10 عصر
خطا چیه؟

اگر کمپایل نشده باشه خطا ندارد؟
خطا هستش: Feature not available
در صورتی که بصورت App کمپایل بشه یا Fxp رو اجرا کنم ایراد نمیگیره ! این ایراد در صورتیه که پروژه Exe بشه.

rezaTavak
یک شنبه 07 بهمن 1386, 13:21 عصر
این خطا میگه که این syntax برای این نگارش درست نیست!

عجیبه!

rezaTavak
یک شنبه 07 بهمن 1386, 13:41 عصر
چیزی که در ORDER BY یادم رفته بود:

DESC و ASC برای ترتیب نزولی و صعودی است به مثال توجه کنید:



SELECT * FROM tbl1 ORDER BY cNAME ASC, cDate DESC


دقت کنید اولی صعودی مرتب شده و دومین فیلد نزولی.

rahro
دوشنبه 08 بهمن 1386, 07:01 صبح
این خطا میگه که این syntax برای این نگارش درست نیست!

عجیبه!
من این دستور رو تو FOX2.6 نوشتم ! یعنی چی ؟!!!

rezaTavak
دوشنبه 08 بهمن 1386, 08:42 صبح
من فاکس قدیمی ندارم اما مطمئنید که:

INTO CURSOR TEMP


در فاکس ۲.۶ هم هست؟

rahro
دوشنبه 08 بهمن 1386, 08:50 صبح
من فاکس قدیمی ندارم اما مطمئنید که:

INTO CURSOR TEMP

در فاکس ۲.۶ هم هست؟
آره :متفکر:

CURSOR <cursor> - Stores query results in a cursor named <cursor>.
If you specify the name of an open table/.DBF, FoxPro closes the
table/.DBF and creates a cursor by that name without warning if
SET SAFETY is OFF. After SELECT is executed, the temporary cursor
remains open and is active but is read-only. Once you close this
temporary cursor, it is deleted. Cursors can exist as a temporary
file on the SORTWORK drive.

rezaTavak
دوشنبه 08 بهمن 1386, 09:08 صبح
بهتره این بحث را به جایی دیگر منتقل کنید شاید دوستان در آنجا بتوانند کمک کنند.

من که می گم مشکل از جایی دیگر است برای این منظور خط آخری که دستور است را غیر فعال کن ببین باز هم خطا میده؟

rezaTavak
یک شنبه 14 بهمن 1386, 10:13 صبح
بحت SQL تمام شد اگر دوستان چیزی جا مانده ادامه دهند.

برای دانستن بیشتر به:

http://www.w3schools.com/sql/default.asp

mehran_337
یک شنبه 14 بهمن 1386, 13:49 عصر
چند مورد :
در ویژوال فاکس برای هر شی به طور مستقیم با بانک ارتباط می دهیم مثل کمبو و یا ... و این مراحل کار را بسیار کوتاه می کند اما آیا اگر دیتابیس sql باشد همش باید کرسری با دستور select اجرا شود ؟؟؟ یعنی وقتی کمبویی قرار می دهیم باید با دستورات آن را سورس دهی کنیم؟
در کل برداشت من تایپ دستور sql ، ایجاد کرسر و مجددا استفاده از بروز رسانی است ؟؟؟؟
مورد بعد اینکه ما در دیتا منیجر از تریگر ها استفاده زیادی می کنیم در sql چگونه می توانیم کدنویسی کنیم؟

rezaTavak
یک شنبه 14 بهمن 1386, 17:22 عصر
سلام

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

بقیه بحثها بستگی به نوع مدیر آن دارد.

در فاکس هم می توانید Remote view بسازید و مانند جدول با آن رفتار کنید. همان چیزی که در بحث MySQL گفته ام.

اینها برای این بود که بدانید کسان دیگر در مثلا بیسیک یا جاوا چگونه کار میکنند!

البته جاوا مثلا ResultSet دارد که یه چیزی تو مایه های table خودمونه و بیسیک با ADO بهینه شده اما به پای فاکس نمی رسند!

mehran_337
دوشنبه 15 بهمن 1386, 08:33 صبح
اتفاقا نکته خوبی را اشاره کردید برای من هم سوال بود که زبانهای دیگه باید از دستورات مذکور استفاده کنند و فاکس علاوه بر روشهای فوق جداول مخصوص به خود را داراست.
مورد بعد اینکه سوال من پاسخ داده نشد آیا با توجه به توضیحاتی که دادید زبانهای دیگر برای هر عمل مثلا تنظیم سورس یک کمبو هم ناچارا از نوشتن دستورات sql باید استفاده کنند و نهایتا آپدیت بانک؟؟

rezaTavak
دوشنبه 15 بهمن 1386, 09:56 صبح
بله در زبانهای دیگر هم باید از این دستورات استفاده کرد.
جتی در فاکس هم بصورت داخلی همینکار انجام می شود.


منتها آدمهای خوش ذوق برای ساده تر کردن کار برای اینکار کلاس مرتبط می سازند مثلا نمونه ای از این کلاس برای java وجود دارد که تمام کنترلهای آنرا برای ارتباط با بانک مهیا کرده است:
http:// (http://swingset.sourceforge.net)swingset.sourceforge.net (http://swingset.sourceforge.net)
که من در netbeans (یک IDE برای جاوا) با آن بصورت ویژوال کار میکنم.

حتی برای ساخت گزارش هم در زبانهای دیگر کلاس مرتبط وجود دارد مثلا در جاوا:
jasperreport
یا حتی ساخت چارت از روی اطلاعات بانک jfreechart و...

و حتی محیط ویژوال مانند iReport برای دو کلاس بالایی!


زبانهای دیگر را مطلع نیستم اما مطمئن باشید اصول دستورات SQL است که شما می توانید قدرتمند باشید.

mehran_337
یک شنبه 23 فروردین 1388, 17:27 عصر
با سلام
جناب توکل با وجودیکه قبلا مطالب فوق را خواندم اما استفاده نکرده بودم تا اینکه دست به کار شدم و تصمیم گرفتم در پروژه های جدید از بانکی بغیر از فاکس استفاده کنم. خیلی جالب بود و از راحتی کار به وجد آمدم اما :

1 - پس از نصب متوجه شدم sqlite 2 utf-8 نیز وجود دارد می خواستم ببینم این فایل چیست ؟
2 - پس از ساختن دیتابیس دیدم فقط یک فایل دارم که به راحتی با برنامه sqliteadmin باز می شود پس امنیت بانک چطور ایجاد می شود.
3 - امنیت اکسس که لو رفته است آیا برای این نیز تا کنون راه نفوذی پیدا کرده اند ؟
4 - هنگامیکه از طریق پنل پروژه دیتابیسی ایجاد می کنم و ریموت ویو می کنم پیغام
file is encrypted or not a database می دهد حال آنکه با دستوراتی که گفتید به راحتی کانکشن ایجاد شد و مشکلی نداشتم.
5 - کدنویسی در تریگر این دیتابیس با چه زبانی نوشته می شود نقش فاکس در این بخش چیست؟
6 - نوشته شده بود در sql ها کنترل کار رکوردها در شبکه به عهده خود دیتابیس است نه برنامه نویس ، اعمالی از قبیل بافرینگ و لاک کردن و جلوگیری از کانفلیگ و ... در این برنامه چطور؟
چنانچه از درون فاکس و دستور insert مقدار فارسی را به تیبل می ریزم توسط brow می بینم آن رکورد خالی است و درون sqliteadmin می بینم حروف ناخوانا پر شده است حال آنکه از ادمین اگر عبارت فارسی در تیبل بریزم در فاکس قابل رویت است.
اگر می شود در این زمینه ها راهنمایی کنید
با تشکر

rezaTavak
چهارشنبه 26 فروردین 1388, 08:41 صبح
۱- من چون توی لینوکس کار میکنم نمی دانم واقعا چه چیزی است.
۲ - این بانک ساده است و فقط برای کارهای کوچک است. امنیت در دیتابیس منیجرهایی است که تازه آن هم کلی اصول دارد.
۳ - گذاشتن رمز امنیت نیست. امنیت یعنی اینکه مثلا شما بتوانید از یک کامپیوتر راه دور به یک دیتابیس منیجر بطور غیر مجاز دسترسی داشته باشید. این دیتابیس در حدی ساده است که روی موبایل هم هست.
۴ - ریموت باید اول دیتابیس وجود داشته بعد به آن وصل شوید. شما در واقع دیتابیسی نساخته اید.
۵ - کد آن با خود همان زبانی است که در sqlite است یعنی همان sql استاندارد.
6 - ببینید منظور من این بود که مثل آن چیزی که در فاکس شماره رکورد در ذهن دارید انتظار نداشته باشید. یعنی فقط به دستورات اکتفا کنید.

شما باید اول داده خود را به یونیکد یا utf8 تبدیل کنید و سپس انتقال دهید تا همه جا درست باشد.