PDA

View Full Version : انبوند کار کردن فرمها( UnBound)



ali_bagheri34
چهارشنبه 03 مهر 1387, 13:06 عصر
سلام دوستان
من یک فرم دارم که از چند فیلد ساخته شده است و به اس کیو ال مرتبط می باشد (اکسس پروجکت می باشد ) این فرم چهار فیلد دارد که اولین فیلد آن شمارنده می باشد که توسط اس کیو ال مدیریت شده و برای هر رکورد جدید یک عدد به آن اضافه می نماید

سوال من این است وقتی با یک دکمه می خواهیم این اطلاعات را ذخیره کنیم (INSERT ) چگونه به کاربر در فیلد اول نمایش دهیم که شماره اختصاص داده شده چند است
و قابل ذکر است که برای دکمه اینزرت از اس کیو ال زیر استفاده می کنیم
INSERT INTO dbo.Table1
( Filde2,Filde3,Filde4)
VALUES (Filde2,Filde3,Filde4)

چطور می تونم فیلد اول را که توسط دیتابیس پر می شود را به کاربر در یک فیلد نمایش دهد
و قابل ذکر است که این فرم به هیچ جدولی مرتبط نیست و کاملا UnBound می باشد
و دوستان نظرتان را در خصوص آنبوند مطرح کنید

arash6510
چهارشنبه 03 مهر 1387, 14:26 عصر
میتونی بگی وقتی فرم داره لود میشه برنامت بره آخرین رکورد رو بخونه و مقدار فیلد رو یه دونه زیاد کنه و بزاره تو تکس باکس.
البته پیشنهادم اینه که autonumber رو خودت از این راه تولید کنی بهتره. ایجوری دستت بازتر میشه

dadsara
شنبه 06 مهر 1387, 09:03 صبح
باسلام
روشهای مختلفی برای اینکار وجود داره راحت ترین آن این است که بعد از ذخیره رکورد با یک پیام مبنی بر ذخیره شدن رکورد شماره رکورد را به کاربر نشان دهیم یا اینکه بعد از ذخیره شدن شماره ذخیره شده را بر روی اولین فیلد به کاربر نشان دهیم و تا زمانی که کاربر کلید جدید را فشار نداده محتویات فرم از جمله اولین فیلد پاک نشود

mohammadgij
یک شنبه 07 مهر 1387, 14:01 عصر
اگر به جاي استفاده از دستور Docmd.runsql "insert" از يك Stored Procedure استفاده كني ميتوني پارامتر خروجي هم از استور پروسيجر بگيري

sib_data
یک شنبه 07 مهر 1387, 15:30 عصر
اگه برنامه تك كاربره هستش راحت ترين راه اينكه بري و اخرين كد را پيدا كني يكي بهش اضافه كني ولي اگه تحت شبكه با چند كاربر كار ميكني بهتره كه بعد از ثبت بهش بگي كه عدد كد چي بوده.

arash6510
یک شنبه 07 مهر 1387, 16:29 عصر
برای چند کاربره هم میشه تو یه تایمر اینو چک کنه تا همیشه اطلاعات درست رو نشون بده.
اینجوری کلی خارجی میشه فرمت!

ali_bagheri34
دوشنبه 08 مهر 1387, 12:01 عصر
اگر به جاي استفاده از دستور Docmd.runsql "insert" از يك Stored Procedure استفاده كني ميتوني پارامتر خروجي هم از استور پروسيجر بگيري



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

پیشاپیش بخاطر جوابتان از شما متشکرم

mohammadgij
سه شنبه 09 مهر 1387, 15:29 عصر
اينم يك نمونه از كار با استور پروسيجر Stored Procedure
براي كار با اين استورد پروسيجر ابتدا بايد بانك رو از فايل BackUp Database TestStoredProcedure.zip روي سرور خودتون Restore كنيد. من فرض مي كنم تمام دوستان بلدند كه Restore كنند.
سپس برنامه رو اجرا كنيد و فرم frmTakhsis رو اجرا كنيد و پس از ثبت مقادير سال و شرح دكمه تاييد رو فشار دهيد تا عملكرد دكمه رو ببينيد.
خب بريم سراغ توضيحات دكمه و Stored Procedure
ابتدا دكمه تاييد رو توضيح ميدم. پشت دكمه برنامه زير نوشته شده است



bolHaveValue = False

If Me.txtbintTakhsisCode.Value = "" Or IsNull(Me.txtbintTakhsisCode.Value) Then
bolHaveValue = False
Else
bolHaveValue = True
End If

If Me.txtnvcYeard.Value = "" Or IsNull(Me.txtnvcYeard.Value) Then
MsgBox "سال را وارد نماييد", vbInformation, "توجه"
Me.txtnvcYeard.SetFocus
Exit Sub
End If

If Me.txtnvcTakhsisTitle.Value = "" Or IsNull(Me.txtnvcTakhsisTitle.Value) Then
MsgBox "شرح تخصيص را وارد نماييد", vbInformation, "توجه"
Me.txtnvcTakhsisTitle.SetFocus
Exit Sub
End If

'-------------------------------------------------------------------

Set adocmdObject.ActiveConnection = CurrentProject.Connection
adocmdObject.CommandText = "sprcInsUpdTakhsis"
adocmdObject.CommandType = adCmdStoredProc
If bolHaveValue = False Then
adocmdObject.Parameters.Append adocmdObject.CreateParameter("bintTakhsisCode", adDouble, adParamInput, 8, 0)
ElseIf bolHaveValue = True Then
adocmdObject.Parameters.Append adocmdObject.CreateParameter("bintTakhsisCode", adDouble, adParamInput, 8, Me.txtbintTakhsisCode.Value)
End If
adocmdObject.Parameters.Append adocmdObject.CreateParameter("nvcYeard", adVarWChar, adParamInput, 8, Me.txtnvcYeard.Value)
adocmdObject.Parameters.Append adocmdObject.CreateParameter("nvcTakhsisTitle", adVarWChar, adParamInput, 4000, Trim(Me.txtnvcTakhsisTitle.Value))
Set adoparIndex = adocmdObject.CreateParameter("bintIndex", adBigInt, adParamOutput, 8, 0)
adocmdObject.Parameters.Append adoparIndex
adocmdObject.Execute

If bolHaveValue = False Then
Me.txtbintTakhsisCode.Value = Nz(adoparIndex, 0)
MsgBox "ركورد مورد نظر ايجاد گرديد", vbInformation, "توجه"
ElseIf bolHaveValue = True Then
MsgBox "ركورد جاري تغيير نمود", vbInformation, "توجه"
End If
Set adocmdObject = Nothing



چند خط اول برنامه جهت كنترل فيلدها نوشته شده تا در ادامه از بروز خطا جلوگيري شود.

متغير bolHaveValue به جهت تعيين Insert و يا Update در ابتدا مقدار دهي مي شود.
لازم به توضيح است كه اين Stored Procedure هم براي Insert ركوردها و هم براي Update آنها نوشته شده و هر دو كار را انجام مي دهد.
محدوده پس از '--- چگونگي ارتباط با Stored Procedure را نشان ميدهد. البته لازم به ذكر است كه راههاي بسياري جهت ارتباط با Stored Procedure و مقدار دهي پارامتر هاي آن ممكن اسن وجود داشته باشد.
متغير adocmdObject از نوع Command در ابتداي فرم تعريف شده است



Set adocmdObject.ActiveConnection = CurrentProject.Connection
خط بالا به جهت تعيين كانكشن مورد نظر نوشته شده است. چنانچه لازم به اتصال به ديتا بيس ديگري باشد مي بايست به جاي CurrentProject.Connection كانكشن همان ديتابيس نوشته شود
adocmdObject.CommandText = "sprcInsUpdTakhsis"
خط بالا مشخص كننده نام Stored Procedure اي است كه مي بايست توسط اين قسمت اجرا گردد
adocmdObject.CommandType = adCmdStoredProc
خط بالا به متغير معرفي شده نوع Command را كه در اينجا Stored Procedure مي باشد معرفي مي كند

'************************************************* ************************************************** *******
If bolHaveValue = False Then
adocmdObject.Parameters.Append adocmdObject.CreateParameter("bintTakhsisCode", adDouble, adParamInput, 8, 0)
ElseIf bolHaveValue = True Then
adocmdObject.Parameters.Append adocmdObject.CreateParameter("bintTakhsisCode", adDouble, adParamInput, 8, Me.txtbintTakhsisCode.Value)
End If
'************************************************* ************************************************** ********
چنانچه در مراحل بعدي به محتويات درون Stored Procedure دقت نماييد متوجه خواهيد شد كه دستورات درون (*) به جهت بررسي و مقدار دهي فيلد مورد كد تخصيص خواهد بود كه پر و يا صفر بودن آن مشخص مي كند كه
چنانچه صفر باشد يعني قسمت Insert در Stored Procedure فعال گردد
چنانچه هر عددي به غير از صفر باشد قسمت Update در Stored Procedure فعال مي گردد.

adocmdObject.Parameters.Append adocmdObject.CreateParameter("nvcYeard", adVarWChar, adParamInput, 8, Me.txtnvcYeard.Value)
adocmdObject.Parameters.Append adocmdObject.CreateParameter("nvcTakhsisTitle", adVarWChar, adParamInput, 4000, Trim(Me.txtnvcTakhsisTitle.Value))
دو خط بالا طريقه پاس دادن مقادير فيلدها به Stored Procedure را نشان مي دهد. فيلدهاي ورودي
Set adoparIndex = adocmdObject.CreateParameter("bintIndex", adBigInt, adParamOutput, 8, 0)
adocmdObject.Parameters.Append adoparIndex
دو خط بالا طريقه ارجاع مقادير خروجي از Stored Procedure را نشان مي دهد
adocmdObject.Execute
خط بالا طريقه اجراي Stored Procedure را نشان مي دهد

'****************************************
If bolHaveValue = False Then
Me.txtbintTakhsisCode.Value = Nz(adoparIndex, 0)
MsgBox "ركورد مورد نظر ايجاد گرديد", vbInformation, "توجه"
ElseIf bolHaveValue = True Then
MsgBox "ركورد جاري تغيير نمود", vbInformation, "توجه"
End If
'****************************************
چند خط بالا با توجه به اجراي متفاوت قسمت هاي Stored Procedure ، پيغام خاص خود را نشان مي دهد.

Set adocmdObject = Nothing



حال به سراغ Stored Procedure برويم.





ALTER PROCEDURE sprcInsUpdTakhsis
@bintTakhsisCode Bigint,
@nvcYeard Nvarchar(4),
@nvcTakhsisTitle Nvarchar(4000),
@bintIndex Bigint output
As

/* If @bintTakhsisCode Parameter Is Null Then Generate FormId And Insert Record And If Is Not Null Update Record */
IF (@bintTakhsisCode=0)
/*If Block*/
BEGIN
--Generate First Empty FormId
SET @bintIndex=1
WHILE 1=1
BEGIN
/*While Block*/
IF Not Exists ( Select bintTakhsisCode From tblTakhsisTree Where nvcYeard=@nvcYeard And bintTakhsisCode=@bintIndex)
BREAK /*If Notexists Mean Found First Empty FormId. So Exit While Loop*/
SET @bintIndex=@bintIndex+1
IF (@bintIndex=10000000000000)
GOTO TOOMANY
/*End Of While Block*/
END
Leave:
--Insert Record
INSERT INTO tblTakhsisTree
(bintTakhsisCode,nvcYeard,nvcTakhsisTitle)
VALUES
(@bintIndex,@nvcYeard,@nvcTakhsisTitle)
END
Else
IF (@bintTakhsisCode<>0)
BEGIN
SET @bintIndex=@bintTakhsisCode
--Update Record
UPDATE tblTakhsisTree
SET nvcTakhsisTitle=@nvcTakhsisTitle
WHERE
bintTakhsisCode=@bintTakhsisCode
AND
nvcYeard=@nvcYeard
END
TOOMANY:
RETURN

ali_bagheri34
شنبه 13 مهر 1387, 08:43 صبح
با سلام
از شما بسیار متشکرم
از راهنماییتان بسیار استفاده کرده ام

ali_bagheri34
شنبه 13 مهر 1387, 09:26 صبح
سلام
دوست عزیز من برنامه اکسس را برداشتم و در هنگام Compile کردن خطال می دهد و برنامه اطلا اجرا نمی شوئ و در ظمن رفرنسها نیز به این صورت می باشد

mohammadgij
شنبه 13 مهر 1387, 11:03 صبح
اين فايل جديد رو بردار. ظاهراً اون ADP خراب شده. رفرنس ها هم درسته

ali_bagheri34
شنبه 20 مهر 1387, 08:38 صبح
اين فايل جديد رو بردار. ظاهراً اون ADP خراب شده. رفرنس ها هم درسته

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