My Programming Notes

Here are Notes.... come from debugging

My Programming Notes

Here are Notes.... come from debugging

سه شنبه, ۳ بهمن ۱۳۹۶، ۰۳:۴۸ ب.ظ

فراخوانی پروسیجر به صورت Nested

فرض کنید سه تا پروسیجر با نام های sp1 و sp2 و sp3 داریم. داخل پروسیجر sp2 ، ما پروسیجر اول یعنی sp1 را فراخوانی می کنیم و از داده آن به صورت Insert در یک tempTable استفاده می کنیم.

در پروسیجر سوم یعنی sp3  ، ما پروسیجر دوم sp2  که خود در دلش یک پروسیجر دیگر را فراخوانی کرده است را فراخوانی می کنیم که با خطای :


An INSERT EXEC statement cannot be nested


مواجه می شوید. در واقع شما می خواهید به صورت نستد (Nested) پروسیجر ها را فراخوانی کنید.

برای رفع این خطا و رسیدن به هدف ، لازم است پروسیجر دوم را که خود شامل یک پروسیجر دیگر نیز می باشد در یک  table_value Function فراخوانی کنید و داده را در یک table بریزد و حالا در پروسیجر سوم  فانکشن را فراخوانی کنید.

می توانید در پروسیجر سوم از table ارسالی این فانکشن استفاده کنید.


مطالعه بیشتر :   اینجا




۰ نظر موافقین ۱ مخالفین ۰ ۰۳ بهمن ۹۶ ، ۱۵:۴۸
سارا زکی زاده
شنبه, ۱ مهر ۱۳۹۶، ۰۹:۲۵ ق.ظ

نمایش عدد به جای کاراکتر در TextView

شاید برای شما هم پیش اومده باشه که بخواین ترکیب دو تا داده متنی (string) رو توی یه TextView ویا ... نمایش بدید. از قضا یکی از این داده ها در فایل string ذخیره شده و شما موقع اتصال این دو داده با همدیگه ، متنی رو که مشاهده می کنید شامل یک عدد است نه مقدار متنی داده ذخیره شده در فایل string.


متن زیر را در نظر بگیرید :    

tv.setText("Welcome to " + R.string.app_name);

 در متن بالا ما توقع چاپ متنی مثل : Welcome to MyApp رو داریم ولی به جای اسم نرم افزار یک عدد طولانی  مثل 2131230755 می بینیم.

در واقع    R.string.app_name   یک مقدار عددی برای شناسایی این متغییر است (identifier).  که در فایل R قرار دارد. و نتیجه (String + مقدار عددی Long )برابر است با همان مقدار عددی ای که به متن اختصاص پیدا کرده است.
برای رفع این مشکل بهتر است به صورت زیر عمل کنیم : 

getString(R.string.app_name);
و یا 
getResources().getString(R.string.app_name);
*** همه منابع (Resource) یک مشخصه دارند که در R ذخیره میشود. مثل Layoutها و String ها و ....






۰ نظر موافقین ۱ مخالفین ۰ ۰۱ مهر ۹۶ ، ۰۹:۲۵
سارا زکی زاده
يكشنبه, ۲۶ شهریور ۱۳۹۶، ۱۰:۱۸ ق.ظ

BPMS چیست؟

مفهوم Business Process Management System مدیریت فرایند های*  کسب و کار یا همان BPM رویکردی است سیستماتیک به منظور هر چه کارا نمودن گردش کار** Workflow  در یک سازمان به نحوی که برخور دار از قابلیت انطباق پذیری نسبت به تغییرات پیرامونی باشد. هدف از استقرار BPMS در یک سازمان ، کاهش خطا های انسانی ناشی از تبادل نا درست اطلاعات بین افراد و نیز سوق دادن افراد به ایفای بهینه  مسئولیت های خود می باشد.


یک BPMS میتواند شامل بخش های زیر باشد :

- فرمساز(Form Generator)
- گزارش ساز (Report Generator)
- سامانه مدیریت گردش کار (Workflow Engine)
- سامانه مدیریت قوانین (Rule Engine)
- سامانه مدیریت گروهها و نقشها (Role Engine)
- سامانه مدیریت میز کار
- سامانه مدیریت کارتابل


---------------------مطالعه بیشتر و منابع----------------------

http://what-is-bpm.com/

Business Process Modeling Language (BPML)

----------------------------------------------
*فرایند  Process: فرآیند به توالی یا دنباله ای  از فعالیت ها گفته می شود که یکی پس از دیگری به جریان می افتد و با تشکیل دادن مجموعه ای از فعالیت ها، یک یا چند «ورودی» را به یک یا چند «خروجی» تبدیل می کند. مثلا جذب نیرو بصورت فرایند در یک سازمان متشکل از مجموعه فعالیت های به نبال هم هستند که شامل وظائفی همچون ، تعیین نیاز ، اعلام عمومی ، مصاحبه ، ارزیابی حین کار ، و استخدام خواهد بود. 
**گردش کار WorkFlow: به توالی از فعالیت های اطلاق می گردد که پایان یکی ، ورودی و شروع برای گام بعدی می باشد و گام ها با هم همپوشانی نداشته باشند. به همین لحاظ نیز می نوان کلیه گام ها را در قالب نموداری نیز نشان داد. 
۰ نظر موافقین ۱ مخالفین ۰ ۲۶ شهریور ۹۶ ، ۱۰:۱۸
سارا زکی زاده
چهارشنبه, ۲۱ تیر ۱۳۹۶، ۰۴:۵۰ ب.ظ

تفاوت بین Interface های Enumerator و Enumerable در C# - قسمت دوم

 

-- ادامه پست قبل

  مثال های از استفاده از IEnumerable ,  IEnumerator Interface:

        }ngth; i++)

}

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
class ColorEnumerator : IEnumerator
    {
        string[] _colors;
        int _position = -1;
        public ColorEnumerator(string[] theColors) // Constructor
        {
            _colors = new string[theColors.Length];
            for (int i = 0; i < theColors.Length; i++)
                _colors[i] = theColors[i];
        }
        public object Current // Implement Current.
        {
            get
            {
                if (_position == -1)
                    throw new InvalidOperationException();
                if (_position >= _colors.Length)
                    throw new InvalidOperationException();
                return _colors[_position];
            }
        }
        public bool MoveNext() // Implement MoveNext.
        {
            if (_position < _colors.Length - 1)
            {
                _position++;
                return true;
            }
            else
                return false;
        }
        public void Reset() // Implement Reset.
        {
            _position = -1;
        }
    }
    class Spectrum : IEnumerable
    {
        string[] Colors = { "violet", "blue", "cyan", "green", "yellow", "orange", "red" };
        public IEnumerator GetEnumerator()
        {
            return new ColorEnumerator(Colors);
        }
    }
    class Program
    {
        static void Main()
        {
            Spectrum spectrum = new Spectrum();
            foreach (string color in spectrum)
                Console.WriteLine(color);
        }
    }

 خروجی :

violet

blue

cyan

green

yellow

orange

red

  

Generic Enumeration Interfaces  :

ما تا الان در مورد Non Generic Enumeration Interfaces   بحث کردیم ولی در واقعیت ما بیشتر از نوع مطمئن Generic Enumeration Interfaces  استفاده می کنیم . که آنها خود IEnumerable  و IEnumerator interfaces. دارند.

مهمترین تفاوت NonGeneric و Generic  موارد زیر هستند:

       در  the NonGeneric Interface form  :

متد GetEnumerator     از اینترفیس  IEnumerable نمونه ای  از کلاس enumerator  را بر می گرداند که IEnumerator را پیاده سازی می کند.

کلاسی که IEnumerator  را پیاده سازی می کند همچنین خصوصیت  Current  را  پیاده سازی می کند که  refrence ای از نوع object بر می گرداند. که در نهایت باید به نوع واقعی شی تبدیل شود.

  در  the Generic Interface form    :

متد GetEnumerator   از اینترفیس  IEnumerable نمونه ای  از کلاس IEnumerator را برمی پرداند.

کلاسی که IEnumerator را پیاده سازی می کند همچنین خصوصیت Current را هم پیاده سازی می کند که یک مقدا رواقعی را نمونه سازی میکند به جای  reference  به شی کلاس پایه.

 


۰ نظر موافقین ۰ مخالفین ۰ ۲۱ تیر ۹۶ ، ۱۶:۵۰
سارا زکی زاده
شنبه, ۱۰ تیر ۱۳۹۶، ۱۲:۲۷ ب.ظ

اطلاعات ستون های جداول پایگاه داده

برای مستند سازی از قسمتی از پروژه ای که روش کار می کنم نیاز داشتم تمام اطلاعات ستون های جداول رو بهتر بشناسم . برای این کار از INFORMATION_SCHEMA.COLUMNS  استفاده کردم :


INFORMATION_SCHEMA.COLUMNS یک VIEW است که قابلیت نمایش اطلاعات تمام ستون های تمام جداول و View های موجود در جداول را داراست.




Column name

Data type

Description

TABLE_CATALOG

nvarchar(128)

Table qualifier.

TABLE_SCHEMA

nvarchar(128)

Name of schema that contains the table.

TABLE_NAME

nvarchar(128)

Table name.

COLUMN_NAME

nvarchar(128)

Column name.

ORDINAL_POSITION

int

Column identification number.

Note: In SQL Server 2005, these column IDs are consecutive numbers.

COLUMN_DEFAULT

nvarchar(4000)

Default value of the column.

IS_NULLABLE

varchar(3)

Nullability of the column. If this column allows for NULL, this column returns YES. Otherwise, NO is returned.

DATA_TYPE

nvarchar(128)

System-supplied data type.

CHARACTER_MAXIMUM_LENGTH

int

Maximum length, in characters, for binary data, character data, or text and image data.

-1 for xml and large-value type data. Otherwise, NULL is returned. For more information, see Data Types (Transact-SQL).

CHARACTER_OCTET_LENGTH

int

Maximum length, in bytes, for binary data, character data, or text and image data.

-1 for xml and large-value type data. Otherwise, NULL is returned.

NUMERIC_PRECISION

tinyint

Precision of approximate numeric data, exact numeric data, integer data, or monetary data. Otherwise, NULL is returned.

NUMERIC_PRECISION_RADIX

smallint

Precision radix of approximate numeric data, exact numeric data, integer data, or monetary data. Otherwise, NULL is returned.

NUMERIC_SCALE

int

Scale of approximate numeric data, exact numeric data, integer data, or monetary data. Otherwise, NULL is returned.

DATETIME_PRECISION

smallint

Subtype code for datetime and SQL-92 interval data types. For other data types, NULL is returned.

CHARACTER_SET_CATALOG

nvarchar(128)

Returns master. This indicates the database in which the character set is located, if the column is character data or text data type. Otherwise, NULL is returned.

CHARACTER_SET_SCHEMA

nvarchar(128)

Always returns NULL.




در تصاویر زیر حاصل اجرای کوئری مربوطه در پایگاه داده AdventureWorks را مشاهده می کنید:


 SELECT * FROM INFORMATION_SCHEMA.COLUMNS



183_in1




183_in2




183_in3



183_in4





183_in5


اگر می خواهید فقط اطلاعات یک جدول را ببینید :
  
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Address'

موفق باشید.


تلگرام : https://t.me/GCC_co

اینستاگرام:  https://www.instagram.com/golden.cube.computing



۰ نظر موافقین ۱ مخالفین ۰ ۱۰ تیر ۹۶ ، ۱۲:۲۷
سارا زکی زاده
شنبه, ۳ تیر ۱۳۹۶، ۰۴:۲۰ ب.ظ

تفاوت بین Interface های Enumerator و Enumerable در C#

 

انواع  Enumerators  و  Enumerable :

تعریف :

"  Enumerator  شی ای است که قابلیت بازگرداندن  هر مورد از یک لیست و گروه داده ای را  به صورت یک به یک و ترتیبی که از آن درخواست میشود را دارد.  Enumerator به طبقه بندی موارد آگاه است و پیگیری می کند که کجای رشته قرار دارد.

و بعد از آن مقدار مورد جاری را بنا به در خواست باز می گرداند.

Enumerable یک نوع است که یک متد به نام GetEnumerator  دارد که این متد یک enumerator برمی گرداند برای بازگردانی مورد ها.

برای درک بهتر  Enumerators   و  Enumerable نگاهی به یک  مثال می اندازیم :

در مثال زیر ما یک آرایه شامل 5 المان تعریف می کنیم و بعد از ان از یک حلقه foreach برای نمایش مقادیر هر مورد.

class Program

   {

       static void Main()

       {

           int[] arr1 = { 1, 2, 3, 4, 5 }; // Define the array.

 

           foreach (int item in arr1) // Enumerate the elements.

               Console.WriteLine("Item value: {0}", item);

       }

   }

خروجی :

Item value: 1

Item value: 2

Item value: 3

Item value: 4

Item value: 5

 

                                            Enumerables

در مثال بالا :

·         شیء enumerator   را  به وسیله  تابع  GetEnumerator   صدا میزنیم .

·         هر مورد را از enumerator  در خواست می کند و به عنوان متغیر تکراری در کد قابل دسترس قرار می دهد.

 IEnumerator Interface :

 

اینترفیس  IEnumerable  توسط یک کلاس IEnumerable  پیاده سازی می شود.

اینترفیس IEnumerable   فقط یک متد دارد : GetEnumerator  که یک enumerator را برمی گرداند.

                                                     IEnumerator

- Current مقدار جایگاه جاری در رشته را برمی گرداند.

  - خصوصیت read-only است.

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

  -MoveNext  متدی است که enumerator را به موقعیت بعدی مکانی پیش می برد. و یک مقدار بولین برمی گرداند که نشان دهنده معتبر بودن موقعیت بعدی و یا انتهای رشته می باشد.

  - اگر موقعیت بعدی معتبر باشد مقدار true است.

  - اگر موقعیت بعدی معتبر نباشد (فرا تر از انتهای رشته باشد) مقدار false است.

  - موقعیت ابتدایی enumerator  ، قبل از اولین مورد در رشته است. پس تابع MoveNext  باید قبل از اولین دسترسی به Current فراخوانی شود.

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

مثال :


class Program

    {

        static void Main()

        {

            List<int> list = new List<int>();

            list.Add(1);

            list.Add(2);

            list.Add(3);

            list.Add(4);

            list.Add(5);

 

            List<int>.Enumerator e = list.GetEnumerator();

            Write(e);

        }

 

        static void Write(IEnumerator<int> e)

        {

            while (e.MoveNext())

            {

                int value = e.Current;

                Console.WriteLine(value);

            }

        }

    } 

 


   }  خروجی:

 

1
2
3
4
5



IEnumerable Interface :

یک کلاس enumerable ، یک  اینترفیس IEnumerable  را پیاده سازی می کند.

اینترفیس IEnumerable  تنها یک متد دارد: GetEnumerator که یک enumerator برمی گرداند.



    IEnumerable




using System.Collections;

 

//Implement the IEnumerable interface

class MyClass : IEnumerable

{

public IEnumerator GetEnumerator { ... }

...


} //Returns an object of type IEnumerator

 

 

 

 

 

using System.Collections;

class MyColors: IEnumerable

{

string[] Colors = { "Red", "Yellow", "Blue" };

public IEnumerator GetEnumerator()

{

return new ColorEnumerator(Colors);//An instance of the enumerator class

}


}


ادامه در پست بعدی .....

۰ نظر موافقین ۰ مخالفین ۰ ۰۳ تیر ۹۶ ، ۱۶:۲۰
سارا زکی زاده
سه شنبه, ۲۹ دی ۱۳۹۴، ۱۲:۲۹ ق.ظ

دلم یک فنجان "گوگل" می خواهد!

سلام.

چه خاکی گرفته این جا رو...

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

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

تمام این مدت خللی رو حس می کردم. خلل حاصل از انجام ندادن کارهایی که برام یه تفریح و لذت بود. یک عادت شخصی ! یه ضرب المثل معروف هست که میگه : "ترک عادت موجب مرض است".

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

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

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

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

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


یکی از سرگرمیام این بود که مرورگر سیستمم رو باز میکردم . وارد سایت گوگل میشدم و هر مورد تازه ای که شنیده بودم رو سرچ می کردم و یا به اصطلاح امروزی ها "گوگل" می کردم. دنبال پاسخ سوالاتی که در طول روز برام پیش اومده بود می گشتم.

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

فیلم زبان اصلی می دیدم. لغاتش رو توی اینترنت پیدا می کردم.

کتاب می خوندم.

و ....

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

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

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

همیشه "گوگل" کنه و هیجان این کارو با هیچ چیزی عوض نکنه.!!!!


پ.ن:

دوباره از سر گرفتم روال قبل رو.

امشب علی رغم خستگی بیش از حدم نشستم پای سیستم و به  لینک های زیر رسیدم:

نگاهی به مزایا و معایب Xamarin.Android

روحم اغنا شد.

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



۰ نظر موافقین ۰ مخالفین ۰ ۲۹ دی ۹۴ ، ۰۰:۲۹
سارا زکی زاده
يكشنبه, ۳ خرداد ۱۳۹۴، ۰۲:۲۱ ق.ظ

متدهای توسعه نرم افزار - بخش اول

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

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

در این مطلب و مطالب آتی به توضیح و تفسیر تعدادی از این متدها خواهیم پرداخت.

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

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

* متدولوژی توسعه نرم افزار Agile

توسعه نرم افزار به روش اجایل یک چارچوب مفهومی برای درک پروژه های مهندسی نرم افزار است.

متد کریستال، مدل توسعه نرم افزار پویا(DSDM) و اسکرام تعدادی از متدهای توسعه نرم افزار اجایل هستند.

بیشتر متد های اجایل با توسعه نرم افزار در بازه های زمانی کوتاه (iteration) که عموما بین یک تا چهار هفته طول می کشد،تلاش می کنند ریسک را به حداقل برسانند.

هر بازه زمانی خود به تنهایی شبیه یک پروژه نرم افزاری می باشد و شامل تمام وظایف لازم برای ارائه یک توسعه کوچک از یک قابلیت است مانند:

برنامه ریزی ، آنالیز های مورد نیاز ، طراحی ، کد نویسی ، تست و مستند سازی؛

زمانی که دوره کوتاه زمانی به اندازه کافی قابلیت تضمین ارائه محصول نرم افزاری را نداشته باشد، یک پروژه اجایل می تواند یک نرم افزار جدید در پایان دوره کوتاه ارائه دهد.

در پایان هر دوره زمانی تیم پروژه ، اولویت های پروژه را مجددا ارزش گذاری می کنند.

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

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

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

این گروه همچنین ممکن است شامل یک تست کننده ، طراح رابط ، نویسنده فنی و مدیر هم باشد.

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

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


در پست بعدی روش Crystal ، یکی از روش های دیگر توسعه نرم افزار را توضیح خواهم داد.

برای مطالعه بیشتر در مورد روش اجایل به لینک های زیر مراجعه نمایید:

بیانیه چابک

متدولوژی اسکرام (Scrum Methodology)

متداوژی اجایل

۶ نظر موافقین ۲ مخالفین ۰ ۰۳ خرداد ۹۴ ، ۰۲:۲۱
سارا زکی زاده
سه شنبه, ۱۹ اسفند ۱۳۹۳، ۱۱:۵۵ ب.ظ

بقچه سال 93 به 94!

همون جوری که پارسال هم بقچه ای از سال قبل همراه خودم داشتم. امسال هم قصد دارم  کوله بار یک ساله ام رو منتشر کنم. کلی هم از این کار ذوق زده ام!


                                            بقچه


* فعلا یک پیشنویسه. دوستان دست به کار شید و منو از تجربیاتتون مطلع کنید.
۴ نظر موافقین ۰ مخالفین ۰ ۱۹ اسفند ۹۳ ، ۲۳:۵۵
سارا زکی زاده
دوشنبه, ۱۸ اسفند ۱۳۹۳، ۱۰:۴۴ ب.ظ

تولید یک کاراکتر تصادفی از بین یک گروه کاراکتر

دیروز در بخشی از کارم باید یک رشته 6 کاراکتری که هر کاراکترش طبق فرمول خاصی انتخاب میشه را در sql تولید می کردم.
در بخشی از این رشته یک کاراکتر باید از بین یک گروه کاراکتر متوالی به صورت تصادفی انتخاب شود.
مثلا :
اگر StudentType برابر 5 بود به صورت تصادفی یک کاراکتر از بین کاراکترهای (B,C,D,E,F) را انتخاب کند.
در Sql Server  تابع ()Rand یک عدد تصادفی بین 0 تا 1 را تولید می کنید.
حالا سوال اینجاست که چگونه یک مقدار کاراکتری بین دو کاراکتر مشخص را پیدا کنیم.
همان طور که می دانیم هر کاراکتر داری یک کد اسکی خاص است پس با استفاده از تابع ()Ascii  می توانیم به مقدار اسکی کاراکتر ها دست پیدا کنیم.
حالا باید برای تولید یک عدد رندم حد فاصل دو عدد مشخص چه روالی را طی کنیم؟؟

برای این کار باید یک مقدار Upper و یک مقدار Lower داشته باشیم که محدوده ما را مشخص می کند: 


 DECLARE @GoalNo INT
            DECLARE @Upper INT
            DECLARE @Lower INT
  SELECT @GoalNo= ROUND(((@Upper - @Lower -1) * Rand() + @Lower

 عبارت   ROUND(((@Upper - @Lower -1) * Rand() + @Lower یک مقدار رندم را بین دو عدد مشخص می کند.
ولی هنوز کار تمام نشده است.
من باید عبارت بالا را در یک function قرار می دادم. والبته مقدار GoalNo@  یک مقدار int است ولی من یک کاراکتر می خواستم!

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

Invalid use of a side-effecting operator 'rand' within a function.

 برای رفع این خطا مجبور شدم یک View بسازم و در این View تابع Rand را صدا کنم  . و از این View در function  استفاده کنم:


***** View ***** 
CREATE VIEW Get_RAND
AS
SELECT RAND() AS MyRAND
GO

***** Function *****

CREATE FUNCTION [dbo].MYFunction
)
StudentType int@
  (
(RETURNS varchar(7
AS
BEGIN
   ( DECLARE @Code nvarchar(20
    
            (DECLARE @RandChar varchar(10
            DECLARE @Upper INT
            DECLARE @Lower INT
  
           ( IF (@StudentType = '19'
                BEGIN
                  (' SET @Upper = Ascii('A 
                   (' SET @Lower =  Ascii('M
                END    
            ELSE
                    IF (@StudentType = '29')
                        BEGIN
                           (' SET @Upper = Ascii('N
                            ('SET @Lower =  Ascii('P
                        END
                    
                    ELSE
                       (' IF (@StudentType = '30
                            BEGIN
                              (' SET @Upper = Ascii('Q
                               (' SET @Lower =  Ascii('R
                            END
                    
                              
        DECLARE @Rand int
       ( set @Rand = (SELECT MyRAND FROM dbo.Get_RAND
          SELECT @RandChar = CHAR(ROUND(((@Upper - @Lower -1)*@Rand +
 ((Lower),0@
  '  SELECT  @Code = 'SZ' + @RandChar + 'programmer
    RETURN @Code
END

اگر به کد بالا دقت کنید من View را صدا زدم و مقدارش را در یک متغیر ریختم.
و بعد تونستم از این مقدار در فرمولم استفاده کنم.
فرمول مقدار عددی بر می گرداند پس برای تبدیل کردن آن به مقدار کاراکتری از تابع ()Char استفاده کردم.
و در آخر هم تونستم اون رشته را تولید کنم.

موفق باشید.

۰ نظر موافقین ۲ مخالفین ۰ ۱۸ اسفند ۹۳ ، ۲۲:۴۴
سارا زکی زاده