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

AccountPlus

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.47/5 (58投票s)

2008年2月4日

LGPL3

20分钟阅读

viewsIcon

274296

downloadIcon

62052

完整的账户管理系统

AccountPlus.JPG

条款与条件

AccountPlus 是一款用于账户/费用分摊的开源软件。AccountPlus 的用户可以按照自己的方式使用该应用程序。如果用户在任何阶段想要对应用程序进行修改/增强,他/她都可以自由进行。作者非常欢迎任何建议/疑问。如有任何疑问,请发送邮件,主题行请注明“AccountPlus”。

目录

1. AccountPlus 概述
1.1 简介
1.2 用户角色及其权限
2. AccountPlus 设计概述
3. AccountPlus 框图
4. 设计与源代码详情
5. AccountPlus 安装
5.1 AccountPlus 先决条件
5.2 安装
6. 如何更改 AccountPlus 数据库
7. 使用 AccountPlus
1. 登录
2. 用户管理
2.1 创建新用户
2.2 搜索用户
2.3 编辑用户信息
2.4 停用用户
2.5 激活用户
3. 项目管理
3.1 创建新项目
3.2 搜索项目
3.3 编辑项目详情
4. 费用管理
4.1 添加新费用
4.2 编辑费用详情
4.3 删除费用
5. 报告
报告是 AccountPlus 最激动人心的部分。AccountPlus 主要有三种报告
5.1 费用报告
5.2 月度报告
5.3 分析报告
6. 费用结算
如何结算费用?
7. 编辑用户资料
如何更改密码?
8. 数据库信息
9. 系统诊断
10. 版本信息
11. 报告错误或联系作者

1. AccountPlus 概述

1.1 简介

技术详情

AccountPlus 使用 Microsoft .NET 技术开发。它使用 C# 作为编码语言。AccountPlus 专门为初学者和中级程序员设计和共享,以便他们理解、设计和实现整个 SDLC(软件开发生命周期)。它还可能有助于理解:

  • 支持多种数据库的数据访问层实现
  • 使用 log4Net 进行全局日志记录/跟踪
  • 更好地使用 .NET Winform 控件
  • 全球化和本地化
  • 任何应用程序的组件化。
  • XML 的使用
  • 设计模式(用于数据访问层)

功能概述

AccountPlus 是一款可用于共享账户/费用管理并提供适当报告和一般分析的应用程序。

为了证明 AccountPlus 的重要性,我们应该将传统的账户管理系统(纸质账户管理)与 AccountPlus 的功能进行比较。

纸质账户管理: 很多时候,多人会分摊日常开支。为了管理所有这些账户,我们通常使用纸质记录来跟踪所有个人开支。

纸质账户管理系统的缺点

  • 月底,需要进行繁琐的计算才能找出谁花费了什么,以及某人应该支付或从他人那里获得了多少金额。
  • 纸质账户管理系统的另一个主要缺点是,我们无法分析哪些项目的开支正在增加,以便我们可以控制这些开支。
  • 纸质账户管理系统存在一些安全漏洞,例如,某人可以非常轻易地更改其他人输入的开支。

像这样,纸质账户管理有很多缺点。但是借助 AccountPlus,我们随时都能够分析开支并进行适当的分析,以便在完全安全的情况下更好地控制开支。

1.2 用户角色及其权限

AccountPlus 有两种用户角色:

  1. 管理员:管理员是应用程序的超级用户,主要负责:
    1. 创建/修改用户详情以访问系统。
    2. 结算费用。
  2. 普通用户:普通用户是经常访问系统的用户。普通用户负责:
    1. 添加/更新/删除费用。(用户不能编辑或删除其他用户的费用)
    2. 生成和分析费用。

2. AccountPlus 设计概述

AccountPlus 应用程序主要分为三层:

  1. 用户界面层

    AccountPlus 的用户界面层包含所有表单和基类,为用户界面提供样式。应用程序的用户界面与业务层交互,很少与数据访问层交互,以完成用户发出的请求或业务操作。此外,该层经常与 AccountPlus 的消息组件交互,以便在用户界面上显示消息。

  2. 业务层

    业务层是应用程序的核心部分。该组件包含应用程序使用的所有业务逻辑。该组件经常与数据访问层交互,以向 AccountPlus 数据库写入或读取数据。

  3. 数据访问层

    数据访问层是应用程序最重要的组件之一。这是一个独立的组件。该层使应用程序能够以高效的方式与 AccountPlus 数据库交互。数据访问层独立于数据库,即它可能支持所有类型的数据库,例如 MS Access、Excel、SQL Server、MySql、Oracle 等。该组件也可以用于任何其他应用程序。

注意:当前数据访问层组件不支持显式事务管理。正在开发中。

此外,它还有三个更小的组件用于消息传递、配置和格式化。以下是这些组件的详细信息:

消息传递

此组件用于使应用程序在实现全球化和本地化方面具有可扩展性。当前版本主要将此组件用作消息存储库。这有助于应用程序从单个位置管理各种应用程序。它将应用程序保存在资源文件中。

配置

此组件用于读取应用程序级别配置,即存储在 App.config 文件中的配置详细信息。

格式化

此组件负责格式化应用程序使用的各种数据类型。

3. AccountPlus 框图

以下是 AccountPlus 各个组件的方框图表示:

  • AccountPlus 业务层的 Logger 类使应用程序能够进行全局错误/异常日志记录和事件跟踪。
  • 业务层的 DataSecurity 类帮助应用程序进行敏感数据的加密和解密

4. 设计与源代码详情

由于它是一个完整的应用程序,因此很难解释每个组件,所以我将主要解释可重用组件。

4.1 如何查看/调试源代码?

按照以下步骤查看/调试 AccountPlus 源代码

  • 从下载的文件中搜索 AccountPlusSource.zip 文件并解压缩。
  • 找到 AccountPlus.sln 文件并双击打开。
  • 确保所有引用都存在。
  • 将 AccountPlus.mdb 文件复制到适当的位置,例如 X:\AccountPlusDatabase\AccountPlus.mdb,其中 X 是您的本地驱动器。修改 app.config 文件的 ConnectionStrings 部分中 MSAccessCon 键的连接字符串,将其指向您的 AccountPlus.mdb 文件路径。
<add name="MSAccessCon" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=X:\ AccountPlusDatabase\AccountPlus.mdb;Jet
OLEDB:Database Password=admin;" providerName="MSACCESS" />

注意

  • 有关数据库配置的更多详细信息,请参阅第 6 点。
  • AccountPlus 使用 log4net 进行日志记录/跟踪。如果 AccountPlus.BusinessLogic 组件中缺少对 log4net 的引用,请从 AccountPlusSource 目录的 Assemblies 目录中引用。
  • AccountPlus.DataAccess 组件使用 MySql.Data 库连接 MySql 数据库。MySql.Data 库是 MySql Connector for .NET 的一部分。如果 MySql.Data 库引用缺失,您可以从以下 URL 下载:

https://dev.mysqlserver.cn/downloads/connector/net/6.1.html

4.2 异常处理

异常处理是开发任何软件/应用程序时的一个重要方面。AccountPlus 将发生的异常显示给用户,并借助 log4Net 将异常记录到日志文件中。

以下是显示应用程序遇到的任何未处理异常的屏幕。此屏幕仅从一个地方获取,即一处异常处理。

上述异常处理逻辑在 AccountPlus.UserInterface 的 Program 类中实现。Program 类是 Visual Studio 自动生成的类。Program 类包含 Main() 方法,它是应用程序的入口点。

为了实现上述类型的异常处理,请遵循以下步骤:

  1. 添加 ThreadExceptionEventHandler 以监视应用程序中发生的所有线程异常
    Application.ThreadException
    += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
  2. 实现 Application_ThreadException 方法,该方法将包含记录错误和显示错误屏幕的逻辑。(请参阅 Program.cs 类中的实际实现)

4.3 借助 log4net 记录异常

AccountPlus 使用开源库 log4Net 将异常或错误记录到日志文件中。AccountPlus.BusinessLogic 的 Logger.cs 类实现了将信息记录到日志文件中的必要方法。

请按照以下步骤记录异常:

  1. 向 app.config 文件的 configSections 中添加一个新节 log4net
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,
    log4net" />
  2. 添加 log4net 的配置详情
    <log4net debug="true">
        <appender name="RollingLogFileAppender" 
            type="log4net.Appender.RollingFileAppender">
          <appendToFile value="true" />
          <rollingStyle value="Size" />
          <maxSizeRollBackups value="10" />
          <maximumFileSize value="2MB" />
          <staticLogFileName value="true" />
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern 
                value="%nDate:%d System User:%W%nClass Name:%C Method Name:
                %l Line Number:%L%nDev Message:%m%n%n" />
          </layout>
        </appender>
        <root>
          <level value="INFO" />
          <appender-ref ref="RollingLogFileAppender" />
        </root>
      </log4net>
  3. 通过实现以上几点(a 和 b),我们现在能够借助 log4net 库实现日志记录。
    • AccountPlus 具有灵活性,可以将异常记录到每个日期的单独文件中,或者将所有异常记录到一个文件中。此功能由 app.config 文件的 appSettings 部分中的键“dateWiseLogTrace”控制。

      示例

      <add key="dateWiseLogTrace" value="true" />

      value="true" 表示为每个日期记录到单独的文件中,例如 07-JUL-2009.txt

      value="false" 表示记录到单个文件中,即 (Log.txt 或 Trace.txt)

    • Logger.cs 类的 WriteLog 方法将异常写入日志文件。此方法遵循以下步骤将异常记录到日志文件中:
      1. 读取 app.config 文件的键“logging”以检查是否需要记录异常。
      2. 获取适当的文件名(每个日期一个文件或单个文件),例如 07-JUL-2007.txt 或 Log.txt
      3. 为需要写入日志的文件创建一个文件追加器。
      4. 创建记录器实例
        log = LogManager.GetLogger(APPENDER_NAME);
      5. 写入日志文件。
        log.Info(traceInfo);

注意:有关详细的实现细节,请参阅 AccountPlus.BusinessLogic 组件的 Logger.cs 类。

4.4 全球化与本地化

事实上,AccountPlus 并非真正意义上实现了全球化和本地化概念,但全球化/本地化概念已在应用程序的 AccountPlus.Messaging 组件中实现。此组件包含一个资源文件 MessageResource.resx,此文件包含显示给用户界面的所有消息。以这种方式管理消息提供了从一个地方更改文本的灵活性,而无需更改用户界面或业务逻辑。目前尚未为应用程序设置任何区域性,但在将来我们可以很容易地包含特定于区域性的消息。

请参考以下几点以了解消息如何存储或从资源文件中检索:

  1. 消息以每个消息的唯一键值存储在资源文件中。
  2. 消息组件的 MessageManager 类包含所有从资源文件中读取消息的逻辑。GetMessage、DisplayMessage 及其各种重载负责获取和格式化消息。
    public static string GetMessage(string messageNo, bool includeNo)
            {
                string message = string.Empty;
                message = ResourceManager.GetString("MSG" + messageNo, Culture);
                message = includeNo ? "[" + messageNo + "] " + message : message;
                return message;
            }

注意:有关详细的实现细节,请参阅 AccountPlus.Messaging 组件的 MessageManager.cs 类。

4.5 数据安全

AccountPlus 通过将数据加密为特定格式来将所有凭据存储在数据库中。AccountPlus.BusinessLogic 组件的 DataSecurity 类负责数据的加密/解密。

DataSecurity 类公开了两个公共方法 Encrypt 和 Decrypt,用于加密或解密字符串。

static byte[] bytes = ASCIIEncoding.ASCII.GetBytes("AccountPlus");
        /// <summary>
        /// Encrypt normal string.
        /// </summary>
        /// <param name="originalString">String to be encrypted.</param>
        /// <returns>Encrypted string</returns>
public string Encrypt(string originalString)
        {
            if (String.IsNullOrEmpty(originalString))           
                return string.Empty;
           
            DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
            MemoryStream memoryStream = new MemoryStream();
            CryptoStream cryptoStream = new CryptoStream(memoryStream,
                cryptoProvider.CreateEncryptor(bytes, bytes), CryptoStreamMode.Write);
            StreamWriter writer = new StreamWriter(cryptoStream);
            writer.Write(originalString);
            writer.Flush();
            cryptoStream.FlushFinalBlock();
            writer.Flush();
            return Convert.ToBase64String(memoryStream.GetBuffer(), 0,
                (int)memoryStream.Length);
        }
 
        /// <summary>
        /// Decrypt encrypted string to the normal string
        /// </summary>
        /// <param name="cryptedString">Decrypted string</param>
        /// <returns>Normal (Decrypted) string</returns>
        public string Decrypt(string cryptedString)
        {
            if (String.IsNullOrEmpty(cryptedString))
            {
                throw new ArgumentNullException
                   ("The string which needs to be decrypted can not be null.");
            }
            DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
            MemoryStream memoryStream = new MemoryStream
                    (Convert.FromBase64String(cryptedString));
            CryptoStream cryptoStream = new CryptoStream(memoryStream,
                cryptoProvider.CreateDecryptor(bytes, bytes), CryptoStreamMode.Read);
            StreamReader reader = new StreamReader(cryptoStream);
            return reader.ReadToEnd();
        }

4.6 XML 操作

AccountPlus 将一些用户偏好设置存储到 XML 文件中,即 Preferences.xml,该文件通常存在于应用程序的根目录中。AccountPlus.BusinessLogic 组件的 Preferences 类负责读取或写入用户偏好设置数据。此类(Preferences.cs)内部使用 XmlHelper 类,该类负责获取或设置 Preferences.xml 文件中的数据。

以下是 Preferences.xml 的模式

XmlHelper 类主要公开了两个方法来获取或设置任何特定用户偏好设置的数据。

public class XMLHelper
{
    private XmlDocument xmlDocument = null;
    public XMLHelper()
    {
        xmlDocument = GetXMLDoc();
    }

    /// <summary>
    /// Reads the value of passed node name
    /// </summary>
    /// <param name="itemName">Node name for which vale needs to be read</param>
    /// <returns>Value of the node</returns>
    public string GetValue(string itemName)
    {
        string value = string.Empty;
        XmlNodeList nodes = xmlDocument.DocumentElement.ChildNodes;

        foreach (XmlNode node in nodes)
        {
            if (node.Attributes["name"].Value.Trim().ToLower() == 
                itemName.Trim().ToLower())
            {
                value = node.Attributes["value"].Value.Trim();
                break;
            }
        }

        return value;
    }

    /// <summary>
    /// Saves the value for the passed xml node into Preference.xml file
    /// </summary>
    /// <param name="itemName">XML Node name</param>
    /// <param name="value">value to be saved</param>
    public void SetValue(string itemName, string value)
    {
        XmlNodeList nodes = xmlDocument.DocumentElement.ChildNodes;
        foreach (XmlNode node in nodes)
        {
            if (node.Attributes["name"].Value.Trim().ToLower() ==
                itemName.Trim().ToLower())
            {
                node.Attributes["value"].Value = value.Trim();
                break;
            }
        }
        xmlDocument.Save(FileName);
    }

    /// <summary>
    /// Saves the modifications done into the XML Document.
    /// </summary>
    public void Save()
    {
        xmlDocument.Save(FileName);
        xmlDocument = GetXMLDoc();
    }

    /// <summary>
    /// Loads XML document for reading or writing purpose.
    /// </summary>
    public XmlDocument GetXMLDoc()
    {
        XmlDocument xmlDoc = new XmlDocument();
        try
        {
            xmlDoc.Load(FileName);
        }
        catch (Exception ex)
        {
            throw ex;
        }

        return xmlDoc;
    }
    /// <summary>
    /// Gets the User Preference file name.
    /// </summary>
    private string FileName
    {
        get { return Application.StartupPath + "\\Preferences.xml"; }
    }
}

4.7 数据访问

数据访问层,即 AccountPlus 的 AccountPlus.DataAccess 组件可能是最受欢迎的可重用组件。无需任何修改,该组件可用于读取或写入任何数据库的数据(已针对 MS Access、SQL Server 和 MySQL 进行测试)。当前版本的数据访问层不支持事务,将很快实现。

以下是数据访问层包含的各种类文件:

AccountPlus 数据访问层如何支持多种数据库?

对多种数据库的支持是通过 .NET Framework 的 System.Data 库公开的各种接口 IDbConnection、IDbCommand、IDataParameter、IDataAdapter 等实现的。

我们将通过查看数据访问层 ExecuteScalar 方法的实现来理解它是如何工作的。

/// <summary>
/// Executes the Sql Command or Stored Procedure and returns result.
/// </summary>
/// <param name="commandText">Sql Command or Stored Procedure name</param>
/// <param name="commandType">Type of command (i.e. Sql Command/ 
///              Stored Procedure name/ Table Direct)</param>
/// <returns>A single value. (First row's first cell value, if more than one
///          row and column is returned.)</returns>

public object ExecuteScalar(string commandText, CommandType commandType)
{
    object objScalar = null;           
    IDbConnection connection = _connectionManager.GetConnection();
    IDbCommand command = _commandBuilder.GetCommand(commandText, connection, commandType);

    try
    {
        objScalar = command.ExecuteScalar();
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally
    {
        if (connection != null)
        {
            connection.Close();
            connection.Dispose();
        }

        if (command != null)
            command.Dispose();
    }
    return objScalar;
}

请看 ExecuteScalar 方法中用于获取数据库连接的代码行:

IDbConnection connection =
_connectionManager.GetConnection();

在这里,我们使用 ConnectionManager 类的 GetConnection 方法来获取与数据库的开放连接。

/// <summary>
/// Establish Connection to the database and Return an open connection.
/// </summary>
/// <returns>Open connection to the database</returns>
internal IDbConnection GetConnection()
{
    IDbConnection connection = null;
    string connectionString = Configuration.ConnectionString;
    switch (Configuration.DBProvider.Trim().ToUpper())
    {
    case Common.SQL_SERVER_DB_PROVIDER:
        connection = new SqlConnection(connectionString);
        break;
    case Common.MY_SQL_DB_PROVIDER:
        connection = new MySqlConnection(connectionString);
        break;
    case Common.ORACLE_DB_PROVIDER:
        connection = new OracleConnection(connectionString);
        break;
    case Common.EXCESS_DB_PROVIDER:
        connection = new OleDbConnection(connectionString);
        break;
    case Common.ODBC_DB_PROVIDER:
        connection = new OdbcConnection(connectionString);
        break;
    case Common.OLE_DB_PROVIDER:
        connection = new OleDbConnection(connectionString);
        break;
    }

    try
    {
        connection.Open();
    }
    catch (Exception err)
    {
        throw err;
    }

    return connection;
}

解释

  • Configuration.ConnectionString 属性返回 app.config 文件中存在的连接字符串。
  • Configuration.DBProvider 属性返回 app.config 文件中用于连接字符串的数据库提供程序,即“SQLSERVER”、“MSACCESS”、“MYSQL”、“OLEDB”或“ODBC”。
  • Common.EXCESS_DB_PROVIDER 只是数据访问层的 Common 类中存在的每个数据库的常量字符串。
  • GetCommand 方法也以类似的方式实现
    IDbCommand command = _commandBuilder.GetCommand(commandText,
    connection, commandType);

如何执行任何命令?

DBHelper 类是应用程序其他组件主要实例化用于读取或写入数据的类。

DBHelper 类实现以下方法及其各种重载以访问数据库:

以下是读取数据库标量值的示例。

private DBHelper _dbHelper = new DBHelper();

object objTemp =
_dbHelper.ExecuteScalar("SELECT COUNT(*) FROM
User_Info;");

注意:当前数据访问层组件不支持显式事务管理。正在开发中。

5. AccountPlus 安装

5.1 AccountPlus 先决条件

要运行 Account Plus,目标计算机应具有:

5.2 安装

  • 下载 AccountPlus2.0。
  • 解压 AccountPlus2.0 目录。
  • 查找目录 Setup
  • 双击运行 AccountPlus 安装程序。一直点击下一步。

注意:请务必在步骤 4 中输入适当的货币,即卢比、美元或任何其他货币,以便您的开支以相同的货币表示。默认情况下,安装程序配置 MS Access 数据库,但可以为任何数据库进行自定义。

6. 如何更改 AccountPlus 数据库

AccountPlus 可以与任何数据库一起使用,例如 MS Access、MySql、SQL Server 和 Oracle。默认情况下,安装程序为应用程序配置 MS Access 数据库,但可以更改为任何数据库。下载的软件包包含 My SQL 和 SQL Server 数据库的数据库脚本。

请按照以下步骤更改数据库。

  1. 通过运行下载文件中数据库目录中的脚本,准备好 MySQL 或 SQL Server 数据库。
  2. 进入 AccountPlus 的安装目录。(通常是 C:\Program Files\AccountPlus)
  3. 找到并用任何合适的编辑器打开 ‘AccountPlus.UI.exe.config’ 文件。
  4. 找到“connectionStrings”部分。您可以在其中找到 MySQL 和 SQL Server 的连接字符串,分别命名为 mySqlCon 和 sqlServerCon。修改连接字符串属性,使用合适的值,即适当的数据库名称、用户 ID、密码、服务器和端口等。
  5. ‘AccountPlus.UI.exe.config’ 文件中找到 ‘appSettings’ 部分。修改 ‘defaultConnection’ 的值,使其与您上一步中修改的连接字符串名称相同。

注意:在更改/添加新连接字符串时,请确保使用正确的 providerName。例如:

数据库 提供程序名称
MS Access providerName="MSACCESS"
MySQL providerName="MYSQL"
Oracle providerName="ORACLE"
SQL Server providerName="SQLSERVER"
OLEDB providerName="OLEDB"
ODBC providerName="ODBC"

7. 使用 AccountPlus

1. 登录

提供用户名和密码,然后点击“登录”按钮登录应用程序。

如果您选择“记住我”,那么下次应用程序将自动填充用户名和密码。

登录信息

点击信息按钮查看上次登录信息。

2. 用户管理

用户管理,即添加新用户和修改用户详细信息的权限仅限于管理员用户角色。

2.1 创建新用户

以管理员用户角色登录应用程序,

  1. 按下“ALT+U”或转到文件-> 添加-> 用户

  2. 将出现一个新窗口。选择所需的用户角色并输入用户详细信息。单击“添加”按钮创建用户。

2.2 搜索用户

按“ALT+U”或转到文件 -> 添加 -> 用户。在打开的窗口中输入任意详细信息并点击搜索按钮。

注意: 所有字段都不是必填项,您可以输入任何详细信息进行搜索。

2.3 编辑用户信息

按“ALT+U”或转到文件 -> 添加 -> 用户。从网格中选择您要编辑其信息的用户。选择任何包含用户信息的行将使用户详细信息显示在上方区域,您可以在其中更改详细信息。点击“更新”按钮保存更改。

2.4 停用用户

按“ALT+U”或转到文件 -> 添加 -> 用户。从网格中选择要停用的用户。选择任何包含用户信息的行将使用户详细信息显示在上方区域。取消选中“激活”复选框,然后点击“更新”按钮保存更改。

2.5 激活用户

按“ALT+U”或转到文件 -> 添加 -> 用户。从网格中选择要激活的用户。选中“激活”复选框,然后点击“更新”按钮保存更改。

3. 项目管理

项目管理,即添加新项目和修改项目详细信息的权限已授予所有用户角色。

3.1 创建新项目

  1. 按下“ALT+I”或转到文件-> 添加-> 项目

  2. 将出现一个新窗口。输入项目详细信息。点击“添加”按钮创建新项目。

3.2 搜索项目

按下“ALT+I”或转到文件 -> 添加 -> 项目。在打开的窗口中输入任意详细信息并点击搜索按钮。

注意: 所有字段都不是必填项,您可以输入任何详细信息进行搜索。

3.3 编辑项目详细信息

按“ALT+U”或转到文件 -> 添加 -> 用户。从网格中选择您要编辑其信息的用户。选择任何包含用户信息的行将使用户详细信息显示在上方区域,您可以在其中更改详细信息。点击“更新”按钮保存更改。

4. 费用管理

只有普通用户可以添加、更新或删除费用。管理员不能输入任何费用。用户只能编辑或删除自己的费用,不能编辑或删除其他用户的费用,但可以查看所有用户的费用。

4.1 添加新费用

选择要输入费用的项目。选择项目将自动填充费用描述,用户可以更改。输入金额和日期等其他信息。单击“添加”按钮保存更改。

成功添加项目后,新添加的费用详细信息将显示在屏幕右侧的费用详细信息网格中。

注意:费用日期不能大于今天的日期。

4.2 编辑费用详情

从网格中选择需要编辑的特定费用。选择任何包含费用详情的行将使详情在屏幕左侧可用,可以在其中编辑详情。点击“更新”按钮保存更改。

4.3 删除费用

从网格中选择需要删除的特定费用。选择任何包含费用详情的行将使详情在屏幕左侧可用,可以在其中编辑或删除详情。点击“删除”按钮删除费用。

5. 报告

报告是 AccountPlus 最激动人心的部分。AccountPlus 主要有三种报告

  • 费用报告
  • 月度报告
  • 分析报告

5.1 费用报告

按 F4 或点击工具栏上的按钮打开费用报告。

成功添加项目后,新添加的费用详细信息将显示在屏幕右侧的费用详细信息网格中。

费用报告向我们提供以下信息:

  • 租期内的总开支。
  • 分摊开支的人数。
  • 每个人分摊的开支金额。(个人贡献)

根据这三项信息,AccountPlus 计算“每个用户支付了多少,以及每个参与者是应该支付给其他参与者还是应该从其他参与者那里获得多少钱”。

5.2 月度报告

按 F5 或点击工具栏上的按钮打开月度报告。

选择需要生成报告的月份、年份,然后点击“生成”按钮。除了费用详情,该报告还将提供一些其他重要信息,如结算日期、总费用和天数等。

5.3 分析报告

按 F6 或点击工具栏上的按钮打开分析报告。

选择需要生成报告的月份、年份,然后点击“生成”按钮。

与月度报告一样,分析报告也有两种视图:个人和月度。

每当我们为特定的月份和年份生成分析报告时,AccountPlus 的分析引擎会检查所选月份和年份的前一个月和后一个月是否存在费用数据。如果数据存在,分析报告将针对特定项目或用户给出费用是比前一个月还是后一个月增加或减少的趋势。

示例

假设您选择了 2007 年 12 月来生成分析报告。现在,AccountPlus 的分析引擎将检查 2007 年 11 月和 2008 年 1 月是否存在数据。如果数据存在,那么分析报告将根据选择的视图(个人或项目)比较每个项目或用户的费用。如果前一个月的数据不存在,那么分析报告将只比较所选月份和下一个月份。

6. 费用结算

只有管理员用户角色才有权结算费用。

为了理解结算过程,我们将以纸质账户管理系统为例。在纸质账户管理系统中,月底所有发生的费用都需要汇总,以计算当月的总费用。然后将总费用除以应分摊费用的人数。这样就计算出了个人贡献。现在,所有成员将根据个人贡献和每个参与者已支付的金额,要么从其他成员那里收到金额,要么向其他成员支付金额。

此过程完成后,费用表需要撕掉或交叉标记。

AccountPlus 中的费用结算过程与此相同,管理员确保所有用户都已结清欠款,即每个参与者都已收到或支付了欠款。结算费用后,当前费用详情将不会显示在主页上,但数据将保留在数据库中以供分析和报告之用。

如何结算费用?

以管理员身份登录。

  • 按 F4 生成费用报告。
  • 点击结算按钮。

费用报告提供了有关特定期间的总费用和应付款项的信息。“支付/获得”是非常重要的信息,用于结清欠款,此信息向用户提供了关于谁应该支付以及谁应该获得的信息。

7. 编辑用户资料

按下“Alt+P”或转到编辑-> 个人资料以打开可编辑用户个人资料的屏幕。

如何更改密码?

勾选“更改密码”复选框。输入旧密码、密码和确认密码字段,然后点击“提交”按钮保存详细信息。

8. 数据库信息

按下“Alt+Shift+S”或转到工具-> 数据库以打开数据库信息窗口。

注意

  • 只有管理员用户角色才有权备份数据库。
  • 当前版本仅支持 MS Access 数据库的备份操作。

9. 系统诊断

按下“Alt+Shift+D”或转到工具-> 诊断以打开诊断信息窗口,其中可以查看应用程序日志和跟踪。

  • 选择日志或跟踪单选按钮以查看日志或跟踪文件。双击打开文件。
  • 导出按钮可用于导出日志/跟踪文件。

10. 版本信息

按 F2 或转到帮助-> 关于以打开关于对话框。

11. 报告错误或联系作者

按 F3 或转到帮助-> 联系管理员以打开一个窗口,该窗口可帮助用户向作者发布他们的反馈或评论。

  • 选择适当的选项,例如报告错误、功能请求等。
  • 在消息文本区域输入消息。
  • 点击“使用 Outlook 发送”以使用 Microsoft Outlook 将消息发送给管理员。
© . All rights reserved.