• مشکی
  • سفید
  • سبز
  • آبی
  • قرمز
  • نارنجی
  • بنفش
  • طلایی
انجمن ها > انجمن کامپیوتر > صفحه اول بحث
لطفا در سایت شناسائی شوید!
کامپیوتر (بازدید: 8841)
يکشنبه 9/3/1389 - 22:31 -0 تشکر 202954
برنامه نویسى و برنامه سازى

این تاپیك رو اصلاح مى كنم تا هر دوستى سوالى و یا مطلبى در مورد برنامه سازى با زبانهاى مختلف داشته باشد در این جا ثبت كند

سه شنبه 11/3/1389 - 20:39 - 0 تشکر 203389

کنترلهای مخفی

شاید تابحال این سؤال برایتان پپش آمده باشد كه صفت hidden در کنترلها چه كاربردی دارد و اصولا کنترلی كه مخفی باشد به چه دردی می خورد؟ من در این مقاله سعی براین دارم كه با نشان دادن كاربردهایی از این کنترلها، كارایی آنها را برایتان شرح دهم.

یك کنترل مخفی در اصل یك فیلد textbox است كه از دید كاربر مخفی می ماند. اگر تاكنون برای صفحات وب برنامه نویسی كرده باشید، حتما تاكنون به مواردی برخورد كرده اید كه لازم بوده کنترلی برای دریافت اطلاعات از كاربر در صفحه قرار دهید و درصورتی كه كاربر قبلا این کنترل را submit كرده باشد، دیگر نیازی به نمایش آن کنترل نداشته باشید. در واقع اگر كاربر قبلا این کنترل را تكمیل كرده باشد، دیگر نیازی نیست که این کنترل نمایش داده شود.

برای این منظور یك textbox مخفی با نام process و مقدار true در فرم مربوطه ایجاد كنید.


بعد action فرم حاوی آن کنترل را به همان صفحه قرار دهید. در ابتدای شروع تگ Form مقدار متغیر process را چك كنید. اگر این اولین باری باشد كه كاربر این صفحه را مشاهده می كند، متغیر process هیچ مقداری نداشته و خالی خواهد بود. اما اگر او قبلا کنترل شما را submit كرده باشد متغیر process مقدار true خواهد داشت. در زیر نمونه كدی را كه برای این منظور باید استفاده شود را آورده ام:

If Request.Form("process") Then
    RunFunction
Else
    Show MyForm
EndIf

دومین راه استفاده از کنترلهای مخفی، قرار دادن اطلاعاتی در کنترل میباشد كه شما می خواهید یا آنها از صفحه ای به صفحه دیگر منتقل كنید و یا اطلاعاتی را كه خودتان بوجود آورده اید (مثل UserId كه بعد از login كردن هر كاربر تولید می شود) بین صفحات انتقال دهید.

جای دیگری كه در آنجا استفاده از کنترلهای مخفی رایج می باشد، در صفحاتی است كه تعداد خاصی از ركوردهای یك بانك اطلاعاتی را در یك صفحه نمایش داده و با استفاده از دكمه های Next و Prev امكان دیدن تعداد ركوردهای بعدی را درصفحه بعد، فراهم می آورند. برای این منظور بعداز Submit كردن یك پرسش (یا فشردن یك دكمه مثل Next) نیاز به رد كردن تعداد ركوردهایی كه تا صفحه قبل نمایش داده بودیم داریم. در این روش وقتی كه كاربر روی دكمه Next، مثلا برای نمایش ۵۰ ركورد بعدی كلیك می كند، تعداد ركوردهای گذشته را كه نمایش داده شده اند، توسط مقدار یك Textbox مخفی به آن صفحه می فرستیم. سپس از این مقدار در عبارت SQL برای بدست آوردن ركوردهای موردنظر استفاده می كنیم.

سه شنبه 11/3/1389 - 20:43 - 0 تشکر 203392

Smart Navigation

در طراحی یک برنامه مبتنی بر Web بعضی اوقات نیازمند ایجاد صفحاتی هستیم که باید بعد از دریافت درخواست کاربر به روز درآید.
برای مثال در نظر بگیرید صفحه ای داریم که در آن نام کارخانه های موجود در بانک اطلاعاتی در یک Combo Box به نمایش در می آید و در سمت راست آن Combo Box دیگری قرار دارد که خطوط  تولید کارخانه انتخاب شده از Combo box قبلی نشان داده می شوند و همینطور در سمت راست  Combo Box قبلی محصولات آن خط تولید به نمایش در می آید. پس در واقع سه جدول در بانک اطلاعاتی موجود است ، که در Combo box متناظرشان باید به صورت مناسب به نمایش در آیند. بدین صورت که با انتخاب نام کارخانه از لیست اول نام خطوط تولید آن کارخانه در لیست بعدی نشان داده شود و سپس با انتخاب نام خط تولید نام محصولات آن در لسیت بعدی به نمایش در آید.
برای پیاده سازی این عملیات بصورت عادی نیاز مند به روز رسانی صفحه Web در هر مرحله و  واکشی اطلاعات از بانک اطلاعاتی هستیم . اما همانطور که می دانیم به روز رسانی صفحه باعث چشمک زدن آن ، و دریافت یکسری اطلاعات تکراری می باشد.در یک مقاله به نام Smart  Navigation راهی معرفی شده بود برای ASP.NET در IE ، حال به توضیح روشی می پردازم که  در حدود بیش از یک سال است که من در ASP از آن بهره می برم البته این روش در اکثر Web  Browser ها قابل استفاده می باشد (تمام مرور گرهای web ای که DOM 2 را حمایت کنند نظیر +NS6 و +IE4 و ... )، حتی می توانید آن را به یک ASP.Net Component تبدیل  نمایید , اساس کار شبیه روش Smart Navigation هست.

روش کار :
صفحه شما تشکیل می گردد از دو فریم :
1) Main : این فریم همان فریمی است که شما اطلاعاتتان را در آن نمایش می دهید ، اندازه آن 100% و Norezise هست. که در اینجا GradesList.asp در آن قرار می گیرد و صفحه ای است که در آن ComboBox  ها قرار گیرند.
2) Hidden : این فریم در واقع با اندازه 0% شکل میگیرد و NoResize است . در واقع این Frame از چشم کاربر مخفی است , صفحات درونی آن متغییر و موقتی مورد استفاده قرار می گیرند. که در اینجا وابسته به نیاز صفحاتretvFamily.asp , retvGrade.asp , ... در آن قرار می گیرند.

 MainPage.htm



Untitled Document







<br />  ....<br />

GradesList.ASP  ----------> In Main Frame


Untitled Document











Select
Grade




















ManufacturerFamilyLineGrade

<% set clsDataBase = Server.CreateObject("Daikin3.clsDatabase")
clsDataBase.ConnectionString = "DSN=Daikin"
set Manufacturers = clsDataBase.GetManufacturers %>








   







توابعی با نام reloadXXXXComboBox برای درخواست اطلاعات جدید و غیر معتبر سازی Combo box مورد استفاده قرار می گیرد.
توابعی با نام
 setXXXXComboBox برای ارسال مقادیر جدید و تنظیم Combo Box از فریم Hidden فراخوانی می گردد.

retvFamily.asp

<%@ Language=VBScript %>
<% ManufacturerId = Request.QueryString("ManufacturerId") %>







retvGrades.asp

<%@ Language=VBScript %>
<% LineId = Request.QueryString("LineId") %>









retvLine.asp

<%@ Language=VBScript %>
<% FamilyId = Request.QueryString("FamilyId") %>









در واقع هنگامیکه درخواست دیدن صفحه اصلی را می کنیم ، در فریم Main  صفحه GradesList.asp دیده می شود که Manufacturer Combo box  به صورت پیش فرض در همان صفحه تنظیم می شود. بدین صورت که از یک ActiveX Dll که نوشته بودیم نام کارخانه ها  را دریافت نموده ( شما می توانید مستقیما از بانک اطلاعاتی ، اطلاعات مورد نظرتان را دریافت نمایید.) و سپس OPTION ها بر اساس آن تنظیم می گردد. و سه Combo box  دیگر به صورت خالی رها می گردد.
و رویداد
OnChange هر کدام به توابع reloadXXXXComboBox متناظرشان نسبت داده می شود.
حال در نظر بگیرید از نام کارخانه ها یک کارخانه انتخاب می شود ، رویداد
OnChange به کار می افتد و تابع reloadFamilyComboBox  فراخوانی می گردد.

function reloadFamilyComboBox()
{
 with(document.SelectGradeForm.Family)
   {
/*1*/      innerHTML="";   
/*2*/      document.SelectGradeForm.Line.innerHTML = "";
/*3*/      document.SelectGradeForm.Grade.innerHTML = "";
/*4*/      if (document.SelectGradeForm.Manufacturer.value == "") return;
/*5*/      disabled = true;
/*6*/      var oNewNode = document.createElement("OPTION");
/*7*/      oNewNode.innerHTML = "Please wait ..."
/*8*/      appendChild(oNewNode);
/*9*/      window.parent.frames["hidden"].location.href =   "retvFamily.asp?ManufacturerID="+document.SelectGradeForm.Manufacturer.value;
   }
}

با فراخوانی این تابع  با اجرا شدن خط شماره 1 محتویات قبلی Family Combo box خالی می گردد.و سپس در خط 2 و 3 دو Combo box دیگر خالی می گردند.
در خط شماره 4 اگر انتخاب حالت
None Manufacturer کنترل می شود که اگر صحیح بود از تابع خارج می گردد در غیر این صورت اگر یه کارخانه ای انتخاب شده بود  با اجرا شده خط شماره 5 ، Manufacturer Combo box غیرفعال می گردد و به توسط DOM  در خط 7 و 8 Element ای با ارزش یک OPTION ایجاد می گردد و سپس در آن مقدار ... please wait تنظیم می شود و به Combo box اضافه می گردد. و سپس در خط 9 فریم  Hidden به صفحه retvFamily.asp با ارسال شماره
هویت نام کارخانه انتخاب شده نسبت داده می شود.
سپس با اجرا شدن صفحه
ASP مورد نظر در Hidden Frame کد JavaScript ای ساخته می شود.

<%@ Language=VBScript %>
<% ManufacturerId = Request.QueryString("ManufacturerId") %>






در خط 1 تابعی به نام loadAndSetFamilyDetails تعریف می گردد. و در خط شماره 1 از طریق DOM  به شی Main Frame  دسترسی پیدا می نماییم.
در خط شماره 3 و 4 دو آرایه به وجود می آوریم و به واسطه خطوط 5 الی 13 خانه های آرایه را از اطلاعات موجود در Database پر می نماییم. در واقع اطلاعات Family کارخانه انتخاب شده در مرحله قبلی و سپس در خط 14 درخواست فراخوانی تابع setFamilyComboBox با ارسال دو آرایه مورد نظر که شامل نام Family  و شماره هویت آنها ست می نماییم. تابع setFamilyComboBox در صفحه GradesList.asp قرار دارد به همین خاطر به واسطه شی MainFrame آن را فراخوانی می نماییم. اما خود تابع loadAndSetFamilyDetails در خط 15 در هنگام Load شدن این صفحه فراخوانی می گردد.
پس بعد از فراخوانی loadAndSetFamilyDetails در نهایت تابع setFamilyComboBox  فراخوانی می شود.

function setFamilyComboBox(IDs,Values)
{
  with(document.SelectGradeForm.Family)
  {
/*1*/     innerHTML="";
/*2*/      var oNewNode = document.createElement("OPTION");
/*3*/      oNewNode.innerHTML = "Choose One";
/*4*/      appendChild(oNewNode);
/*5*/      var oNewNode = document.createElement("OPTION");
/*6*/      oNewNode.innerHTML = "--------------------";
/*7*/      appendChild(oNewNode);
/*8*/      for (i=0;i              {
/*9*/          var oNewNode = document.createElement("OPTION");
/*10*/          oNewNode.innerHTML = Values[i];
/*11*/          oNewNode.value = IDs[i];
/*12*/          appendChild(oNewNode);
              }
/*13*/     disabled = false;
  }
}

با اجرا شدن خط شماره 1 Family Combo Box  تمام اعضای قبلیش را از دست می دهد و خالی می گردد در واقع نمایش ... please wait  از بین می رود و  سپس از طریق DOM عنصر OPTION ای ساخته می شود با مقدار نمایشی نام Family مورد نظر و ارزشی معادل هویت Family مورد نظر البته برای ایجاد نمودن تعداد OPTION لازم با بدست آوردن تعداد خانه های آرایه و بک حلقه For این کار میسر می گردد و سپس این OPTION  ها به شی Combo box  مورد نظر اضافه می گردند و نهایتا وضعیت غیرفعالی که در مرحله اجرا شدن تابع reloadFamilyComboBox  بوحود آمده بود در اینجا به وضعیت فعال تغییر می کند.
در واقع کار تمام شد و بدوند Refresh  شدن صفحه GradesList.asp اطلاعات موجود در Combo box ها اصلاح گشت برای دیگر Combo box  ها نیز کار به همین صورت است که شما کد آن را می توانید ملاحظه فرمایید.

چهارشنبه 12/3/1389 - 10:25 - 0 تشکر 203478

تبدیل تاریخ و ساعت محلی به تاریخ و ساعت رسمی ایران

با توجه به اینکه بسیاری از سرویس های خوب و مناسب وهمچنین مجانی میزبانی وب (hosting) در خارج از ایران و معمولا در کشورهای امریکایی و اروپایی ارائه می شود و در نتیجه تاریخ آنها میلادی و ساعت آنها ساعت رسمی کشور مربوطه است برآن شدم تا کلاسی را برای تبدیل تاریخ و ساعت سرورهای مربوطه به تاریخ و ساعت رسمی ایران بنویسم. اگر چه در این مورد برنامه های مختلفی ارایه شده است، اما این برنامه نیز ویژگیهای مربوط به خود را داراست که در زیر به آن اشاره می شود.

• تبدیل تاریخ میلادی به شمسی با توجه به اختلاف زمان. بدین معنی که تغییر تاریخ در زمان خود صورت می گیرد. بطور مثال اگر تبدیل تاریخ برای زمان جاری سیستم انجام شود، تاریخ شمسی بدست آمده معادل با تاریخ شمسی ایران است یعنی اگر در راس ساعت 12 شب تاریخ یک روز جلو برود، همین اتفاق در همین ساعت برای سایت رخ می دهد.
• نمایش زمان ایران با توجه به تغییر ساعاتی که در اول بهار و آخر پاییز صورت می گیرد. بنا براین تاریخ و ساعت تبدیلی نیزدقیق و بدون نوسان در زمانهای معینی است. بطور مثال تبدیل تاریخ یک روز تابستان در ساعت 12:30 شب را روز بعد نشان می دهد (یعنی ۱ ساعت جلو رفته را در نظر گرفته و تاریخ را تنظیم می کند. در غیر اینصورت می بایست ساعت را 11:30 شب در نظر گرفته و روز را روز قبل محاسبه می کرد که این اشتباه است).
• نمایش تاریخ به ۴ صورت ممکن است. بطور مثال خواهیم داشت:
• حالت اول: 12/5/1381
• حالت دوم: 12 مرداد 1381
• حات سوم: شنبه 12/5/1381
• حالت چهارم: شنبه 12 مرداد 1381
• محاسبه توسط روشهای معمولی انجام می گیرد. بدین ترتیب که درمحاسبه تاریخ و زمان از هیچ فرمول خاصی استفاده نشده است و این باعث می شود که کدها و روش محاسبه قابل فهم باشد.

با توجه به ویژگیهای فوق، این کلاس محدودیت هایی را نیز داراست که باید مد نظر باشند:

• تبدیل فقط از تاریخ میلادی به شمسی است و برعکس آن امکان پذیر نیست.
• کلاس فقط توانایی محاسبه اختلاف زمانی کشورهای غرب ایران را داراست. بدین معنی که اگر سرور در شرق ایران همچون کشورهای ژاپن و چین بود، این کلاس از محاسبه زمان مربوطه نا توان است.
• ساعت سرور نباید جلو و یا عقب برود.

پس از مقدمه فوق به بررسی خصوصیات و متدهای کلاس می پردازیم:

۱- خصیصه SFhour: (Boolean)
با تنظیم این خصیصه به مقدار True باعث می شود که جلو و یا عقب بردن ساعت در نظر قرار گیرد. اگر مقدار را False قرار دهید دیگر ساعت در آغاز بهار جلو برده نمی شود و در نتیجه در ابتدای پاییز نیز برگرداندن ساعت اعمال نخواهد شد.

توجه کنید که این خصوصیت، مقدار جلو و یا عقب بردن را تغییر نمی دهد. این تغییر مقدار ثابت و همان ۱ ساعت مصوبه مجلس شورای اسلامی است.

۲- خصیصه Time_Diff: (Time)
این خصیصه اختلاف زمانی میان ایران و سرور حاوی سایت را تنظیم میکند. برای بدست آوردن اختلاف زمانی مربوطه کافی است یکبار صفحه حاوی دستور <%=time%> را اجرا کنید تا زمان سرور بدست آید. سپس اختلاف زمانی را با توجه به اینکه زمان ایران مقدار بیشتری دارد محاسبه کنید و مقدار حاصل را به این خصیصه انتصاب دهید. توجه کنید که اگر در فصل بهار یا تابستان هستید، ۱ ساعت از مقدار حاصل کم کنید. بطور مثال اختلاف ساعت ایران با دوبی نیم ساعت است که باید به صورت objectname.Time_Diff=00:30 منظور شود.

۳- خصیصه State: (از 0 تا 3)
این خصیصه مقداری از 0 تا 3 را می گیرد که نحوه نمایش تاریخ را نشان می دهد. 0 مربوط به کوچکترین شکل و 3 مربوط به شکل کامل است.

۴- متد To_Hejri : (DateTime)
این متد تاریخ و زمان را با هم دریافت می کند و با توجه به تنظیمات انجام شده تاریخ شمسی را با رعایت اختلاف زمانی بدست می آورد. بدین ترتیب تاریخ بدست آمده در تمامی ساعات روز با تاریخ شمسی ایران مطابقت می کند و تغییر تاریخ نیز در موقع مقرر انجام می گیرد. توجه کنید که مقدار وررودی باید یک مقدار کامل از تاریخ و زمان باشد.برای بدست آوردن تاریخ و زمان جاری سیستم در یکجا از تابع now() استفاده کنید و یا اینکه تاریخ و زمان مورد نظر را به این صورت به متد مربوطه ارسال کنید: Fdate & " " & Ftime که در آن Fdate و Ftime شامل فرمت های صحیحی از تاریخ و زمان باشند.

۵- متد To_Time: (DateTime)
این متد نیز مانند متد To_Hejri تاریخ و زمان را با هم دریافت می کند و با توجه به اختلاف زمانی موجود و تغییر ساعت موجود در ایران (در صورت تنظیم خصیصه SFhour) زمان رسمی ایران را بازمی گرداند. توجه کنید که این متد مقدار بازگشتی اش از نوع زمان است، بنابرین قادر خواهید بود با توابع مربوطه شکل مورد نظر خود را از آن درآورید. بطور مثال formatdatetime(objectname.To_Time(now()),vbLongTime) زمان جاری را پس از تغییرات به شکل بلند آن نشان خواهد داد.

برای استفاده صحیح از کلاس فوق کل کلاس را در یک فایل قرار دهید ودر انتهای فایل یک نمونه از شئ را ایجاد کرده و تنظیمات مربوطه را برای آن انجام دهید. سپس فایل را به صفحه های ASP دلخواه بچسبانید (include) و از شئ مربوطه استفاده کنید. بطور نمونه پس ازتعریف کلاس بنویسید:

DIM OBJhejri
SET OBJhejri=NEW farsi_date_time
OBJhejri.SFhour = True
OBJhejri.Time_Diff = #9:0:0# 
OBJhejri.State=3

توجه کنید که حتما لازم نیست که بدین صورت عمل کنید. شما حتی قادر خواهید بود نمونه های مختلفی از کلاس را ایجاد کرده و برای هر کدام خصوصیات مربوطه را جداگانه و بر حسب نیاز تنظیم کنید. بدین ترتیب شما قادر خواهید بود زمان و تاریخ ایران را به طور دقیق و مستند پیدا کنید. همچنین این کلاس برای سرورهایی که زمان آن با ایران تنظیم شده نیز قابل استفاده است و بدینوسیله، در صورتیکه آنها زمان را جلو وعقب نبرند، شما خود این کار را انجام می دهید. حتی اگر آنها نیز ساعت را جلو و عقب ببرند، حداقل استفاده کلاس یعنی تبدیل تاریخ میلادی به شمسی هنوز قابل استفاده است. در این حالت که استفاده شئ در پایین ترین سطح خود می باشد، به صورت زیر هواهد بود:

OBJhejri.SFhour = False
OBJhejri.Time_Diff = #0:0:0#

چهارشنبه 12/3/1389 - 10:28 - 0 تشکر 203480

سیستم پرداخت Authorize.Net

Authorize.Net یک دروازه (Gateway) سیستم پرداخت (Payment) شبیه به Verisign"s Payflow pro است. Authoriz.Net چندین محصول مختلف و محدوده سرویس های مختلفی از یک پایانه مجازی تا فرم های پرداخت را معرفی می نماید.

برخلاف چندین دروازه دیگر، توسعه دهندگان امکان انتخاب چگونگی پیاده سازی سرویس های Authorize.Net را دارا می باشند. شما به سادگی می توانید کاربر را به یک فرم بر روی سایت Authorize.Net (چیزی که آنها آن را WebLink می نامند) بفرستید. شما فرم تان را می توانید به یک صفحه در سایت Authorize.Net بفرستید که یک صفحه تشکر آمیزی که شما از سایتتات مشخص کردید می گیرد و به کاربرانتان نشان می دهند (که آن را Relay Response می نامند)، یا اینکه شما می توانید از نرم افزار شخص ثالث (3rd party) برای ارسال نمودن به سرویس دهنده هاشان و دریافت مقادیر بازگشتی و سپس انجام دادن هر آنچه شما نیاز دارید در اسکریپتتان، استفاده نمایید (که آن را Direct Response می نامند).

بدین صورت ما می توانیم درخواست خود را به یک برنامه ISAPI Dll ارسال نماییم بر روی سایت ذکر شده و سپس خروجی آن را تجزیه و تحلیل نماییم. ارسال درخواست در صفحه ASP یا ASP.Net با استفاده از شی Microsoft.XMLHTTP میسر می باشد.

کد زیر نشان دهنده چگونگی کار است :




Description:

Amount:

Credit Card Number:

Expiration Date:

First Name:

Last Name:

Address:

City:

State:

Zip Code:

Phone:

Fax:

Email:






<%
"First enter our loginID
PostData = "x_Login=testdrive" "test account for Authorize.Net
PostData = PostData & "&x_Version=3.0"
PostData = PostData & "&x_Test_Request=TRUE" "since we are testing
PostData = PostData & "&x_ADC_Delim_Data=TRUE" "we want comma delimited
PostData = PostData & "&x_ADC_URL=FALSE" "do not want to redirect

"Now add the form fields
PostData = PostData & "&x_Card_Num=" & Request.Form("x_Card_Num") & ""
PostData = PostData & "&x_Exp_Date=" & Request.Form("x_Exp_Date") & ""
PostData = PostData & "&x_Description=" & Request.Form("x_Description") & ""
PostData = PostData & "&x_Amount=" & Request.Form("x_Amount") & ""
PostData = PostData & "&x_First_Name=" & Request.Form("x_First_Name") & ""
PostData = PostData & "&x_Last_Name=" & Request.Form("x_Last_Name") & ""
PostData = PostData & "&x_company=" & Request.Form("x_company") & ""
PostData = PostData & "&x_Address=" & Request.Form("x_Address") & ""
PostData = PostData & "&x_City=" & Request.Form("x_City") & ""
PostData = PostData & "&x_State=" & Request.Form("x_State") & ""
PostData = PostData & "&x_ZIP=" & Request.Form("x_ZIP") & ""
PostData = PostData & "&x_Phone=" & Request.Form("x_Phone") & ""
PostData = PostData & "&x_Fax=" & Request.Form("x_Fax") & ""
PostData = PostData & "&x_Email=" & Request.Form("x_Email") & ""

"Send the transaction info as part of the querystring
set xml = Server.CreateObject("Microsoft.XMLHTTP")
xml.open "POST", "https://secure.authorize.net/gateway/transact.dll?" _
& PostData & "", false
xml.send ""
strStatus = xml.Status
strRetval = xml.responseText
set xml = nothing

"Response.Write "response = " & strRetVal & "
" "this will print out the
"entire return string
"for troubleshooting

"first we"ll create an array from the return value by splitting on the
"commas and then we"ll assign each member of the array to values that
"better describe them for the reader. Of course we"d probably want to
"do something else with these values like save them to a database,
"create an email to send to the webmaster and/or the user

strArrayVal = split(strRetVal, ",", -1)
x_response_code = strArrayVal(0)
"Response Code:
"1 = This transaction has been approved.
"2 = This transaction has been declined.
"3 = There has been an error processing this transaction.

x_response_subcode = strArrayVal(1)
x_response_reason_code = strArrayVal(2)
x_response_reason_text = strArrayVal(3)
x_auth_code = strArrayVal(4) "6 digit approval code
x_avs_code = strArrayVal(5)
"Address Verification system:
"A = Address (street) matches, Zip does not
"E = AVS error
"N = No match on address or zip
"P = AVS Not Applicable
"R = Retry, system unavailable or timed out
"S = service not supported by issuer
"U = address information is unavailable
"W = 9 digit Zip matches, address does not
"X = exact AVS match
"Y = address and 5 digit zip match
"Z = 5 digit zip matches, address does not

x_trans_id = strArrayVal(6) "transaction id
x_invoice_num = strArrayVal(7)
x_description = strArrayVal(8)
x_amount = strArrayVal(9)
x_method = strArrayVal(10)
x_type = strArrayVal(11)
x_cust_id = strArrayVal(12)
x_first_name = strArrayVal(13)
x_last_name = strArrayVal(14)
x_company = strArrayVal(15)
x_address = strArrayVal(16)
x_city = strArrayVal(17)
x_state = strArrayVal(18)
x_zip = strArrayVal(19)
x_country = strArrayVal(20)
x_phone = strArrayVal(21)
x_fax = strArrayVal(22)
x_email = strArrayVal(23)
x_ship_to_first_name = strArrayVal(24)
x_ship_to_last_name = strArrayVal(25)
x_ship_to_company = strArrayVal(26)
x_ship_to_address = strArrayVal(27)
x_ship_to_city = strArrayVal(28)
x_ship_to_state = strArrayVal(29)
x_ship_to_zip = strArrayVal(30)
x_ship_to_country = strArrayVal(31)
x_tax = strArrayVal(32)
x_duty = strArrayVal(33)
x_freight = strArrayVal(34)
x_tax_exempt = strArrayVal(35)
x_po_num = strArrayVal(36)
x_md5_hash = strArrayVal(37)
%>

Order Receipt


<%
"Check the ErrorCode to make sure that the component was able to talk
"to the authorization network
If (strStatus <> 200) Then
Response.Write "An error occured during processing. " _
& "Please try again later."
else
If x_response_code = 1 Then
Response.Write("Thank you for your purchase.")
elseif x_response_code = 2 then
Response.Write("The transaction was not approved: " _
& x_response_reason_text)
Else
response.Write "An error occured during processing. " _
& "Please try again later."
End If
end if
%>


چهارشنبه 12/3/1389 - 10:33 - 0 تشکر 203481

ورود اطلاعات فارسی با استفاده از جاوااسکریپت

اگر قبلا اقدام به استفاده از زبان فارسی در كدهای خود و مخصوصا هنگام كار با Microsoft Access كرده باشید به احتمال زیاد با مشكلات موجود بر سر راه آشنا هستید. یكی از مشكلات اساسی بر سر راه استفاده از زبان فارسی در بانكهای اطلاعاتی Microsoft Access در نحوه ورود اطلاعات می باشد. برای درك بهتر این موضوع اینگونه عمل نمایید:

در ویندوز خود قابلیت فارسی نویسی را فعال نمایید و پس از آن در Access یك Table با نام test وبا یك فیلد به نام test از نوع text ایجاد نمایید. سپس با استفاده از خود Access اطلاعاتی به زبان فارسی وارد نمایید. سپس از Access خارج شده و با استفاده از ASP به بانك اطلاعاتی Access متصل شده و اطلاعات وارد شده را خوانده و نمایش دهید. مشاهده خواهید نمود كه اطلاعات نمایش داده شده داخل مرورگر با اطلاعات وارد شده توسط شما در داخل Access متفاوت می باشد.

برای حل این مشكل چه باید كرد؟
برای حل این مشكل باید اطلاعات از خارج از Access و با استفاده از ASP و یك تابع Javascript كه صفحه كلید را در همه ویندوزها اعم از فارسی و انگلیسی، فارسی نموده و امكان تایپ فارسی را فراهم میكند، وارد شوند. روش كار به این صورت است كه در یك فرم HTML و در داخل یك Input Box هنگام فشرده شدن هر كلیدی از صفحه كلید، تابع Javascript فرا خوانده شده و معادل فارسی حرف وارد شده را نمایش میدهد. برای نمایش حروف فارسی لازم است كه از charset=windows-1256 استفاده نمایید. فونت صفحه را نیز یكی از دو فونت Times New Roman و یا Tahoma انتخاب نمایید. این دو فونت فونتهای استاندارد ویندوز بوده و برای دیده شدن متون فارسی نیازی به نصب فونت جدید روی سیستم کاربر نخواهد بود. Javascript استفاده شده در زیر آمده است:

#$%،گ)(+و-./0123456789:ك,=.؟@ِذ}ىُىلآـ،/د؛َءٍف{ًْإ~جژچ^_پشذزیثبلاهتنمئدخحضقسفعرصطغظ<|>ّ".charCodeAt(key-32);
else if (e)
e.which=" !"#$%،گ)(+و-./0123456789:ك,=.؟@ِذ}ىُىلآـ،/د؛َءٍف{ًْإ~جژچ^_پشذزیثبلاهتنمئدخحضقسفعرصطغظ<|>ّ".charCodeAt(key-32);
}
return true;
}
//-->

پس از طراحی فایل HTML نوبت به ایجاد فایل ASP می رسد. در فایل ASP باید اطلاعات وارد شده در فرم HTML را دریافت نموده و در بانك اطلاعاتی Access توسط برنامه خود بنویسید. نكته جالب این است كه اگر وارد Microsoft Access شوید و اطلاعات وارد شده توسط برنامه خود را مشاهده نمایید اثری از حروف فارسی مشاهده نخواهید کرد. حال اگر دوباره توسط برنامه ASP اولیه به بانك اطلاعاتی متصل شوید و اطلاعات دریافت شده را داخل مرورگر نمایش دهید اطلاعات به صورت فارسی نمایش داده میشوند. لازم به ذكر است كه باید از charset=windows-1256 در فایل ASP كه اطلاعات فارسی را نمایش میدهد استفاده نمایید.

چهارشنبه 12/3/1389 - 10:40 - 0 تشکر 203488

HTTP HEADERS

هدرهای Http اطلاعاتی هستند كه در پی درخواست یك صفحه وب، از سرویس گیرنده به سرویس دهنده و برعكس فرستاده می شود. به عبارت دیگر وقتی شما یك URL را درخواست می كنید سرویس گیرنده شما به جز آدرس اینترنتی یك سری اطلاعات دیگر را كه شامل نوع مرورگر، IP ، نوع سیستم عامل و میباشد را به سرویس دهنده ارسال می كند. همچنین وقتی سرویس دهنده درخواست شما را پس می فرستد یك مجموعه از اطلاعات مربوط به سرویس دهنده شامل مسیر فیزیكی صفحه درخواست شده، نام نرم افزار سرویس دهنده وب، QueryString، و نیز همراه آن ارسال می كند كه به آنها متغیرهای محیطی یا Enviromnental Variables می گویند.

تمامی Http Header ها و متغیرهای محیطی در مجموعه ServerVariables از آبجكت Request قابل دسترسی میباشند. دستور زیر یك Http Header را به خروجی ارسال میكند.

<%= Request.Servervariables ("نام هدر مورد نظر ") %>

مثال:

<%= Request.Servervariables ("HTTP_USER_AGENT") %>

در زیر لیستی از تمامی Http Header ها و متغیرهای محیطی در Request.ServerVariables آورده شده است.

HTTP_USER_AGENT: نوع مرورگر و نوع سیستم عامل سرویس گیرنده
REMOTE_ADDR: IP كاربری كه صفحه را درخواست كرده است
HTTP_REFERER: URL صفحه ای كه از آنجا به صفحه ASP شما Link شده است
SERVER_NAME: DOMAIN NAME سایتی كه صفحه ASP شما در آن قرار دارد.
HTTP_HOST: نام كامل میزبان وب
HTTP_COOKIE: كوكی هایی كه به مرورگر ارسال میشود
HTTP_ACCEPT_LANGUAGE: زبانهایی كه مرورگر پشتیبانی میكند
URL: URL صفحه ASP مابین DOMAIN NAME و QueryString
PATH_PHYSICAL_PATH: آدرس فیزیكی دایركتوری ریشه WEB
PATH_TRANSLATED: مسیر فیزیكی صفحه ASP شما
QUERY_STRING: دقیقا QueryString را بر می گرداند.
SERVER_SOFTWARE: نرم افزار سرویس دهندهه وب مثل Microsoft-IIS/4.0

برای بدست آوردن تمامی Http Header ها و متغیرهای محیطی از کد زیر استفاده كنید.

<%
Dim strName
For Each strName in Request.ServerVariables
Response.Write "" & strName & ": " & "" & _
Request.ServerVariables (strName)& "
"
Next
%>

چهارشنبه 12/3/1389 - 10:43 - 0 تشکر 203490

معرفی ADO و کاربرد آن در ASP (بخش اول – مفاهیم)

ارتباط ASP با بانك های اطلاعاتی از طریق واسطی بنام ADO انجام می گیرد. با استفاده از رابط فوق می توان به انواع داده های ذخیره شده بسادگی، در كمترین زمان و صرفا بكمك یك مسیر دستیابی پیدا كرد. به همین دلیل می توان ادعا كرد كه ADO ساده ترین روشی است كه تاكنون برای ذخیره و بازیابی داده ها بوجود آمده است.ADO نسخه 5 / 2 دارای پنج شئ اساسی با نام : Connection , Command, RecordSet , Record , Stream است. دو شی Record و Stream در نسخه قبلی ADO وجود نداشتند. در این مقاله به بررسی برخی از اشیاء عمده ADO و متدهای مربوطه آنها خواهیم پرداخت.

شئ Connection
قبل از هر گونه ذخیره و بازیابی داده ها از بانك اطلاعاتی می بایست با ایجاد و مقدار دهی اولیه یك Connection زمینه لازم جهت ارتباط با بانك اطلاعاتی را بوجود آورد. در ADO با استفاده از شی Connection یك ارتباط با بانك اطلاعاتی ایجاد و پس از انجام عملیات دلخواه در رابطه با بانك اطلاعاتی و در زمانیكه به وجود آن دیگر نیاز نباشد، می توان آن را حذف كرد. Open كردن یك ارتباط به بانك اطلاعاتی پروژه ای واحد با نام ( ADODB(ActiveX Data Objects Database بوده كه خود شامل تمامی اشیاء ADO است. برای ایجاد یك Connection نظیر سایر اشیاء ASP از متد Server.CreateObject استفاده می گردد.

Dim Conn
Set Conn = Server.CreateObject("ADODB.Connection")

بصورت پیش فرض Connection فقط خواندنی می باشند، شما می توانید وضعیت فوق را تغییر داده و در صورت نیاز و بكمك صفات مربوط به شی فوق ارتباطاتی از نوع خواندنی / نوشتنی و یا فقط نوشتنی ایجاد نمائید. در زمان استفاده از ADO می توان از مجموعه ای ثوابت كه دربردارنده مقادیر متفاوتی برای آیتم های متفاوت می باشند و پیشاپیش تعریف شده اند استفاده كرد. این ثوابت در فایلی با نام Adovbs.inc قرار دارند. بمنظور استفاده از ثوابت فوق در صفحات ASP خود، می بایست فایل فوق را بكمك دستور Include به برنامه های خود ملحق نمائیم.

اگر فایل adovbs.inc را توسط ادیتوری نظیر Notepad فعال نمائید، ثوابت تعریف شده را بصورت مجموعه ای از گروهها مشاهده خواهید كرد. پس از ایجاد یك Connection با بانك اطلاعاتی می توان نوع ( Mode ) ارتباط را بكمك استفاده از ثوابت تعریف شده مشخص نمود. در صورتیكه بخواهیم از بانك اطلاعاتی صرفا اطلاعاتی را بخوانیم از ثابت adModeRead ، فقط اطلاعاتی را در بانك اطلاعاتی بنویسیم از ثابت adoModeWrite و در نهایت در صورتیكه قصد داریم بطور همزمان اطلاعاتی را از بانك اطلاعاتی خوانده و در آن اطلاعات جدیدی را نیز بنویسیم از ثابت adoModeReadWrite استفاده می گردد. توصیه می گردد با توجه به نوع رفتاری كه با بانك اطلاعاتی خواهیم داشت آن را باز نمائیم چراكه در صورتیكه صرفا قصد خواندن و یا نوشتن را در یك بانك اطلاعاتی داشته باشیم و نخواهیم دو عملیات را با هم انجام دهیم، باز كردن بانك اطلاعاتی بصورت هم خواندنی و هم نوشتنی ( adoModeReadWrite ) سرعت دستیابی به بانك اطلاعاتی را كاهش خواهد داد.

ConnectionString
پس از تعیین Mode، می بایست صفت Connectionstring مربوط به شی Connection را مقدار دهی مناسب نمود. صفت فوق دارای چندین بخش بوده كه می بایست مشخص گردند: نام Provider، نام سرویس دهنده بانك اطلاعاتی، نام بانك اطلاعاتی كه قصد استفاده از آن را دارید، User Id لازم جهت اتصال به بانك اطلاعاتی (UID)، رمز عبور برای كاربرخاص ( PWD ).

هر یك از بخش های فوق توسط علامت ";" از هم جدا می شوند. مثلا در ساده ترین حالت می توانید از یك Data Source Name یا DSN یا مربوط به ODBC، یك User ID، و یك رمز عبور جهت اتصال به بانك اطلاعاتی استفاده نمائید. یك DSN خود شامل نام Provider، نام سرویس دهنده بانك اطلاعاتی و نام بانك اطلاعاتی بوده و دیگر نیازی به مشخص نمودن مجدد آنها نخواهد بود. به مثال زیر توجه فرمائید.

Dim Conn
Set Conn = Server.Create0bject("ADODB.Connection")
Conn.Mode = adModeReadWrite
Conn.ConnectionString = "DSN=myDSN;UID=Javad;PWD=7474;"

روش فوق بهترین حالت ایجاد یك ارتباط نیست زیرا DSN بصورت پیش فرض از MSDASQL Provider استفاده می كند. اما JET OLEDB Provider بمراتب سریعتر و قابلیت های بیشتری را دارا است. بنابراین می توان جهت ارتباط با بانك اطلاعاتی مطابق زیر عمل نمود:

Dim Conn, ConnStr
ConnStr= "PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=" + Server.MapPath(Path2DB)
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Mode = adModeReadWrite
Conn.ConnectionString = ConnStr

ConnectionString شامل نام Provider، نام سرویس دهنده بانك اطلاعاتی و نام بانك اطلاعاتی است. در مثال فوق از تابع Server.MapPath برای ترجمه مسیر مجازی به مسیر واقعی استفاده شده است. مثلا یك بانك اطلاعاتی موجود درwww.Test.com/test.mdb می تواند بصورت واقعی در مسیر E:\web\Mydatabase\Test.mdb قرار گرفته باشد. تابع Server.MapPath آدرس نوع اول را به آدرس نوع دوم ترجمه خواهد كرد. توجه داشته باشیم كه شی ADODB.Connection نیازمند آگاهی از مسیر واقعی بانك اطلاعاتی است. فراموش نكنیم كه قبل از باز نمودن Connection، تمامی تغییرات لازم بر روی صفت های مربوطه اعمال گردد. در صورتیكه بخواهیم پس از ایجاد ارتباط با بانك اطلاعاتی یك یا چند صفت مرتبط را تغییر دهیم، می بایست در ابتدا ارتباط خود را با بانك اطلا عاتی قطع (Connection، بسته گردد) و در ادامه تغییرات لازم را از طریق صفات مربوطه اعمال و مجددا Connection را برقرار نمود.

بمنظور باز نمودن یك Connection از متد Open مربوط به شئ Connection استفاده می گردد.

متد Connection.Open
در صورتیكه متد فوق بدون خطا اجرا گردد، یك ارتباط كاری ( عملیاتی) با بانك اطلاعاتی ایجاد شده است.

متد Connection.Execute
برای بازیابی داده ها از یك بانك اطلاعاتی توسط ADO سه روش عمده وجود دارد. تمامی آنها در مرحله اول نیاز به ارتباط با بانك اطلاعاتی خواهند داشت. ساده ترین حالت استفاده از متد Execute مربوط به شی Connection است. متد فوق سه پارامتر را خواهد داشت:- یك دستور SQL، یا Query، Table، View یا نام یك Stored Procedure كه توسط پارامتر CommandText مشخص خواهد شد.
• یك متغیر با نام RecordsAffected، كه شامل تعداد ركوردهائی خواهد بود كه با توجه به Query اجرا شده توسط متد Execute مشخص می شود.
• یك ثابت اختیاری با نام CommandTypeEnum كه به بانك اطلاعاتی خواهد گفت چه نوع عبارت و یا Query را می خواهید اجرا نمائید و اینكه یك شی Recordset را برگرداند یا خیر.

پس از اجرای متد Execute ( به هر روش ممكن )، ركوردهای برگردانده شده در شئ RecordSet برگردانده خواهند شد. در صورتیكه از دستور SELECT استفاده شود ركوردهای برگردانده شده در شی RecordSet قرار خواهند گرفت. اما زمانیكه از دستورات INSERT و یا UPDATE استفاده گردد رکوردی باز گردانده نخواهد شد.

شئ RecordSet
از شی RecordSet جهت نگهداری رکوردها یا جدول دریافتی استفاده می گردد. این شئ نظیر یك جدول بانك اطلاعاتی دارای سطرها و ستون هائی است. در حقیقت شئ فوق یك تصور مجازی از یك جدول خواهد داد و بصورت فیزیكی یك جدول نیست. چراكه مقادیر مورد نظری كه در ستون های این شئ قرار می گیرد ممكن است حاصل تركیب (Join) چندین جدول دیگر باشند.

متد RecordSet.Open
در صورتیكه در هنگام استفاده از شئ RecordSet به هر نوع Cursor ( اشاره گری به هر یك از سطرهای موجود در جدول ) نیاز داشته باشید ( صرفا نه یك Cursor كه بصورت Forward-Only و یا Read-Only باشد ) می بایست به جای استفاده از متد Execute مربوط به شی Connection، مستقیما بانك اطلاعاتی را باز کنید. شئ RecordSet نیز دارای متدی با نام Open است كه چندین پارامتر را بعنوان پارامتر اخذ می كند.

Recordset.Open CommandText, Connection|ConnectionString, Cursor-Type, LockType, Options

CommandText شامل SQL query بوده، Connection|ConnectionString شامل یك رجوع به شئ Connection باز شده و یا یك پارامتر معتبر Connectionstring است. پارامتر CursorType مقدار خود را از ثابتی با نام adCursorTypeEnm مطابق زیر اخذ خواهد كرد:

adopenForwardOnly: یك Cursor كه فقط امكان حركت بسمت جلو را دارد، برمی گرداند. ( پیش فرض). اگر نوع Cursor را مشخص ننمائید، ADO همواره Cursor از این نوع را بر می گرداند. همانگونه كه از نام آن مشخص است، صرفا می توان بسمت جلو در شئ RecordSet حركت نمود.
AdOpenKeyset: یك Cursor از نوع Keyset را برمی گرداند. در چنین حالتی می توان جهت و نوع حركت را به هر نوع دلخواه انتخاب نمود (اولین ركورد، آخرین ركورد، بسمت جلو، بسمت عقب...). سرویس دهنده برای هر یك از سطرهای موجود در شئ RecordSet پس از اجرای Query یك Bookmark، ایجاد می كند. این Bookmark ها تا زمانیكه شئ Recordset حیات دارد تغییر نخواهند كرد بنابراین در صورتی كه یك ركورد جدید توسط كاربر دیگری در بانك اطلاعاتی در آن زمان درج گردد، آن رکورد جدید برای ما قابل رؤیت نخواهد بود.
adOpenDynamic: یك Cursor پویا را برمی گرداند. این نوع Cursor مشابه Keyset است با این تفاوت كه امكان مشاهده ركوردهای جدید نیز وجود خواهد داشت. یك Cursor پویا بصورت پیوسته ركوردهای جدید و یا تغییر یافته را بررسی و حاصل را در شی RecordSet بصورت پویا منعكس خواهد كرد.
adOpenStatic: یك Cursor ایستا بهمراه تعداد ثابتی از ركوردها را برمی گرداند. در چنین حالتی تغییرات و درج ركوردهای جدید در بانك در همان لحظه مشاهده نخواهد شد مگر اینكه مجددا درخواست بازیابی اطلاعات از بانك صادر شود.

پارامتر LockType، به ADO خواهد گفت كه چگونه با مسئله Lock در بانك اطلاعاتی رفتار نماید. در حالت كلی می بایست برای اعمال تغییرات و یا درج ركوردهای جدید، پیش بینی های لازم را انجام داد. چراكه Lock ایجاد شده توسط یك كاربر می تواند باعث بروز مسائلی برای سایر كاربران گردد. مقدار این پارامتر مطابق زیر خواهد بود:

adLockReadOnly: فقط خواندنی، امكان تغییر داده ها وجود نخواهد داشت.
adLockPessimistic: قویترین نوع Lock است. ركوردهائی كه بدین صورت Lock خواهند شد توسط سایر كاربران قابل دستیابی نخواهند بود. ركوردها زمانیكه سرویس دهنده آنها را برمی گرداند Lock شده و تا زمانیكه شئ RecordSet وجود دارد، امكان استفاده از این ركوردها برای سایرین وجود نخواهد داشت. 
adLockoptimistic: این نوع Lock صرفا در زمان بهنگام سازی یك ركورد اعمال شده و بلافاصله ركورد از حالت Lock آزاد می گردد. بنابراین در مراحلی كه لازم است یك ركورد تغییر یابد می توان از این نوع Lock استفاده كرد. و پس از اعمال تغییرات بصورت اتوماتیك، Lock آزاد خواهد شد.
AdLockBatchOptimistic: این نوع Lock مشابه Optimistic است با این تفاوت كه آنها برای بهنگام سازی Batch مورد استفاده قرار می گیرند. در این حالت مجموعه ای از ركوردها در یك مقطع زمانی بهنگام سازی خواهند شد ( بجای اینكه هر كورد بهنگام سازی گردد ). با توجه به نوع نرم افزار طراحی شده و میزان محاوره ای بودن آن، می توان تصمیم به استفاده از این نوع Lock و یا Optimistic نمود.

آخرین پارامتر متد Recordset.Open، پارامتراختیاری flag است. كه نوع Query را مشخص خواهد كرد ( Table,View,Stored Procedure ).

متد Move
پس از باز نمودن یك شئ RecordSet، با استفاده ازمتد Move، می توان در طول سطرهای موجود در شئ RecordSet با توجه به نوع cursor حركت كرد. شئ RecordSet دارای یك صفت با نام RecordCount بوده كه تعداد ركوردهای موجود در شئ RecordSet را مشخص می كند. تصور كنید كه شئ RecordSet نظیر یك جدول است با یك سطر خالی در ابتدا و یك سطر خالی در انتهای آن و اشاره گر ی كه در هر لحظه به یك ركورد اشاره می كند. در واقع با استفاده از متد Move، موقعیت اشاره گر فوق تغییر خواهد كرد ( اشاره گر حركت خواهد كرد) . شئ RecordSet دارای دو متد دیگر با نام EOF و BOF است كه زمان حضور اشاره گر در ابتدا و یا انتهای ركوردها را مشخص خواهند كرد. این دو متد از نوع Boolean ( درست / نادرست ) هستند.

While NOT RecordSet.EOF
"Do something
RecordSet.MoveNext
Wend

متدهای Sort و Search
با استفاده از متدهای شئ RecordSet، می توان عملیات مرتب سازی (Sort) و جستجو (Search) را انجام داد. برای مرتب سازی یك مجموعه از ركوردها نام فیلد مورد نظری را كه می خواهیم مرتب سازی بر اساس آن انجام شود را به صفت Sort نسبت خواهیم داد. مثلا اگر بخواهیم مجموعه ای از ركوردها را كه توسط اجرای SELECT * FROM PhoneBook برگردانده شده است را براساس نام خانوادگی (LastName) مرتب نمائیم، می توان دستور RecordSet.Sort = "LastName" را استفاده كرد. برای مرتب سازی ركوردها براساس بیش از یك فیلد بصورت RecordSet.Sort = "LastName, FirstName" عمل می نمائیم. برای مرتب سازی ركوردها بصورت صعودی ( پیش فرض است )، یا نزولی بصورت RecordSet.Sort = "LastName, FirstName DESC" عمل می کنیم.

برای جستجوی یك ركورد بخصوص در بین مجموعه ركوردهای برگردانده شده از متد Find شئ RecordSet استفاده می گردد. شرط جستجو را بصورتی كه در یك SQL Where است، مشخص خواهیم كرد و پس از اجرای متد Find، شئ RecordSet به اولین موردی كه پیدا كرده است اشاره خواهد كرد و در صورتیكه ركوردی پیدا نشود،EOF ارزش درست را پیدا خواهد كرد. متد Find بغیر از شرطی كه نظیر SQL WHERE برای آن مشخص می كنیم، می تواند دارای سه پارامتر اختیاری دیگر باشد:

SkipRecords: تعداد ركوردهائی را كه می بایست قبل از عملیات جستجو، صرفنظر (Skip) نماید، مشخص خواهد كرد.
SearchDirection: جهت حركت جستجو در مجموعه ركوردها را مشخص خواهد كرد. adSearchForward ( بسمت جلو) ویا adSearchBackward( از آخر بسمت اول )
Start: تعداد ركوردهائی را كه می بایست برای جستجو شروع كرد مشخص می كند.

شئ Field
با اینكه تاكنون ما به شئ RecordSet بصورت یك جدول نگاه می كردیم، اما این صرفا یك مدل فرضی برای راحتی تصور آن است. شئ RecordSet در حقیقت شامل یك بردار دو بعدی از شئ Field است. شئ Field شامل داده است. بنابراین هر شئ از این نوع دارای یك اندازه، یك مقدار و یك نوع بخصوص است. شئ فوق همچنین دارای مجموعه ای از صفات است. در اكثر موارد شاید نیازی نباشد كه با صفات و متدهای شئ فوق مستقیما كار كنیم، اما مطالعه آنها برای موارد پیش بینی شده در طراحی صفحات ASP كه قصد ارتباط با بانك های اطلاعاتی از طریق ADO را دارند، توصیه می گردد.

چهارشنبه 12/3/1389 - 10:46 - 0 تشکر 203492

معرفی ADO و کاربرد آن در ASP (بخش دوم – مثال)

در این پاسخ به بررسی برخی مثال های كاربردی از نحوه ارتباط ASP و ADO برای ایجاد وب سایت های متكی بر بانك های اطلاعاتی خواهیم پرداخت. قبل از پرداختن به مثال های مربوطه، در ابتدا لازم است كه یك بانك اطلاعاتی نمونه بهمراه یك جدول را تعریف كنیم. به كمك Access (نوع نسخه آن هر چیزی می تواند باشد) یك بانك اطلاعاتی با نام Students.mdb ایجاد و در آن صرفا یك جدول با نام Student كه شامل فیلدهای اطلاعاتی زیر است، را تعریف می كنیم.

ID: شماره دانشجوئی یك دانشجو را در خود نگهداری خواهد كرد. فیلد فوق Primary Key خواهد بود.
FirstName: نام دانشجو را در خود نگهداری خواهد كرد.
LastName: نام خانوادگی دانشجو را در خود ذخیره خواهد كرد. 
DateOfBirth: تاریخ تولد یك دانشجو را در خود نگهداری كرد.
Email: آدرس پست الكترونیكی دانشجو را در خود ذخیره خواهد كرد.

مثال ۱- بازیابی اطلاعات از بانك اطلاعاتی دانشجویان
در این مثال جهت ارتباط با بانك اطلاعاتی از ODBC استفاده نشده است. برای بازیابی اطلاعات از بانك اطلاعاتی فوق از SQL SELECT استفاده می شود. متن برنامه بازیابی اطلاعات از بانك اطلاعاتی دانشجویان بصورت زیر است.


Student Records

<%
Dim DBSet DB = Server.CreateObject ("ADODB.Connection")
DB.Open ("PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=" + "C:\MyDb\Students.mdb")
Dim RSSet RS = Server.CreateObject ("ADODB.Recordset")
RS.Open "SELECT * FROM Students", DB

If RS.EOF And RS.BOF Then
    Response.Write "There are 0 records."
Else
    RS.MoveFirst
    While Not RS.EOF
        Response.Write RS.Fields ("FirstName")
        Response.Write RS.Fields ("LastName")
        Response.Write RS.Fields ("Email")
        Response.Write "
"
        RS.MoveNext
    Wend
End If
%>

مثال ۲- افزودن یک رکورد جدید
در این مثال ركوردهای جدید را در بانك اطلاعاتی دانشجویان ذخیره خواهیم كرد. برای درج ركوردهای جدید در بانك اطلاعاتی می توان از INSERT INTO استفاده كرد. یكی دیگر از روش های درج ركورد در بانك اطلاعاتی استفاده از شئ RecordSet است كه بمراتب ساده تر مورد قبلی گفته شده است. در مثال فوق برای درج ركوردها در بانك اطلاعاتی از مورد دوم استفاده شده است. متن برنامه درج ركورد جدید در بانك اطلاعاتی دانشجویان بصورت زیر است.



Student Records


<%
Dim DBSet DB = Server.CreateObject ("ADODB.Connection")
DB.Mode = adModeReadWrite
DB.Open ("PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=" + C:\MyDb\Students.mdb")
Dim RSSet RS = Server.CreateObject ("ADODB.Recordset")
RS.Open "Students", DB, adOpenStatic, adLockPessimistic
RS.AddNew
RS ("FirstName") = "name"
RS ("LastName") = "family"
RS ("Email") = "name @domain.com"
RS ("DateOfBirth") = CDate("25 Mar, 2002")
RS.Update
%>

در مثال فوق ركورد دانشجوئی با نام "name" و نام خانوادگی "family" بهمراه آدرس پست الكترونیكی مربوطه و تاریخ تولد آن در بانك اطلاعاتی دانشجویان درج خواهد شد. اقلام اطلاعاتی مربوط به درج یك ركورد جدید را می توان با طراحی یك فرم از كاربران اخذ و پس از تكمیل و ارسال فرم مربوطه، مقادیر متناظر در هر یك از فیلدهای موجود در فرم اخذ اطلاعات به مقادیر مربوطه در بانك اطلاعاتی نسبت داده شود (كار بسیار ساده ای است ! امتحان كنید).

مثال ۳- بهنگام سازی ركوردهای بانك اطلاعاتی دانشجویان
در این مثال با نحوه بهنگام سازی ركوردهای موجود در بانك اطلاعاتی دانشجویان آشنا خواهیم شد. متن برنامه بهنگام سازی ركورد دانشجوئی در بانك اطلاعاتی دانشجویان بصورت زیر است.



Student Records


<%
Dim DBSet DB = Server.CreateObject ("ADODB.Connection")
DB.Mode = adModeReadWrite
DB.Open ("PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=" + "C:\MyDb\Students.mdb")
Dim RSSet RS = Server.CreateObject ("ADODB.Recordset")
RS.Open "SELECT * FROM Students WHERE FirstName = ""name", DB, adOpenStatic, adLockPessimistic
RS ("Email") = "name@domain.com"
RS ("DateOfBirth") = CDate("26 Mar, 2001")
RS.Update
%>

در برنامه فوق ركورد دانشجوئی با نام "name" انتخاب و فیلدهای آدرس پست الكترونیكی (Email) و تاریخ تولد (DateIfBirth) آن تغییر و حاصل مجددا در بانك اطلاعاتی دانشجویان ثبت شده است.

مثال ۴- حذف یك ركورد
در این مثال با نحوه حذف یك ركورد در بانك اطلاعاتی دانشجویان آشنا خواهیم شد. متن برنامه حذف یك ركورد از بانك اطلاعاتی دانشجویان بصورت زیر است.



Student Records


<%
Dim DBSet DB = Server.CreateObject ("ADODB.Connection")
DB.Mode = adModeReadWrite
DB.Open ("PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=" + "C:\MyDb\Students.mdb")
DB.Execute ("DELETE * FROM Students WHERE FirstName = "name"")
%>

در مثال فوق ركورد دانشجوئی با نام "name" از بانك اطلاعاتی دانشجویان حذف شده است. در زمان حذف یك ركورد از بانك اطلاعاتی به دو نكته مهم می بایست توجه كرد: اولا امكان معروف Undo وجود ندارد. بنابراین ركوردی كه حذف می گردد، امكان برگرداندن آن وجود ندارد. ثانیا اگر در زمان اجرای DELETE ، عبارت WHERE حذف گردد، تمامی ركوردهای موجود در جدول حذف خواهند گردید.

همه مقالات ASP کلاسیک را ببینید.

چهارشنبه 12/3/1389 - 10:50 - 0 تشکر 203493

تبدیل تاریخ میلادی به شمسی

این برنامه امكان مى دهد كه تاریخ میلادى را به شمسى تبدیل كنید.


<%
function date_shamsi(dates,short)
D = Array (20, 19, 20, 20, 21, 21, 22, 22, 22, 22, 21, 21)
P = Array (11, 12, 10, 12, 11, 11, 10, 10, 10, 9, 10, 10)
W = Array ("يکشنبه", "دوشنبه", "سه شنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه")
Mon = Array ("فروردين", "ارديبهشت", "خرداد", "تير", "مرداد", "شهريور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند")
Dm = day(dates)
Mm = month(dates)
Ym = year(dates)
U = 0
Rp = 0
if (Ym mod 4)=0 then U=1
if (Ym mod 100)=0 and (Ym mod 400)<>0 then U=0
Ys = Ym - 622
X = Ys - 22
X = X mod 33
if (((X mod 4)=0) AND X <> 32) then Rp = 1
I = (not (Rp-2)) + (not (U - 2)) * 2
X = 0
if(I = 0 AND Mm = 3) then X = 1
if(I = 0) then I = 3
Ms = (9 + Mm) mod 13
if(Ms < 10) then Ms = Ms + 1
D1 = D(Mm - 1)
if(I = 1 AND Mm > 2) then D1 = D1 - 1
if (I = 2 AND Mm < 3) then D1 = D1 - 1
P1 = P(Mm - 1)
if(I = 1 AND Mm > 2) then P1 = P1 + 1
if(I = 2 AND Mm < 4) then P1 = P1 + 1
if(Dm > 0 AND Dm <= D1) then
Ds = P1 + Dm + X - 1
X = 1
else
Ds = Dm - D1
Ms = Ms + 1
if(Ms = 13) then Ms = 1
X = 2
end if
if((Mm = 3 AND X = 2) OR Mm > 3) then Ys = Ys + 1
if(Ms<10) then Ms="0"&Ms
if(Ds<10) then Ds="0"&Ds
if short then
date_shamsi=Ys&"/"&Ms&"/"&Ds
else
date_shamsi=w(weekday(dates)-1)&" "&Ds&" "&mon(Ms-1)&" "&Ys
end if
end function
%>

* * * *


 برای تبدیل تاریخ میلادی به شمسی باید چند نكته را مورد توجه قرار دهید:

۱- سال شمسی ۶۲۲ سال با سال میلادی فاصله دارد.
۲- ۱۱ دیماه هر سال آغاز سال میلادی است ( مصادف با اول ژانویه است ).
۳- در هر ۳۳ سال، چهاربار كبیسه اتفاق می افتد.

تمامی نكات بالا را باید در برنامه خود مورد توجه قرار دهید:

<%@Language=VBScript%>

<%
D = Array (20, 19, 20, 20, 21, 21, 22, 22, 22, 22, 21, 21)
P = Array (11, 12, 10, 12, 11, 11, 10, 10, 10, 9, 10, 10)
W = Array ("یکشنبه", "دوشنبه", "سه شنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه")
Mon = Array ("فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند")
Dm = Day(Date)
Mm = Month(Date)
Ym = Year(Date)
U = 0 
Rp = 0
If (Ym Mod 4) = 0 Then U = 1
If ((Ym Mod 100) = 0 AND (Ym Mod 400) <> 0) Then U = 0
Ys = Ym - 622
X = Ys - 22
X = X Mod 33
If ((X Mod 4) = 0 AND X <> 32) Then Rp = 1
I = Not(Rp-2) + NOT(U - 2) * 2
X = 0
If (I = 0 AND Mm = 3) Then X = 1
If I = 0 Then I = 3
Ms = (9 + Mm) Mod 13
If Ms < 10 Then Ms = Ms + 1
D1 = D(Mm - 1)
If (I = 1 AND Mm > 2) Then D1 = D1 - 1
If (I = 2 AND Mm < 3) then D1 = D1 - 1
P1 = P(Mm - 1)
If (I = 1 AND Mm > 2) Then P1 = P1 + 1
If (I = 2 AND Mm < 4) Then P1 = P1 + 1
If (Dm > 0 AND Dm <= D1) Then
    Ds = P1 + Dm + X - 1
    X = 1
Else
    Ds = Dm - D1
    Ms = Ms + 1
    If Ms = 13 Then Ms = 1
    X = 2
End If
If ((Mm = 3 AND X = 2) OR Mm > 3) Then Ys = Ys + 1
DateShamsi = W(WeekDay(Date) - 1) & " " & Ds & " " & Mon(Ms - 1) & " " & Ys
%>
<%= DateShamsi %>

پس از نوشتن این برنامه می توانید با فراخواندن متغیر DateShamsi یك تاریخ شمسی كامل همراه با نام روز هفته را روی مرورگر نمایش دهید.

همچنین برای راحتی كار، شما می توانید با دو روش تاریخ شمسی را در تمامی صفحات یك سایت نمایش دهید:
۱- كد بالا را در فایل Global.asa در قسمت Application_OnStart قرار دهید و در هر صفحه از یك سایت تنها با فراخوانی یك متغیر از نوع Application تاریخ شمسی را روی مرورگر نمایش دهید.
۲- كد بالا را بصورت یك فایل ضمیمه در تمامی صفحات یك سایت استفاده نمایید.

چهارشنبه 12/3/1389 - 10:53 - 0 تشکر 203495

کوکی در ASP کلاسیک


Cookie چیست؟
از یك كوكی می توان برای تشخیص كاربر استفاده كرد. کوکی یك فایل كوچك است كه سرور روی كامپیوتر كاربر قرار می دهد و هر مرتبه كه كاربر با همان مرورگر با آ ن سرور ارتباط برقرار می كند آن كوكی را نیز می فرستد. با استفاده از ASP هم می توان كوكی ایجاد كرد و هم آن ها را بازخوانی نمود.

چگونگی ساخت یك كوكی
فرمان Response.Cookies برای ساخت كوكی مورد استفاده قرار می گیرد:

<%
Response.Cookies("firstname")="Alex"
%>

ما در مثال بالا یك كوكی به اسم firstname ساخته ایم و مقدار Alex را به آن داده ایم. نكته مهم در اینجا این است كه دستور Response.Cookies باید قبل از برچسب قرار گرفته باشد. همچنین می توان به یك كوكی چند صفت داد، مثل تاریخی كه باید در كامپیوتر كاربر از بین برود:

<%
Response.Cookies("firstname")="Alex"
Response.Cookies("firstname").Expires="May 10,2002"
%>

حالا كوكی با اسم firstname مقدار Alex را دارد و در تاریخ 10 می 2002 از كامپیوتر كاربر پاك خواهد شد.

چگونگی گرفتن مقدار یك كوكی
دستور Request.Cookies برای خواندن مقدار یك كوكی مورد استفاده قرار می گیرد. در مثال زیر ما مقدار كوكی firstname را بازخوانی می كنیم و آن را نمایش می دهیم:

<%
fname=Request.Cookies("firstname")
response.write("Firstname=" & fname)
%>

یك كوكی با كلیدها
یك كوكی همچنین می تواند شامل مجموعه ای از مقدارهای متعدد باشد، كه در اینصورت گفته می شود كوكی دارای كلیدهایی است. در مثال زیر ما یك كوكی به اسم user خواهیم ساخت كه دارای كلیدهایی است كه شامل اطلاعات كاربر است:

<%
Response.Cookies("user")("firstname")="Alex"
Response.Cookies("user")("lastname")="Nasser"
Response.Cookies("user")("country")="Iran"
Response.Cookies("user")("age")="20"
%>

خواندن همه كوكی ها
مثال زیر تمام كوكی هایی كه سرور شما به كاربر فرستاده است را می خواند. توجه كنید كه كد زیر بررسی می كند كه آیا كلیدهای كوكی دارای صفت HasKeys هستند یا نه:

")
    if Request.Cookies(x).HasKeys then
        for each y in Request.Cookies(x)
            response.write(x & ":" & y & "=" & Request.Cookies(x)(y))
            response.write("
        next
    else
    Response.Write(x & "=" & Request.Cookies(x) & "
")
    end if
    response.write "

"
next
%>

برو به انجمن
انجمن فعال در هفته گذشته
مدیر فعال در هفته گذشته
آخرین مطالب
  • آلبوم تصاویر بازدید از کلیسای جلفای...
    آلبوم تصاویر بازدید اعضای انجمن نصف جهان از کلیسای جلفای اصفهان.
  • بازدید از زیباترین کلیسای جلفای اصفهان
    جمعی از کاربران انجمن نصف جهان، در روز 27 مردادماه با همکاری دفتر تبیان اصفهان، بازدیدی را از کلیسای وانک، به عمل آورده‌اند. این کلیسا، یکی از کلیساهای تاریخی اصفهان به شمار می‌رود.
  • اعضای انجمن در خانه شهید بهشتی
    خانه پدری آیت الله دکتر بهشتی در اصفهان، امروزه به نام موزه و خانه فرهنگ شهید نام‌گذاری شده است. اعضای انجمن نصف جهان، در بازدید دیگر خود، قدم به خانه شهید بهشتی گذاشته‌اند.
  • اطلاعیه برندگان جشنواره انجمن‌ها
    پس از دو ماه رقابت فشرده بین کاربران فعال انجمن‌ها، جشنواره تابستان 92 با برگزاری 5 مسابقه متنوع در تاریخ 15 مهرماه به پایان رسید و هم‌اینک، زمان اعلام برندگان نهایی این مسابقات فرارسیده است.
  • نصف جهانی‌ها در مقبره علامه مجلسی
    اعضای انجمن نصف جهان، در یك گردهمایی دیگر، از آرامگاه علامه مجلسی و میدان احیا شده‌ی امام علی (ع) اصفهان، بازدیدی را به عمل آوردند.