الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشروع : إنشاء مكتبة من الكتب

مغلق
بدأه محمد خليل أبو صلاح في 12 نوفمبر 2002 · 17 رد · 17,092 مشاهدة · في ASP.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بناء على طلبكم سوف نقوم مع بعضنا بعمل مكتبة للكتب لها خصائص عدة سنذكرها الان ..

لكن قبل هذا العمل يجب أن نتفق على إتفاقيات .. و ذلك ليضمن صاحب العمل حقه ..

مثلا هول تودون ان يكون مصدر الأكواد مفتوحا للجميع بحيث يستفاد منه بناء على اتفاقية ميكروسوفت

ال Shared Source أم نقوم فقط بطرح الأفكار و الحلول و معالجة المشاكل حتى نصل

لعمل متكامل خاص بكل مبرمج له كلا على حدة من باب الحفاظ على الخصوصية ؟؟

أنا من ناحيتي أريد الطريقة الأولى و هي جعل المصدر مفتوحا بحيث يستفيد الجميع لأنه من المنطقي

أنه ليس كل شخص يدخل في هذا الموضوع ملم باللغة و يمكنه اجراء التطبيقات و تبقى الفكرة البرمجة ..

لكن هناك أعضاء ترغب بالتعلم و المشاركة و التفاعل في هذه المواضيع بحيث تفيد و تستفيد و هذا خير

طريق للتعلم .. كما أننا لا ننسى أنه قد يسجل أعضاء لاحقون سيستفيدون جدا من هذا التطبيق عندما

يجدونه مشروحا بالكامل .. و كأنما هم تابعوه في مراحله الأولى ..

* على العموم فكرة المشروع كالتالي :

إنشاء مكتبة لكتب الويب يحوي وصلات لمجموعة من الكتب موجودة على سيرفرات ربما تكون مختلفة على الويب ..

* الشكل العام للفكرة :

-عمل أقسام مختلفة للكتب و كأنها تصنيفات عامة مثل كتب برمجية و كتب دينية و غيرها و تفرع

-عدد من الأقسام الفرعية مثل كتب الفيجوال بيسك في قسم كتب البرمجة و هكذا .

* خصائص العرض للمشروع :

-وجود واجهة عرض سهلة التعامل من قبل المستخدم الذي يزور التطبيق .

-وجود خصائص لكل كتاب أو مصنف مثل عدد مرات التحميل .

-إمكانية التصويت لمستوى الكتاب .

-حجم الكتاب إن أمكن .

-ذكر وصف عام للكتاب .

-وصلة لتحميل الكتاب .

-وجود وصلات عامة في التطبيق لأكثر الكتب طلبا و وصلة لأحدث الكتب .

* قاعدة البيانات :

سوف نصمم قاعدة بيانات من نوع أكسيس للتدريب و كل حر في تغييرها كما يشاء .

جداول قاعدة البيانات :

-جدول categories و هو خاص بالتصنيفات العامة للكتب .

-جدول SubCategories و هو للتصنيفات الجزئية .

-جدول booksInfo و هو يحوي معلومات عن الكتب كل كتاب على حدة .

* تفاصيل الجداول :

-الجدول Categories :

به الحقول التالية :

categoryId : و هو رقم وحيد معرف لكل قسم .

categoryName : و هو يحمل أسماء التصنيفات العامة للكتب .

-الجدول subCtegories

به الحقول التالية :

id: رقم معرف وحيد خاص بكل قسم فرعي .

subName : يحمل أسماء الأقسام الفرعية للتصنيفات .

categoryId: و هو رقم القسم الذي يقع تحته هذا التصنيف .

-الجدول booksInfo :

به الحقول التالية :

bookId : رقم معرف خاص بكل كتاب .

bookName : يدل على اسم الكتاب .

bookUrl : يحوي المسار الذي موجود به الكتاب مع اسم الكتاب .

downloadRates : عدد مرات التحميل للكتاب .

language : خاصة بلغة الكتاب إما العربية أو الانجليزية أو الإثنين .

Description : حقل يحمل وصفا موجزا للكتاب .

vote : من الأجل التصويت لمستوى الكتاب .

هذه الحقول بدائية و الجداول كذلك أي ربما تحتاج للإطافة إليها حسب متطلبات تطبيقك الخاص

أو قد تحذف منها كل ما لا تحتاجه .. لكن أنا تقريبا ذكرت أغلب الأشياء الهامة .

يبقى الان الخطوة القادمة و تبدأ منكم .. اطرحوا ما لديكم من استفسارات و اراء و تعديلات

و بعدها سنبدأ إنشاء المكتبة بإذن الله ثم بجهودنا جميعا ..

و الله الموفق ..

You can fly while you can touch the sky

#2

بالنسبة للمكتبة فما رائيك بالفكرة التالية :D (مختلفة قليلا عن فكرتك و غير موجودة على انترنت على الاطلاق.)

لماذا لا يتم صناعة برنامج ويب و الذي هو عبارة عن مكتبة الكترونية ولكن بطريقة مختلفة جذريا عن فكرة المكتبات الالكترونية العادية.

سوف احاول توضيح الموضوع اكثر و بالطبع يمكن بناء فكرة مفصلة اكثر لاحقا، لماذا لا يوجد موقع عربي على انترنت يحتوي على مكتبة الكترونية تعرض الكتب على شكل HTML اي ان الكتب محفوظة بداخل هذه المكتبة، بحيث ازورها بالمتصفح و اختار كتاب ما و من ثم يفتح لي على شكل Windows Explorer بالمواضيع الرئيسية و الفرعية و الصفحات نفسها.

ولكن ذلك ليس كل شئ، اذا انا كنت الكاتب لماذا لا يكون لدي امكانية لعمل تسجيل دخول و تعديل محتويات الصفحات او اضافة صفحات جديدة او مواضيع جديدة الى الكتاب :D و ما الى ذلك.

و من ثم الزوار يمكنهم وضع التعليقات على الكتاب او على فصل ما او على قطعة بسيطة ما، و بهذا يمكن للمؤلف ان يعدل اجزاء في ذلك الكتاب مباشرة بنائا على الملاحظات.

كما يمكن لكل كاتب ان ينشر اية كتاب يرغب به في المكتبة، و يمكن للزائر ان يتصفح اية جزء من المكتبة، بذلك ربما سوف تصبح مكتبة حقيقة على انترنت.

الفكرة ربما قريبة من فكرتك ولكنها مختلفة قليلا :D

بالطبع قد يكون للمستخدم الامكانية لحفظ كل الكتاب في جهازه لو لم تتوفر لديه انترنت بالكوابل ليقرائه لاحقا، او ربما يحفظه في ال Tablet PC الخاص به :D اعتقد ان العام القادم سوف ينتشر هذا الجهاز كثيرا ايضا.

بالطبع هذه فكرة قديمة حبيت ان اشاركها معكم

#3

فكرة مميزة خضر و هي تقريبا تشبه بالشكل العام فكرة موقع أمازون الذي يمنحك نظرة عن بعض صفحات الكتاب قبل شرائه ..

لكن لي تعقيب بسيط و هو أنني قمت بعمل هذا المشروع بناء على رغبة الأعضاء ثم القصد منه هو أصلا تنزيل برامج و انا كتبتها كتب من باب أنها ملفات سيتم انزالها من النت ..

على العمووم الاعضاء يحددون ما يريدون و نبدأ العمل ..:)

لكن فكرتك جميلة ..

You can fly while you can touch the sky

#4

فكرة الاتستاذ خضر ممتازة طبعا لكن مشكلتها ان معظم الكتب الموجودة عندنا بصيغة pdf و معظمها لمؤلفين اجانب :):)

بس فكرة التعليقات هذه ممتازة

انا اقترح وضع كل كتاب بالصيغتين (هناك عدة برامج تقوم بالتحويل) صيغة الpdf تكون للتنزيل من النت و الاخري بعد التحويل لصيغة html و هذه تكون للنقاش والتعليقات

#5

مو مهم الأفكار طالما أنها ستبقى ساكنة .. نحن يهمنا التطبيق حتى نتعلم .. و حتى الان و كل هذه القراءات فقط ردان .. أتمنى أن أرى المزيد ..

You can fly while you can touch the sky

#6

أنا متحمسه لفكره وأتمنى تطبيقها وكتابة الكود للجميع

والله يعينك ويوفقك حتى تكمل هذا العمل

وشكرا جزيل لك

#7

سنبدأ اليوم العمل في المشروع .. طبعا سنبدأ بتقنية ال ASP ثم بعدها سنعيد انشاءه بال ASP.NET حتى نجرب التقنية الجديدة

فمنها الافئدة و التغيير لما هو جديد في عالم التقنيات البرمجية الموجهة للويب و منها الوقوف على الفوارق بين التقنيتين و لو جزئيا ..

طبعا ليس من الضروري الارتباط بقاعدة البيانات التي وضعتها بالأعلى و إنما كانت كشبه تصور كلي لمشروع متكامل و هنا ساقوم بطرح

مثال و أشرحه و سأرفق معه نمذج لقاعدة البيانات المستخدمة في هذا التطبيق ..

صفحة Default.asp

[trrrrr]




[trrrrr]
 
[/trrrrr]









[/trrrrr]
[trrrrr]






[trrrrr]

[/trrrrr]


[trrrrr]


[trrrrr]

[/trrrrr]


[/trrrrr]

[trrrrr]

SQL="SELECT * FROM category"
set rs=createObject("ADODB.recordset")
rs.open SQL,conn,3,3
if rs.EOF then
write "

لا يوجد كتب هنا .. سنعود بك للموقع الرئيسي"
response.addHeader "refresh","2;url=http://www.arabteam2000.com"
response.end
else 
%>

[trrrrr]while not rs.EOF
cnt=cnt+1

SQL="SELECT * FROM programs where categoryId="&rs("id")
set subCat=createObject("ADODB.recordset")
subCat.open SQL,conn,3,3

write "" & rs("category") &"" & _
"  [يوجد "& subCat.RECORDCOUNT&"  من البرامج.]"
write "
  "
write rs("Desc") & "  
" &_
"  -> البرامج من هنا" 
write ""
if cnt mod 2=0 then write "[/trrrrr]"
rs.MoveNext
WEND
%>



[/trrrrr]

[trrrrr]

[/trrrrr]









[/trrrrr]
[trrrrr]






[trrrrr]



http://arabteam2000.com

[/trrrrr]









[/trrrrr]

سنبدأ الان في شرح الصفحة ..

قمنا بتضمين ملفين الأول خاص بمسار قاعدة البيانات انت تنشيؤه على كيفك و تضمين ملف خاص باللغة العربية و هذا مثال له :

طبعا لا تقلق من كثرة الأسطر فأغلبها مولد تلقائي من الفرونت بيج و الذي يهمنا هو الكود و هذا بدايته :

SQL="SELECT * FROM category"
set rs=createObject("ADODB.recordset")
rs.open SQL,conn,3,3
if rs.EOF then
write "

لا يوجد كتب هنا .. سنعود بك للموقع الرئيسي"
response.addHeader "refresh","2;url=http://www.arabteam2000.com"
response.end
else 
%>

قمنا بعمل استعلام لاستخراج الحقول من جدول category الذي يحوي تصنيفات البرامج مثل برامج التصميم و البرامج الخدمية و غيرها ..

طبعا الاستعلام واضح بعدها قمنا بتعريف مجموعة من الحقول باسم rs ثم فتحنا مجرى لها من خلال rs.open و طبعا الرقم 3 خاص بال Lock Type وقد قمنا بتوضيحه سابقا في هذا المنتدى ..

قمنا بفحص التصنيفات من خلال جملة الشرط .. إن لم تكن هناك تصنيفات اظهر رسالة تخبرنا بذلك و بعدها قمنا باستخدام الأمر response.AddHeader الذي يقوم بنقل الصفحة لغيرها بعد تحديد قيمة العداد الزمني لثانيتين و حددنا عنوان المسار الذي ستنتقل له .

بعدها استخدمنا response.end و التي تقوم بانهاء تفسير الأكواد عند هذه النقطة و بالتالي لا تظهر الأكواد التي أسفلها أبدا .. أما في حالة

الاستثناء else أي وجود تصنيفات تظهر بشكل جدول .. نأتي الان لشرحه ..

هذا هو الكود :

[trrrrr]while not rs.EOF
cnt=cnt+1

SQL="SELECT * FROM programs where categoryId="&rs("id")
set subCat=createObject("ADODB.recordset")
subCat.open SQL,conn,3,3

write "" & rs("category") &"" & _
"  [يوجد "& subCat.RECORDCOUNT&"  من البرامج.]"
write "
  "
write rs("Desc") & "  
" &_
"  -> البرامج من هنا" 
write ""
if cnt mod 2=0 then write "[/trrrrr]"
rs.MoveNext
WEND
%>

طبعا يظهر أننا استخدمنا جدولا لاظهار التصنيفات .. و حدود الجدول صفر أي مخفي .. ثم قمنا بانشاء دوارة لعرض التصنيفات و أنشأنا عدادا يحمل الاسم cnt سأشرح الحاجة له لاحقا .. طبعا نعلم أن بكل دوارة نقون داخل سجل معين .. أي نستطيع قراءة جميع حقوله و منها ال id و هي المفتاح الوحيد في الجدول الناتج عن ال rs و هو الخاص بالتصنيفات .. نقوم بانشاء استعلام اخر بداخل كل دوارة له شرط و هو تماثل ال id في جدول ال category أي التصنيفات مع المفتاح categoryId و الذي هو مفتاح الربط بين الجدولين ..

ما نراه أننا قمنا بعرض التصنيف ثم عرضنا أمامه عدد البرامج الواقعة تحت هذا التصنيف .. طبعا حصلنا عليها من خلال طريقة ال ADO عن طريق الخاصية recordCount و التي تعيد عدد صحيح و هو عدد السجلات الناتجة من الشرط الخاص بالاستعلام ..

اعلم أن هذه الفكرة قد تكون غامضة و لكن مع تجربتها ستجدها سهلة لكن لا مانع من مثال :

نفرض أن لدينا تصنيفان و هنا برامج التصميم و ال id لها هو 1 و البرامج التربوية و رقمها هو 2 ..

في جدول البرامج سنحتاج أن نعين تصنيف لكل كتاب و نكتفي بوضع الرقم 1 في خانة ال categoryId إن كان الكتاب يقع تحت تصنيف برامج التصميم ..

المهم سنجد عندنا عددا لا بأس منه من الكتب .. إما لها الرقم 1 أو 2 في التصنيف ..

الإستعلام السابق subCat يعرض مجموعة الحقول التي لها نفس رقم التصنيف .. في أول دورة سيكون ال id عندنا 1 و بالتالي في subCat سيقوم باختيار جميع الحقول التي تقع تحت هذا التصنيف من خلال ايجاد القيمة 1 في الحقول categoryId ..

طبعا ان كان عندنا 5 كتب لها نفس هذا التصنيف ستعيد subCat.RECORDCOUNT عدد السجلات ..

و من أجل انشاء شكل جميل للعرض غير تقليدي قمنا باجراء معادلة رياضية لتقوم بتقسيم الصف لعدد انت تختاره من الخلايا لتظهر ..

هنا نحن نود أن نعرض خليتين أي تصنيفين في كل صف ثم ينتقل تلقائيا للصف التالي و هذه هي المعادلة :

if cnt mod 2=0 then write ""

ها نحن نعود ل cnt و هي العداد الذي أنشأناه .. بعد دخوله أول دورة سيزيد واحد ليصبح 1 و مع كل دورة يزداد فينتج عندنا تسلسل له يبدأ من 1 إلى عدد الحقول حسب الدوارة و توقفها ,, نلاحظ أنه ستظهر أعاداد زوجية و أخرى فردية .. المعادلة السابقة تفيد انه ان كان باقي قسمة العدد على 2 تساوي الصفر معناها أن العدد زوجي لذا انزل سطر أي اغلق الصف و اذهب للصف التالي ..

طبعا ان كنت تريد عرض عدد معين من الحقول كل ما عليك هو ابدال الرقم 2 بما تريد من عدد الخلايا بكل صف .. اعتقد أنها أيضا فكرة جميلة اكتسبناها من أول درس ..

أتمنى أن تقوموا ببدأ العمل و التطبيق و ذكر أي مشاكل تواجهكم هنا ليتم شرحها شرحا وافيا ..

و ها هو ملف مرفق به قاعدة البيانات ..

بالتوفيق جميعا ..

proglibrary.zip

You can fly while you can touch the sky

#8

درس رائع أستاذ محمد وبالتوفيق..

#9

نسيت أن أذكركم بأن هناك وصلة تابعة لكل تصنيف عند الضغط إليها ننتقل لصفحة showPrograms و التي تقوم بعرض البرامج الواقعة تحت كل تصنيف .. طبعا كي نستدل على التصنيف التي تقع البرامج أسفله يجب أن نرسل للصفحة رقم التصنيف و هو واضح بالكود السابق من خلال :

response.write "البرامج من هنا"

و أود أن انبه لنقطة أخرى شرحتها في المتجر الالكتروني لمن لم يتابع و هي استخدام write بدلا من response.write و ذلك بإضافة هذه الإجرائية :

 Sub write(text)

    response.write text

 End Sub

حتى هنا اعتقد أن كل شيء مفهوم .. سأقوم بعد قليل بإضافة صفحة showPrograms.asp

You can fly while you can touch the sky

#10

صفحة showPrograms.asp :

تقوم هذه الصفحة باستقبال رقم التصنيف و الذي هو الرابط بين جدول التصنيفات و جدول البرامج الواقعة تحتها .. و بعدها نستخدم استعلام ليقوم بعرض حقول كل سجل يقع تحت نفس التصنيف الذي اخترناه .. دعونا نرى الكود أولا و بعدها نشرح ما كان غامضا ..:

<script>


pId=Request.QueryString("programsId")
page=Request.QueryString("page")
path=Request.ServerVariables(29) & "?programsId="&pId

Function printArrows(page,pagecount)
response.write ""
if cint(page)1 then 
response.write "
أول صفحة "&VBCrlf
response.write " "&VBCrlf
end if
if cint(page)pagecount then 
response.write ">> "&VBCrlf
response.write "آخر صفحة "&VBCrlf
end if
response.write "
"
End Function



SQL="SELECT * FROM subCategory where categoryId="&pId&" order by subCategory"
set rs=createObject("ADODB.recordset")
rs.open SQL,conn,3,3

if pagers.pageSize=15
rs.AbsolutePage=page


IF rs.EOF then
write "


لا يوجد برامج في هذا القسم .. لحظات و نعود بك .." 
response.AddHeader "refresh","2;url=default.asp"
response.end 

End IF


%>







[trrrrr]
 
[/trrrrr]
[trrrrr]




[trrrrr]

[/trrrrr]
[trrrrr]

تحميل البرنامج

 مرات 
التحميل

التصويت للبرنامج

وصف البرنامج

اسم البرنامج
[/trrrrr]

Function getvote(vote,id)
if vote  "" then
if voteif vote>10 then vote=10
good=vote*10
worse=(10-vote)*10
write good & "% "& _
"" onclick=NewWindow('vote.asp?op=yes&id="&id&"','name','300','150','no');return false>"&_
"ممتاز - " &_
"" onclick=NewWindow('vote.asp?op=no&id="&id&"','name','300','150','no');return false>"&_
"سيء "& worse & "%"


end if
End Function 

for i=1 to rs.pageSize
cnt=cnt+1

if cnt mod 2=0 then
color="#EDF2FA"
else
color="#D2DFF2"
end if 


%>
[trrrrr]

 [url="http://download.asp?id=[/url]


 


 


 


 

[/trrrrr]
rs.MoveNext
if rs.EOF then exit for 
next 

%>

[trrrrr]
 
[/trrrrr]









[/trrrrr]
[trrrrr]


 

[/trrrrr]

قمنا بالبداية بتضمين ملف مسار قاعدة البيانات و بعدها أضفنا ملف اللغة العربية ثم وضعت كود يقوم بفتح نافذة صغيرة بوسط الشاشة حسب الاعدادات التي حددناها لها من ارتفاع و عرض و مكان ظهور .. بعدها وضعت دالة للتنقل بين الصفحات حيث أنني أنوي عرض 15 برنامجا بكل صفحة حتى تظهر بشكل جميل ..

دعونا الان نتابع ثم نعود للدالة عند استدعائها لشرح مابها ..

نقوم باستقبال رقم المجموعة أو التصنيف الخاص بالبرامج في ال pId ثم قمنا باستقبال رقم الصفحة من شريط العنوان أيضا و ذلك من خلال الأمر request.QueryString و قمنا بتعريف مسار للصفحة يلزمنا في دالة التنقل بين الصفحات و هذا شرح له :

Request.ServerVariables(29)

تحدثنا عنها كثيرا سابقا و هي تعيد ال PATH_INFO التي يمكن استبدالها بالرقم 29 الذي يمثل ترتيبها في المصفوفة مضاف إليه واحد لأن المصفوفة تبدأ من الصفر (يا مبرمجين ;) طبعا الناتج سيكون كمثالhttp://127.0.0.1/progLibrary/showPrograms.asp و أضفنا لها ?programsId لتصبح على هذا الشكل http://127.0.0.1/progLibrary/showPrograms....sp?programsId=1 طبعا الرقم 1 افتراضي و هو المفروض ان يعاد (الرقم يمثل رقم التصنيف الذي استقبلناه كما قلت من قليل في المتغير pId ..

استخدمنا بعدها استعلاما كالتالي :

SQL="SELECT * FROM subCategory where categoryId="&pId&" order by subCategory"
set rs=createObject("ADODB.recordset")
rs.open SQL,conn,3,3

وظيفة الاستعلام استخراج كل البرامج الموجودة في الجدول subCategory الذي يحتويهم حيث أن الشرط هو أن يكون لهم نفس التصنيف الذي تم استقباله فتظهر البرامج ذات نفس التصنيف مع بعضها ,, ثم أنشأنا بعدها مجموعة سجلات من نوع rs كما ذكرنا سابقا ..

بعد ذلك قمنا بضبط رقم الصفحة التي نحن فيها و ذلك يلزم لدالة التنقل بين الصفحات .. طبعا الحالة الافتراضية page عند استقبالها فارغة لأنها غير موجودة في شريط العنوان لذا أنشأنا شرطا يقوم بتعيينها للقيمة واحد في حال حدوث ذلك أو تمت كتابة رقم أقل من الواحد كالصفر وغيره تحسبا لوقوع الأخطاء .. بعد ذلك حددنا عدد السجلات التي سنعرضها و هو 15 و ممكن انت تغيرها بكيفك .. و بعدها قمنا بتحديد رقم الصفحة الحالية عن طريق اسناده للقيمة المستقبلة في المتغير page .. طبعا هذه المقطوعة تتركز حول ال ADO الذي نصحتكم مسبقا أن تتعمقوا فيه من أجل الاستفادة ..

if pagers.pageSize=15
rs.AbsolutePage=page

بعد هذا الكود قمنا بعمل شرط مجمله انه ان لم تكن هناك سجلات يعرض رسالة بذلك و ينهي الكود السفلي و يعود بنا للصفحة السابقة و يمكنك أن تجرب عدم وجود سجلات و تحذف الجملة response.end لترى ماذا سيحدث حال غيابها .. طبعا بعدها يوجد اشتثناء للشرط و هو حال وجود سجلات حيث سيتم عرضها في جدول .. اكتفيت بعرض بعض الخصائص مثل اسم البرنامج و شرح نبذه عنه و تصويت للبرنامج و عدد مرات التحميل و وصلة للتحميل ..

طبعا استخدمت حلية لاظهار التصويت و هي أنني وفرت على قاعدة البيانات حقلا و اكتفيت بحقل واحد يعد كم مرة تم التصويت .. طبعا المفروض أن الخانة ستأخذ من الصفر حتى الرقم 10 من القيم .. ما فعلته كالاتي .. جعلت القيمة الابتدائية تساوي 5 و يتم استدعاؤها كالتالي :

Function getvote(vote,id)
if vote  "" then
if voteif vote>10 then vote=10
good=vote*10
worse=(10-vote)*10
write good & "% "& _
"" onclick=NewWindow('vote.asp?op=yes&id="&id&"','name','300','150','no');return false>"&_
"ممتاز - " &_
"" onclick=NewWindow('vote.asp?op=no&id="&id&"','name','300','150','no');return false>"&_
"سيء "& worse & "%"
end if
End Function

نفرض أن القيمة المخزنة 7 أي اننا جعلنا التصويت لممتاز يساوي 7 مضروبة في 10 حتى تظهر النسبة المئوية .. و طرح القيمة من 10 هو النسبة للسيء و بالتالي تظهر 30 .. لكن هناك احتمالات و هي أن القيمة ربما تكون أكبر من 10 مثلا 14 فتظهر النسبة 140 و هذا غير منطقي لذا وضعنا شرط لذلك يقوم بتحويل أي قيمة أكبر من ال 10 إلى 10 و أي قيمة أقل من الصفر إلى 0 .. الزيادة و النقصان في قيمة التصويت سنشرحها في صفحة vote.asp المرة القادمة ..

بعد ذلك قمنا بعمل جملة طباعة لاخراج النتائج عن طريق write طبعا كل واحد حر في الشكل و انا حبيت أتفنن شوي :)

لكن يجب أن ننتبه إلى أننا استخدمنا دالة جافا سكريبت تقوم بفتح نافذة خاصة بالتصويت الذي جعلته على شكل وصلات بمجرد لمسها تحسب نقطة إما للمتاز أو السيء ..

بعد ذلك يأتي هذا الكود :

cnt=cnt+1
if cnt mod 2=0 then
color="#EDF2FA"
else
color="#D2DFF2"
end if

استخدمنا دوارة من نوع for و هي المفضلة عند استخدام تقسيم الصفحات كما ذكرنا و بعدها قمنا بعمل عداد cnt اللي فهمه المرة اللي فاتت كانت له هذه المرة بسيطة .. و هي أننا قمنا بعمل شيء شبيه بالخدعة بحيث تظهر الصفوف في الجودل بألوان مختلفة كما ترى في ألوان المنتدى ما بين الفاتح و الغامق .. نقارن العداد فإن كان موجب القيمة كان لونه كذا و إلا كان كذا ..

نأتي الان لشرح الدالة التي تجنبناها بالأول :

Function printArrows(page,pagecount)
response.write ""
if cint(page)1 then 
response.write "
أول صفحة "&VBCrlf
response.write " "&VBCrlf
end if
if cint(page)pagecount then 
response.write ">> "&VBCrlf
response.write "آخر صفحة "&VBCrlf
end if
response.write "
"
End Function

الدالة تستقبل رقم الصفحة و عدد الصفحات و ذلك عند استدعائها من خلال حيث أنه من خلال ال ADO يتم حساب عدد الصفحات عند استخدام الطريقة rs.PageCount .. بعد ذلك نقوم بتحويل قيمة المتغير الموجودة في المتغير page إلى رقم عن طريق cint و بعدها المفروض يكون واضح لأي انسان ملم بأساسيات و مبادئ اللغة أو التقنية ..

تقريبا هذا شرح وافي لهذه الصفحة التي أرفقتها مع المقال و ما عليك إلا أن تضمها للمجلد السابق .. و أي سؤال أنا حاضر ..

و شكرا لكم على حسن المتابعة ..

showprograms.zip

You can fly while you can touch the sky

#11

نتابع معكم مشروع مكتبة الكتب و ها أنا سأضع الان كود لصفحة التصويت التي ستظهر على شكل نافذة في منتصف الشاشة تبلغك بتمام العملية و هذا هو الكود قبل الشرح :

' id is the uniqe key for the program in the table
id=request("id")
' op is the option [good,worse]
op=request("op")

SELECT CASE op
CASE "yes"
SQL = "UPDATE subCategory SET Vote=Vote+1 WHERE ID=" & ID
CASE "no"
SQL = "UPDATE subCategory SET Vote=Vote-1 WHERE ID=" & ID
END SELECT

Conn.Execute (SQL)

%>
شكرا لقد تم اعتماد تصويتك

[اغلق النافذة]

نقوم باستقبال قيمة مجموعة البرامج أو التصنيف الخاص بها و هو رقم وحيد كما ذكرنا بأول جدول و أيضا نأخذ قيمة الخيارو هي إما ممتاز و أرسلنا لها القيمة yes أو سيء و قيمتها no .. بدع ذلك قمنا باستخدام select case لتقوم بتحديد الخيار الذي اخترناه من بين خيارين فإذا كان الاختيار ممتاز أي yes فإنه يقوم بعمل الاستعلام الأول الذي يضيف واحدا للقيمة المخزنة و يختار الثانية و يطرح قيمة واحد من قيم التصويت إن كان التصويت بسيء ..

ثم يقوم بتنفيذ الاستعلام و هناك عدة طرق لعمل هذه العملية سنتطرق لها في أمثلة أخرى إن شاء الله .. طبعا ستظهر بالنافذة وصلة مكتوب عليها اغلاق النافذة تغلق النافذة عند الضغط عليها من خلال أمر الجافا سكريبت الموجه لكائن النوافذ و هو ( )window.close ...

من الضروري أن لا تنسى حفظ هذا الكود في ملف و سمه vote.asp و أضفه للمجلد السابق ..

أتمنى أن تكونوا استفدتم معنا حتى الان ..

You can fly while you can touch the sky

#12

أخيرا صفحة download.asp و التي هي عبارة عن نافذة تظهر لتخبرك بأنه يتم التحميل بعدها تختفي و ترى نافذة حفظ الملف

وغيرها من الخيارات كما هو الحال عند تنزيل أي ملف ..

ها هو الكود أولا ..

ID = Request.querystring("ID")
if ID  "" then
	ID = ID * 1
end if
SQL = "SELECT * FROM subCategory WHERE ID=" & ID
SET RS=CREATEOBJECT("ADODB.RecordSet")
RS.OPEN SQL,CONN,3,3
 Rs("downloads")=Rs("downloads")+1
 Rs.Update
Response.redirect ("http://"& Rs("url"))
%>

قمنا بالبداية باستقبال رقم البرنامج أو المنتج مهما يكن في القيمة id التي سنحتاجها في الاستعلام و هو رقم وحيد في جدول البرامج ..

بعدها قمنا بعمل استعلام يختار البرنامج الذي نريد من خلال رقمه الوحيد .. ثم أنشأنا كائن للسجلات و استخدمنا ال ADO للإضافة

بمقدار واحد لعدد مرات التحميل ..

و ترون هنا كيف أضفنا واحدا و كان بالإمكان استخدام الاستعلام كما في المثال السابق لصفحة التصويت ..

You can fly while you can touch the sky

#13
اقتباس
الرساله الأصليه بواسطة

SQL="SELECT * FROM subCategory where categoryId="&pId&" order by subCategory"
set rs=createObject("ADODB.recordset")
rs.open SQL,conn,3,3

أخي محمد في هذا الكود خطأ والصحيح التالي:

SQL="SELECT * FROM programs where categoryId="&pId&" order by subCategory"
set rs=createObject("ADODB.recordset")
rs.open SQL,conn,3,3
#14

ممتاز واصل نحن معك

شبكة

#15

جهد رائع اخي محمد بتوفيق الله ورعايته (f)(gift):D

امر واحد ارجو الا تخيبني فيه وهو ان تقوم بارفاق ملف txt يحوي ما تشرحه في الصفحة هنا عشان التتبع ايضا عندما لا نكون اونلاين

شكرا مرة اخرى

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#16

أخي كل شيء مشروح هنا فلا داعي لملفات خارجية .. :)

تابع التحديثات كلما دخلت هنا و أي استفسار نحن حاضرين ..

تقريبا انتهى الكود بقي فقط ترتيبه من قبلكم ..

You can fly while you can touch the sky

#17

مسكور جدا والله على هذا الجهذ يا اخى

اعانك الله

#18

مشكور ساتابعه عن طريق الاوفلاين

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

هذا الموضوع مغلق.

مواضيع مشابهة