我尝试使用MS Access数据库在C#中开发协议,可以由用户打印出来。我有不同的表(库存,贷款,退货),可以在这里看到:
这个想法是这样的:
有广告资源表格(请参阅图片库存),其中有一个具有特定数量的产品。
使用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。
如何实现这一目标?非常感谢你提前!
答案 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)
正如另一个答案所述,我还会将Lending
和Returning
表合并到一个Transaction
表中。
但是,据我所知,有时您确实希望为交易的每一方都有单独的记录。这使得你有能力进行更复杂的交易......爱丽丝借给了鲍恩,后者借给了查理,后者借给了大卫,后者终于把它归还给爱丽丝。每个交易都有自己的记录。
如果您不需要这些更复杂的交易,那么包含LentFrom
,LentTo
,LentDate
和ReturnDate
列的单条记录就足够了,可能更容易实施和报告。但是,如果您确实想要支持更复杂的事务,那么每次更改都会返回单独的记录。无论哪种方式,将其归结为一个表格。
答案 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个单位延期交货。)