اذهب الي المحتوي
أوفيسنا

الردود الموصى بها

قام بنشر

السادة الافاضل أصحاب الخبرة في الاكسس

السلام عليكم ورحمة الله وبركاته

أرجو من سيادتكم المساعدة في طلبي هذا وجزاكم الله خيرا

لدي قاعدة بيانات عن بلاغات الحريق

والمطلوب عمل تقرير نهائي أو نموذج كما موضح بالصورة

DB1.rar

قام بنشر

السادة الافاضل أصحاب الخبرة في الاكسس

السلام عليكم ورحمة الله وبركاته

أرجو من سيادتكم المساعدة في طلبي هذا وجزاكم الله خيرا

لدي قاعدة بيانات عن بلاغات الحريق

والمطلوب عمل تقرير نهائي أو نموذج كما موضح بالصورةDB1.rar

قام بنشر

وعليكم السلام ورحمة الله وبركاته :rol:

 

السؤال ظاهرا سهل ، ولكني لم اجد طريقة سهلة لحلّه :blink:

 

اليك خطوات عملي:

الجدول الذي نأخذ منه البيانات:

411.Clipboard01.jpg

.

والنموذج الذي يجب ان نحتار التاريخين فيه:

411.Clipboard02.jpg

.

استعلام المجاميع Totals لجمع البيانات حسب الحالات المتشابهة بين تاريخي النموذج:

411.Clipboard03.jpg

.

ونتيجته:

411.Clipboard04.jpg

.

وفي الواقع ، كل العمل التالي هو لجعل معلومات الاستعلام اعلاه تدور 90 درجة الاى اليمين ، ليصبح:

411.Clipboard044.jpg

.

لعمل الدوران لكل حالة ، نحن محتاجين نعمل استعلام جدولي Crosstab Query ، وفي حالتنا عندنا 3 حالات ، عدد البلاغات ، عدد المصابين ، عدد الوفيات:

411.Clipboard05.jpg

.

والنتيجة لكل حالة:

411.Clipboard06.jpg

.

ولكن الاستعلام الجدولي محتاج تضبيط قبل ان يشتغل بالطريقة الصحيحة:

اولا: بإدخال جميع الحالات الموجودة ، حتى تظهر لنا في التقرير (وإن لم يكن فيها قيمة للفترة بين تاريخين):

411.Clipboard09.jpg

.

ثانيا: بتعريف المعايير التي تم استخدامها في استعلام المجاميع سابقا:

411.Clipboard10.jpg

.

الآن لدينا 3 استعلامات جدولية ، وفي كل واحد منها قيمة ، ولكننا نريد القيم الثلاث ، لذا يجب ان نعمل استعلام تجميع Union query لهذه الاستعلامات الثلاث:

411.Clipboard07.jpg

.

والنتيجة:

411.Clipboard08.jpg

.

ولكن الاستعلام اعلاه جدا حساس ، واذا غيّرت شئ ، فلن يعمل الاستعلام!!

ولكننا بحاجة الى عمل مجموع للقيم !!

لذا ، سنأخذ الاستعلام السابق ، ونعمل منه استعلام جديد عادي Select ، بحيث نجمع القيم في الحقل Total ، كمل عملنا حقل للملاحظات (طبعا انت يجب ان تربطه بجدول):

411.Clipboard11.jpg

.

والنتيجة:

411.Clipboard12.jpg

.

 

 

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

411.Clipboard13.jpg

 

سهله هاه :rol:

 

جعفر

 

411.Database11.accdb.zip

  • Like 4
قام بنشر
2 دقائق مضت, محمد سلامة said:

وهو في اسهل من كده ياشيخ.. دانت كانك بتشرح في المدرسة 

ربنا يباركلك استاذ جعفر

الله يسلمك اخوي محمد :rol:

 

اذا تلاحظ ، مافي كود في العملية كلها :rol:

في طريقة ثانية عن طريق الكود ، بس تحتاج نكتب في جدول مؤقت ، بحيث يأخذ التقرير بياناته من هذا الجدول المؤقت ، وانا اتفادى الجداول المؤقته ، لأنها تُكبّر من جحم البرنامج ، ويجب عليك الضغط والاصلاح لتصغير البرنامج :blink:

 

جعفر

  • Like 1
قام بنشر

السلام عليكم

اثابك الله على ماتقدمه دائما استاذ جعفر

الحقيقة لي تعليق لاخي جعفر : اعتقد انك تسرعت قليلا فخلينا نعيد القراءة مع تركيز قليلا ! فجرب ان تضيف مصابين اكثر لنفس البلاغ في جدول المصابين! هل سيتغير العدد ؟!!

ولي عودة بعد طلب وملاحظة للاخ السائل !

اخي محمود سعيد

مارايك ان هناك فكرة تعديل في البرنامج ( فكرة محلل ) وهي عبارة عن الاستغناء عن حقلي مصاب و وفيات في جدول balagh لانه يمكن اعرف العدد بوجود رقم البلاغ بجدولي المصابين والوفيات !؟

 

بالتوفيق

  • Like 1
قام بنشر (معدل)

السلام عليكم ورحمة الله وبركاته

مشكور جدا أستاذنا الكريم جعفر على هذا المجهود الرائع

أستاذي رمهان 

لا مانع من الغاء تلك الحقول 

عذرا أ . جعفر  حيث أني لم استطع القيام بهذا العمل في البرنامج الاصلي 

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

بالرابط أسفل

http://www.4shared.com/file/GO9-9Vfxce/Blagh.html

Blagh.html

حيث ان هذا اول عمل لي بالاكسس

 

تم تعديل بواسطه محمود_سعيد
قام بنشر
3 ساعات مضت, رمهان said:

السلام عليكم

1. اثابك الله على ماتقدمه دائما استاذ جعفر

2. الحقيقة لي تعليق لاخي جعفر : اعتقد انك تسرعت قليلا فخلينا نعيد القراءة مع تركيز قليلا ! فجرب ان تضيف مصابين اكثر لنفس البلاغ في جدول المصابين! هل سيتغير العدد ؟!!

ولي عودة بعد طلب وملاحظة للاخ السائل !

اخي محمود سعيد

3. مارايك ان هناك فكرة تعديل في البرنامج ( فكرة محلل ) وهي عبارة عن الاستغناء عن حقلي مصاب و وفيات في جدول balagh لانه يمكن اعرف العدد بوجود رقم البلاغ بجدولي المصابين والوفيات !؟

 

بالتوفيق

 

وعليكم السلام اخوي رمهان :rol:

 

1. حياك الله ، ولك مثل ما دعوت لي وزيادة ان شاء الله :rol:

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

3. لا تستطيع ان تستغني عن حقلي المصابين والوفيات في الجدول Blagh ، وذلك لأنه في حالات يوجد بلاغ ولا يوجد مصابين ولا وفيات ، ولا يوجد جدول مستقل لحالات البلاغ ، وقد عملت البرنامج على حساب هذين الحقلين في الجدول :rol:

 

شكرا على المتابعة :rol:

 

 

 

 

2 ساعات مضت, محمود_سعيد said:

السلام عليكم ورحمة الله وبركاته

مشكور جدا أستاذنا الكريم جعفر على هذا المجهود الرائع

أستاذي رمهان 

لا مانع من الغاء تلك الحقول 

عذرا أ . جعفر  حيث أني لم استطع القيام بهذا العمل في البرنامج الاصلي 

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

بالرابط أسفل

http://www.4shared.com/file/GO9-9Vfxce/Blagh.html

Blagh.html

حيث ان هذا اول عمل لي بالاكسس

 

 

وعليكم السلام اخي محمود :rol:

 

لوسمحت المرات الجاية ، لوسمحت لا تضع ملف تجريبي ، لأن العمل يصير مرتين :blink:

استعمل احد برامج الضغط مثل winzip او winrar ، وارفق ملفك في الموضوع ، فانا لا املك حساب في الموقع الذي رفعت فيه الملف.

 

جعفر

411.Database11.accdb.zip

  • Like 2
قام بنشر
4 ساعات مضت, محمود_سعيد said:

أستاذي رمهان 

لا مانع من الغاء تلك الحقول 

تفضل المرفق وهو بطريقة دوال المجال ! 

تم انشاء استعلامين query4 and query5  وشف المعادلات في التقرير ترا اغلبها نسخ ولصق وتغيير المعيار فقط

1 ساعه مضت, jjafferr said:

 

وعليكم السلام اخوي رمهان :rol:

3. لا تستطيع ان تستغني عن حقلي المصابين والوفيات في الجدول Blagh ، وذلك لأنه في حالات يوجد بلاغ ولا يوجد مصابين ولا وفيات ، ولا يوجد جدول مستقل لحالات البلاغ ، وقد عملت البرنامج على حساب هذين الحقلين في الجدول :rol:

والله شكلك لازم تستخدم البخور ووو !

فلما يوجد بلاغ وليس له حالات هذه طلعت اسهل من بين الاخريات !

شوف المرفق ولك اجمل التحايا

تحياتي

Database11.rar

  • Like 2
قام بنشر

السلام عليكم :rol:

 

في 7/22/2016 at 03:33, رمهان said:

فلما يوجد بلاغ وليس له حالات هذه طلعت اسهل من بين الاخريات !

 

نعم أخوي رمهان اللي تقوله يصير ، ولكني كنت اشير الى الطريقة التي عملت فيها برنامجي ، فبرنامجي معتمد عليه:

في 7/22/2016 at 01:21, jjafferr said:

3. لا تستطيع ان تستغني عن حقلي المصابين والوفيات في الجدول Blagh ، وذلك لأنه في حالات يوجد بلاغ ولا يوجد مصابين ولا وفيات ، ولا يوجد جدول مستقل لحالات البلاغ ، وقد عملت البرنامج على حساب هذين الحقلين في الجدول :rol:

 

وبالبرمجة ممكن عمل اي شئ :rol:

 

وانزلت برنامجك واتضح انك تستخدم دالة Dcount في التقرير ، وعملت مقارنة بين نتائجي ونتائجك ، بس الظاهر ان عندك خطأ في الجمع:

 

نتيجتي (بعد ان اخذت بيانات جداولك):

411.j-First.jpg

.

ونتيجتك:

411.R-First.jpg

 

ورجاء متابعة المشاركة التالية :rol:

 

 

جعفر

  • Like 1
قام بنشر

السلا عليكم :rol:

 

الموضوع هذا اصبح له حلّان:

حلّي انا بإستخدام الاستعلام الجدولي ولأكثر من مرة ،

وحل اخوي رمهان بإستخدام دالة Dcount في التقرير اكثر من مرة (اما موضوع النتائج الغير صحيحة كما اشرت اليها في مشاركتي السابقة ، فهو موضوع سهل حلّه على اخوي رمهان:rol:) .

 

السؤال الذي طرأ على بالي هو: اي الطريقتين هي الاسرع (على اساس ان الطريقتين تعطيان النتائج الصحيحة) ، وبذلك نقترح هذه الطريقة على الاخ محمود سعيد في برنامجه:rol:

 

لحساب السرعة ، يجب ان تكون الجداول كبيرة ، حتى يكون للمقارنة معنى ، لذلك عملت التالي:

1. عملت الفهرسة للحقول التي تحتاج فهرسة ،

2. جعلت عدد السجلات في الجداول كالتالي:

Blagh = 3,845,966  ، المصابين = 1,922,966 ، الوفيات = 1,538,373

3. بحيث اصبح حجم قاعدة البيانات حوالي 328MB

 

الموضوع اخذ مني يوم كامل ، والنتائج:

وطريقة احتساب الوقت الذي أخذه كل تقرير على حده هو:

t = Timer
	docmd.openreport ....
Time_Took = Timer - t

 

والنتيجة بالثوان:

j = جعفر ، R = رمهان

1-7-2016 to 7-7-2016
j = 109.8164
R = 132.0977

1-7-2016 to 15-7-2016
j = 230.1016
R = 187.8359

1-7-2016 to 30-7-2016
j = 335.2969
R = 239.1992

 

وهذه صور التقرير النهائي:

جعفر:

411.j-12.jpg

.

رمهان:

411.R-12.jpg

 

لهذا السبب ، فانا اقترح على الاخ محمود سعيد ان يستخدم طريقة الاخ رمهان (طبعا بعد ان يتم تصحيح النتائج بها) ، فهي الاسرع في الاداء :rol:

 

جعفر

  • Like 3
قام بنشر

جزاكم الله كل خير أخي  أ .جعفر و أ . رمهان على هذا المجهود الرائع

ولكن جربت الطريقتين داخل البرنامج وبنفس الضوابط ولكنهما لم يعملا معي

ولا أعرف السبب؟؟

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

لكي يعمل بشكل صحيح ومراجعة عامة البرنامج وتظبيطه وتقييمه

حيث انه اول برنامج لي على الاكسس

على الرابط

 http://www.4shared.com/file/GO9-9Vfxce/Blagh.html

او الرابط التالي

https://1drv.ms/u/s!AofOWjyR41R4hQHuCRPDux_rTCKV

Blagh.html

قام بنشر

السلام عليكم :rol:

 

أخي محمود ، للأسف الشديد ، لا برنامجي كان ينفع ولا برنامج أخي رمهان ، لأن برنامجك المرفق الجديد يختلف عن البرنامج السابق ، للأسف الشديد :blink:

ما ممكن نعمل تقرير للنتيجة ، لأن عدد الحقول غير معروف (نعم عندك 10 انواع بلاغ الآن ، ولكن قد يزيدوا لاحقا ، فلا يمكن عمل تقرير ثابت) !!

 

رجاء استخدم النموذج frm_Main ، ونتيجة الزر الآن تكون الجدول tbl_Output ، واللي يمكنك عمل ما تشاء به.

 

جعفر

411.Blagh_OK.accdb.zip

قام بنشر

السلام عليكم :rol:

 

تكملة للتجربة اعلاه ، وبعد وضع كود جديد في المشاركة الاخيرة ، وهذا الكود يعتمد على انشاء جدول مؤقت ، اضع لكم النتائج:

1-7-2016 to 30-7-2016
j = 335.2969
R = 239.1992
Transpose = 148.8281

 

والكود على هيئة دالة

Option Compare Database

Function transposer()
'http://www.access-programmers.co.uk/forums/showpost.php?p=907107&postcount=15
'Edited by jjafferr on 22-7-2016

    Dim db As DAO.Database
    Dim tdfNewDef As DAO.TableDef
    Dim fldNewField As DAO.Field
    Dim rstSource As DAO.Recordset
    Dim rstTarget As DAO.Recordset
    Dim i As Integer, j As Integer
    Dim strSource As String
    Dim strTarget As String
    Dim sqlcode As String
    
    Dim t_array() As Variant
    Dim t_no_of_rows As Integer
    Dim t_no_of_columns As Integer
    Dim s_no_of_rows As Integer
    Dim s_no_of_columns As Integer
    
    Dim T As Long
    
    On Error GoTo Transposer_Err
    
    'strSource = "tbl_input"
    strSource = "qry_blagh_2"
    strTarget = "tbl_output"
    
    Set db = CurrentDb()
    'Set rstSource = db.OpenRecordset("SELECT * FROM tbl_input ORDER BY sample_type", dbOpenDynaset)
    Set rstSource = db.OpenRecordset("SELECT * FROM " & strSource, dbOpenDynaset)
    rstSource.MoveLast

    t_no_of_rows = rstSource.Fields.count
    t_no_of_columns = rstSource.RecordCount + 1
    s_no_of_columns = rstSource.Fields.count
    s_no_of_rows = rstSource.RecordCount + 1

    DoCmd.SetWarnings False
    sqlcode = "DELETE tbl_output.* FROM tbl_output"
   DoCmd.RunSQL sqlcode
    DoCmd.SetWarnings True

    ReDim t_array(t_no_of_rows, t_no_of_columns)

    ' Fill the first field of the array with
    ' field names from the original table.
    For i = 0 To t_no_of_rows - 1
       t_array(i, 0) = rstSource.Fields(i).Name

    Next i
    
    rstSource.MoveFirst
    
    ' Fill each column of the array
    ' with a record from the original table.
    For j = 0 To t_no_of_rows - 1
        ' Begin with the second field, because the first field
        ' already contains the field names.
        For i = 1 To t_no_of_columns - 1
       '     Debug.Print i & " " & j
      
            t_array(j, i) = rstSource.Fields(j)
   
            rstSource.MoveNext
        Next i
        rstSource.MoveFirst
    Next j
    
    ' Fill the target table with fields from the array
    Set rstTarget = db.OpenRecordset(strTarget)
    For j = 0 To t_no_of_rows - 1
        rstTarget.AddNew
        T = 0
        For i = 0 To t_no_of_columns - 1
  
            'rstTarget.Fields(i) = t_array(j, i)
            rstTarget.Fields(i + 1) = t_array(j, i)
            
            'j
            If j > 0 And IsNumeric(t_array(j, i)) Then
                T = T + Val(t_array(j, i))
            End If
            
        Next i
        
        rstTarget!Totals = T
        rstTarget.Update
    Next j
    
    db.Close
    
    'MsgBox ("finished")
Exit Function

Transposer_Err:

   Select Case Err
      Case 3061
        'Too Few parameters, expect 2
        Set db = CurrentDb
        Set qdf = db.QueryDefs(strSource)

        For Each prm In qdf.Parameters
            prm.Value = Eval(prm.Name)
        Next prm

        Set rstSource = qdf.OpenRecordset(dbOpenDynaset)
        Resume Next
        
      Case 3010
         MsgBox "The table " & strTarget & " already exists."
      Case 3078
         MsgBox "The table " & strSource & " doesn't exist."
      Case Else
         MsgBox CStr(Err) & " " & Err.Description
   End Select

   Exit Function

End Function

 

اما الجدول المؤقت فهكذا شكله:

411.Transpose_tbl_Output.jpg

 

وهذه نتيجته

411.Transpose.jpg

 

 

جعفر

  • Like 2
قام بنشر (معدل)

وعليكم السلام ورحمة الله وبركاته
أستاذي الكريم الغالي : jjafferr
أليس بالإمكان أن تكون عناوين الأعمدة (عدد الوفيات - المصابين - البلاغات) لأنها الثوابت ... ونغير في اتجاه النص فقط
(بخلاف نوع المنشأة لأنها غير محصورة)

تم تعديل بواسطه Hosain21

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

زائر
اضف رد علي هذا الموضوع....

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • اضف...

Important Information