0

この問題を詳しく説明するには時間がかかりますので、ご容赦ください。最初のコード:

    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 つあるように見える理由を知っている人はいますか? または、どんな解決策でも素晴らしいでしょう!!

4

1 に答える 1