工厂用的生产系统,代码是VB6.0的。现在有个报表需求。要求把生产各工序的数据在一行显示完。数据
库保存的各生产工序数据都是一个工序一行,所以大部分报表显示的格式都是按着工序排下去。一个工序
一行。类似如下表格:
工序1 | 投入 | 产出 | 人员 | 机器... |
工序2 | 投入 | 产出 | 人员 | 机器... |
工序3 | 投入 | 产出 | 人员 | 机器... |
工序4 | 投入 | 产出 | 人员 | 机器... |
工序5 | 投入 | 产出 | 人员 | 机器... |
工序6 | 投入 | 产出 | 人员 | 机器... |
现在要实现把所有工序都显示在一行
工序1 | 投入 | 产出 | 人员 | 机器 | 工序2 | 投入 | 产出 | 人员 | 机器... |
1、oracle数据库,写存储过程。接受产品类别(动态决定工序)和批号(实际走了哪些工序)。
返回所有工序以行显示的数据。如
批号,工序1,投入,产出,人员,机器,工序2,投入,产出,人员,机器
代码如下
create or replace procedure HORIZONTAL_DISPLAY_WIP_INFO
(vprod_pn IN VARCHAR2,
vlot_no IN VARCHAR2,
re_str OUT VARCHAR2 )
AS
tin_qty VARCHAR2(50);
tout_qty VARCHAR2(50);
yield VARCHAR2(6);
tmc_id VARCHAR2(20);
tin_user VARCHAR2(20);
tin_time VARCHAR2(50);
tout_time VARCHAR2(50);
cnt INTEGER;
CURSOR cur_proc IS SELECT proc_id FROM proc_seq
WHERE prod_pn=vprod_pn AND co_code='MEMS'
ORDER BY seq ;
cur_tmp cur_proc%ROWTYPE;
BEGIN
OPEN cur_proc;
re_str:=vlot_no||',';
LOOP
FETCH cur_proc INTO cur_tmp;
EXIT WHEN cur_proc%NOTFOUND;
SELECT COUNT(*)
INTO cnt
FROM test_info WHERE prod_pn=vprod_pn AND proc_id=cur_tmp.proc_id
AND lot_no=vlot_no;
IF cnt>0 THEN
SELECT nvl(in_qty,0),nvl(out_qty,0),round(nvl(out_qty*100/in_qty,0),2),nvl(mc_id,' '),nvl(in_user,' '),
to_char(nvl(in_time,SYSDATE),'MM/dd/yyyy HH:mm:ss'),to_char(nvl(out_time,SYSDATE),'MM/dd/yyyy HH:mm:ss')
INTO tin_qty,tout_qty,yield,tmc_id,tin_user,tin_time,tout_time
FROM test_info WHERE prod_pn=vprod_pn AND proc_id=cur_tmp.proc_id
AND lot_no=vlot_no;
re_str:=re_str||tin_qty||','||tout_qty||','||yield||','||tin_user||','||tmc_id||','||tin_time||','||tout_time||',';
END IF;
END LOOP;
--DBMS_OUTPUT.ENABLE (20000);
--dbms_output.put_line(re_str);
end HORIZONTAL_DISPLAY_WIP_INFO;
2、vb 调用oracle存储过程,得到数据。数据已逗号分隔,然后拆开为各个表格单元的值
Public Function sFillPorce(prod_pn As String, lot_no As String) As String
On Error GoTo ErrContinue
Dim result As String
Set adoCmd = New ADODB.Command
adoCmd.ActiveConnection = adoCn
adoCmd.CommandText = "HORIZONTAL_DISPLAY_WIP_INFO" '存储过程名
adoCmd.CommandType = adCmdStoredProc
adoCmd.Parameters.Append adoCmd.CreateParameter("vprod_pn", adVarChar, adParamInput, 50, prod_pn)
输入参数1
adoCmd.Parameters.Append adoCmd.CreateParameter("vlot_no", adVarChar, adParamInput, 30, lot_no)
输入参数2
adoCmd.Parameters.Append adoCmd.CreateParameter("re_str", adVarChar, adParamOutput, 10000, result)
输出参数,注意大小,太小会截断输出数据
adoCmd.Execute
sFillPorce = adoCmd("re_str") 获取输出数据
' MsgBox result '存储过程式的返回值
ErrContinue:
If Err.Number = 0 Then Exit Function
If Err.Number <> 0 Then MsgBox Err.Description & ", " & Err.source & ", " & Err.Number
sFillPorce = ""
End Function