按完成的事务

时间:2016-09-27 12:37:37

标签: c# sql ms-access

我尝试使用MS Access数据库在C#中开发协议,可以由用户打印出来。我有不同的表(库存,贷款,退货),可以在这里看到: tables

这个想法是这样的:

广告资源表格(请参阅图片库存),其中有一个具有特定数量的产品。

使用Datestamp存在借出流程的表格(请参阅贷款图片): "吉姆在01.01.2000 08:00" 等

使用Datestamp

返回流程(请参阅返回图片): "吉姆正在回归3个锤子......" 等

所以我想合并这两个表来创建所有已完成交易的概览,其中已完成的交易是贷款&返回。

然而,当我执行我的代码时,这是结果(参见图像结果):

private void btn1_Click(object sender, EventArgs e)
{
    OleDbConnection con = new OleDbConnection(@"Provider = Microsoft.Jet.OLEDB.4.0; Data Source = D:\Access\keymgt_db_test.mdb");
    oda = new OleDbDataAdapter(@"SELECT * FROM Lending LEFT JOIN Returning ON Lending.EmployeeIndex=Returning.EmployeeIndex AND Lending.Datestamp<Returning.Datestamp", con);
    dta = new DataTable();
    oda.Fill(dta);
    dataGridView1.DataSource = dta;
}

在dataGridView中,所需的结果应该看起来像理想(见图片),其中会阻止重复的ID。

如何实现这一目标?非常感谢你提前!

3 个答案:

答案 0 :(得分:0)

如果您在编写简单查询(SQL DML)时遇到问题,那么您应该怀疑您的设计(SQL DDL)。

在我看来,你将两个行中的一个实体(一个贷款期)分开了。

我最成功的方法是在同一行上拥有@Override public void onAttach(Activity activity) { super.onAttach(activity); Fragment parentFragment = getParentFragment(); if (parentFragment != null) { if (parentFragment instanceof OnFragmentInteractionListener) { mListener = (OnFragmentInteractionListener) parentFragment; } else { throw new RuntimeException(parentFragment.toString() + " must implement OnFragmentInteractionListener"); } } } start_date属性。借用该项目时,end_date将设置为当前时间戳值,而start_date尚未发生,将设置为远期时间戳值例如end_date表示无限(有点像在.NET中使用#2099-12-31 23:59:59#,但MS Access的DateTime.MaxValue无法处理其精度。)

这个神奇数字&#39; for infinity在代码中效果很好,例如

DATETIME

以前我在结束日期使用null(对我来说是一个罕见的例外情况!),但发现我经常需要处理缺失的值! e.g。

...where now() between start_date and end_date

答案 1 :(得分:0)

正如另一个答案所述,我还会将LendingReturning表合并到一个Transaction表中。

但是,据我所知,有时您确实希望为交易的每一方都有单独的记录。这使得你有能力进行更复杂的交易......爱丽丝借给了鲍恩,后者借给了查理,后者借给了大卫,后者终于把它归还给爱丽丝。每个交易都有自己的记录。

如果您不需要这些更复杂的交易,那么包含LentFromLentToLentDateReturnDate列的单条记录就足够了,可能更容易实施和报告。但是,如果您确实想要支持更复杂的事务,那么每次更改都会返回单独的记录。无论哪种方式,将其归结为一个表格。

答案 2 :(得分:0)

除了@onedaywhen和@Joel的答案之外,您可以将“Lending”和“Returning”表合并到一个表中,但也可以单独跟踪每个项目。也就是说,而不是

ProductLent  LentTo  LentQty  DateLent
-----------  ------  -------  ----------
Hammer       Gord          3  2016-09-26

你可以

ProductLent  LentTo  DateLent    DateReturned
-----------  ------  ----------  ------------
Hammer       Gord    2016-09-26
Hammer       Gord    2016-09-26
Hammer       Gord    2016-09-26

那样的话,如果我今天只返回一个Hammer,那么只标记一个项目被归还只是

的问题
ProductLent  LentTo  DateLent    DateReturned
-----------  ------  ----------  ------------
Hammer       Gord    2016-09-26  2016-09-27
Hammer       Gord    2016-09-26
Hammer       Gord    2016-09-26

(我看到你在你的样本“返回”表中暗示了这样的活动,其中吉姆没有同时返回所有5个锤子。)

如果您需要将多项贷款显示为单个“交易”,则可以始终运行一个查询,该查询对各个行GROUPED BY(ProductLent,LentTo,DateLent)进行COUNT以获取LentQty。

这种方法可能看起来很浪费,但现代数据库真的很擅长“卷起”单个项目,而“卷起”几乎总是比将一行“拆分”成多行更容易。 (作为另一个例子,考虑一个采购订单上的一个项目,您只需要订购5个单位,以便找到您的供应商发运3个单位并将另外2个单位延期交货。)