For loop 在to表之间循环以在SAS中创建第三个表
我正试图编写SAS代码来跟踪生产过程中原材料的状态。我有两个输入表: 这是物料表:For loop 在to表之间循环以在SAS中创建第三个表,for-loop,while-loop,sas,For Loop,While Loop,Sas,我正试图编写SAS代码来跟踪生产过程中原材料的状态。我有两个输入表: 这是物料表: MATERIAL AMOUNT FINISHED SCRAPPED NOT_STARTED A 500 0 0 0 A 500 0 0 0 B 500 0 0 0 B 50
MATERIAL AMOUNT FINISHED SCRAPPED NOT_STARTED
A 500 0 0 0
A 500 0 0 0
B 500 0 0 0
B 500 0 0 0
B 500 0 0 0
B 1250 0 0 0
B 750 0 0 0
C 500 0 0 0
C 500 0 0 0
C 500 0 0 0
C 500 0 0 0
C 500 0 0 0
这是用法表:
COMPANY AMOUNT TYPE
A 150 FINISHED
A 350 FINISHED
A 200 SCRAPPED
B 300 FINISHED
B 200 SCRAPPED
B 1000 FINISHED
C 1500 FINISHED
C 500 SCRAPPED
使用FIFO方法,我需要编写代码,将所有“金额”列分配给“已完成”、“已报废”和“未启动”三列,其中“未启动”是一个等于“金额-已完成-已报废”的计算字段
此实例的输出如下所示:
MATERIAL AMOUNT FINISHED SCRAPPED NOT_STARTED
A 500 500 0 0
A 500 0 200 300
B 500 300 200 0
B 500 500 0 0
B 500 500 0 0
B 1250 0 0 1250
B 750 0 0 750
C 500 0 0 0
C 500 500 0 0
C 500 500 0 0
C 500 500 0 0
C 500 0 500 0
我在VBA中使用以下代码完成了此操作:
y = 2
For x = 2 To raw_material
not_started = ws_raw_material.Cells(x, 7).Value
material = ws_raw_material.Cells(x, 1).Value
Do While not_started > 0 And material = ws_material_usage.Cells(y, 1)
If usage_amt = 0 Then
usage_amt = ws_material_usage.Cells(y, 5)
End If
If not_started + usage_amt >= 0 Then
ws_raw_material.Cells(x, 7) = usage_amt + not_started
If ws_material_usage.Cells(y, 4) = "SCRAPPED" Then
ws_raw_material.Cells(x, 6) = -usage_amt + ws_raw_material.Cells(x, 6).Value
Else: ws_raw_material.Cells(x, 5) = -usage_amt + ws_raw_material.Cells(x, 5).Value
End If
not_started = ws_raw_material(x, 7).Value
usage_amt = 0
y = y + 1
Else: ws_raw_material.Cells(x, 7) = 0
If ws_material_usage.Cells(y, 4) = "SCRAPPED" Then
ws_raw_material.Cells(x, 6) = remaining + ws_raw_material.Cells(x, 6).Value
Else: ws_raw_material.Cells(x, 5) = not_started + ws_raw_material.Cells(x, 5).Value
End If
redemp_amt = usage_amt + not_started
remaining = 0
End If
Loop
Next x
我需要SAS中的代码与希望在SAS中执行此操作的用户兼容。我花了数小时试图直接将其转换为SAS,但却陷入了循环和变量值更改中
我不需要任何人为我编写代码。我只是需要一些指导来帮助我像SAS程序员一样思考。有什么程序可以帮助你吗?我是否应该尝试在数据步骤中对循环进行编程?任何指导都会有所帮助 困难在于材料与公司的“多-多”对齐,不允许简单的合并 如果不为您编写代码,我将采用这种方法来模拟VBA解决方案
data stock; input
MATERIAL $ AMOUNT FINISHED SCRAPPED NOT_STARTED; datalines;
A 500 0 0 0
A 500 0 0 0
B 500 0 0 0
B 500 0 0 0
B 500 0 0 0
B 1250 0 0 0
B 750 0 0 0
C 500 0 0 0
C 500 0 0 0
C 500 0 0 0
C 500 0 0 0
C 500 0 0 0
run;
data usage; input
COMPANY $ AMOUNT TYPE; datalines;
A 150 FINISHED
A 350 FINISHED
A 200 SCRAPPED
B 300 FINISHED
B 200 SCRAPPED
B 1000 FINISHED
C 1500 FINISHED
C 500 SCRAPPED
run;
使用与VBA相同的循环将用法应用于股票,但是,使用独立的SET
语句推进用法。因为您的算法具有用法,所以读取流发生在开始(y=2)和内部(y=y+1),您必须使数据步骤使用一个SET语句从两个不同的位置读取用法——这是以下伪代码中的链接(thinkGOSUB
-ish)的作用
data ledger;
if _n_ = 1 then LINK GET_USAGE; * corresponds to retrieving data at (y,*) index data;
set stock; * corresponds to looping x and getting data at (x,*);
/*
... vba similar looping logic ...
... the (y,*) vba references can be changed to the variable names of data set usage ...
... use a LINK GET_USAGE at point where you would do a y=y+1 ...
*/
return; * goes back to top of data step, corresponds to getting next stock row, (or x loop increment);
get_usage:
set usage (rename=amount=amt_used); * gets values for company, amount and type;
* rename prevents variable name collision with stock data;
return;
run;
来自SAS文档
LINK语句
将程序执行立即定向到指定的语句标签,如果后跟RETURN语句,则将执行返回到LINK语句后面的语句
在表2上使用PROC TRANSPOSE生成一个宽表,然后可以在另一个表上合并。我不明白为什么成品/报废产品在不同的行中,但如果您需要这样做,您可以先将其更改为该格式,然后将其合并。PROC BOM可能对您很有用,您可以查看它是否可以满足您的需要。