65.9K
CodeProject 正在变化。 阅读更多。
Home

Iron Speed Designer 应用程序中的复式记账法

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.67/5 (2投票s)

2008年11月4日

CPOL

3分钟阅读

viewsIcon

35480

Les Cardwell 演示了如何使用最新的代码生成技术 Iron Speed Designer 构建复式记账应用程序。

在此处试用 Iron Speed Designer.

CustomerProfileLesCardwell.gif

您必须验证用户是否输入了等量的借方和贷方,以确保所有条目都记录了资金流入和流出每个帐户的情况。
- Les Cardwell,White Box, Inc. 总裁

2007 年 2 月 12 日
Iron Speed Designer V4.X

Iron Speed Designer 应用程序中的复式记账法

在复式记账应用程序中,无论它们是应收账款、应付账款、普通日记账还是十几个分类账中的任何一个,都有一些业务规则适用于所有分类账。 最重要的是验证用户是否输入了等量的借方和贷方,以确保所有条目都记录了资金流入和流出每个帐户的情况。 理想情况下,这应在运行时的数据输入期间完成,然后才能实际保存记录。 如果能够实现,则无需运行报告来查找未过帐的条目、不平衡的条目,甚至无需在会计期末运行试算平衡表(假设),因为我们已强制执行约束以在输入点解决这些潜在的数据正确性错误。

在此处试用 Iron Speed Designer.

Figure1.jpg

验证不平衡的交易。

这是通过覆盖 <form>TableControl: Base<subform>TableControl 类(位于可定制区域中的)的 SaveData() 方法来实现的,该类位于

.NET Framework 1.1

...\<Table Folder>\Add<Table Name>Page.aspx.cs or .vb

.NET Framework 2.0 / 3.0

...\App_Code\<Table Folder>\Add<Table Name>Page.Controls.cs or .vb

覆盖方法本身只是循环遍历子表单数组,合计值,然后允许保存记录,或者抛出一个异常,用上述消息提醒用户。

C#

public class GJDistributionsTableControl : BaseGJDistributionsTableControl
{

    public override void SaveData()
    {
        decimal amountToDistribute = 0;
        GJDistributionsTableControlRow[] oTable = this.GetRecordControls();
        DbUtils.StartTransaction();
        foreach (GJDistributionsTableControlRow oRow in oTable)
        {
            amountToDistribute = amountToDistribute + Convert.ToDecimal(oRow.Amount.Text);
        }

        if (amountToDistribute.Equals(0))
        {
            DbUtils.CommitTransaction();
            base.SaveData();
        }
        else
        {
            throw new Exception("Distribution Amounts are not equal.");
        }
    }

Visual Basic .NET

Public Class GJDistributionsTableControl
    Inherits BaseGJDistributionsTableControl
 
    Public Overrides Sub SaveData()
        Dim amountToDistribute As Decimal = 0
        Dim oTable As GJDistributionsTableControlRow() = Me.GetRecordControls()
        DbUtils.StartTransaction()
        Dim oRow As GJDistributionsTableControlRow
        For Each oRow In oTable
           amountToDistribute = amountToDistribute + Convert.ToDecimal(oRow.Amount.Text)
        Next oRow
 
        If amountToDistribute.Equals(0) Then
           DbUtils.CommitTransaction()
           MyBase.SaveData()
        Else
           Throw New Exception("Distribution Amounts are not equal.")
        End If
    End Sub 'SaveData
End Class 'GJDistributionsTableControl

在此处试用 Iron Speed Designer.

我们还希望帮助用户确定条目中还剩多少需要分配的金额,因为当我们在执行数据输入功能时必须手动或使用辅助工具跟踪净额时,长的条目会变得令人困惑和疲惫。 理想情况下,这在用户界面屏幕中处理,允许用户优雅地适应变化的信息,并在输入的数据可能不正确时通知他们。 在这种情况下,我们会在分发表条目屏幕中显示要分配的金额,最自然地位于金额列的底部,如下面的屏幕截图所示……

Figure2.JPG

使用动态更新简化用户输入过程。

这是通过覆盖 AddButton_Click() 方法来实现的,该方法也位于 TableControl 类的可定制区域中,该类位于

.NET Framework 1.1

...\<Table Folder>\Add<Table Name>Page.aspx.cs or .vb

.NET Framework 2.0 / 3.0

...\App_Code\<Table Folder>\Add<Table Name>Page.Controls.cs or .vb

此点击处理程序使用相同的方法来聚合输入的金额。

C#

public override void GJDistributionsAddButton_Click(object sender, EventArgs args)
{
    try
    {
        DbUtils.StartTransaction();

        decimal amountGrandTotal = 0.00m;
        GJDistributionsTableControlRow[] oTable2 = this.GetRecordControls();
        foreach (GJDistributionsTableControlRow oRow2 in oTable2)
        {
            amountGrandTotal = amountGrandTotal + 
                Convert.ToDecimal(oRow2.Amount.Text);
        }

        if (amountGrandTotal.Equals(0))
        {
            ((Label)(this.Page.FindControl("AmountGrandTotal"))).Text = "0.00";
        }
        else
        {
            ((Label)(this.Page.FindControl("AmountGrandTotal"))).Text = 
                Convert.ToString(amountGrandTotal);
        }

        this.AddNewRecord = 1;
        this.DataChanged = true;
        this.Page.CommitTransaction(sender);
    }
    catch (Exception ex)
    {
        this.Page.RollBackTransaction(sender);

        BaseClasses.Utils.MiscUtils.RegisterJScriptAlert(this, "BUTTON_CLICK_MESSAGE",
            ex.Message);
        this.Page.ErrorOnPage = true;
    }
    finally
    {
        DbUtils.EndTransaction();
    }
}

Visual Basic .NET

Public Overrides Sub GJDistributionsAddButton_Click(sender As Object, args As EventArgs)
    Try
        DbUtils.StartTransaction()
 
        Dim amountGrandTotal As Decimal = 0D
        Dim oTable2 As GJDistributionsTableControlRow() = Me.GetRecordControls()
        Dim oRow2 As GJDistributionsTableControlRow
        For Each oRow2 In oTable2
           amountGrandTotal = amountGrandTotal + Convert.ToDecimal(oRow2.Amount.Text)
        Next oRow2
 
        If amountGrandTotal.Equals(0) Then
           CType(Me.Page.FindControl("AmountGrandTotal"), Label).Text = "0.00"
        Else
           CType(Me.Page.FindControl("AmountGrandTotal"), Label).Text =
           Convert.ToString(amountGrandTotal)
        End If
 
        Me.AddNewRecord = 1
        Me.DataChanged = True
        Me.Page.CommitTransaction(sender)
    Catch ex As Exception
        Me.Page.RollBackTransaction(sender)
 
        BaseClasses.Utils.MiscUtils.RegisterJScriptAlert(Me, "BUTTON_CLICK_MESSAGE",
        ex.Message)
        Me.Page.ErrorOnPage = True
    Finally
        DbUtils.EndTransaction()
    End Try
End Sub 'GJDistributionsAddButton_Click

在此处试用 Iron Speed Designer.

请注意,目前存在一个问题,该问题阻止将“金额”列显示为“货币”($100.00),并且在执行时会创建字符串转换错误,因此必须在 Iron Speed Designer 的“金额属性”显示属性中将格式更改为自定义格式 0.00。

如果我们要更进一步,我们可以通过将反向值保存到“AddButton_Click”方法中的会话变量来为用户自动输入 AmountToDistribute (* -1) ……

    amountGrandTotal = amountGrandTotal * -1;
    System.Web.HttpContext.Current.Session["strAmountGrandTotal"] = Convert.ToString(
        amountGrandTotal);

……以便整个类变成……

C#

public override void GJDistributionsAddButton_Click(object sender, EventArgs args)
{
    try
    {
        DbUtils.StartTransaction();

        decimal amountGrandTotal = 0.00m;
        GJDistributionsTableControlRow[] oTable2 = this.GetRecordControls();
        foreach (GJDistributionsTableControlRow oRow2 in oTable2)
        {
            amountGrandTotal = amountGrandTotal +
                Convert.ToDecimal(oRow2.Amount.Text);
        }

        if (amountGrandTotal.Equals(0))
        {
            ((Label)(this.Page.FindControl("AmountGrandTotal"))).Text = "0.00";
        }
        else
        {
            ((Label)(this.Page.FindControl("AmountGrandTotal"))).Text = 
                Convert.ToString(amountGrandTotal);
        }

        amountGrandTotal = amountGrandTotal * -1;
        System.Web.HttpContext.Current.Session["strAmountGrandTotal"] = 
            Convert.ToString(amountGrandTotal);

        this.AddNewRecord = 1;
        this.DataChanged = true;
        this.Page.CommitTransaction(sender);
    }
    catch (Exception ex)
    {
        this.Page.RollBackTransaction(sender);

        BaseClasses.Utils.MiscUtils.RegisterJScriptAlert(this, "BUTTON_CLICK_MESSAGE",
            ex.Message);
        this.Page.ErrorOnPage = true;
    }
    finally
    {
        DbUtils.EndTransaction();
    }
}

Visual Basic .NET

Public Overrides Sub GJDistributionsAddButton_Click(sender As Object, args As EventArgs)
    Try
        DbUtils.StartTransaction()
 
        Dim amountGrandTotal As Decimal = 0D
        Dim oTable2 As GJDistributionsTableControlRow() = Me.GetRecordControls()
        Dim oRow2 As GJDistributionsTableControlRow
        For Each oRow2 In oTable2
           amountGrandTotal = amountGrandTotal + Convert.ToDecimal(oRow2.Amount.Text)
        Next oRow2
 
        If amountGrandTotal.Equals(0) Then
           CType(Me.Page.FindControl("AmountGrandTotal"), Label).Text = "0.00"
        Else
           CType(Me.Page.FindControl("AmountGrandTotal"), Label).Text =
           Convert.ToString(amountGrandTotal)
        End If
 
              amountGrandTotal = amountGrandTotal * -1;
              Me.Page.Session["strAmountGrandTotal"] = Convert.ToString(amountGrandTotal);
 
        Me.AddNewRecord = 1
        Me.DataChanged = True
        Me.Page.CommitTransaction(sender)
    Catch ex As Exception
        Me.Page.RollBackTransaction(sender)
 
        BaseClasses.Utils.MiscUtils.RegisterJScriptAlert(Me, "BUTTON_CLICK_MESSAGE",
        ex.Message)
        Me.Page.ErrorOnPage = True
    Finally
        DbUtils.EndTransaction()
    End Try
End Sub 'GJDistributionsAddButton_Click

……并向‘public class ARDistributionsTableControlRow : BaseARDistributionsTableControlRow’类添加一个 PreRender 事件……

C#

public class ARDistributionsTableControlRow : BaseARDistributionsTableControlRow
{
    protected override void OnPreRender(System.EventArgs e)
    {
        if (System.Web.HttpContext.Current.Session["strAmountGrandTotal"] != null)
        {
            this.Amount1.Text = (string)System.Web.HttpContext.Current.Session
                ["strAmountGrandTotal"];

            System.Web.HttpContext.Current.Session["strAmountGrandTotal"] = null;
        }
        base.OnPreRender(e);
    }
}

Visual Basic .NET

Protected Overrides Sub OnPreRender(e As System.EventArgs)
    If Not (System.Web.HttpContext.Current.Session("strAmountGrandTotal") Is Nothing) Then
        Me.Amount1.Text = CStr(System.Web.HttpContext.Current.Session
           ("strAmountGrandTotal"))
           'this.Container.SelectedValue = (string)System.Web.HttpContext.Current.Session
           ["strContainer"];
           System.Web.HttpContext.Current.Session("strAmountGrandTotal") = Nothing
        End If
    MyBase.OnPreRender(e)
End Sub 'OnPreRender

在此处试用 Iron Speed Designer.

当我们单击“添加”按钮时,它不仅会在页面底部给出要分配的金额,还会将该金额自动插入到下一个行项目中,以进一步增强最终用户的体验。

Figure3.JPG

单击“添加”按钮会自动将金额插入到下一个行项目中。

在此处试用 Iron Speed Designer.

阅读更多关于 Iron Speed 的信息:在您的 Iron Speed Designer 应用程序中集成帮助

© . All rights reserved.