面向对象划分--ERP销售订单、生产工单、料号

erp中,在接单生产或者备库生产中,生产工单和销售订单是有一一对应关系的。假设有一个需求,就是根据不同客户,列印不同的标签信息。也就是简单的标签系统,大概分析一下,需要哪些内容。
1、厂内料号的相关情况
2、工单上有这个料件的生产信息
3、由于生产的料件是要交到客户手里,为方便客户扫码入库,可能还有客户的一些信息
在我思考后,参考之前的面向过程程序,一个客户一段代码,修改不方便。尤其是对每个客户的差别部分,很容易修改出错。
我的划分为:
料号、批号、订单和工单。决定建立这4个类。
工单包含:料号和订单。
批号:可以查到生产的相关具体信息。
料号:厂内的料号由于也是遵循一定的原则,每一码都是有含义的。所以属性里面根据每一码获取不同的信息是可以的。由生产工单可以查到销售订单。所以客户料号的信息我也是放到这里的。所谓料号,就是包含厂内料号和客户料号的信息。
type
TPartNumber = class
private
partnumber:string;
grade:string;
specification:string;
ta_oeb01:string;
ta_oeb02:string;
function getsize():string;
function getsizemm():string;
function gethanliang():STRING;
function getname():string;
public
function getclothtype():string;
function getfirstpart():string;
function getsecondpart():string;
function getlastpart():string;
function getleixing():string;
function getgrade():string;
constructor Create(part:string;pgrade:string;pspecification:string;
pta_oeb01:string;pta_oeb02:string);
property sizeinch:string read getsize;
property sizemm:string read getsizemm;
property name:string read getname;
property hanliang:string read gethanliang;
property leixing:string read getleixing;
property pgrade:string read getgrade;
function ishf():Boolean;

end;
订单:就是客户代码,客户名称,客户料号和品名的一些信息。有人会说,为什么料号里面有,订单这里还有,是不是有问题。我的解释是,两个地方的客户料号信息不同。比如,料号里面,可以存储的是,根据不同
客户,厂内料号对应的客户那边的尺寸这些信息,订单中的就是客户料号的代码和品名这些具体的。因为厂里的料号,可能根据不同的客户,同一个料号,它的尺寸定义就是不同。可以把这个信息分开到料号中去。
type TCustOrder = class
private
m_custno:string;
m_custgrade:string;
m_custorder:string;
m_custpart:string;
function getcustno():string;
function getcustgrade():string;
function getcustorder():string;
function getcustpart():string;
public
constructor Create(pcustno:string;pcustgrade:string;pcustorder:string;pcustpart:string);
property custno:string read getcustno;
property custgrade:string read getcustgrade;
property custorder:string read getcustorder;
property custpart:string read getcustpart;
end;
工单:工单就很单纯了,因为很多信息都由料号和订单做了。我们的设计界面就是,输入生产工单,会去erp系统,查询其他料号和订单的信息。当然,在构造工单对象的时候,自然其他两个对象也会构造好。
type TWorkOrder = class
private
wpartnumber:TPartNumber;
wcustorder:TCustOrder;
function getpartnumber():TPartNumber;
function getcustorder():TCustOrder;
public
constructor Create(gdcode:string);
property partnumber:TPartNumber read getpartnumber;
property custorder:TCustOrder read getcustorder;
end;
批号:一个生产工单,可以生产很多批次,每个批次都有检验信息和具体的特性。所以我们默认带出最小批次的信息。比如:生产日期,取样时间,等级这些信息。
我们输入完工单,带出订单和料号信息后。默认是有一笔批号信息,每次从下拉框选择不同批号,和批号相关的信息就会变动。但是工单这些信息不同重新计算。
type TLotNo = class
private
llotno:TStringList;
lmfgdae:string;
lexpdate:string;
lrc:string;
lrf:string;
lgt:string;
lclass:string;
lsampletime:string;
lselected:string;
function getmfgdate():string;
function getexpdate():string;
function getrc():string;
function getrf():string;
function getgt():string;
function getclass():string;
function getsampletime():string;
function getlotno():TStringList;
function getlselected():string;
procedure setlselected(pselected:string);
public
constructor Create(pworkorderno:string);
procedure setotherlot();
property lotno:TStringList read getlotno;
property mfgdate:string read getmfgdate;
property expdate:string read getexpdate;
property rc:string read getrc;
property rf:string read getrf;
property gt:string read getgt;
property lotclass:string read getclass;
property sampletime:string read getsampletime;
property selected:string read getlselected write setlselected;
end;

每个类的实现:
constructor TPartNumber.Create(part:string;pgrade:string;pspecification:string;
pta_oeb01:string;pta_oeb02:string);
begin
partnumber:=part;
grade:=pgrade;
specification:=pspecification;
ta_oeb01:=pta_oeb01;
ta_oeb02:=pta_oeb02;
end;
function TPartNumber.getsize():string;
var
l_str:string;
begin
l_str:=getfirstpart;
if (l_str=’Q’) or (l_str=’P’)then
IF COPY(partnumber,10,1)=’1’ THEN
Result:=’49.8’
ELSE
IF COPY(partnumber,10,1)=’5’ THEN
Result:=’42.8’
ELSE
Result:=’ ’
ELSE
if (l_str=’N’) or (l_str=’M’)then
Result:=minint(ta_oeb01,2)+’G*’+minint(ta_oeb02,2)
else
Result:=Copy(partnumber,14,3);
end;
function TPartNumber.getsizemm():string;
var
l_str:string;
begin
l_str:=getfirstpart;
IF (l_str=’R’) or (l_str=’B’)THEN
BEGIN
if STRTOINT(COPY(partnumber,14,3))=496 then
Result:=’1259’
else
if STRTOINT(COPY(partnumber,14,3))=495 then
Result:=’1258’
else
if STRTOINT(COPY(partnumber,14,3))=428 then
Result:=’1088’
else
if STRTOINT(COPY(partnumber,14,3))=438 then
Result:=’1113’
else
Result:= FLOATTOSTR((STRTOFLOAT(sizeinch)*25.4));
end

  else
     IF (l_str='N')or(l_str='M') THEN
         begin
              Result:=inttostr(Round(StrToFloat(ta_oeb01)*25.4))
              +'G*'
              +inttostr(Round(StrToFloat(ta_oeb02)*25.4));
         end;

end;
function TPartNumber.getname():string;
begin
Result:=partnumber;
end;
function TPartNumber.getleixing():string;
begin
Result:=Copy(partnumber,4,4);
end;
function TPartNumber.getgrade():string;
var
l_grade:string;
begin
l_grade:=TRIM(COPY(grade,1,POS(‘-‘,grade)-1));
l_grade:=Copy(l_grade,1,2) + ‘-’ + Copy(l_grade,3,Length(l_grade));
Result:=l_grade;
end;
function TpartNumber.ishf():Boolean;
var
l_second:string;
begin

l_second:=getsecondpart();
IF (l_second=’1’)OR (l_second=’M’)OR (l_second=’J’)
OR (l_second=’L’)
THEN
Result:=True
else
Result:=False;
end;

function TPartNumber.getclothtype():string;

begin
Result:=Copy(partnumber,4,4);
end;
function TPartNumber.getfirstpart():string;

begin
Result:=Copy(partnumber,1,1);
end;

function TPartNumber.getsecondpart():string;

begin
Result:=Copy(partnumber,2,1);
end;
function TPartNumber.getlastpart():string;

begin
Result:=COPY(partnumber,Length(partnumber),1);
end;
function TPartNumber.gethanliang():string;
var
ss:Double;
firstpart,resincontent:string;
BEGIN
firstpart:=getfirstpart();
IF (firstpart=’P’) or (firstpart=’Q’) THEN
BEGIN
resincontent:=copy(partnumber,6,3);
END;
IF (firstpart=’R’) OR (firstpart=’N’)
OR (firstpart=’B’) OR (firstpart=’M’) THEN
BEGIN
resincontent:=COPY(partnumber,8,3);
END;
ss:=strtofloat(resincontent)/10;
result:= formatFloat(‘0.0’, ss);

end;
constructor TCustOrder.Create(pcustno:string;pcustgrade:string;pcustorder:string;pcustpart:string);
begin
m_custno:=pcustno;
m_custgrade:=pcustgrade;
m_custorder:=pcustorder;
m_custpart:=pcustpart;
end;
function TCustOrder.getcustno():string;
begin
Result:=m_custno;
end;
function TCustOrder.getcustorder():string;
begin
Result:=m_custorder;
end;
function TCustOrder.getcustgrade():string;
begin
Result:=m_custgrade;
end;
function TCustOrder.getcustpart():string;
begin
Result:=m_custpart;
end;
constructor TWorkOrder.Create(gdcode:string);
var
str:string;
begin
if trim(gdcode)<>” then
begin
STR:=’SELECT SFB01,SFB05,SFB08,SFB13,IMA02,IMA021,TA_IMA01,TA_IMA02,a.TA_OEB01,a.TA_OEB02,IMA18, ’
+ ’ a.OEA10,a.OEA04,a.TA_OEB10,a.OEB11 FROM SFB_FILE,IMA_FILE ,(SELECT oeb01,oeb03,oea10,oea04,ta_oeb10, ’
+ ’ oeb11,TA_OEB01,TA_OEB02 FROM oea_file,oeb_file WHERE oea01=oeb01 AND oeaconf=”Y”) a ’
+ ’ where a.OEB01(+)=SFB22 AND a.OEB03(+)=SFB221 AND IMA01=SFB05 AND SFB01=”’+trim(gdcode)+””;
OPEN_SQL(Frm_DM.TEMP,STR);
IF Frm_DM.TEMP.RecordCount=0 THEN
BEGIN
SHOWMESSAGE(‘工單號輸入有誤!’);
EXIT ;
END
else
begin
wpartnumber:=TPartNumber.Create(TRIM(Frm_Dm.TEMP.FIELDBYNAME(‘SFB05’).ASSTRING),
TRIM(Frm_Dm.TEMP.FIELDBYNAME(‘IMA02’).ASSTRING),
TRIM(Frm_Dm.TEMP.FIELDBYNAME(‘IMA021’).ASSTRING),
TRIM(Frm_Dm.TEMP.FIELDBYNAME(‘TA_OEB01’).ASSTRING),
TRIM(Frm_Dm.TEMP.FIELDBYNAME(‘TA_OEB02’).ASSTRING));

       wcustorder:=TCustOrder.Create(TRIM(Frm_Dm.TEMP.FIELDBYNAME('OEA04').ASSTRING),
                                     TRIM(Frm_Dm.TEMP.FIELDBYNAME('TA_OEB10').ASSTRING),
                                     TRIM(Frm_Dm.TEMP.FIELDBYNAME('OEA10').ASSTRING),
                                     TRIM(Frm_Dm.TEMP.FIELDBYNAME('OEB11').ASSTRING));
    end;

end;

end;
function TWorkOrder.getpartnumber():TPartNumber;
begin
Result:=wpartnumber;
end;
function TWorkOrder.getcustorder():TCustOrder;
begin
Result:=wcustorder;
end;

constructor TLotNo.Create(pworkorderno:string);
var
lsqlstr:string;
begin
lsqlstr:=’SELECT TC_SIA02 FROM TC_SIA_FILE,SHB_FILE WHERE SHB01=TC_SIA01 ’
+ ’ AND TC_SIA02 IS NOT NULL and SHB05=”’+pworkorderno+”’ order by TC_SIA02 ‘;
OPEN_SQL(Frm_Dm.TEMP,lsqlstr);
if Frm_Dm.TEMP.RecordCount<>0 then
begin
llotno:=TStringList.Create;
WHILE NOT Frm_Dm.TEMP.Eof DO
BEGIN
llotno.add(Frm_Dm.TEMP.FIELDBYNAME(‘TC_SIA02’).ASSTRING);
Frm_Dm.TEMP.Next;
END;
end;
end;
function TLotNo.getlotno():TStringList;
begin
Result:=llotno;
end;
function TLotNo.getmfgdate():string;
begin
lmfgdae:=getdate(lselected);
Result:=lmfgdae;
end;
function TLotNo.getexpdate():string;
begin
lexpdate:=DATETOSTR(IncMonth(strtodate(lmfgdae),3));
Result:=lexpdate;
end;
function TLotNo.getrc():string;
begin
Result:=lrc;
end;
function TLotNo.getrf():string;
begin
Result:=lrf;
end;
function TLotNo.getgt():string;
begin
Result:=lgt;
end;
function TLotNo.getclass():string;
begin
Result:=lclass;
end;
function TLotNo.getsampletime():string;
begin
Result:=lsampletime;
end;
function TLotNo.getlselected():string;
begin
Result:=lselected;
end;
procedure TLotNo.setlselected(pselected:string);
begin
lselected:=pselected;
end;
procedure TLotNo.setotherlot();
VAR
str1:string;
begin
str1:=’SELECT * FROM TC_SIA_FILE WHERE 0=0 ’
+’ AND substr(TC_SIA02,1,9) =”’+copy(lselected,1,9)+””;
open_sql(Frm_DM.temp,str1);
lrc:=minint(FLOATTOSTR(roundto((Frm_DM.temp.FIELDBYNAME(‘tc_sia171’).ASFLOAT
+Frm_DM.temp.FIELDBYNAME(‘tc_sia173’).ASFLOAT
+Frm_DM.temp.FIELDBYNAME(‘tc_sia175’).ASFLOAT)/3,-1)),1);
lgt:=FLOATTOSTR(ceil((Frm_DM.temp.FIELDBYNAME(‘tc_sia192’).ASFLOAT+Frm_DM.temp.FIELDBYNAME(‘tc_sia193’).ASFLOAT+
Frm_DM.temp.FIELDBYNAME(‘tc_sia195’).ASFLOAT+Frm_DM.temp.FIELDBYNAME(‘tc_sia196’).ASFLOAT+
Frm_DM.temp.FIELDBYNAME(‘tc_sia199’).ASFLOAT)/5));
lrf:=Frm_DM.temp.FIELDBYNAME(‘tc_sia183’).ASSTRING;
if Frm_DM.temp.FIELDBYNAME(‘tc_sia24’).ASSTRING=’A’ then
lclass:=’A+’
else if Frm_DM.temp.FIELDBYNAME(‘tc_sia24’).ASSTRING=’B’ then
lclass:=’A’;
lsampletime:=Frm_DM.temp.FIELDBYNAME(‘tc_sia23’).ASSTRING;
end;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值