سؤال

أواجه بعض المتاعب في الحصول على التنسيق بشكل صحيح. أعتقد أنه ينبع مما ربما يكون فهمًا غير صحيح للأحداث التي أحاول إجراء التغييرات فيها.

أي اتجاه سيكون رائعا

    private void so_FetchData(object sender, FetchEventArgs eArgs)
    {
        if (m_so != null && m_so.Rows.Count > (m_soRowCount + 1))
        {
            DataRow soDr = m_so.Rows[m_soRowCount++];
            if (soDr != null)
            {
                var compResID = (int) soDr["CompResID"];
                var result = (ComplianceLevel) soDr["Result"];
                var sectNum = (int) soDr["JobSectType"];
                var sectName = soDr["S" + sectNum + "Name"] as string;
                var sectTxt = soDr["S" + sectNum + "Text"] as string;

                Fields["CompLev"].Value = (result == ComplianceLevel.OtherThanSerious) ? "Other Than Serious" : result.ToString();

                m_sectInfo = new SectInfo(sectName, sectTxt);
                m_causes = new Causes(compResID);
                m_actions = new Actions(compResID);
                subReport1.Report = m_sectInfo;
                subReport2.Report = m_causes;
                subReport3.Report = m_actions;
                eArgs.EOF = false;
            }
        }
        else
        {
            eArgs.EOF = true;
        }
    }

    private void eh_BeforePrint(object sender, EventArgs e)
    {
        //decide where the bottom border should be draw to
        if (m_actions != null && m_actions.ShouldShowBottBorder)
        {
            subReport3.Border.BottomStyle = BorderLineStyle.ThickSolid;
            subReport2.Border.BottomStyle = BorderLineStyle.Solid;
        }
        else if (m_causes != null && m_causes.ShouldShowBottBorder)
        {
            subReport2.Border.BottomStyle = BorderLineStyle.ThickSolid;
        }
        else
        {
            subReport1.Border.BottomStyle = BorderLineStyle.ThickSolid;
        }
    }

المشكلة هي أنه في كل مرة أتجول فيها طريقة EH_BEFORERT ، فإن القيم تعادل دائمًا خطأ على الرغم من أنني أتقدم عبر التقارير الفرعية ويتم تعيين القيم بشكل صحيح. ما الذي يحدث للتسبب في إعادة تعيين خاصية Bool إلى False؟

فقط تغييره إذا كان هناك أي سجلات لطباعتها في طريقة Fetch_data لكل تقرير فرعي.

    private void Causes_FetchData(object sender, FetchEventArgs eArgs)
    {
        if (m_pos < m_corrs.Count)
        {
            if (!ShouldShowBottBorder)
                ShouldShowBottBorder = true;
            //...
         } 
     }
هل كانت مفيدة؟

المحلول

لا يمكن أن تطمئن إلى أن حدث ما قبل الطباعة يرفع بالضبط بعد حدث FetchData المقابل. على سبيل المثال ، قد تطلق FetchData عدة مرات للحصول على عدة سجلات ، ولكن نظرًا لبعضها البعض من المنطق في محرك التخطيط ، قد يستغرق الأمر عدة سجلات قبل أن يعرف Activereports الصفحة التي ستلتزم بها قسمًا. لذلك ، من الشائع جدًا أن يتم رفع FetchData لعدة أحداث قبل رفع أحداث الطباعة المقابلة.

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

التعليق هنا مع بعض المعلومات الإضافية إذا كان لديك أسئلة محددة حول القيام بذلك.

في ملاحظة غير ذات صلة ، يمكنك الحصول على دفعة كبيرة في الأداء إذا قمت بتغيير الطريقة التي تهيئ بها التقارير الفرعية. قم دائمًا بتهيئة التقارير الفرعية الخاصة بك في حدث التقرير ، ثم قم بتعيين بياناتهم بتنسيق الحدث للقسم الذي يحتوي على عنصر تحكم التقريب الفرعي. وبهذه الطريقة ، تقوم بتهيئة كل التقديم الفرعي مرة واحدة بدلاً من تهيئة كل سفر لكل سجل. فمثلا:

private void so_ReportStart()
{
    subreport1.Report = new SectInfo();
    subreport2.Report = new Causes();
    subreport3.Report = new Actions();
}
private void Detail_Format()
{ // assuming Detail is the section containing your subreports:

    ((SectInfo)subreport1.Report).SetParameters(Fields["sectName"].Value, Fields["sectTxt"].Value);
    ((Causes)subreport2.Report).SetParameters(Fields["compResID"].Value);
    ((Actions)subreport3.Report).SetParameters(Fields["compResID"].Value);
}

يمكنك إعداد قيم "الحقول" في FetchData مماثلة لكيفية تهيئة التقارير الفرعية الآن. شيء مثل ما يلي:

private void so_FetchData(object sender, FetchEventArgs eArgs)
{
    if (m_so != null && m_so.Rows.Count > (m_soRowCount + 1))
    {
        DataRow soDr = m_so.Rows[m_soRowCount++];
        if (soDr != null)
        {
            var compResID = (int) soDr["CompResID"];
            var result = (ComplianceLevel) soDr["Result"];
            var sectNum = (int) soDr["JobSectType"];
            var sectName = soDr["S" + sectNum + "Name"] as string;
            var sectTxt = soDr["S" + sectNum + "Text"] as string;

            Fields["CompLev"].Value = (result == ComplianceLevel.OtherThanSerious) ? "Other Than Serious" : result.ToString();
            /** BEGIN NEW CODE **/
            Fields["sectName"].Value = sectName;
            Fields["sectTxt"].Value = sectTxt;
            Fields["compResID"].Value = compResId;
            /** END NEW CODE **/

            /** OLD CODE:
            m_sectInfo = new SectInfo(sectName, sectTxt);
            m_causes = new Causes(compResID);
            m_actions = new Actions(compResID);
            subReport1.Report = m_sectInfo;
            subReport2.Report = m_causes;
            subReport3.Report = m_actions;
            **/     
            eArgs.EOF = false;
        }
    }
    else
    {
        eArgs.EOF = true;
    }
}

لمعرفة المزيد حول الأحداث في Activereports انظر موضوع أحداث المفاهيم موضوع في Activereports على الإنترنت مساعدة. لمعرفة المزيد حول تمرير البيانات إلى نقاط فرعية انظر الإبلاغ الفرعي مع مصادر بيانات وقت التشغيل في مساعدة Activereports عبر الإنترنت.

Scott Willeke
GrapeCity inc.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top