Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于SAS约束修改生产目标列表_Sas - Fatal编程技术网

基于SAS约束修改生产目标列表

基于SAS约束修改生产目标列表,sas,Sas,我有一个生产目标清单。这是数据 数据目标 输入产品$w1 w2 w3 w4 w5 卡片 A 800 400 200 400 100 B 300 400 200 100 C 50 25 25 ) 运行 现在,我需要做的是根据生产是否因某种原因停止重新分配目标。例如,如果工厂在第1周关闭,则我无法生产800 As、300 Bs和50 Cs。现在我无法在第二周弥补所有损失的生产力,只有50%。o、 因为我在第一周需要800个,所以我将在第二周做400个(以及我在第二周已经安排好的),在第三周做同样的事

我有一个生产目标清单。这是数据

数据目标

输入产品$w1 w2 w3 w4 w5

卡片

A 800 400 200 400 100

B 300 400 200 100

C 50 25 25

)

运行

现在,我需要做的是根据生产是否因某种原因停止重新分配目标。例如,如果工厂在第1周关闭,则我无法生产800 As、300 Bs和50 Cs。现在我无法在第二周弥补所有损失的生产力,只有50%。o、 因为我在第一周需要800个,所以我将在第二周做400个(以及我在第二周已经安排好的),在第三周做同样的事情。所以我希望我的新目标是

产品w1 w2 w3 w4 w5

A 0 800 600 400 100

b05550350100100

C05025025

因此,我将在接下来的两周内重新分配目标,每周占第一周目标的50%

我尝试了不同的方法来实现这一点,但在语法方面没有任何进展


顺便说一下,我是SAS。我愿意用不同的方法来实现这一点。

更有趣的问题是,如何传达W1值以及对程序的更改。将ds1转换为ds2的问题很简单,如何解决它与更大的问题有关

实现这一点的一个好方法是使用带有适合您需要的参数的宏。一个例子:

%macro fix_goals(week=,newweek=,percent=50,max=constant(big)); *max set arbitrarily high if not used;
adjusted = min(&newweek.+(&week.*&percent.),&max.); *assumes MAX is the maximum it could accomplish in a week including both the old target and the new target;
&week.=&week.-(adjusted-&newweek.); *how much was added;
&newweek.=adjusted;
%mend fix_goals;
然后:


您可以通过许多类似的方式来实现这一点,具体取决于标准以及您希望如何将更改传达给程序。如果你总是在接下来的两周内把时间精确到50/50,那么上面的内容会比需要的稍微复杂一些(但会按照书面形式完成)

乔,我相信这正是我需要的。不过,我得到了一个错误代码:“所有位置参数必须在关键字参数之前。”您是否能够在没有此错误消息的情况下获得所需的输出?
newweek
需要一个
=
-通过编辑在答案中进行修复。此外,百分比需要小于1。非常感谢你,乔。这真是太棒了……优雅实用。荣誉
data want;
set have;
%fix_goals(week=w1,newweek=w2,percent=50);
%fix_goals(week=w1,newweek=w3,percent=100); *the rest;
run;