存档

2015年1月 的存档

NAV2015 累计更新-3#

2015年1月31日 评论已被关闭

发布版本号 Build No. – 39368

发布日期 Release Date – January, 2015

下载链接

更新项:
——————————————————————————————————————–

ID KB Title
362138 The user receives an error message when exporting to Excel.
362268 Document reports using static images in Word headers or footers may not render the images correctly in multi-document reports.
362367 It is possible to return the product version and product name with the new GetBuildVersion command for finsql.exe.
361944 Administration shell cmdlet Set-NAVWebServerInstanceConfiguration has no TimeZone key.
362418 Some SharePoint parts do not load when connecting to a cold NAV Server in SharePoint Portal.
362431 Collapse/expand the General FastTab moves the focus to the Lines FastTab.
362167 Disabling Data Caching
362451 Cannot run a Date Picker control for worksheets and list pages on a tablet.
360989 “Unable to convert from System.Double to Microsoft.Dynamics.Nav.Runtime.Decimal18” error message when you try to assign xlRange.Value to a C/AL decimal field.
362297 “The following SQL error was unexpected. Invalid column name ‘Balance (LCY)'” error message when you use SETPERMISSIONFILTER with security filters.
361392 Lookup to a FlowField of type Date returns Date + Time on request pages.
361820 Unable to remove action items through ribbon configuration
361943 Wrong shortcut actions when editing fields in a list
362175 “The requested record cannot be located” error message when you open a notification.
362135 When you run the Nonstock Items function to add a non-stock item to a second order line, no values are returned.
362336 The Windows client hangs at start-up when using a Citrix environment.
360794 “The filter “<><>” on the Variant Code field in the Lot numbers by Bin Buffer table has no possible values.” error message when you filter on lines on a Warehouse Put-away page that has the Lot Numbers By Bin Filter FactBox.
362481 Import-NAVData does not create a trigger on the Object Metadata table.
362603 “The following SQL error was unexpected. Incorrect syntax near the keyword ‘Primary’.” error message when you change the Compressed property to NO on a field of data type BLOB.
362376 Microsoft Social Listening integration
362607 Boolean filter moves across the screen.
362458 The Windows client crashes when filtering.
362289 F8 does not copy the previous value in the Swiss database.
362465 Wasted space between dialog caption and field group in the Tablet client
362860 NumberFormatManager does not always work as documented for non-ascending format IDs.
362634 XML Port export Issue. Error “Argument was out of range: Non-negative number required” when exporting large Data.
362824 Filters in URL are not applied to ODATA db queries.
362778 Compiling application objects fails when NAS is running.
362600 The Notes part is very slow when many users exist.
362556 The ERROR C/AL statement does not execute as expected in some scenarios.
362770 “The record already exists” when you create a new customer from the Sales Info-Pane FactBoc
分类: Uncategorized 标签:

NAV2013 R2 累计更新-15#

2015年1月31日 评论已被关闭

发布版本号 Build No. – 39354

发布日期 Release Date – January, 2015

下载链接

更新项:
——————————————————————————————————————–

ID KB Title
361977 The user receives an error message when exporting to Excel.
362432 Collapse/expand the General FastTab moves the focus to the Lines FastTab.
362368 It is possible to return the product version and product name with the new GetBuildVersion command for finsql.exe.
361813 Unable to remove action items through ribbon configuration
362152 Disabling Data Caching
362160 “The requested record cannot be located” error message when you open a notification.
362500 When you run the Nonstock Items function to add a non-stock item to a second order line no values are returned.
362335 The Windows client hangs at start-up when using a Citrix environment.
362477 Import-NAVData does not create a trigger on the Object Metadata table.
362295 “The following SQL error was unexpected. Invalid column name ‘Balance (LCY)'” error message when you use SETPERMISSIONFILTER with security filters.
362239 Freeze Panel crashes the Windows client in some circumstances when used with the Visibility property.
362439 The Windows client crashes when filtering.
362606 Boolean filter moves across the screen
362283 F8 does not copy the previous value in the Swiss database.
362517 The CurrPage.Editable(False) function leaves the page editable.
362554 The ERROR C/AL statement does not execute as expected in some scenarios
分类: Uncategorized 标签:

NAV2013 累计更新-22#

2015年1月31日 评论已被关闭

发布版本号 Build No. – 39369

发布日期 Release Date – January, 2015

下载链接

更新项:
——————————————————————————————————————–

ID KB Title
360867 The Security filter does not get converted correctly in database conversions.
362316 The Windows client hangs at start-up when using a Citrix environment.
362333 User personalization is deleted automatically after you create and delete an empty profile.
362412 Boolean filter moves across the screen
362647 The cache size of server cache does not seem to work, and bigger caches sometimes cause worse performance
分类: Uncategorized 标签:

Nav中使用ADO将数据快速输出为txt格式

2015年1月30日 评论已被关闭

1. 将数据存储到mdb中, 或者直接使用Adodb连接到文本文件数据库

2. 使用下面的代码执行SQL.

sql := ”;
sql := sql + ‘Select ResxName’;
sql := sql + ‘ INTO [text;Format=Delimited(“|”);Database=C:\;CharacterSet=65001].[ab.txt]’;
sql := sql + ‘ from [CHS & ENU]’;
F.ExeCuteSQL(‘D:\Users\yxq1003\Documents\2013R2Translate.mdb’,sql);

上面的驱动必须要
Adodb_Conn.ConnectionString:=’Provider=Microsoft.Jet.OLEDB.4.0;Data Source=’+dbName;

[text; 表示文件格式
Format=Delimited(|) 表示分隔符
HDR=Yes 表示是否输出标题
Database=C:\ 表示文件保存目录, 注意 \ 要使用\\作为分隔
CharacterSet=65001 表示UTF-8, 实际不起作用, 建议OEM
.[ab.txt] 表示文件名称, 即表名称

附: Schema.ini 文件

[ab.txt]
ColNameHeader=False
CharacterSet=OEM
TextDelimiter=|
Format=Delimited( )
MaxScanRows=0
DecimalSymbol=,
NumberDigits =3
NumberLeadingZeros=true
CurrencySymbol =$
CurrencyPosFormat=($1)
CurrencyDigits =2
CurrencyNegFormat =-$1
CurrencyThousandSymbol=,
CurrencyDecimalSymbol =.
DateTimeFormat=ddmmyyyy
Col1=ResxName LongChar Attribute 32

文件名
是否列标题
字符集
文本前后分隔符
字段分隔符, 可以设置为字段固定长度
最多获取记录数
小数点分隔符
小数位数
小数是否包含前面的0
货币符号
货币符号位置
货币数据小数位数
货币负数金额表示形式
货币千位分隔符
货币小数点风格
日期时间格式
列的信息 LongChar 表示长字符串 属性 字符长度

列信息可以使用的字符类型如下表
Parameter Description
ColumnName The text name of the column. If the column name contains embedded spaces, you must enclose it in double quotation marks.
type Data types are as follows:
Microsoft Jet data types
Bit
Byte
Short
Long
Currency
Single
Double
DateTime
Text
Memo
ODBC data types Char (same as Text)
Float (same as Double)
Integer (same as Short)
LongChar (same as Memo)
Date date format
Width The literal string value Width. Indicates that the following number designates the width of the column (optional for character-delimited files; required for fixed-length files).
# The integer value that designates the width of the column (required if Width is specified).

分类: C/AL 标签:

通过CTE递归Navision BOM表获得全部BOM

2015年1月26日 评论已被关闭

———————————–
–Script by Yeats. —
–Copyright by Navision.asia —
———————————–
DECLARE @ItemNo varchar(20)
DECLARE @PDBOM TABLE
(
[Item No_] varchar(20),
[Production BOM No_] varchar(20),
[Version Code] varchar(20),
Type int,
[No_] varchar(20),
[Unit of Measure Code) varchar(20),
[Quantity] decimal(12,5),
[Scrap %] decimal(12,5),
[Parcent Qty] decimal(12,7)
)
SET @ItemNo =’8000000080′;

If (SELECT OBJECT_ID(‘tempdb..#temp1’)) IS NOT NULL
drop table #temp1;

If (SELECT OBJECT_ID(‘tempdb..#temp2’)) IS NOT NULL
drop table #temp2;

WITH PdBom_Item AS(
— 定位所有物料BOM表
SELECT BOMLine.[Production BOM No_],BOMLine.[Version Code],
BOMLine.Type,BOMLine.No_,BOMLine.[Unit of Measure Code],BOMLine.Quantity,BOMLine.[Scrap %],cast(1 as decimal(12,7)) as [Qty]
FROM [Cronus$Production BOM Line] BOMLine,[Cronus$ITEM] Item
WHERE
Item.[No_] =@ItemNo
AND BOMLine.[Production BOM No_] =Item.[Production BOM No_]
AND BOMLine.[Version Code] =”
AND BOMLine.Type=1

UNION ALL

— 递归成员
SELECT
BomList.[Production BOM No_],BomList.[Version Code],
BomList.Type,BomList.No_,BomList.[Unit of Measure Code],BomList.Quantity,BomList.[Scrap %] ,cast(B.Quantity as decimal(12,7)) as [Qty]
FROM [Cronus$Production BOM Line] BomList, PdBom_Item B,[Cronus$ITEM] Item
WHERE BomList.[Production BOM No_] = Item.[Production BOM No_]
AND Item.[No_] = B.[No_]
AND BomList.[Version Code]=”
AND BomList.Type=1
)
SELECT @ItemNo as [Item No_],* into #temp1 FROM PdBom_Item;

WITH PdBom_PD AS(
— 定位所有物料BOM表
SELECT BOMLine.[Production BOM No_],BOMLine.[Version Code],
BOMLine.Type,BOMLine.No_,BOMLine.[Unit of Measure Code],BOMLine.Quantity,BOMLine.[Scrap %],BOMLine.Quantity as [Qty]
FROM [Cronus$Production BOM Line] BOMLine,[Cronus$ITEM] Item
WHERE
Item.[No_] =@ItemNo
AND BOMLine.[Production BOM No_] =Item.[Production BOM No_]
AND BOMLine.[Version Code] =”
AND BOMLine.Type=2

UNION ALL

— 递归成员
SELECT
BomList.[Production BOM No_],BomList.[Version Code],
BomList.Type,BomList.No_,BomList.[Unit of Measure Code],BomList.Quantity,BomList.[Scrap %] ,B.Quantity as [Qty]
FROM [Cronus$Production BOM Line] BomList, PdBom_PD B
WHERE BomList.[Production BOM No_] = B.[No_]
AND BomList.[Version Code]=”
AND BomList.Type=2
)
SELECT @ItemNo as [Item No_],* into #temp2 FROM PdBom_PD;

select *,Quantity*Qty*((100+[Scrap %])/100) as [Std Consump] from #temp1
UNION ALL
SELECT *,Quantity*Qty*((100+[Scrap %])/100) as [Std Consump] FROM #temp2

分类: Uncategorized 标签:

申请工作表与计划工作表的差异

2015年1月20日 评论已被关闭

申请工作表功能只要标准License就能实现相应的功能,所以,他是系统提供的标准功能,对应2013后续版本,在Starter Pack版本基础上即可进行相关计算.
而如果我们还需要更加复杂的计划功能, 就需要购买计划工作表功能(对应2013后续版本,需要升级到Extended Pack才能具备此功能).

那么, 计划工作表和申请工作表有什么不同的功能呢?
Requisition worksheet is on the basic license … thus, it provides basic functionality. In the other hand, if you require more complex planning functionality, you should buy planning worksheet. And, what are these differences between Requisition and Planning Worksheets in terms of functionality? Lets find out this:

申请工作表:
Requisition Worksheet:
• It is included in the Business Essentials
• It is intended for replenishment of Purchase and/or Transfer orders
• It allows to run Regenerative Plan
• It sets Pegging info
• It is MRP focused

计划工作表
Planning Worksheet:
• It also allows replenishment of Production Orders
• It allows to run Regenerative Plan
• It sets Pegging info
• It is MRP and MPS focused
• It provides Planning warnings
• It is prepare for Net Change planning
• It has a Error Log
• And, it can interact with Requisition Worksheet by creating entries

分类: Manufacturing 标签:

简单跑MPS与MRP

2015年1月8日 评论已被关闭

要简单实现跑MPS与MRP. 步骤如下:

1. 通过SO,Forecast, 跑Low Code = 1的物料的MPS.
2. 得到具体的工单表. 这些工单都可以通过Order Tracking了解为何会产生.
主要计算日期:
“Due Date” = SO Line.”计划的交货日期” – MFG Setup.”Default Safety Lead Time”

3. 跑出MPS后, 就生成了Production Order. 这时已经完成工单计划.
4. 如果生产是多层生产, 并且是每一张工单的物料都是多层生产. 那么执行Production Order. Replan All Level. 得到下级工单.

如果生产是多层共用物料, 那么再按照MPS. 跑 Low Code>1的物料的MPS.

5. 这时已经得到所有刷新好的工单计划了. 这些工单计划的Order Tracking应该非常清晰的描述了为何做这份工单.

6. 开始跑MRP. 跑Purchase Item.

跑出的Purchase Item日期格式如下:
Due Date = 工单用料日期(销售日期) – Item.”Lead Calc Date” – “Inbound process”
(如果设置了Reorder Cycle, 则会将此期间内全部合并在一起)

采购量 = 工单用料量(销售量) – Item.Inventory + PO.”即将到货数量” -Item.”Safety Stock Quantity”

7. 通过跑出的Purchase建议, 可以看到Order Tracking.

分类: Manufacturing 标签:

NAV “core” Planning: CU 99000854: Planning states

2015年1月6日 评论已被关闭

NAV 生产计划”Core”代码. Codeunit 99000854

Why focusing Codeunit 99000854? If you interested on what is the logic behind NAV planning, you should look into this codeunit.

为什么要看Codeunit 99000854? 如果你对NAV计划的计算逻辑感兴趣, 你应该看看这些代码.
 
这些代码里面描述了在NAV中输入进行计划操作(参照”NAV Supply Planning White Paper”) 和计划是如何执行的. (=计划和申请工作表的执行).
This codeunit is the link between how NAV planning logic is written (= “NAV Supply Planning White Paper”) and how this logic is executed (=functionality around Planning and Requisition Worksheets).
 

Based on this, I will be posting a series of entries regarding how this CU 99000854 performs. Furthermore, this series on entries will:
– provide info about what are the demands taken into account during planning run
– understand what are the considered supplies in NAV
– identify the primary code related with the how NAV will treat demands and supplies (ie. will any of these be allowed to reschedule?)
– understand why priorities are needed when netting demands/supplies
– understand what is the forecast and blanket order consumption
– verify what is the planning flexibility flag in NAV

开始之前, 我们需要理解什么是NAV需求计划的需求类型. (demand = 需求) 
To start with, we will be understanding what are the demand types from a NAV planning engine perspective.

首先, 我们回顾基础介绍文档… 让我们看看”Supply Planning white Paper”对于Demand的定义.
First, lets review the foundation here … lets review what the “Supply Planning White Paper” mentions:


DEMAND AND SUPPLY: 需求和供应:
Demand is the common term used for any kind of gross demand, such as sales order and component need from a production order. In addition, the program allows more technical types of demand, such as negative inventory and purchase returns

Planning parameters and inventory levels are other types of demand …

检查CU99000854, 我们可以看到下面4种类型的需求: 
Checking the CU 99000854, what is a demand for NAV planning engine?
a. Sales Orders
b. Service Orders
c. Planned Production consumption
d. Transfer orders
 
The actual code to find the data considered as demand can be found on the DemandToInvProfile procedure in CU 99000854.
 
As an example …
a. sales orders are being considered as demands by using this query:

SalesLine.SETCURRENTKEY(Type,”No.”,”Variant Code”,”Drop Shipment”,”Location Code”,”Document Type”,”Shipment Date”);
SalesLine.SETFILTER(“Document Type”,’%1|%2′,SalesLine.”Document Type”::Order,SalesLine.”Document Type”::”Return Order”);
SalesLine.SETRANGE(Type,SalesLine.Type::Item);
SalesLine.SETRANGE(“No.”,Item.”No.”);
Item.COPYFILTER(“Location Filter”,SalesLine.”Location Code”);
Item.COPYFILTER(“Variant Filter”,SalesLine.”Variant Code”);
SalesLine.SETFILTER(“Outstanding Qty. (Base)”,’<>0′);
SalesLine.SETFILTER(“Shipment Date”,’>%1&<=%2′,0D,ToDate); …   b. service orders … … ServiceLine.SETCURRENTKEY(Type,"No.","Variant Code","Location Code","Posting Date"); ServiceLine.SETRANGE("Document Type",ServiceLine."Document Type"::Order); ServiceLine.SETRANGE(Type,ServiceLine.Type::Item); ServiceLine.SETRANGE("No.",Item."No."); Item.COPYFILTER("Location Filter",ServiceLine."Location Code"); Item.COPYFILTER("Variant Filter",ServiceLine."Variant Code"); ServiceLine.SETFILTER("Outstanding Qty. (Base)",’<>0′);
ServiceLine.SETFILTER(“Posting Date”,’>%1&<=%2′,0D,ToDate); …   c. production order consumption … … ReqLine.SETCURRENTKEY("Ref. Order Type","Ref. Order Status","Ref. Order No.","Ref. Line No."); ReqLine.SETRANGE("Ref. Order Type",ReqLine."Ref. Order Type"::"Prod. Order"); ProdOrderComp.SETCURRENTKEY("Item No.","Variant Code","Location Code",Status,"Due Date"); ProdOrderComp.SETRANGE("Item No.",Item."No."); Item.COPYFILTER("Location Filter",ProdOrderComp."Location Code"); Item.COPYFILTER("Variant Filter",ProdOrderComp."Variant Code"); ProdOrderComp.SETRANGE(Status,ProdOrderComp.Status::Planned,ProdOrderComp.Status::Released); ProdOrderComp.SETFILTER("Due Date",’>%1&<=%2′,0D,ToDate); …   and so on with other type of demands like planned consumption (check DemandToInvProfile procedure). 对于这些产生需求数据的查询, 我们需要分析他们使用的过滤条件. 比如: Sales line使用的是"Shipment Date" 小于等于计划的结束日期来过滤. 特别注意, 这里不考虑订单状态.  For any of these "queries", the exact filters used should be analyzed. For instance, sales line considered are those which have a shipment date equal or earlier than the planning ending date … regardless of the status in the sales order. 本文章介绍的下面代码不是为了读者的使用而制定,而是为了更好的测试和增加需求. This post is not for the reader to use the suggested code but to test it and enhance it as required. Yeap, this is a disclaimer so reader knows that testing should always be done. 所以, 下面代码尚未完成但是提供了一个比较好的思想来表示如何增强NAV的计划和Jobs的材料需求. Also, the below code is not completed but might provide a good idea on how to enhance NAV planning with Jobs material planning. What I would like to cover here is how to integrate MRP with Jobs so material required for jobs create action messages. Before that, we might need to refresh how CU99000854 determines where the demands are coming from. This was covered on my earlier post about CU 99000854 (Demand Types). As a remider, logic is on function DemandToInvProfile. Here it goes through the different types of demand (Service, Sales, Production, …) and make planning aware of them. Back to our topic, this same function is where we need to add code so MRP is aware that Job Planning Lines carry demands (material requirements). As an example, the piece of code we could consider is the following: // Copyright © Microsoft Corporation. All Rights Reserved. // This code released under the terms of the // Microsoft Public License (MS-PL, http://opensource.org/licenses/ms-pl.html.) … JobPlanningLine.SETCURRENTKEY(Type,”No.”,”Variant Code”,”Location Code”,”Planning Date”); JobPlanningLine.SETRANGE(Type,JobPlanningLine.Type::Item); JobPlanningLine.SETRANGE(“No.”,Item.”No.”); Item.COPYFILTER(“Location Filter”,JobPlanningLine.”Location Code”); Item.COPYFILTER(“Variant Filter”,JobPlanningLine.”Variant Code”); JobPlanningLine.SETFILTER(“Planning Date”,’>%1&<=%2',0D,ToDate); IF JobPlanningLine.FIND('-') THEN REPEAT InventoryProfile.INIT; InventoryProfile."Line No." := NextLineNo; InventoryProfile.TransferFromJobPlanningLine(JobPlanningLine); IF InventoryProfile.IsSupply THEN InventoryProfile.ChangeSign; InventoryProfile.INSERT; UNTIL JobPlanningLine.NEXT = 0; … What we are doing above is using the job planning lines of type "Item" to be considered as demand and use the planning date as due date for the demand. Going forward, reader could take it from here to finalize the development. Not sure if you are familiar with this. But, I believe it worths covering it … 计划执行的步骤: 1.初始化变量 InitVariables(InventoryProfile[1],ManufacturingSetup2,Item,TemplateName,WorksheetName,OrderDate,MPSPlanning); 2. 计算需求量InvProfileDemandtoInvProfile(InventoryProfile[1],Item,ToDate); 3. 计算预测消耗量ForecastConsumption(InventoryProfile[1],Item,OrderDate,ToDate); 4. 计算BlankedOrder消耗量BlanketOrderConsump(InventoryProfile[1],Item,ToDate); 5. 计算供应量SupplytoInvProfile(InventoryProfile[1],Item,ToDate); 6. 展开物料跟踪(UnfoldItemTracking(InventoryProfile[1],InventoryProfile[2]); 7. 查找组合需求FindCombination(InventoryProfile[1],InventoryProfile[2],Item); 8. 物料计划 PlanItem(InventoryProfile[1],InventoryProfile[2],OrderDate,ToDate); 9. 提交物料跟踪CommitTracking; 你有没有注意到NAV计划通过不同的阶段来实现这些计划的? 在PlanItem过程下的NextState选项变量StartOver,MatchDates,MatchQty,CreateSupply,ReduceSupply,CloseDemand,CloseSupply,CloseLoop StartOver MatchDates MatchQty CreateSupply ReduceSupply CloseDemand CloseSupply CloseLoop 所有上面的这些执行步骤都在PlanItem过程. 通过reordering Policy策略的不一致而执行的步骤将会不一致。 Have you ever realized NAV Planning goes through different steps or phases of the planning? StartOver, MatchDates, MatchQty, CreateSupply, ReduceSupply, CloseDemand, CloseSupply, CloseLoop. All these steps are being performed on the PlanItem procedure from CU99000854. The way planning goes through each of these steps depends on the reordering policy. 但基本上来说: But basically: 第一个状态是StartOver来确定任何进行后续的需求计划动作. IF DemandExists THEN //如果需求存在 IF Demand."Untracked Quantity" = 0 THEN //如果需求里面的未跟踪数量=0, 表示需求已经全部被计划所跟踪了. NextState := NextState::CloseDemand //则进入CloseDemand模块. 关闭需求 ELSE IF SupplyExists THEN //反之, 需求没有被跟踪完, 则检查供应是否存在 NextState := NextState::MatchDates //如果存在供应, 就检查供应的日期是否一致. 是否需要更改或提前 ELSE NextState := NextState::CreateSupply //反之, 则创建供应 ELSE IF SupplyExists THEN //如果供应存在 NextState := NextState::ReduceSupply //则进入减少供应 ELSE NextState := NextState::CloseLoop; //否则关闭循环. END; First state is StartOver which determines if there is any demand to plan for. If so, it try to determines if there is any supply. If this is the case, next state would be MatchDates. If no supply exists, next state would be CreateSupply. If there is no other demand to plan for, next state would be ReduceSupply (if any exists) or CloseLoop (to finalize the loop through all states). 在MatchDates这个环节, MatchDates state. This is about matching demand and supply dates to make sure that both can be plan together (ie. supply can be used to meet demand). If cannot be met, next state would be CreateSupply (another supply needs to be created). If it can, the existing untracked quantity in the supply needs to be reduced and state would be ReduceSupply. 在MatchQty这个环节 MatchQty state. If supply quantity is not enough, it needs to be closed (no more available) through 在CloseSupply这个环节 CloseSupply state. If this is a supply where quantity can be increased, then CloseDemand state can be next. 在CreateSupply这个环节 CreateSupply state. This is the step where supply will be created depending on the policy. 在ReduceSupply这个环节 ReduceSupply state. Here, the untracked (unnecessary) quantity will be reduced from the supply. Next state would be to close the supply. 在CloseDemand这个环节 CloseDemand state. In here, the demand will be closed which means that demand has been planned for. The next thing (state) to do here would be StartOver to start the planning of another demand. 在CloseSupply这个环节 CloseSupply state. This is similar than CloseDemand state but from the supply perspective. If supply has been entirely planned, another supply needs to be considered and StartOver state will be next. 在CloseLoop这个环节 CloseLoop state. This is where planning finalizes. Before doing that, it will determine if ROP has been crossed. If so, it will be planned for again by going through the StartOver state. 希望有人发现上面的信息非常有用. 思考在计划被确定前执行的这一系列步骤。这些顺序执行步骤在PlanItem过程中While Loop循环执行知道计划完毕为止。 Hopefully someone finds the above info useful. Think about a sequence of steps before plan can be considered as finalized. These sequences of steps are being done in the PlanItem procedure through a WHILE loop until plan is done.

分类: Uncategorized 标签: