تقييم الموضوع :
  • 1 أصوات - بمعدل 5
  • 1
  • 2
  • 3
  • 4
  • 5
[VB.NET] الشرح المتكامل لطريقة عمل فاتورة مبيعات وطباعتها
#1
Wink 
بسم الله الرحمن الرحيم
بسم الله والصلاة والسلام علي رسول الله ( صلى الله عليه وسلـم )
إخواني الإعزاء وأساتذتنا الأفاضل في البداية عذراً على المقدمة والتي قد تبدو حادة بعض الشيء وذلك بسبب التقارير في فيجوال بيسك دوت نت
التقارير ليست سهلة وليست صعبة أيضا ولكن عندما بدأت اتعلم عمل التقارير واجهتني مشكلة الشروحات فأغلب المواضيع التي يطلب فيها الاعضاء المساعدة في عمل تقرير أجد الاجابة ( اذهب للرابط التالي ) بدون وضع حل مجدي وفي الغالب الرابط يكون لموضوع يطلب صاحبة نفس الطلب ويكون الرد عليه ( اذهب للرابط التالي ) ..... وهكذا
وللأمانة تكرم بعض الاخوه لعمل مشروع ورفعه ولكن انا لا اريد كود جاهز انا اريد أن اعرف كيف حصلنا على الناتج وأعتقد أن أكثر موضوعين فقيرين جداااااااااااااااااااااااااااا في الشروحات الخاصة بهم ( الفواتير + التقارير ) لذلك وبعد أكثر من شهر في البحث عن حل استطعت بمساعدة الأخوة ان اقوم بعمل فاتورة تعتمد على ثلاث جداول ن قاعدة البيانات كيفية تصميمها وكيف نقوم بحفظها وطباعتها
استرخ وأحضر كوباً من الشاي و واستعد Big Grin
لنبدأ من البدااااااية لأني كمبتدأ اشفق علي المبتدئين أمثالي والذين يريدون الشرح المفصل لذلك قررت أن يكون شرحي علي قدر الإمكان بسيط وسهل ومن البداية
لنبدأ على بركة الله



أولا نبدأ من برنامج أكسس لإنشاء قاعدة بيانات وهنا سأعتمد على الكتابة أكثر من الشرح لأن الأغلب يستطيع عمل قاعدة بيانات
بسم الله : نفتح برنامج أكسس في الغالب أنا أفضل اوفيس 2007 لأن إبتداء من 2010 و 2013 فأن قاعدة بيانات أكسس محمية برقم سر بها العديد من المشاكل حسب موقع مايكروسوفت إذا فبديهيا أنا الان امام أكسس 2007
قاعدة بيانات جديدة بأسم TestDB  محمية برقم سري 123456
انشاء جدول في وضع التصميم أطلق عليه (tbl_Header) وهو لرأس الفاتورة ويحتوي على الخلايا التالية
HeaderID  ترقيم تلقائي
CustomerName   نص
OutDate    نوع تاريخ ووقت بتنسيق تاريخ قصير "13/13/2013"  ( عكاشة ستايل )
BillTottal رقم ( عدد عشري )
طبعا انا مشروعي به ما يقرب من 20 خلية ولكن هنا انا اعتمد علي فهم الطريقة ويمكنكم فهم الفكره وتطبيقها بطريقتكم الخاصة
هذا الجدول به اسم العميل وتاريخ الفاتورة وتكلفتها وانا اعتمدت على ثلاث جداول وليس أثنان لسبب أنني اريد أن يكون عندي سند قبض منفصل عن الفاتورة كما سأشرحة عند الإنتهاء من شرح الجداول
الجدول الثاني جدول tblProducts
وبه سنضع به تفاصيل المنتجات المباعه مثل النوع والعدد والكمية والسعر كالتالي :
ProductsID  ترقيم تلقائي مفتاح اساسي
HeaderID   رقم صحيح لربطة مع الجدول السابق رأس الفاتورة
ProductsID   عدد صحيح لربطة مع جدول المنتجات ( هنا ساعمله نص لتقليل عدد الجداول المستخدمة في الشرح )
ProductsCount    رقم ( عدد الكمية المباعه )
ProductsPrice   رقم ( سعر الوحدة )
ProductsTottal   رقم ( اجمالي سعر الوحدات المباعه )
الجدول الثالث والأخير هنا هو جدول المبالغ المالية المستلمة من العميل فمثلا العميل قام بشراء منتجات معينة بتكلفة 500 جنيه مصري وقام بسداد 200 جنيه والباقي سيقوم بسداد 100 جنيه علي فترات متقطعة لذلك قمت بعمل جدول خاص بالمبالغ المالية مرتبط بجدول الرأس عن طريق رقم الفاتورة  اسم الجدول TblPay ويحتوي على :
PayID    حقل ترقيم تلقائي
HeaderID    رقم طويل لربطة مع جدول الرأس
Paid   رقم ( المبلغ المدفوع )
PaidFrom   رقم ( مدفوع من ..) وهنا لان ربما في قسط من الاقساط يرسل العميل شخص آخر لسداد المبلغ المستحق
PaidDate   تاريخ السداد تاريخ ووقت بتنسيق تاريخ قصير  
ثم من أدوات قاعدة البيانات نقوم بربط الجداول كما في الصورة التالية



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





الرد }}}}
#2
السلام عليكم

بارك الله فيك وصحتين وعافية على القهوة

يعطيك العافية
شـــايـفـــك

الرد }}}}
تم الشكر بواسطة: رحوووم
#3
الجزء الثاني نبدأ من الفيجوال بيسك دوت نت 2012 وهي النسخة المفضلة لدي
نبدأ على بركة الله
نفتح الفيجوال بيسك ونبدأ مشروع جديد وهنا أسميته  Bill
نقوم بنسخ قاعدة البيانات التي صممناها في الفقرة السابقة الي مسار البرنامج في المسار التالي  Bill\Bill\bin\Debug
ونعود الي برنامج فيجوال بيسك من قائمة Project اختيار Add new Item
ونختار كلاس جديد أسميته DAL
ونبدأ مرحلة كتابة الكود
بسم الله
نبدأ باستيراد مكتبات العمل مع قاعدة البيانات
في التصريحات العامة

PHP كود :
Imports System.Data.OleDb
Imports System
.Data 


ثم تحديد جملة الإتصال

PHP كود :
Public Class DAL
   Public Con 
As OleDbConnection
   Sub 
New()
    Con = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source= TestDB.accdb;Jet OLEDB:Database Password=123456;")
   End Sub 





بعدها سنقوم بكتابة ثلاث دوال وهم ما سنستخدمهم في عمليات الادراج والحذف طوال عمل البرنامج وهم بالترتيب
''' الدلة المسؤولة عن الاتصال المغلق
''' الدلة المسؤولة عن الاتصال المفتوح
''' التعديل في البيانات

PHP كود :
 ''' <summary>
   ''' 
التعديل في البيانات
   
''' </summary>
   ''' 
<param name="inserttxt"></param>
   ''' <remarks></remarks>
   Public Sub Editdata(inserttxt As String)
       Try
           Dim cmd As New OleDbCommand()
           With cmd
               .CommandType = CommandType.Text
               .CommandText = inserttxt
               .Connection = Con
           End With
           If (Con.State = ConnectionState.Open) Then Con.Close()
           Con.Open()
           cmd.ExecuteNonQuery()
           Con.Close()
       Catch ex As Exception
           MsgBox(ex.Message)
           Con.Close()
       End Try
   End Sub 
"""""""""""""""""""""""""""""""   (2)

PHP كود :
''' <summary>
   ''' 
الدلة المسؤولة عن الاتصال المفتوح
   
''' </summary>
   ''' 
<param name="cmdtext"></param>
   ''' <returns></returns>
   ''' 
<remarks></remarks>
   Public Function selectdatareader(cmdtext As String) As OleDbDataReader
       Dim cmd 
As New OleDbCommand()
       With cmd
           
.CommandType CommandType.Text
           
.CommandText cmdtext
           
.Connection Con
       End With
       Dim DR 
As OleDbDataReader
       If 
(Con.State ConnectionState.OpenThen Con.Close()
       Con.Open()
       DR cmd.ExecuteReader()
       Con.Close()
       Return DR
   End 
Function 

''''''''''''''''''''''''''''''''''''''''''''  ( 3 )
 
PHP كود :
''' <summary>
   ''' 
التعديل في البيانات
   
''' </summary>
   ''' 
<param name="inserttxt"></param>
   ''' <remarks></remarks>
   Public Sub Editdata(inserttxt As String)
       Try
           Dim cmd As New OleDbCommand()
           With cmd
               .CommandType = CommandType.Text
               .CommandText = inserttxt
               .Connection = Con
           End With
           If (Con.State = ConnectionState.Open) Then Con.Close()
           Con.Open()
           cmd.ExecuteNonQuery()
           Con.Close()
       Catch ex As Exception
           MsgBox(ex.Message)
           Con.Close()
       End Try
   End Sub 







نقوم بحفظ الكلاس ونغلقة لن نحتاجة مره أخرى
لنا عودة ان شاء الله
 ..............................
الرد }}}}
تم الشكر بواسطة: رحوووم , مبرمج بلا حدود
#4
نستكمل ما بدأناه (بعون الله وتوفيقه )في السابق وسنقوم بكتابة أكواد اضافة البيانات علي الفاتورة

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




مع الوضع في الاعتبار أنني قمت بعمل خلايا  الداتا جريد فيو كما هو موضح بالصورة التالية وعمل خليه اسمها   HeaderNO وحددت خاصيى فيزابل لها بالقيمة False حتي لا تظهر للمستخدم  وسنستخدمها للربط مع الجدول Header



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

PHP كود :
Try
 
          Dim BillNo As New DataTable
           BillNo 
= New DAL().selectdatatable(" Select * FROM tbl_Header ")
 
          For As Integer 0 To BillNo.Rows.Count
               txtBillNo
.Text BillNo.Rows(i)(0).ToString 1
           Next
       
Catch ex As Exception
           
'  MsgBox(ex.Message)
       End Try 



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

الان نحن نملك تكست بوكس سنكتب فيه اسم الصنف ونحدد سعرة والكمية المباعه مع العلم بأنه قمت بتحديد الخلية الاخيرة المجموع  ReadOnly لاننا سنقوم بجلب المجموع اوتوماتيكيا وعندما يكون التركيز في مربع نص الكمية المباعه عند الضغط علي مفتاح انتر سيتم ادراج الخلايا في الداتا  جريد فيو ومسح الخلايا ووضع التركيز علي مربع اسم الصنف استعدادا لكتابة صنف جديد
ولعمل هذا نحدد مربع نص الكمية المباعه وفي حدث KeyDown سنكتب الكود التالي

 

PHP كود :
Private Sub txtCount_KeyDown(sender As ObjectAs KeyEventArgsHandles txtCount.KeyDown
       
' الحدث عند الضغط على انتر 
       If e.KeyCode = Keys.Enter Then
           ' 
التأكد من أن خلية اسم الصنف غير فارغة 
           
'ويمكنك هنا اضافة باقي مربعات النص هنا أنا اضع الفكرة فقط 
           If txtProd.Text = "" Then
               MsgBox("خطأ")
               Return
           End If
           ' 
ضرب الكمية في السعر للحصول على الاجمالي 
           txtProdTottal
.Text Val(txtCount.Text) * Val(txtPrice.Text)
 
          '  اضافة المبلغ الاجمالي هنا لخلية اجمالي الفاتورة قبل الخصم 
           DGVsum.Text += Val(txtProdTottal.Text)
           ' 
 اضافة المبلغ الاجمالي هنا لخلية اجمالي الفاتورة بعد الخصم 
           TXTNotPaid
.Text += Val(txtProdTottal.Text)
 
          ' كود وضع العناصر داخل الجدول
           For Each R As DataGridViewRow In DataGridView1.Rows
               R.HeaderCell.Value = (R.Index + 1).ToString
           Next
           DataGridView1.Rows.Add()
           DataGridView1.Item(0, DataGridView1.Rows.Count - 1).Value = txtProd.Text  ' 
وضع اسم الصنف في الخلية الاولي
           DataGridView1
.Item(1DataGridView1.Rows.Count 1).Value txtPrice.Text  ' وضع سعر الصنف في الخلية الثانية
           DataGridView1.Item(2, DataGridView1.Rows.Count - 1).Value = txtCount.Text   ' 
 وضع الكمية في الخلية الثالثة
           DataGridView1
.Item(3DataGridView1.Rows.Count 1).Value txtProdTottal.Text   ' الاجمالي في الخلية الرابعة
           DataGridView1.Item(4, DataGridView1.Rows.Count - 1).Value = txtBillNo.Text   ' 
 هنا نضع رقم الفاتورة في الخلية الغير ظاهرة 
           txtProd
.Text String.Empty
 
          txtPrice.Text String.Empty
 
          txtCount.Text String.Empty
 
          txtProdTottal.Text String.Empty
 
          txtProd.Focus()
 
      End If
 
  End Sub 


ليصبح شكل الفاتورة النهائي كالاتي



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


وسنقوم بعمل ذلك في حدث TextChanged لمربع النص المبلغ المدفوع
ويكون الكود كالتالي


PHP كود :
Private Sub txtPay_TextChanged(sender As ObjectAs EventArgsHandles txtPay.TextChanged

       TXTNotPaid
.Text = (Val(DGVsum.Text) - Val(txtDisc.Text) - Val(txtPay.Text))

 
  End Sub 




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


الرد }}}}
تم الشكر بواسطة: رحوووم , مبرمج بلا حدود , adel27 , adel27
#5
بسم الله وعلى بركة الله نبدأ مرحلة حفظ الفاتورة
الآن وبعد تطبيق كل الخطوات السابقة أصبحت كل خلايا جداول قاعدة البيانات يقابلها بيانات موجودة علي الفورم بقى فقط تخزينها من البرنامج لقاعدة البيانات وهنا سأعتمد على أنني سأقوم بعمل SUB  حفظ خاص لكل جدول وترتيبهم داخل اجراء مفتاح الحفظ
نبدأ بالجدول الأول جدول رأس الفاتورة نقوم بإنشاء Sub جديد ونسميه SUB saveHeader     ويكون الكود كالتالي

PHP كود :
Try
Dim Header As New DAL
Dim Bill_Date 
As Date CDate(DateTimePicker1.Text).ToString("yyyy/MM/dd")
Dim TottalBill As Double Val(DGVsum.Text) - Val(txtDisc.Text)
Header.Editdata("insert into tbl_Header (CustomerName,OutDate,BillTottal) Values ('" txtCust.Text "' ,'" Bill_Date "' ,'" TottalBill "' ) ")
Catch 
ex As Exception
MsgBox
(ex.Message)

End Try 

حفظ جدول TblPay  كود :
PHP كود :
Sub Save_TblPay()
 
      Dim Bill_Date As Date CDate(DateTimePicker1.Text).ToString("yyyy/MM/dd")

 
      Dim TblPaySave As New DAL
       TblPaySave
.Editdata("insert into TblPay (HeaderID,Paid,PaidFrom,PaidDate) Values ('" txtBillNo.Text "' ,'" txtPay.Text "' ,'" txtCust.Text "' ,'" Bill_Date "' ) ")

 
  End Sub 

الآن حفظ الأصناف المباعة
نقوم بعمل حلقة تكرار من صفر وحتي نهاية صفوف الداتا جريد فيو وهنا يمكننا حفظ رقم الفاتورة اما بمربع رقم الفاتورة أو بالصف المخفي من الداتا جريد فيو
يكون الكود بالشكل التالي
PHP كود :
Sub Save_TblProducts()
 
      Try
 
          Dim cmd As New DAL
           
For As Integer 0 To DataGridView1.Rows.Count 1
               cmd
.Editdata("insert into TblProducts ( HeaderID , ProductsName , ProductsCount , ProductsPrice , ProductsTottal ) VALUES ('" txtBillNo.Text "' , '" DataGridView1.Rows(I).Cells(0).Value "' , '" DataGridView1.Rows(I).Cells(1).Value "' , '" DataGridView1.Rows(I).Cells(2).Value "' , '" DataGridView1.Rows(I).Cells(3).Value "' )")
 
          Next
       
Catch ex As Exception
           MsgBox
(ex.Message16"خطأ")
 
      End Try
 
  End Sub 


والآن بعد كتابة جميع الأكواد لمفتاح الحفظ نضعها في حدث Button1_Click ونراعي الترتيب حيث ((( لابد ))) من وضع SUB حفظ رأس الجدول اولاً لأن باقي الجداول مرتبطة به برقم الفاتورة ويكون الكود كالتالي :

PHP كود :
Private Sub Button1_Click(sender As ObjectAs EventArgsHandles Button1.Click
       SaveHeader
()
 
      Save_TblProducts()
 
      Save_TblPay()
 
      MessageBox.Show("تم حفظ الفاتورة بنجاح ""تم"MessageBoxButtons.OKMessageBoxIcon.Asterisk)
 
  End Sub 




وهكذا نكون انتهينا من 80% من العمل وتم حفظ الفاتورة بنجاح في قاعدة البيانات ويتبقي لنا عمل تقرير البيع وطباعته
للحوار بقية ...... Big Grin
ولا تنسوني ووالدتي ( رحمها الله )  بصالح الدعاء
دمتم بخير

السلام عليكم ورحمة الله وبركاته
مشكلة المشاكل بالنسبة لي على الأقل وأكبر معضلة واجهتني في عمل برنامجي هي عمل تقرير للطباعة  وأعتقد انه أقل المواضيع شرحاً بشكل عملي لسبب وحيد أننا نستخدم طريقة الكود في الاتصال بقاعدة البيانات وأغلب شروحات التقارير تستخدم الاتصال بالداتا ست عن طريق المعالج  ما يسبب ( لخبطة ) لأغلب المستخدمين
وبعد التنقل ما بين الريبورت والكريستال ريبوت عشرات المرات استقريت علي الريبورت لأنه أفضل من ناحية أنني لن احتاج لأي إضافات أقوم بتنزيلها علي أجهزة العملاء وبعد مئات المحاولات الفاشلة استطعت أن أقوم بعمل التقرير بطريقة ( قد تكون قديمة ) ولكنها جاءت نتيجة العديد من المحاولات لكنني قررت أن أقوم بشرحها لعل غيري يستفيد ...
نبدأ على بركة الله
الآن نتوجه إلى قاعدة البيانات ونقوم بفتح برنامج الأكسس ومن قائمة إنشاء نقوم بعمل استعلام  في وضع التصميم وإضافة الثلاث جداول ونقوم بإضافة جميع الخلايا التي نريدها في الاستعلام  مع مراعاة أن أول خلية يتم اختيارها هي HeaderID



ونقوم بحفظ الاستعلام بأسم Report_Print

الآن نتوجة الي الفيجوال بيسك ومن قائمة Project    نختار Add new Item    ومنها نختار Dataset  



ثم نضغط كليك يمين ونختار  Add Data Table



ونقوم بتغيير اسم الجدول إلى اي أسم نشاء  ونضيف إليه خلايا بعدد خلايا الاستعلام الذي قمنا بإنشائه سابقا ونسمي الخلايا بنفس أسماء خلايا الاستعلام  
ليصبح الشكل النهائي للجدول كالآتي




الآن من ومن قائمة Project    نختار Add new Item    ومنها نختار Report



سيفتح أمامنا تقرير فارغ من قائمة أدوات التقرير يمكننا سحب الأدوات التي تتناسب مع التقرير لكن أهم أداة هي الجدول سنقوم بسحب جدول من قائمة أدوات التقرير ووضعه بمنتصف منطقة التصميم عند إفلات الجدول ستظهر رسالة بتحديد نوع الاتصال بقاعدة البيانات سنختار Dataset1 التي قمنا بإنشائها ومنها نختار الجدول الذي قمنا بتصميمه
كما في الصورة



الآن يمكننا وضع باقي الأدوات وإضافة أعمدة للجدول حسب ما نريد ليصبح الشكل كالتالي :



إلى هنا انتهينا من تصميم التقرير بقي تحديد الخلايا على التقرير وما يقابلها من الداتا ست وهناك طريقتين لعمل ذلك
الطريقة الأولى عن طريق فتح قائمة  View  ومنها إختيار   report data لتظهر لنا قائمة الخلايا المتاح اضافتها للتقرير ويمكننا اختيار داتا ست 1 وسحب الخلية وافلاتها علي مايقابلها في التقرير
الطريقة الثانية عن طريق الضغط علي مربع النص المراد تحديد قيمة له والضغط بمفتاح الفأرة الأيمن واختيار Expression  ومن القائمة اليسرى نختار Dataset   ومنها نقوم باختيار الخلية المقابلة لها في القيمة ونكرر ذلك مع باقي مربعات النص

الآن يبتبقي لنا تحديد خلايا الجدول وهي عن طريق النقر داخل خلية الجدول ليظهر لنا مربع تحديد القيمة ونختار منها قيمة كل خلية وما يقابلها في البيانات
أما آخر خلية وهي غير موجودة في قاعدة البيانات أصلا هي مربع نص المبلغ المتبقي وهي رقم محسوب لم اشاء أن أضعه في قاعدة البيانات ويمكننا هنا أن نضع له كود عن طريق والضغط بمفتاح الفأرة الأيمن واختيار Expression    وكتابة الكود التالي :
=First(Fields!BillTottal.Value, "DataSet1")-First(Fields!Paid.Value, "DataSet1")




ليصبح الشكل النهائي كما يلي



الآن اقتربنا على الانتهاء تبقي لنا إضافة فورم جديد ووضع أداة  ReportViewer عليه واختيار التقرير الذي قمنا بإنشائه
مع ملاحظة أنه بمجرد اختيار التقرير سيتم إضافة Dataset1  ,   SalahDTBindingSource    اوتوماتيكيا للتقرير



نغلق هذا الفورم ونعود الي اول فورم قمنا بتصميمه الخاص بالفاتورة في حدث الضغط علي مفتاح الحفظ نريد الآن ان يقوم بالطباعه بمجرد الانتهاء من الحفظ

نذهب الي حدث Button1_Click  
الأمر ببساطة الان نحن نمتلك داتا ست بها جدول قمنا بتصميمه غير مرتبط ولا يحتوي علي اي بيانات هذا الجدول هو مصدر بيانات التقرير لذلك إن استطعنا ملئ الجدول بالبيانات ستعرض علي التقرير بسهولة
نقوم أولا باضافة جملة اتصال جديدة وجلب مكتبات داتا لاننا سنقوم بتعبئة الجدول عن طريق داتا ادابتر
ثم نذهب الي الأكسس ونقوم بفتح الاستعلام في وضع SQL  وننسخ الكود الموجود به ثم نضعه في جملة الاستعلام بوضع شرط كالتالي
اولا نقوم بتعريف متغير جديد كالتالي
           Dim NO As String = Val(txtBillNo.Text)
ثم الكود :
PHP كود :
          Dim DA As New OleDbDataAdapter("SELECT tbl_Header.HeaderID, tbl_Header.CustomerName, tbl_Header.OutDate, tbl_Header.BillTottal, TblPay.Paid, TblProducts.ProductsName, TblProducts.ProductsCount, TblProducts.ProductsPrice, TblProducts.ProductsTottal FROM (tbl_Header INNER JOIN TblPay ON tbl_Header.HeaderID=TblPay.HeaderID) INNER JOIN TblProducts ON tbl_Header.HeaderID=TblProducts.HeaderID WHERE (((tbl_Header.HeaderID)= " NO " ));"Con

الان نحن نملك داتا ادابتر DA  وتم تخزين جميع البيانات به الان نقوم بتعبئة الداتا ست بالبيانات كالتالي
PHP كود :
          DA.Fill(frm_Print.DataSet1"SalahDT"

ونقوم بامر فتح الفورم الذي يحتوي علي عارض التقارير
PHP كود :
          frm_Print.Show() 


ليكون الكود النهائي كالتالي

PHP كود :
Private Sub Button1_Click(sender As ObjectAs EventArgsHandles Button1.Click
       SaveHeader
()
 
      Save_TblProducts()
 
      Save_TblPay()
 
      Try
 
          Dim NO As String Val(txtBillNo.Text)
 
          Dim DA As New OleDbDataAdapter("SELECT tbl_Header.HeaderID, tbl_Header.CustomerName, tbl_Header.OutDate, tbl_Header.BillTottal, TblPay.Paid, TblProducts.ProductsName, TblProducts.ProductsCount, TblProducts.ProductsPrice, TblProducts.ProductsTottal FROM (tbl_Header INNER JOIN TblPay ON tbl_Header.HeaderID=TblPay.HeaderID) INNER JOIN TblProducts ON tbl_Header.HeaderID=TblProducts.HeaderID WHERE (((tbl_Header.HeaderID)= " NO " ));"Con)
 
          DA.Fill(frm_Print.DataSet1"SalahDT")
 
          frm_Print.Show()
 
      Catch ex As Exception
           MsgBox
(ex.Message)
 
      End Try
 
      MessageBox.Show("تم حفظ الفاتورة بنجاح ""تم"MessageBoxButtons.OKMessageBoxIcon.Asterisk)
 
  End Sub 


 والآن مع الصور




التقرير في وضع المعاينة



صورة مقربة للتقرير



وهكذا نكون انتهينا من عمل فاتورة مبيعات وربطها بداتا ست وحفظها في قاعدة البيانات وطباعتها
لاتنسونا بصالح الدعاء
دمتم بخير
الرد }}}}
#6
شكرا علي الشرح وقبله التصميم الرائع
برجاء رفع هذا الفورم كلنا نحتاجه
الرد }}}}
تم الشكر بواسطة: مبرمج بلا حدود
#7
أخي الحبيب atefkhalf2004
ألا ترى معي أن الفورم بهذا الشكل بدائي جدا تكتب فيه كل المعلومات يدويا ووارد إحتمال الأخطاء ؟
سأقوم برفع الفورم لا مشكلة في ذلك ولكن ردك أوحى إلي بفكرة
واحده من ضمن مشاكل اي برنامج هي تصميم الفاتورة وطباعتها والحمد لله تغلبنا عليها مارأيك في ان نجعل هذا الموضوع تفاعلي لانهاء برنامج متكامل انطلاقا من هذا الفورم ؟

تم اضافة ملف المشروع اخي الحبيب


الملفات المرفقة
.zip   Bill.zip (الحجم : 722.25 ك ب / التحميلات : 2,518)
الرد }}}}
#8
السيد الفاضل
شكرا علي اهتمامك
لكن المشروع تم عمله ب 2012
هل فيه طريقة لتحويله الي 2008

وانا اري الكريستال افضل بكثير في التقارير

لكن مجهود تشكر عليه وانا استفدت منه كثير
الرد }}}}
تم الشكر بواسطة:
#9
انا اسف جدا اخي والله لا أعرف طريقة تحويله لـ 2008 ولا امتلك حتى 2008 كنت عملت بيه المشروع
وبالنسبة للكريستال اا مش بعرف استخدمه لو عندك شرح ليه يكون لشكل عملي ياريت ترسله
الرد }}}}
تم الشكر بواسطة: saad mahyoub
#10
Thumbs Down 
(30-03-15, 06:18 AM)الفيومي116 كتب : انا اسف جدا اخي والله لا أعرف طريقة تحويله لـ 2008 ولا امتلك حتى 2008 كنت عملت بيه المشروع
وبالنسبة للكريستال اا مش بعرف استخدمه لو عندك شرح ليه يكون لشكل عملي ياريت ترسله

اخى ممكن باسورد acsses ادا امكن وبارك الله فيك
الرد }}}}
تم الشكر بواسطة: العواد الصغير , مبرمج بلا حدود


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  مثال للعمليات علي قواعد البيانات مع الشرح mr_mgm 1 1,136 02-06-16, 12:34 PM
آخر رد: CLARO

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم