====== COBI.ppc ====== COBI.ppc is a Production Process Control solution aka Manufacturing Execution System (MES) for SAP Business One, offered mainly in the form of an Android App. It is similar to and based on COBI.wms, but specialized for complex production workflows. ===== Setup ===== The following UDTs and UDFs are used by COBI.ppc. **IMPORTANT: All tables should be of type ''No object with auto-increment''.** ==== Attributes ==== In COBI.ppc we use the term "attributes" to refer to information about production orders that will be shown to the user. These attributes can come from a number of sources (see ''Origin'') and can be shown in the production overview screen, the production order details/execution screen, and in some step types. (See below for explanation of "steps.") ^ ''PPC_ATTRIBUTES'' ^^^ ^ Column ^ Type ^ Size ^ | Department | Alphanumeric | 20 | | RouteStage | Alphanumeric | 50 | | Title | Alphanumeric | 20 | | Origin | Alphanumeric | 20 | | FieldName | Alphanumeric | 254 | | PositionInOverview | Numeric | 2 | | PositionInDetails | Numeric | 2 | | PositionInSteps | Numeric | 2 | The ''Origin'' can have the following values: ^ Value ^ Meaning ^ | RDR | Sales order on which production order is based | | RDR_LINE | Sales order line containing the item being produced | | WOR | The production order itself | | ITM | Item master data of item being produced | | CUSTOM | Special | The ''FieldName'' must contain the name of an SAP Business One object field **with the name given to it in DI-API / Service Layer, not the name of the database column**. For example, if the origin is ''RDR'', then it's fine to use ''DocNum'' because that's the name of the field both in the database and in DI-API / Service Layer. However, if the origin is ''WOR'', then you must use ''DocumentNumber'' instead, because even though in the database it's still ''DocNum'', in DI-API / Service Layer it's ''DocumentNumber'' instead. If the origin is ''CUSTOM'', the following values are supported for the ''FieldName'': ^ Value ^ Meaning ^ | ''__QUANTITY'' | Completed & planned quantity displayed as ''X / Y'' | | ''__QUANTITY_WTR_PROD'' | Transferred & planned quantities displayed as ''X / Y'' | The ''__QUANTITY_WTR_PROD'' is useful if you don't want to consider a quantity to be truly completed yet before it's transferred to the target warehouse. See the "step" of action type ''ProdWTR'' below. ==== Buttons ==== When the user selects a production order from the overview, the details/execution screen will be opened for that order. In this screen, there can be up to five buttons with various actions attached to them. In the beginning all buttons are in the "Start" state. If a button has a ''TimeType'' value other than ''None'', then pressing it will switch the button into the "Stop" state and a timer will be started. The timer ends when the button is pressed again, or when a button of type ''Fault'' is pressed. ^ ''PPC_BUTTONS'' ^^^ ^ Column ^ Type ^ Size ^ | Id | Alphanumeric | 20 | | Department | Alphanumeric | 20 | | RouteStage | Alphanumeric | 50 | | Position | Numeric | 1 | | StartTitle | Alphanumeric | 20 | | StopTitle | Alphanumeric | 20 | | TimeType | Alphanumeric | 20 | The ''TimeType'' can have the following values: ^ Value ^ Meaning ^ | Normal | Regular production time | | Preparation | Production preparation time | | Fault | Duration of a fault situation | | None | Button doesn't measure time | If ''None'' is used, the button is always in the "Start" state. ==== Steps ==== We use the term "steps" to refer to one or more actions that can be tied to the clicking of a button in a certain state. This is how you can tie in actions like Goods Issue, Goods Receipt, and so on into the production workflow. For example, you might have a simple "Begin Production / End Production" button, which triggers a Goods Issue step when it's clicked in the "Start" state, and triggers a Goods Receipt when in the "Stop" state. ^ ''PPC_STEPS'' ^^^ ^ Column ^ Type ^ Size ^ | Department | Alphanumeric | 20 | | RouteStage | Alphanumeric | 50 | | FirstStageOnly | Alphanumeric | 1 | | LastStageOnly | Alphanumeric | 1 | | ButtonId | Alphanumeric | 20 | | ButtonState | Alphanumeric | 20 | | Position | Numeric | 2 | | Title | Alphanumeric | 50 | | ShowAttrs | Alphanumeric | 1 | | ActionType | Alphanumeric | 20 | | ActionParam | Alphanumeric | 254 | The ''Department'' and ''RouteStage'' fields, if filled, limit this step to the corresponding department (resource group) and/or route stage. The ''FirstStageOnly'' and ''LastStageOnly'' fields can be ''Y'' or ''N'' and only make sense if the ''RouteStage'' field was left empty. They limit the step automatically to the first or last route stage in a production order, without having to explicitly name that stage. The combination of ''ButtonId'' and ''ButtonState'' determines when the step will be triggered. The ''ButtonState'' must be ''Start'' or ''Stop''. (A button with ''TimeType = None'' is always in the ''Start'' state.) The ''Position'' determines the order in which the steps will be executed if they would both be executed after a button event. The ''ShowAttrs'' field can be ''Y'' or ''N'' and determines whether the display attributes of the production order should be shown in the step's screen. The ''ActionType'' determines what type of step this is, and can have the following values: ^ Value ^ Meaning ^ | AllItems | List all item components of the production order | | MatsWTR | Relocation of component items to be issued | | IGE | Goods issue of the component items | | CompletedQty | Enter completed quantity for current routing stage | | SimpleIGN | Goods receipt of finished goods | | IGN | Goods receipt with optional discarded/return items | | ProdWTR | Relocation of received goods that were produced | | FillParams | Parameter input screen (see below) | | Text | Show the user a static text (e.g. instructions) | | Close | Offer to close routing stage or production order | The ''ActionParam'' can have different meanings depending on the ''ActionType''. The following table describes the meanings it can have. When there are multiple possibilities, they can be added together and separated with a comma. ^ Action type ^ Meaning of ''ActionParam'' ^ | IGE | Comma-separated list of item groups to include | | ::: | Start with ''!'' to exclude instead | | MatsWTR | Comma-separated list of exactly two warehouse codes | | ::: | Determines the from and to warehouse | | CompletedQty | ''IGNIfLast'' to call ''SimpleIGN'' during last stage | | ::: | ''PreFillQty'' to pre-fill the quantity field | | ::: | ''OverwriteQty'' to make the entered quantity overwrite the old | | ProdWTR | Same as for MatsWTR | | FillParams | Comma-separated list of parameter IDs | | Text | The text that will be shown on the screen | | Close | ''CloseDocIfLast'' to close production order during last stage | (Note that the ''ActionParam'' has nothing to do with the "parameters" mechanism described below, except that for the ''FillParams'' action type it contains a list of parameter IDs.) ==== Parameters ==== We use the term "parameters" (not to be confused with "attributes") to refer to completely specialized values that users can input via a ''FillParams'' step, to document various information that doesn't fit into any standard SAP Business One logic. For example, you might have a "Tool State" parameter, and add a ''FillParam'' step to an "End Production" button where the user has to specify in what shape the tool is (fine, damaged, broken). ^ ''PPC_PARAMS'' ^^^ ^ Column ^ Type ^ Size ^ | Id | Alphanumeric | 20 | | Name | Alphanumeric | 50 | | DataType | Alphanumeric | 20 | | ValidValues | Alphanumeric | 254 | | DefaultValue | Alphanumeric | 254 | | Mandatory | Alphanumeric | 1 | | MultiValue | Alphanumeric | 1 | The ''DataType'' can be ''Text'' or ''Number''. The ''ValidValues'' is a list of comma-separated values. The ''Mandatory'' and ''MultiValue'' fields can be ''Y'' or ''N''. When a ''FillParams'' step is executed, the values given by the user are saved in the following UDT. ^ ''PPC_PARAM_INPUTS'' ^^^ ^ Column ^ Type ^ Size ^ | Timestamp | Alphanumeric | 12 | | Resource | Alphanumeric | 50 | | EmployeeId | Numeric | 11 | | UserInfo | Alphanumeric | 20 | | WORDocEntry | Numeric | 11 | | RDRDocEntry | Numeric | 11 | | ParamId | Alphanumeric | 20 | | ParamValue | Alphanumeric | 254 | ==== Fault and rejection reasons ==== The fault reasons will be shown in a drop-down when a user clicks on a button with a ''TimeType'' value of ''Fault''. The user has to select one of the reasons before the fault state can be ended. The fault reason will be saved in the ''Comment'' field of the ''PPC_WORSTATUS'' table (see below). ^ ''PPC_FAULT_REASONS'' ^^^ ^ Column ^ Type ^ Size ^ | Reason | Alphanumeric | 254 | The reject reasons are shown in a drop-down when a user wants to add rejected quantities in a Goods Receipt, i.e. goods that were produced but are being discarded again for some reason, like being damaged. ^ ''PPC_REJECT_REASONS'' ^^^ ^ Column ^ Type ^ Size ^ | Reason | Alphanumeric | 254 | ==== Production status / timeline ==== The following table records all button start/stop events so the price state in which a production order is, and for how long it's been running, can be seen. ^ ''PPC_WORSTATUS'' ^^^ ^ Column ^ Type ^ Size ^ | Timestamp | Alphanumeric | 12 | | Resource | Alphanumeric | 50 | | EmployeeId | Numeric | 11 | | UserInfo | Alphanumeric | 20 | | WORDocEntry | Numeric | 11 | | WORDocLine | Numeric | 11 | | RDRDocEntry | Numeric | 11 | | PrevStatus | Alphanumeric | 20 | | Status | Alphanumeric | 20 | | ResourceGroup | Alphanumeric | 20 | | RouteStage | Alphanumeric | 50 | | ButtonId | Alphanumeric | 20 | | Comment | Alphanumeric | 254 | In addition to the fields, it's recommended to add the following **keys** to this table for better performance: ^ ''PPC_WORSTATUS keys'' ^^ ^ Key ^ Columns ^ | IX_0 | ''WORDocEntry'' | | | ''WORDocLine'' | | IX_1 | ''ResourceGroup'' | | IX_2 | ''UserInfo'' | (To add keys to a user-defined table in SAP Business One, open the **User-Defined Fields - Management** window, find the table under **User Tables**, click on the ''PPC_WORSTATUS'' table, and then click on the **Keys** button at the bottom right.) ==== User-defined fields ==== Resources can be tied to a specific route stage (aka sub-department) via this UDF: ^ Resource Master Data ^^^ ^ Column ^ Type ^ Size ^ | PPC_RouteStage | Alphanumeric | 20 | Items can be declared to be of various types: ''Tool'', ''RawMaterial'', ''IntermediateProduct'', ''FinalProduct'', ''ByProduct''. However, currently only the ''Tool'' type is used. Items of type ''Tool'' will be automatically added to a Goods Receipt document as returned good. ^ Item Master Data ^^^ ^ Column ^ Type ^ Size ^ | PPC_ItemType | Alphanumeric | 20 | Since Relocation documents can't be based on a Production Order, the following UDF is used to specify for which Production Order they were executed: ^ Documents ^^^ ^ Column ^ Type ^ Size ^ | PPC_WORDocId | Numeric | 11 | | PPC_User | Alphanumeric | 20 | Times measured by COBI.ppc are booked as a Goods Issue with a Resource line; the following UDF describes what time of type this was (Normal, Preparation, Fault). ^ Document Lines ^^^ ^ Column ^ Type ^ Size ^ | PPC_TimeType | Alphanumeric | 20 | In the following UDFs, COBI.ppc stores information about the status of a routing stage within a production order. The UDF ''PPC_CompletedQty'' represents the quantity of items whose processing //within this routing stage// has been completed, although they may still have to go through other routing stages before they can be booked in as a Receipt from Production. The UDF ''PPC_Closed'' can be set to **Y** to indicate that no further processing will take place within the routing stage. ^ Production Order - Route Stage Rows ^^^^^ ^ Column ^ Type / Structure ^ Size ^ Valid values ^ Default ^ | PPC_CompletedQty | Units and Totals / Quantity | | | | | PPC_DiscardedQty | Units and Totals / Quantity | | | | | PPC_User | Alphanumeric | 254 | | | | PPC_Closed | Alphanumeric | 1 | Y / N | N |