unit U_CPSQSMCK; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData, cxDataStorage, cxEdit, DB, cxDBData, StdCtrls, ExtCtrls, ADODB, DBClient, cxGridCustomPopupMenu, cxGridPopupMenu, cxGridLevel, cxGridCustomTableView, cxGridTableView, cxGridDBTableView, cxClasses, cxControls, cxGridCustomView, cxGrid, MovePanel, cxCheckBox, Menus, ComCtrls, BtnEdit, ShellAPI, cxTextEdit, cxLookAndFeels, cxLookAndFeelPainters, cxNavigator; type TfrmCPSQSMCK = class(TForm) ADOQueryTemp: TADOQuery; ADOQueryCmd: TADOQuery; DS_MainSel: TDataSource; CDS_MainSel: TClientDataSet; cxGridPopupMenu4: TcxGridPopupMenu; cxGrid3: TcxGrid; Tv3: TcxGridDBTableView; cxGridDBColumn4: TcxGridDBColumn; v3Column1: TcxGridDBColumn; cxGridLevel1: TcxGridLevel; v3Column2: TcxGridDBColumn; Panel2: TPanel; Label5: TLabel; Label4: TLabel; CKOrdNo: TEdit; SMID: TEdit; CRTime: TDateTimePicker; Button2: TButton; cxStyleRepository1: TcxStyleRepository; cxStyle1: TcxStyle; Label12: TLabel; CDS_Main: TClientDataSet; Button1: TButton; Label2: TLabel; Label3: TLabel; Edit1: TEdit; cxGrid1: TcxGrid; TV2: TcxGridDBTableView; cxGridDBColumn2: TcxGridDBColumn; cxGridDBColumn3: TcxGridDBColumn; cxGridDBColumn5: TcxGridDBColumn; cxGridDBColumn6: TcxGridDBColumn; cxGridLevel2: TcxGridLevel; V2Column1: TcxGridDBColumn; DS_FHSQ: TDataSource; CDS_FHSQ: TClientDataSet; cxGridPopupMenu1: TcxGridPopupMenu; Button3: TButton; CRType: TEdit; Label1: TLabel; Label6: TLabel; edtIsSMTH: TEdit; TV2Column1: TcxGridDBColumn; procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormDestroy(Sender: TObject); procedure FormShow(Sender: TObject); procedure SMIDKeyPress(Sender: TObject; var Key: Char); procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure TV2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Button3Click(Sender: TObject); procedure edtIsSMTHClick(Sender: TObject); private { Private declarations } FSMStr, JXFlag, FSubId, FAPBatchNo, FCarNo, isGX, FIsFJT: string; FFHPS, FSQPS: integer; procedure InitFHMX(); function CheckCkd(): Boolean; function CheckPB(): Boolean; function JudgeJTMCX(): Boolean; procedure SaveCKDataJTMCX(); procedure SaveCK(); procedure InitFHPS(); public { Public declarations } end; var frmCPSQSMCK: TfrmCPSQSMCK; implementation uses U_DataLink, U_Fun, MMSystem, U_FHSQListSel, U_PBKCListSel; //, U_CKProductBCPKCList //var // frmPBKCListSel: TfrmCKProductBCPKCListPB; {$R *.dfm} procedure TfrmCPSQSMCK.SaveCKDataJTMCX(); begin try ADOQueryCmd.Connection.BeginTrans; with ADOQueryCmd do begin Close; sql.Clear; sql.Add('exec P_Do_PBCK @CRFlag=''未出库'', @CKOrdNo=' + quotedstr(trim(CKOrdNo.Text)) + ', @MJID=' + quotedstr(trim(FSMStr)) + ', @DName=' + quotedstr(trim(DName))); ExecSQL; end; with ADOQueryCmd do begin Close; sql.Clear; sql.Add('exec P_Do_FHSQ ''' + Trim(CKOrdNo.Text) + ''''); ExecSQL; end; with ADOQueryCmd do begin Close; sql.Clear; sql.Add('insert into SY_SysLog(operor,opertime,Model,acction,opevent,result) values( '); sql.Add(' ' + quotedstr(trim(DName))); sql.Add(',getdate() '); sql.Add(',' + quotedstr('')); sql.Add(',' + quotedstr(trim('出库扫描撤销'))); sql.Add(',' + quotedstr('卷条码:' + trim(FSMStr) + ' 出库单号:' + trim(CKOrdNo.Text))); sql.Add(',' + quotedstr(trim('成功'))); sql.Add(')'); ExecSQL; end; ADOQueryCmd.Connection.CommitTrans; FFHPS := FFHPS - 1; except ADOQueryCmd.Connection.RollbackTrans; application.MessageBox('撤销出库失败!', '提示信息', 0); end; end; function TfrmCPSQSMCK.JudgeJTMCX(): Boolean; begin try if Trim(CKOrdNo.Text) = '' then raise Exception.Create('出库单号不能为空'); if CDS_MainSel.IsEmpty then raise Exception.Create('无可撤销的数据'); with ADOQueryTemp do begin Close; sql.Clear; sql.Add(' select A.SQPS,A.FHPS,B.* from FHSQ_Sub A'); sql.Add(' inner join CK_PBCP_CR B on A.MainId=B.MainId'); sql.Add(' where A.FSID=''' + Trim(CKOrdNo.Text) + ''''); sql.Add(' and B.CRFlag=''出库'' and B.MJID=''' + Trim(FSMStr) + ''''); // ShowMessage(sql.text); Open; end; if ADOQueryTemp.IsEmpty then begin raise Exception.Create('无可撤销的数据'); end else begin FSubId := ADOQueryTemp.fieldbyname('SubId').AsString; FSQPS := ADOQueryTemp.fieldbyname('SQPS').AsInteger; FFHPS := ADOQueryTemp.fieldbyname('FHPS').AsInteger; end; Result := True; except Result := false; PlaySound(PChar('wav\' + Exception(ExceptObject).Message + '.wav'), 0, SND_FILENAME or SND_ASYNC); end; end; procedure TfrmCPSQSMCK.InitFHPS(); begin with CDS_FHSQ do begin Locate('SubId;APBatchNo', VarArrayOf([Trim(FSubId), Trim(FAPBatchNo)]), []); Edit; FieldByName('FHPSHZ').Value := FFHPS; Post; Edit1.Text := IntToStr(FFHPS) end; end; procedure TfrmCPSQSMCK.SaveCK(); var maxno, SMFlag, KYCKFlag: string; FFQty: Integer; begin try ADOQueryCmd.Connection.BeginTrans; //如果是别的批号来凑数的,就把批号更新成要发货的批号,但是保留原批号,字段为WFB_MJJY_PB中的YuanAPBatchNo if isGX = '是' then begin with ADOQueryCmd do begin Close; sql.Clear; sql.Add('select top 1 isnull(APBatchNo,'''') AS APBatchNo from FHSQ_Sub where isnull(FHPS,0) < isnull(SQPS,0) and FSID =''' + Trim(CKOrdNo.Text) + ''''); sql.Add('and SubID=''' + Trim(FSubID) + ''''); // ShowMessage(sql.text); open; end; with ADOQueryTemp do begin Close; sql.Clear; sql.Add('UPDATE WFB_MJJY_PB set YuanAPBatchNo =isnull(APBatchNo,''''),APBatchNo=''' + Trim(ADOQueryCmd.fieldbyname('APBatchNo').AsString) + ''''); sql.Add('where MJID = ''' + Trim(FSMStr) + ''''); // ShowMessage(sql.text); ExecSQL; end; end; with ADOQueryCmd do begin Close; sql.Clear; sql.Add('exec P_Do_PBCK @CRFlag=''直接出库'', @CKOrdNo=' + quotedstr(trim(CKOrdNo.Text)) + ', @MJID=' + quotedstr(trim(FSMStr)) + ', @DName=' + quotedstr(trim(DName))); // ShowMessage(sql.text); ExecSQL; end; with ADOQueryCmd do begin Close; sql.Clear; sql.Add('exec P_Do_FHSQ ''' + Trim(CKOrdNo.Text) + ''''); // ShowMessage(sql.text); ExecSQL; end; ADOQueryCmd.Connection.CommitTrans; FFHPS := FFHPS + 1; PlaySound('wav\正确.wav', 0, SND_FILENAME or SND_ASYNC); Exit; except ADOQueryCmd.Connection.RollbackTrans; application.MessageBox('出库失败!', '提示信息', 0); PlaySound('wav\出库失败.wav', 0, SND_FILENAME or SND_ASYNC); end; end; function TfrmCPSQSMCK.CheckCkd(): Boolean; begin try if CKOrdNo.Text = Trim(FSMStr) then raise Exception.Create('重复扫描申请单!.wav'); with ADOQueryTemp do begin Close; sql.Clear; sql.Add('select * from FHSQ_MAIN A inner join FHSQ_Sub B on A.FSID=B.FSID where A.FSID=''' + Trim(FSMStr) + ''''); Open; end; if ADOQueryTemp.IsEmpty then begin raise Exception.Create('申请单不存在暂停发货.wav'); end else begin SCreateCDS20(ADOQueryTemp, CDS_FHSQ); SInitCDSData20(ADOQueryTemp, CDS_FHSQ); CKOrdNo.Text := Trim(FSMStr); CRType.Text := Trim(CDS_FHSQ.FieldByName('CRType').AsString); InitFHMX(); end; Result := True; except Result := false; // application.MessageBox(PChar(Exception(ExceptObject).Message), '提示信息', 0); PlaySound(PChar('wav\' + Exception(ExceptObject).Message + '.wav'), 0, SND_FILENAME or SND_ASYNC); end; end; function TfrmCPSQSMCK.CheckPB(): Boolean; begin try if Trim(CKOrdNo.Text) = '' then raise Exception.Create('未扫描申请单暂停发货'); with ADOQueryTemp do begin Close; sql.Clear; sql.Add(' select * from (select APID=SUBSTRING(OPEvent,4,13) from SY_Syslog where Acction =''作废布票'' and Operor <> ''ygname'' '); sql.Add(' )AA where APID = ''' + Trim(FSMStr) + ''''); Open; end; if ADOQueryTemp.IsEmpty = false then begin raise Exception.Create('布票已作废'); end; with ADOQueryTemp do begin Close; sql.Clear; sql.Add(' select * from JYCon_Sub_AnPai B '); sql.Add(' where B.APID=''' + Trim(FSMStr) + ''''); // showmessage(sql.text); Open; end; if ADOQueryTemp.IsEmpty then begin raise Exception.Create('条码错误'); end; with ADOQueryTemp do begin Close; sql.Clear; sql.Add(' select isnull(APBatchNo,'''') AS APBatchNo,A.*,B.* from WFB_MJJY_PB B inner join Cloth_Sub A on A.SubID =B.SubID '); sql.Add(' where B.MJID=''' + Trim(FSMStr) + ''''); // showmessage(sql.text); Open; end; if ADOQueryTemp.IsEmpty then begin raise Exception.Create('未检验'); end; if Trim(ADOQueryTemp.fieldbyname('MJStr2').AsString) = '未入库' then begin raise Exception.Create('未入库'); end; FSubId := Trim(ADOQueryTemp.fieldbyname('SubID').AsString); //获取这个布票的subid FAPBatchNo := Trim(ADOQueryTemp.fieldbyname('APBatchNo').AsString); //获取这个布票的批号 FCarNo := Trim(ADOQueryTemp.fieldbyname('CarNo').AsString); //获取这个布票的机台号 //查询这个subid在不在这个申请单里 with ADOQueryTemp do begin Close; sql.Clear; sql.Add(' select * from FHSQ_Sub '); sql.Add(' where FSID=''' + Trim(CKOrdNo.Text) + ''''); sql.Add(' and SubID=''' + Trim(FSubId) + ''''); Open; end; if ADOQueryTemp.IsEmpty then begin raise Exception.Create('产品编号错误'); end; with ADOQueryTemp do begin Close; sql.Clear; sql.Add(' select * from FHSQ_Sub '); sql.Add(' where FSID=''' + Trim(CKOrdNo.Text) + ''''); sql.Add(' and SubID=''' + Trim(FSubId) + ''''); sql.Add(' and isnull(APBatchNo,'''')=''' + Trim(FAPBatchNo) + ''''); // showmessage(sql.text); Open; end; if ADOQueryTemp.IsEmpty then begin //如果这个布票的批号没有在在要发货里 PlaySound(PChar('wav\批号不一致.wav'), 0, SND_FILENAME or SND_ASYNC); isGX := '否'; if Application.MessageBox('批号不一致,是否要出库?', '提示', 32 + 4) = IDYES then begin isGX := '是'; //要更新检验表中的批号 end else begin Result := false; Exit; end; //找一个同产品的没发全的别的申请 with ADOQueryCmd do begin Close; sql.Clear; sql.Add('select top 1 * from FHSQ_Sub where isnull(FHPS,0) < isnull(SQPS,0) and FSID =''' + Trim(CKOrdNo.Text) + ''''); sql.Add('and SubID=''' + Trim(FSubID) + ''''); // ShowMessage(sql.text); open; end; if ADOQueryCmd.IsEmpty then begin //找不到的话,就让发货匹数大于申请匹数,这样后面就会卡主,不给发货 FSQPS := 0; FFHPS := 1; end else begin //找的到的话,就是获取别的发货申请的申请匹数和发货匹数,为了不发多 FSQPS := ADOQueryCmd.fieldbyname('SQPS').AsInteger; FFHPS := ADOQueryCmd.fieldbyname('FHPS').AsInteger; FIsFJT := '否'; end; end else begin FSQPS := ADOQueryTemp.fieldbyname('SQPS').AsInteger; FFHPS := ADOQueryTemp.fieldbyname('FHPS').AsInteger; FIsFJT := Trim(ADOQueryTemp.fieldbyname('IsFJT').AsString); //是否分机台 end; if Trim(FIsFJT) = '是' then begin //查询一下这个出库单号第一次出库的机台号, with ADOQueryTemp do begin Close; sql.Clear; sql.Add(' select top 1 B.CarNo from CK_PBCP_CR A inner join WFB_MJJY_PB B on A.MJID =B.MJID '); sql.Add(' where A.SubId=''' + Trim(FSubId) + ''''); sql.Add(' and A.CKOrdNo=''' + Trim(CKOrdNo.Text) + ''''); sql.Add(' order by CRTime '); // showmessage(sql.text); Open; end; if (ADOQueryTemp.IsEmpty = False) and (Trim(ADOQueryTemp.fieldbyname('CarNo').AsString) <> FCarNo) then begin PlaySound(PChar('wav\机台号不一致.wav'), 0, SND_FILENAME or SND_ASYNC); if Application.MessageBox('机台号不一致,是否要出库?', '提示', 32 + 4) <> IDYES then begin Result := false; Exit; end; end; end; if FSQPS <= FFHPS then begin raise Exception.Create('超出发货上限暂停发货'); end; with ADOQueryTemp do begin Close; sql.Clear; sql.Add(' select C.CKOrdNo from FHSQ_Sub A'); sql.Add(' inner join WFB_MJJY_PB B on A.MainId=B.MainId'); sql.Add(' inner join CK_PBCP_CR C on B.MJID=C.MJID and C.CRFlag=''出库'' '); sql.Add(' where B.MJID=''' + Trim(FSMStr) + ''''); sql.Add(' and A.FSID=''' + Trim(CKOrdNo.Text) + ''''); // ShowMessage(SQL.text); Open; end; if ADOQueryTemp.IsEmpty = False then begin if Trim(ADOQueryTemp.fieldbyname('CKOrdNo').AsString) = Trim(CKOrdNo.Text) then begin raise Exception.Create('已扫描'); end else begin raise Exception.Create('已出库暂停发货'); end; end; Result := True; except Result := false; // application.MessageBox(PChar(Exception(ExceptObject).Message), '提示信息', 0); PlaySound(PChar('wav\' + Exception(ExceptObject).Message + '.wav'), 0, SND_FILENAME or SND_ASYNC); end; end; procedure TfrmCPSQSMCK.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caFree; end; procedure TfrmCPSQSMCK.FormDestroy(Sender: TObject); begin frmCPSQSMCK := nil; end; procedure TfrmCPSQSMCK.FormShow(Sender: TObject); begin SMID.SetFocus; ReadCxGrid('扫描出库', Tv3, '坯布仓库'); CRTime.DateTime := SGetServerDate(ADOQueryTemp); end; procedure TfrmCPSQSMCK.InitFHMX(); var MFHPS: integer; begin if CDS_FHSQ.IsEmpty then Exit; with ADOQueryTemp do begin Close; sql.Clear; sql.Add('select B.* '); sql.Add(' from CK_PBCP_CR A'); sql.Add(' inner join WFB_MJJY_PB B on A.MJID=B.MJID'); sql.Add(' where A.CKOrdNo=' + quotedstr(Trim(CKOrdNo.Text))); sql.Add(' and A.SubId=' + quotedstr(Trim(CDS_FHSQ.FieldByName('SubId').AsString))); sql.Add(' and isnull(B.APBatchNo,'''')=' + quotedstr(Trim(CDS_FHSQ.FieldByName('APBatchNo').AsString))); // ShowMessage(sql.Text); Open; end; SCreateCDS20(ADOQueryTemp, CDS_MainSel); SInitCDSData20(ADOQueryTemp, CDS_MainSel); if CDS_MainSel.IsEmpty = False then MFHPS := Tv3.DataController.Summary.FooterSummaryValues[0] else MFHPS := 0; Edit1.Text := IntToStr(MFHPS); with CDS_FHSQ do begin Edit; FieldByName('FHPS').Value := MFHPS; end; end; procedure TfrmCPSQSMCK.SMIDKeyPress(Sender: TObject; var Key: Char); begin if Key = #13 then begin FSMStr := Trim(SMID.Text); SMID.Text := ''; if edtIsSMTH.Text = '' then begin if Copy(FSMStr, 1, 2) = 'CK' then begin if CheckCkd() then begin end; end else begin if CheckPB() then begin SaveCK(); InitFHPS(); InitFHMX(); end; end; end else begin if JudgeJTMCX() then //检测卷条码 SaveCKDataJTMCX(); InitFHPS(); InitFHMX end; end; end; procedure TfrmCPSQSMCK.Button2Click(Sender: TObject); begin Close; WriteCxGrid('扫描出库', Tv3, '坯布仓库'); end; procedure TfrmCPSQSMCK.Button1Click(Sender: TObject); var MKey: Char; begin MKey := #13; try frmFHSQListSel := TfrmFHSQListSel.Create(self); with frmFHSQListSel do begin if ShowModal = 1 then begin SMID.Text := Trim(Order_Main.fieldbyname('FSID').AsString); SMIDKeyPress(SMID, MKey); end; end; finally frmFHSQListSel.Free; end; end; procedure TfrmCPSQSMCK.TV2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin InitFHMX(); end; procedure TfrmCPSQSMCK.Button3Click(Sender: TObject); var MKey: Char; begin MKey := #13; if TRIM(SELF.CKOrdNo.Text) = '' then EXIT; try frmPBKCListSel := TfrmPBKCListSel.Create(self); with frmPBKCListSel do begin FCKOrdNo := trim(CKOrdNo.text); if ShowModal = 1 then begin while frmPBKCListSel.CDS_Main.Locate('SSel', true, []) do begin self.SMID.Text := Trim(CDS_Main.Fieldbyname('MJID').AsString); self.SMIDKeyPress(self.SMID, MKey); frmPBKCListSel.CDS_Main.Delete; sleep(500); end; end; end; finally frmPBKCListSel.Free; end; end; procedure TfrmCPSQSMCK.edtIsSMTHClick(Sender: TObject); begin SMID.SetFocus; if edtIsSMTH.Text = '√' then begin edtIsSMTH.Text := ''; end else begin if Application.MessageBox('确定要扫描退货吗?', '提示', 32 + 4) = IDYES then edtIsSMTH.Text := '√'; end; end; end.