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






2.67/5 (2投票s)
Les Cardwell 演示了如何使用最新的代码生成技术 Iron Speed Designer 构建复式记账应用程序。
![]() |
您必须验证用户是否输入了等量的借方和贷方,以确保所有条目都记录了资金流入和流出每个帐户的情况。 - Les Cardwell,White Box, Inc. 总裁 2007 年 2 月 12 日 Iron Speed Designer V4.X |
Iron Speed Designer 应用程序中的复式记账法
在复式记账应用程序中,无论它们是应收账款、应付账款、普通日记账还是十几个分类账中的任何一个,都有一些业务规则适用于所有分类账。 最重要的是验证用户是否输入了等量的借方和贷方,以确保所有条目都记录了资金流入和流出每个帐户的情况。 理想情况下,这应在运行时的数据输入期间完成,然后才能实际保存记录。 如果能够实现,则无需运行报告来查找未过帐的条目、不平衡的条目,甚至无需在会计期末运行试算平衡表(假设),因为我们已强制执行约束以在输入点解决这些潜在的数据正确性错误。
这是通过覆盖 <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
我们还希望帮助用户确定条目中还剩多少需要分配的金额,因为当我们在执行数据输入功能时必须手动或使用辅助工具跟踪净额时,长的条目会变得令人困惑和疲惫。 理想情况下,这在用户界面屏幕中处理,允许用户优雅地适应变化的信息,并在输入的数据可能不正确时通知他们。 在这种情况下,我们会在分发表条目屏幕中显示要分配的金额,最自然地位于金额列的底部,如下面的屏幕截图所示……
这是通过覆盖 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
请注意,目前存在一个问题,该问题阻止将“金额”列显示为“货币”($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 的信息:在您的 Iron Speed Designer 应用程序中集成帮助。