How to make custom bin location list in Put Away

  • Updated

This note describes how to make a custom target location list by PutAwayDestinationLocationHookScript

The hook flow is called if the following settings are disabled:

  • Use suggested locations? setting on the Location controller
  • Use Location Suggestions? on the warehouse level of the Organization Structure

Creating SQL VIEW as an input for the script

First, create an SQL view that contains all source data.

 

MSSQL

CREATE PROCEDURE[dbo].[SP_EXAMPLE_PUTAWAY_DESTINATION]
     @luid int,
     @sscc nvarchar(20),
     @listOfItemCode nvarchar(max),
     @quantityToMove numeric(19,6),
     @listOfZoneTypesForItems nvarchar(max),
     @sourceLocation nvarchar(50),
     @warehouse nvarchar(50),
     @selectLocationFilter nvarchar(100)
AS
BEGIN
     SELECT "PMX_OSSL"."Code" AS "Code", "PMX_OSSL"."Name" AS "Description", "PMX_OSEL"."PmxWhsCode" AS "WarehouseCode", "PMX_OSWH"."Name" AS "WarehouseName"
     FROM "PMX_OSSL"
     INNER JOIN "PMX_OSEL" ON "PMX_OSEL"."Code" = "PMX_OSSL"."Code"
     INNER JOIN "PMX_OSWH" ON "PMX_OSEL"."PmxWhsCode" = "PMX_OSWH"."Code"
     INNER JOIN "OWHS" ON "OWHS"."WhsCode" = "PMX_OSWH"."SboWhsCode" AND "OWHS"."U_PMX_IMBP" = 'Y'
END

 

HANA

CREATE PROCEDURE "SP_EXAMPLE_PUTAWAY_DESTINATION"
(
     p_luid int,
     p_sscc nvarchar(20),
     p_listOfItemCode nvarchar(255),
     p_quantityToMove numeric(19,6),
     p_listOfZoneTypesForItems nvarchar(255),
     p_sourceLocation nvarchar(50),
     p_warehouse nvarchar(50),
     p_selectLocationFilter nvarchar(100)
)
LANGUAGE SQLSCRIPT AS
BEGIN
     SELECT "PMX_OSSL"."Code" AS "Code", "PMX_OSSL"."Name" AS "Description", "PMX_OSEL"."PmxWhsCode" AS "WarehouseCode", "PMX_OSWH"."Name" AS "WarehouseName"
     FROM "PMX_OSSL"
     INNER JOIN "PMX_OSEL" ON "PMX_OSEL"."Code" = "PMX_OSSL"."Code"
     INNER JOIN "PMX_OSWH" ON "PMX_OSEL"."PmxWhsCode" = "PMX_OSWH"."Code"
     INNER JOIN "OWHS" ON "OWHS"."WhsCode" = "PMX_OSWH"."SboWhsCode" AND "OWHS"."U_PMX_IMBP" = 'Y'
     WHERE "PMX_OSSL"."IsActive" = 'Y';
END

 

Changing the Workflow script

Next, open the script of PutAwayDestinationLocationHookScript from Organizational Structure > Company object > Workflows tab, and replace the content of the script by the script below. The Mobile Client application must be restarted.

 

using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data;
using System.Globalization;
using System.Reflection;
using System.Text;
using Produmex.Foundation;
using Produmex.Foundation.Barcode;
using Produmex.Foundation.Data;
using Produmex.Foundation.Data.Sbo;
using Produmex.Foundation.Data.Sbo.BusinessObjects;
using Produmex.Foundation.Data.Sbo.BusinessObjects.Convertors;
using Produmex.Foundation.Data.Sbo.BusinessObjects.Definitions;
using Produmex.Foundation.Data.Sbo.BusinessObjects.Definitions.Tables;
using Produmex.Foundation.Data.Sbo.DataObjects;
using Produmex.Foundation.Data.Sbo.Providers;
using Produmex.Foundation.Data.Sbo.Utilities;
using Produmex.Foundation.Data.SqlClient;
using Produmex.Foundation.Diagnostics;
using Produmex.Foundation.GS1;
using Produmex.Foundation.Messages;
using Produmex.Foundation.SlimScreen;
using Produmex.Foundation.SlimScreen.Interfaces;
using Produmex.Foundation.SlimScreen.Interfaces.Definitions;
using Produmex.Foundation.SlimScreen.Interfaces.Definitions.DataObjects;
using Produmex.Foundation.SlimScreen.Interfaces.Definitions.KnownDataSets;
using Produmex.Foundation.SlimScreen.WinGui;
using Produmex.Foundation.Utilities;
using Produmex.Foundation.Workflows;
using Produmex.Foundation.Workflows.Parameters;
using Produmex.Foundation.Wwf.Sbo;
using Produmex.Foundation.Wwf.Sbo.DataObjects;
using Produmex.Foundation.Wwf.Sbo.LocalServices;
using Produmex.Sbo.Logex.Data.BusinessObjects;
using Produmex.Sbo.Logex.Data.BusinessObjects.Definitions;
using Produmex.Sbo.Logex.Data.BusinessObjects.Definitions.Tables;
using Produmex.Sbo.Logex.Data.DataObjects;
using Produmex.Sbo.Logex.Data.Devices;
using Produmex.Sbo.Logex.Data.Generators.BatchNumberGenerators;
using Produmex.Sbo.Logex.Data.Generators.PackingController;
using Produmex.Sbo.Logex.Data.Providers;
using Produmex.Sbo.Logex.Data.ViewObjects.Definitions.Views;

namespace WorkflowScript_PutAwayDestinationLocationHookScript
{
     public class WorkflowScript_PutAwayDestinationLocationHookScript : WorkflowInstanceScriptBase
     {
           private static readonly ILog s_log = LogProvider.GetLogger(MethodInfo.GetCurrentMethod().DeclaringType);

          // Input parameters * do not change *
           public ReadOnlyBinder<CultureInfo> DefaultCultureInfo;
           public ReadOnlyBinder<PmxOseCompany> PmxOseCompany;
           public ReadOnlyBinder<object[]> FlowParameters;

            private object[] currentFlowParameters
           {
                 get { return FlowParameters == null ? null : FlowParameters.Get(); }
           }

            private CultureInfo defaultCultureInfo
           {
                 get { return DefaultCultureInfo.Get(); }
           }

            // Output paramteters
           public ReadWriteBinder<DataSet> Locations;

            // Sub-flows
           // <none>
           //Internal helpers

            internal enum LocationFilter
           {
                 All = 0,
                 Empty = 1,
                 NotFull = 2,
                 NotFullAndIgnoreNonLuidStock = 3,
                Default = NotFull
           }

            public WorkflowScript_PutAwayDestinationLocationHookScript(WorkflowInstanceBase parent, WorkflowInstanceFactory factory)
                  : base(parent, factory)
           {
           }

            #region WorkflowInstanceScriptBase Members
           protected override void Execute()
           {
                 /* */
                 // Parameters in scope
                 int luid = (int)currentFlowParameters[0];
                 string sscc = (string)currentFlowParameters[1];
                 Collection<string> listOfItemCodes = (Collection<string>)currentFlowParameters[2];
                 double quantityToMove = (double)currentFlowParameters[3];
                 Collection<string> listOfZoneTypesForItems = (Collection<string>)currentFlowParameters[4];
                 string sourceLocation = (string)currentFlowParameters[5];
                 string warehouse = (string)currentFlowParameters[6];
                 LocationFilter selectLocationFilter = (LocationFilter)currentFlowParameters[7];

                Session session = GetScopeParameter("Session") as Session;
                 ISboProviderService sboProviderService = GetScopeParameter("<WwfService>ISboService") as ISboProviderService;
                 string query = GetQueryDestinationLocations(luid, sscc, listOfItemCodes, quantityToMove, listOfZoneTypesForItems, sourceLocation, warehouse, selectLocationFilter, defaultCultureInfo);
                 DataSet dsLocation = null;

                  //Required colums:
                 // "Code"
                 // "Description"
                 // "WarehouseCode"
                 // "WarehouseName"
                 // Extra colums are allowed
                 dsLocation = sboProviderService.RunView(false, null, null, query);

                  Locations.Set(dsLocation);
                 return;
           }

            /* */

            private static string GetQueryDestinationLocations(int luid, string sscc, Collection<string> listOfItemCodes, double quantityToMove, Collection<string> listOfZoneTypesForItems, string sourceLocation, string warehouse, LocationFilter selectLocationFilter, CultureInfo cultureDatabase)
           {
                 StringBuilder strBuilder = new StringBuilder();
                 string listOfItemCodesAsString = "";
                 foreach (string itemCode in listOfItemCodes)
                 {
                       if (!string.IsNullOrEmpty(listOfItemCodesAsString))
                       {
                             listOfItemCodesAsString += "|";
                       }
                       listOfItemCodesAsString += itemCode;
                 }
                 string listOfZoneTypesForItemsAsString = "";
                 foreach (string zoneType in listOfZoneTypesForItems)
                 {
                       if (!string.IsNullOrEmpty(listOfZoneTypesForItemsAsString))
                       {
                             listOfZoneTypesForItemsAsString += "|";
                       }
                       listOfZoneTypesForItemsAsString += zoneType;
                 }

                  //SQL VERSION    
                 strBuilder.Append("EXEC SP_EXAMPLE_PUTAWAY_DESTINATION ");
                 strBuilder.Append(SqlCommandHelper.FormatAndEscapeColumnValue(luid, cultureDatabase));
                 strBuilder.Append(", " + SqlCommandHelper.FormatAndEscapeColumnValue(sscc, cultureDatabase));
                 strBuilder.Append(", " + SqlCommandHelper.FormatAndEscapeColumnValue(listOfItemCodesAsString, cultureDatabase));
                 strBuilder.Append(", " + SqlCommandHelper.FormatAndEscapeColumnValue(quantityToMove, cultureDatabase));
                 strBuilder.Append(", " + SqlCommandHelper.FormatAndEscapeColumnValue(listOfZoneTypesForItemsAsString, cultureDatabase));
                 strBuilder.Append(", " + SqlCommandHelper.FormatAndEscapeColumnValue(sourceLocation, cultureDatabase));
                 strBuilder.Append(", " + SqlCommandHelper.FormatAndEscapeColumnValue(warehouse, cultureDatabase));
                 strBuilder.Append(", " + SqlCommandHelper.FormatAndEscapeColumnValue(selectLocationFilter, cultureDatabase));
                 //END OF SQL VERSION

                ////HANA VERSION
                 //strBuilder.Append("CALL SP_EXAMPLE_PUTAWAY_DESTINATION (");
                 //strBuilder.Append(SqlCommandHelper.FormatAndEscapeColumnValue(luid, cultureDatabase));
                 //strBuilder.Append(", " + SqlCommandHelper.FormatAndEscapeColumnValue(sscc, cultureDatabase));
                 //strBuilder.Append(", " + SqlCommandHelper.FormatAndEscapeColumnValue(listOfItemCodes, cultureDatabase));
                 //strBuilder.Append(", " + SqlCommandHelper.FormatAndEscapeColumnValue(quantityToMove, cultureDatabase));
                 //strBuilder.Append(", " + (listOfZoneTypesForItems == null || listOfZoneTypesForItems.Count == 0 ? "''" : SqlCommandHelper.FormatAndEscapeColumnValue(listOfZoneTypesForItems, cultureDatabase)));
                 //strBuilder.Append(", " + SqlCommandHelper.FormatAndEscapeColumnValue(sourceLocation, cultureDatabase));
                 //strBuilder.Append(", " + SqlCommandHelper.FormatAndEscapeColumnValue(warehouse, cultureDatabase));
                 //strBuilder.Append(", " + SqlCommandHelper.FormatAndEscapeColumnValue(selectLocationFilter, cultureDatabase));
                 //strBuilder.Append(")");
                 ////END OF HANA VERSION

                 return strBuilder.ToString();
           }
           #endregion
     }
}


For more information please read our documentation.

 

Was this article helpful?

0 out of 0 found this helpful

Comments

0 comments

Please sign in to leave a comment.