Voeg een read-write kolom toe in de tabel met de beschikbare voorraden in de artikelfiches

0000002387     -      29-11-2016

De hier beschreven programmering voegt een extra kolom toe in de tabel met de beschikbare voorraden in de artikelfiches. Deze kolom staat ons toe om een numerieke waarde op te slaan voor elk artikel en iedere depot. In ons voorbeeld werd het veld STOCKSAI (float) toegevoegd aan de DISPO tabel. 

De code is opgebouwd op basis van een SigStock customizer die deze interfaces implementeert:

De StringUpdate methode staat toe om de lees verzoeken voor de DISPO tabel aan te passen, om de toegevoegde kolom te weerspiegelen.

De FormLoadCustomize methode zal het AfterColumnsCreated,evenement opnemen, waarvoor we de extra kolom zullen toevoegen in het raster.

De SqlCommandUpdate methode zorgt dat de inhoud van de STOCKSAI kolom wordt opgeslagen in de DISPO tabel.

De code is als volgt:

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using MercatorUi;
using MercatorApi;
using System.Data;
using System.Data.SqlClient;
using System.IO;

namespace SigStock
{
    public class Customizer : MercatorUi.ICustomizers.IFormLoadCustomizer, MercatorUi.ICustomizers.IFormClosedCustomizer, MercatorUi.ICustomizers.IStringUpdater, MercatorUi.ICustomizers.ISqlCommandUpdater
    {
        public string StringUpdate(string StringToModify)
        {
            if (Api.StrExtract(StringToModify, "<ID>", "</ID>") == "STOCKDISPO")
            {
                StringToModify = StringToModify.Replace("dispo.qa_3,", "dispo.qa_3,dispo.stocksai,")
                                               .Replace("sum(qa_3),", "sum(qa_3),sum(stocksai),");
            }
            return StringToModify;
        }

        public void FormLoadCustomize(Form form)
        {
            MercatorUi.Forms.Sig.SigForm SigForm = (MercatorUi.Forms.Sig.SigForm)form;
            List<Control> controls = SigForm.FindMovableControlsByType(typeof(MercatorUi.Forms.Sig.SigGrids.StockDispo));
            if (controls.Count > 0)
            {
                MercatorUi.MovableControls.MovableGrid GridDispo = (MercatorUi.MovableControls.MovableGrid)controls[0];
                GridDispo.AfterColumnsCreated += new MercatorUi.MovableControls.MovableGrid.AfterColumnsCreatedHandler(GridDispo_AfterColumnsCreated);
            }
        }

        public void FormClosedCustomize(Form form)
        {
            MercatorUi.Forms.Sig.SigForm SigForm = (MercatorUi.Forms.Sig.SigForm)form;
            List<Control> controls = SigForm.FindMovableControlsByType(typeof(MercatorUi.Forms.Sig.SigGrids.StockDispo));
            if (controls.Count > 0)
            {
                MercatorUi.MovableControls.MovableGrid GridDispo = (MercatorUi.MovableControls.MovableGrid)controls[0];
                GridDispo.AfterColumnsCreated -= new MercatorUi.MovableControls.MovableGrid.AfterColumnsCreatedHandler(GridDispo_AfterColumnsCreated);
            }
        }

        void GridDispo_AfterColumnsCreated(object sender, EventArgs e)
        {
            MercatorUi.MovableControls.MovableGrid GridDispo = (MercatorUi.MovableControls.MovableGrid)sender;

            MercatorUi.GridPro.DataGridViewDoubleTextBoxColumn c = new MercatorUi.GridPro.DataGridViewDoubleTextBoxColumn();
            c.Name = "stocksai";
            c.HeaderText = "+ Saison";
            c.Width = Api.ValSafeInt(Globals.Params["LARG_DISP2"]);
            c.DisplayFormat = Globals.PictQ;
            c.DataPropertyName = "stocksai";
            c.DefaultCellStyle.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleRight;
            c.Increment = 0;
            GridDispo.Grid.Columns.Add(c);

            GridDispo.Grid.CellValidated += new DataGridViewCellEventHandler(grid_CellValidated);
            GridDispo.Grid.CellEnter += new DataGridViewCellEventHandler(grid_CellEnter);
        }

        void grid_CellValidated(object sender, DataGridViewCellEventArgs e) // Bereken het totaal van de STOCKSAI kolom
        {
            MercatorUi.GridPro.DataGridViewXPro _grid = (MercatorUi.GridPro.DataGridViewXPro)sender;

            if (((e.ColumnIndex > -1) && (_grid.Columns[e.ColumnIndex].Name == "stocksai")) && (!((_grid.Rows[e.RowIndex].Cells["id"].Value != DBNull.Value) && (_grid.Rows[e.RowIndex].Cells["id"].Value.ToString().TrimEnd() == ""))) && (_grid.RowCount > 1))
            {
                DataTable dt = (DataTable)_grid.DataSource;
                DataRow[] foundRowsTotal = dt.Select("ID = ''");
                if (foundRowsTotal.Length == 0)
                    return;
                foundRowsTotal[0][_grid.Columns[e.ColumnIndex].Name] = dt.Compute("Sum(stocksai)", "ID <> ''");
            }
        }

        void grid_CellEnter(object sender, DataGridViewCellEventArgs e) // Zet de cel "Totaal" op read-only in de STOCKSAI kolom
        {
            MercatorUi.GridPro.DataGridViewXPro _grid = (MercatorUi.GridPro.DataGridViewXPro)sender;
            MercatorUi.MovableControls.MovableGrid GridDispo = (MercatorUi.MovableControls.MovableGrid)_grid.Parent;

            if ((e.ColumnIndex > -1) && (_grid.Columns[e.ColumnIndex].Name == "stocksai"))
            {
                if ((_grid.RowCount > 1) && (_grid.Rows[e.RowIndex].Cells["id"].Value != DBNull.Value) && (_grid.Rows[e.RowIndex].Cells["id"].Value.ToString().TrimEnd() == ""))
                    _grid.Columns[e.ColumnIndex].ReadOnly = true;
                else
                    _grid.Columns[e.ColumnIndex].ReadOnly = GridDispo.ReadOnly;
            }
        }

        public void SqlCommandUpdate(System.Data.SqlClient.SqlCommand SqlCommandToModify, Form WindowsForm)
        {
            string id = Api.StrExtract(SqlCommandToModify.CommandText, "<ID>", "</ID>");
            if (id == "UPDATESTOCKDISPO") // Deze SQLCommand wordt uitgevoerd op alle lijnen buiten de Totaal lijn
            {
                MercatorUi.Forms.Sig.SigForm sigForm = (MercatorUi.Forms.Sig.SigForm)WindowsForm;
                MercatorUi.MovableControls.MovableGrid GridDispo = (MercatorUi.MovableControls.MovableGrid)sigForm.FindMovableControlsByType(typeof(MercatorUi.Forms.Sig.SigGrids.StockDispo))[0];
                if (!SqlCommandToModify.CommandText.Contains("@stocksai"))
                    SqlCommandToModify.CommandText = SqlCommandToModify.CommandText.Replace(",stockmax=@stockmax", ",stockmax=@stockmax,stocksai=@stocksai");
                string id_magasin = SqlCommandToModify.Parameters["@id_magasin"].Value.ToString();
                DataRow[] foundRows = ((DataTable)GridDispo.Grid.DataSource).Select(string.Format("id='{0}'", Api.UnquoteSql(id_magasin)));
                SqlCommandToModify.Parameters.AddWithValue("@stocksai", foundRows[0]["stocksai"]);
            }
        }
    }
}