For loop 在to表之间循环以在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

我正试图编写SAS代码来跟踪生产过程中原材料的状态。我有两个输入表:

这是物料表:

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语句从两个不同的位置读取用法——这是以下伪代码中的
链接
(think
GOSUB
-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可能对您很有用,您可以查看它是否可以满足您的需要。