この問題を詳しく説明するには時間がかかりますので、ご容赦ください。最初のコード:
public DataModule(Main main)
{
frmMain = main;
InitializeComponent();
getWarehouseData();
createSortTables();
}
/// <summary>method : getWarehouseData
/// Loads data from database to local objects
/// </summary>
private void getWarehouseData()
{
WarehouseDataSet dsWarehouse = new WarehouseDataSet();
WarehouseDataSetTableAdapters.LocationTableAdapter taLocation =
new WarehouseDataSetTableAdapters.LocationTableAdapter();
WarehouseDataSetTableAdapters.PickOrderTableAdapter taPickOrder =
new WarehouseDataSetTableAdapters.PickOrderTableAdapter();
WarehouseDataSetTableAdapters.ProductTableAdapter taProduct =
new WarehouseDataSetTableAdapters.ProductTableAdapter();
WarehouseDataSetTableAdapters.Prod_LocTableAdapter taProd_Loc =
new WarehouseDataSetTableAdapters.Prod_LocTableAdapter();
taLocation.Fill(dsWarehouse.LOCATION);
taPickOrder.Fill(dsWarehouse.PICK_ORDER);
taProduct.Fill(dsWarehouse.PRODUCT);
taProd_Loc.Fill(dsWarehouse.PROD_LOC);
dtLocation = dsWarehouse.Tables["LOCATION"];
dtPickOrder = dsWarehouse.Tables["PICK_ORDER"];
dtProduct = dsWarehouse.Tables["PRODUCT"];
dtProd_Loc = dsWarehouse.Tables["PROD_LOC"];
}
private void createSortTables()
{
// Modified Location Table from View
dvSortedLocations = new DataView(dtLocation);
dvSortedLocations.Sort = "PickTime ASC";
// Modified Product Table as view
DataView dvSortedProducts = new DataView(dtProduct);
dvSortedProducts.Sort = "NumOfPicks DESC";
dtSortedProduct = dvSortedProducts.ToTable();
// New table for optimised Product Locations
dtOptProd_Loc = new DataTable("OPTPROD_LOC");
dtOptProd_Loc.Columns.Add("ProductCode", typeof(string));
dtOptProd_Loc.Columns.Add("Location", typeof(string));
dtOptProd_Loc.Columns.Add("StockQtty", typeof(double));
dsWarehouse.Tables.Add(dtOptProd_Loc);
DataColumn parentColumn = dsWarehouse.Tables["PRODUCT"].Columns["ProductCode"];
DataColumn childColumn = dsWarehouse.Tables["OPTPROD_LOC"].Columns["ProductCode"];
DataRelation REL_Prod_OptProdLoc = new DataRelation("PRODUCTOPTPROD_LOC", parentColumn, childColumn);
dsWarehouse.Relations.Add(REL_Prod_OptProdLoc);
// New table for Picking from optimised Locations
dsWarehouse.Tables.Add(new DataTable("OPTPICK"));
dtOptPick = dsWarehouse.Tables["OPTPICK"];
dtOptPick.Columns.Add("PickID", typeof(int));
dtOptPick.Columns.Add("ProductCode", typeof(string));
dtOptPick.Columns.Add("Location", typeof(string));
dtOptPick.Columns.Add("PickQtty", typeof(double));
dtOptPick.Columns.Add("SaleNumber", typeof(double));
DataColumn parentColumn2 = dsWarehouse.Tables["LOCATION"].Columns["LocationCode"];
DataColumn childColumn2 = dsWarehouse.Tables["OPTPICK"].Columns["Location"];
DataRelation REL_Loc_OptPick = new DataRelation("REL_Loc_OptPick", parentColumn2, childColumn2);
dsWarehouse.Relations.Add(REL_Loc_OptPick);
parentColumn = dsWarehouse.Tables["PRODUCT"].Columns["ProductCode"];
childColumn = dtOptPick.Columns["ProductCode"];
DataRelation REL_Prod_OptPick = new DataRelation("REL_Prod_OptPick", parentColumn, childColumn);
dsWarehouse.Relations.Add(REL_Prod_OptPick);
foreach (DataRow dr in dtPickOrder.Rows)
{
dtOptPick.Rows.Add(dr.ItemArray);
}
Access データベース アプリケーション用の WindowsForms GUI を作成します。データを取得し、それをいくつかの新しいテーブルに再編成し、結果を分析します。getWarehouseData() に示されているように、dsWarehouse データセットとしてロードされた初期データには、4 つのテーブルがあります。
createSortTables() では、2 つの新しいテーブルが dsWarehouse に追加され、既存のテーブルへの関係が追加されます。ただし、下の foreach ループに到達して新しい dtOptPick テーブルを埋めるときに示されているコードでは、到達した最初の「場所」が親テーブル (dtLocation) に存在しないことを示す InvalidConstraintException がスローされます。デバッガーで dsWarehouse.Tables["LOCATION"] を検査すると、予想どおり非パブリック メンバーのリストに 6 つの項目が表示されますが、データ テーブル ビジュアライゼーションを調べると、データが含まれていません。ただし、dtLocation を調べると、1371 個のデータ行が表示されます。
そこで、dsWarehouse.Tables["LOCATION"] を dtLocation に置き換えてみましたが、これにより、新しい DataRelation 行で InvalidConstraintException がスローされ、「異なる DataSet 内のテーブル間に関係を持つことはできません」と表示されます。したがって、すべての場合に dsWarehouse 参照を使用しているにもかかわらず、2 つの異なる実際のデータセットがあるようです。元のデータセットはすべてのデータを保持し、新しいデータセットはデータのないテーブルを追加しようとしました。
acceptChanges と Merge を適用しようとしましたが、少なくとも適用した方法では機能しませんでした。
同じ名前のデータセットが 2 つあるように見える理由を知っている人はいますか? または、どんな解決策でも素晴らしいでしょう!!