PDA

View Full Version : نیاز به راهنمایی برای ساخت کوئری



unforgiven
یک شنبه 01 تیر 1393, 18:06 عصر
سلام دوستان
ما جدول فروشی داریم که در اون مشخصات مشتری و تاریخ آخرین خریدش ذخیره میشه .حالا قرار شده لیست همه مشتریانی که مثلا از تاریخ آخرین خریدشون بیش از 2 ماه گذشته رو بدست بیاریم و براشون sms ارسال کنیم . مشتریان به صورت میانگین 7 هزار نفر هستن .
دوستان راه حلی برای این کوئری سراغ دارید که البته با سرعت خوبی هم اجرا بشه !
مثال یا کدی در این زمینه دارید ممنون میشم بزارید
پیشاپیش متشکرم

vbhamed
پنج شنبه 05 تیر 1393, 05:45 صبح
سلام

بهترين راه ثبت تاريخ به صورت ميلادي در بانك اطلاعاتي و استفاده از اونه
اينم مثال، selldate نام فيلد تاريخ است و عدد 60 هم تعداد روز مورد نظر

SELECT * FROM Table1 WHERE selldate<now()-60

m.4.r.m
پنج شنبه 05 تیر 1393, 17:34 عصر
با تاریخ شمسی هم میشه این کارو کرد . شما اول باید خارج از کوئری درون یک متغیر یا لیبل اختلاف تاریخ خرید و تاریخ جاری رو بصورت شمسی محاسبه کنی (توسط توابع تاریخ شمسی) بعدا از کوئری استفاده کنی به همین راحتی

vbhamed
جمعه 06 تیر 1393, 15:18 عصر
با تاریخ شمسی هم میشه این کارو کرد . شما اول باید خارج از کوئری درون یک متغیر یا لیبل اختلاف تاریخ خرید و تاریخ جاری رو بصورت شمسی محاسبه کنی (توسط توابع تاریخ شمسی) بعدا از کوئری استفاده کنی به همین راحتی

سلام
خب در اينصورت بايد هر ركورد جداگانه پردازش بشه چون معمولا آخرين تاريخ خريد يك مشتري با مشتري ديگه متفاوته و نميشه از يك دستور اس كيو ال براي پردازش كل مشتريان استفاده كرد

ضمنا وقتي به راحتي ميشه روي تاريخهاي ميلادي محاسبات انجام داد چه كاريه شمسي استفاده بشه و با توجه به اينكه آخرين تاريخ خريد در جدول مشتريان ثبت ميشه و هر مشتري هم فقط يكبار اسمش در جدول مشتريان ثبت ميشه، اضافه شدن يك فيلد تاريخ در جدول مشتريان، حجم بسيار كمي رو روي كل ركوردها اشغال مي‌كنه، ضمن اينكه اگر هم فيلد تاريخ ميلادي اضافه نمي‌شد بايد فيلد تاريخ شمسي اضافه ميشد

unforgiven
چهارشنبه 11 تیر 1393, 12:33 عصر
vbhamed عزیز سلام
ببخشید یکم دیر جواب دادم . ممنون از پاسخت . ولی تاریخ در بانک به صورت شمسی ذخیره شده و دقیقا او مطلبی که در پست بالایی فرمودید در موردش صدق می کنه .
با این توضیحات بهینه ترین و پر سرعت ترین راه برای حل این مسئله چی هست ؟
متشکرم

vbhamed
چهارشنبه 11 تیر 1393, 14:05 عصر
سلام

درسته كه تاريختون شمسي هست، اما بهترين راه اينه كه يك فيلد تاريخ ميلادي هم اضافه كنيد و معادل ميلادي هر تاريخ شمسي رو هم در اون ذخيره كنيد، حالا اگر فيلد تاريخ شمسي رو جايي براي نمايش در ليست نياز نداريد كلا اون رو حذف كنيد ولي اگر نياز داريد بزاريد هر دو تا فيلد باشه

اينطوري كوئري مورد نظر خيلي سريعتر از حالتي هست كه يكي يكي پردازش كنيد چون علاوه بر اينكه خود حلقه تاخير ايجاد مي‌كنه، مقايسه هم در محيط وي بي انجام ميشه در صورتيكه در حالتي كه تاريخ ميلادي داريد مقايسه با سرعت بالاتر توسط موتور بانك اطلاعاتي انجام ميشه

يك فيلد اضافه تاريخ اون هم در جدول مشتريان كه به ازاي هر مشتري فقط يك ركورد داره، سرباز زيادي نداره

unforgiven
چهارشنبه 11 تیر 1393, 17:11 عصر
بله ای کاش حداقل داخل جدول خرید مشتریان علاوه بر تاریخ شمسی فیلد تاریخ میلادی رو هم اضافه میکردم .
راستش موضوع این که نزدیک 200 نسخه از برنامه با این بانک به مشتری داده شده و الان امکان این که این فیلد رو به بانک ها اضافه کنم وجود نداره .ظاهرا باید با همون حلقه کار رو انجام بدم . شما کد بهینه ای برای این موضوع میتونید پیشنهاد بدید ؟
متشکرم

vbhamed
پنج شنبه 12 تیر 1393, 05:31 صبح
سلام
اگر قراره برنامه جديدي بهشون بديد پس مي‌تونيد با همون برنامه به صورت اتوماتيك به ديتابيس فيلد اضافه كنيد و مقادير ميلادي جديد رو هم محاسبه كنيد
دستورات Sql شامل دو دسته DDL و DML هستند كه DML براي مديريت داده هاي بانك و DDL جهت مديريت ساختار بانك اطلاعاتي است و با دستورات DDL ميشه ساختار رو تغيير داد، فيلد و جدول، اضافه و ويرايش يا حذف كرد و ...

دستوراتي مثل Alter table و ...

البته از روش اتصال به بانك اطلاعاتي از طريق كنترل ديتا هم ميشه اينكار ها رو انجام داد، پس مهم نيست برنامه شما دست 200 تا مشتري باشه، شما با آپديت جديد مي‌تونيد ساختار بانك رو روي دستگاه مشتري عوض كنيد و مثلا يك جدول جديد هم در بانك ايجاد كنيد كه ورژن بانك اطلاعاتي رو در اون بنويسيد تا با ورود به برنامه چك كنيد اگر ورژنش قديمي هست اصلاحش كنيد

البته يك روش ديگه هم هست كه زياد توصيه نميشه ولي بعضي مواقع خوبه، اونم اينكه بانك جديد با ساختار جديد رو بسازيد و به همراه آپديت برنامه به مشتري بديد و برنامه شما داده ها رو از بانك قبلي به بانك جديد منتقل كنه

unforgiven
پنج شنبه 12 تیر 1393, 10:06 صبح
سلام
اگر قراره برنامه جديدي بهشون بديد پس مي‌تونيد با همون برنامه به صورت اتوماتيك به ديتابيس فيلد اضافه كنيد و مقادير ميلادي جديد رو هم محاسبه كنيد
دستورات Sql شامل دو دسته DDL و DML هستند كه DML براي مديريت داده هاي بانك و DDL جهت مديريت ساختار بانك اطلاعاتي است و با دستورات DDL ميشه ساختار رو تغيير داد، فيلد و جدول، اضافه و ويرايش يا حذف كرد و ...

دستوراتي مثل Alter table و ...

البته از روش اتصال به بانك اطلاعاتي از طريق كنترل ديتا هم ميشه اينكار ها رو انجام داد، پس مهم نيست برنامه شما دست 200 تا مشتري باشه، شما با آپديت جديد مي‌تونيد ساختار بانك رو روي دستگاه مشتري عوض كنيد و مثلا يك جدول جديد هم در بانك ايجاد كنيد كه ورژن بانك اطلاعاتي رو در اون بنويسيد تا با ورود به برنامه چك كنيد اگر ورژنش قديمي هست اصلاحش كنيد

البته يك روش ديگه هم هست كه زياد توصيه نميشه ولي بعضي مواقع خوبه، اونم اينكه بانك جديد با ساختار جديد رو بسازيد و به همراه آپديت برنامه به مشتري بديد و برنامه شما داده ها رو از بانك قبلي به بانك جديد منتقل كنه

آقا حامد سلام
این مطالبی که گفتید فکر کنم در مورد SQL server باشه ,در مورد بانک اکسس هم صدق می کنه ؟ چون بانک اطلاعاتی ما الان اکسس 2003 هست .البته خیلی از دستورات SQL در اکسس قابل استفاده هست . حالا نمیدونم میشه در اکسس هم ازش استفاده کرد و اگر میشه مثالی در این باره دارید ؟ متشکرم

vbhamed
پنج شنبه 12 تیر 1393, 13:50 عصر
سلام
بله در مورد اكسس هم ميشه
در مورد خودم يكي از كارهاي مهم برنامه هاييم كه بانكش اكسسه همين درست كردن ساختار بانك اطلاعاتي در ابتداي ورود به برنامه است، در صورتيكه ساختار بانكم قديمي باشه
اين يك نمونه براي افزودن فيلد تاريخ ميلادي
Dim cn As New Connection

cn.Open ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Test.mdb;Persist Security Info=False")
cn.Execute "Alter Table Table1 add MiladiDate Date"
cn.Close
براي بقيه دستورات DDL هم مي‌تونيد سايت بسيار مفيد و معروف زير رو ببينيد
http://www.w3schools.com/sql/sql_alter.asp

unforgiven
پنج شنبه 12 تیر 1393, 17:15 عصر
اینجا یه مشکلی وجود داره .
فرض کنید من می خوام تو جدول مشتریان فیلد تاریخ میلادی رو اضافه کنم . با دستور Alter یه جدول بر اساس ساختاری که تعریف می کنیم درست میشه . اما تکلیف دیتای مشتری چی میشه . از بین میره و جدول خام ایجاد میشه ؟ یا جدول من سرجاش هست با دیتاش و فقط اون ستون بهش اضافه شده؟ میشه یکم بیشتر در مورد روشی که خودتون برای برنامه هاتون استفاده می کنید توضیح بدید . مثلا کد های اصلاح بانک رو در ابتدای برنامه در بخش splash میزارید یا جایی از برنامه قرار میدید که فقط یکبار کدها اجرا بشن .
ممنون میشم بیشتر توضیح بدید.

vbhamed
پنج شنبه 12 تیر 1393, 17:54 عصر
سلام
چون شما داريد يك فيلد اضافه مي‌كنيد كاري با ديتاهاي شما نداره و فقط يك فيلد اضافه ميشه كه مقدارش تو تمام ركوردها Null هست و بايد بعد از ايجاد مقداردهي كنيد
اگر فيلدي رو ويرايش مي‌كرديد ممكن بود روي ديتا تاثير بزاره ولي اضافه كردن فيلد مشكلي نداره
در هر صورت در هنگام انجام عمليات اينچنيني حتما از بانكتون بكاپ بگيريد و روي سيستم خودتون هم دقيقا عملكرد رو تست كنيد

unforgiven
پنج شنبه 12 تیر 1393, 18:32 عصر
لطفا اگر دوست دارید و مایلید یکم بیشتر در مورد روشی که خودتون برای برنامه هاتون استفاده می کنید توضیح بدید . مثلا کد های اصلاح بانک رو در ابتدای برنامه در بخش splash میزارید یا جایی از برنامه قرار میدید که فقط یکبار کدها اجرا بشن .
ممنون میشم بیشتر توضیح بدید.

vbhamed
پنج شنبه 12 تیر 1393, 19:35 عصر
سلام

روش من يكم از اين روشي كه به شما گفتم پيچيده تره اونم به خاطر اينكه از سالها قبل اونطوري انجامش داده بوده و ديگه تغيير ندادم وگرنه روشي كه بهتون گفتم اصولي تره و ممكنه روش فعلي خودم رو هم به اين حالت تغيير بدم

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