U bevindt zich nu op een technische pagina over de software Mercator. Deze pagina bevat specifieke informatie die bestemd is voor professionals van de software Mercator. Wenst u naar algemenere informatie over Mercator door te gaan?


   Deze vraag niet meer stellen

Bereken de minimum-stock in functie van verkopen op een bepaalde periode

0000002448     -      29-07-2019

Deze customizer laat toe om de minimum stockhoeveelheid te herberekenen. Onderstaand voorbeeld, wordt opgeroepen vanaf een nieuwe entry in het menu "Beheer".

Na de selectie van het depot, de datums en het eventueel toepassen van een filter op de artikelen, zal de customizer de minimale voorraad berekenen in functie van de verkopen die overeenstemmen met de selectiecriteria.

attention In ons voorbeeld, wordt de berekende hoeveelheid verhoogd met 10% alvorens het wordt opgeslagen als minimale voorraad.

using System;
using System.Data;
using System.Data.SqlClient;
using System.Text;
using System.Windows.Forms;
using MercatorApi;
using MercatorUi;
using MercatorUi.Forms.Sig;
using MercatorUi.Wait;

namespace Main
{
    public class Customizer : MercatorUi.ICustomizers.IExec
    {
        public void Main(MercatorUi.ICustomizers.ExecAction Action)
        {
            if (Action == MercatorUi.ICustomizers.ExecAction.MenuCreated)
            {
                //Een entry toevoegen in het menu Beheer om de minimum stockhoeveelheid te herberekenen voor een bepaalde periode.
                var menu = _Divers.MenuElementByText(_Divers.Iif_langue(MercatorUi.Globals.Langue, "Verwaltung", "Administration", "Beheer", "Gestion"));
                if (menu != null)
                    menu.SubItems.Add(new MercatorUi._BaseClasses.MenuElement("Maj MIN-stock per periode", "", null, StockMin_Click));
            }
        }

        void StockMin_Click(object sender, EventArgs e)
        {
            // Mise à jour stock min sur base des ventes ancienne période
            var depot = Dialogs.AskDepot("Voor welk depot?");
            if (depot == null)
                return;

            bool bDefaultDepot = (Globals.DepotDef == depot.Id);

            var dates = Dialogs.AskDates("Op welke periode moet men zich baseren om de MIN-stock te herberekenen?");
            if (dates == null || dates.GetLength(0) < 2)
                return;

            string filter = "";
            Form wonTop = Globals.Main.WonTopForm();
            if (wonTop != null)
            {
                var sigForm = wonTop as SigForm;
                if (sigForm != null && sigForm.Sig.Module == MercatorUi.Sig._SigEnum.STOCK)
                    filter = sigForm.Filter;
            }

            if (!string.IsNullOrEmpty(filter))
                if (!Dialogs.AnswerYesNo(string.Format("Filter toepassen?'{0}' ?", filter)))
                    filter = "";
                else
                    filter = " and " + filter;

            string sqlQuery = @"select LIGNES_V.ID_ARTICLE, sum(LIGNES_V.Q) as Tot_Q
                                   from PIEDS_V
                                    inner join LIGNES_V on PIEDS_V.ID = LIGNES_V.ID and PIEDS_V.JOURNAL = LIGNES_V.JOURNAL and PIEDS_V.PIECE = LIGNES_V.PIECE
                                    inner join STOCK on LIGNES_V.ID_ARTICLE = STOCK.S_ID -- this join is needed for filters to work
                                   where (PIEDS_V.TYPE = 1)
                                         and (LIGNES_V.ID_ARTICLE <> '')
                                         and (PIEDS_V.DATE between @DATE_1 and @DATE_2)
                                    and LIGNES_V.Q <> 0
                                    and PIEDS_V.ID_DEPOT = @ID_DEPOT
                                    {0}
                                   group by ID_ARTICLE
                                   order by ID_ARTICLE";

            sqlQuery = string.Format(sqlQuery, filter);

            var paramDate1 = new MercatorSqlParam("@DATE_1", dates[0]);
            var paramDate2 = new MercatorSqlParam("@DATE_2", dates[1]);
            var paramDepot = new MercatorSqlParam("@ID_DEPOT", depot.Id);

            WaitStatic.WaitWindow("Verkochte hoeveelheden berekenen op deze periode?");
            var dataSet = Api.Zselect(Globals.RepData, sqlQuery, paramDate1, paramDate2, paramDepot);
            WaitStatic.WaitClear();

            if (dataSet != null && dataSet.Tables.Count > 0 && dataSet.Tables[0].Rows.Count > 0)
            {
                if (Dialogs.AnswerYesNo(string.Format("{0} entries gevonden.\r\n\r\n Update de minimum-stock van deze artikelen?", dataSet.Tables[0].Rows.Count)))
                {
                    Progress.ProgressCreate(dataSet.Tables[0].Rows.Count);
                    var stringBuilder = new StringBuilder();

                    // Mise à zéro de tous les articles retournés par le filtre (ou tous si pas de filtre)
                    if (bDefaultDepot)
                        stringBuilder.AppendFormat("update STOCK set S_STOCKMIN = 0 where S_STOCKMIN<>0{0}\r\n", filter);
                    stringBuilder.AppendFormat("update dispo set dispo.STOCKMIN = 0 from DISPO inner join STOCK on dispo.ID_STOCK = stock.S_ID where STOCKMIN<>0 and ID_MAGASIN = '{0}'{1}\r\n\r\n", depot.Id, filter);

                    Api.TrimDataTable(dataSet.Tables[0]);
                    foreach (DataRow row in dataSet.Tables[0].Rows)
                    {
                        decimal Q = Convert.ToDecimal(row["Tot_Q"]);
                        string s_id = (string)row["ID_ARTICLE"];

                        // Ajout 10%
                        Q = Math.Ceiling(Q * 1.1m);

                        if (bDefaultDepot)
                            stringBuilder.AppendFormat("update STOCK set S_STOCKMIN = {0} where S_ID = '{1}'\r\n", Q, s_id);

                        stringBuilder.AppendFormat("update DISPO set STOCKMIN = {0} where ID_STOCK = '{1}' and ID_MAGASIN = '{2}'\r\n\r\n", Q, s_id, depot.Id);

                        Progress.ProgressIncrement(1);
                    }

                    WaitStatic.WaitWindow("Update minimum stock...");

                    bool result = Api.SqlExec(Globals.RepData, new SqlCommand(stringBuilder.ToString()));
                    WaitStatic.WaitClear();
                    Progress.ProgressDestroy();

                    if (result)
                        Dialogs.Stop("Update met succes beëindigd!");
                    else
                        Dialogs.Stop("Een fout is opgetreden: " + Api.LastError);
                }
            }
            else
                Dialogs.Stop("Geen enkele verkoop werd gevonden voor deze periode en dit depot.");
        }
    }
}