unit frmGenKoopObj; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Data.DB, Vcl.Grids, Vcl.DBGrids, JvExDBGrids, JvDBGrid, RzTabs, Vcl.StdCtrls, RzCmboBx, Vcl.ComCtrls, ddPlugin_TLB, Vcl.Menus; type TformGenKoopObj = class(TForm) pnl1: TGridPanel; grdHlavicky: TJvDBGrid; pgCtrl: TRzPageControl; shHlavicky: TRzTabSheet; shNovaObj: TRzTabSheet; btnNovaObj: TButton; btnPrijem: TButton; btnReload: TButton; pnl2: TGridPanel; pnl3: TGridPanel; btnPolUloz: TButton; btnPolSmaz: TButton; GridPanel1: TGridPanel; Label1: TLabel; cbKooperanti: TRzComboBox; Label2: TLabel; dtPozadDodani: TDateTimePicker; btnNovaPol: TButton; edtBarcode: TEdit; grdNovePolozky: TJvDBGrid; lblTypKodu: TLabel; pMenu: TPopupMenu; pM1ZmenaMnoz: TMenuItem; N1: TMenuItem; pM1Smazat: TMenuItem; procedure edtBarcodeExit (Sender: TObject); procedure shNovaObjShow (Sender: TObject); procedure btnNovaPolClick (Sender: TObject); procedure cbKooperantiChange (Sender: TObject); procedure FormShow (Sender: TObject); procedure btnNovaObjClick (Sender: TObject); procedure btnPolSmazClick (Sender: TObject); procedure pM1SmazatClick(Sender: TObject); procedure pM1ZmenaMnozClick(Sender: TObject); procedure btnPolUlozClick(Sender: TObject); strict private function SumPolozkyDleDavky (const idDavky: integer): Extended; function SumPolozkyDlePrikazu (const idPrikaz: integer): Extended; procedure NactiKooperanty; public Helios: IHelios; typObj: integer; end; var formGenKoopObj: TformGenKoopObj; jsemKooperace, operUzavrena, skenPrikaz, skipMe: boolean; idDavka, idDavkaRodic, locIDDavka, locIDDavkaSelf, ksNaStrom, dokladPrP: integer; idKoopObj, idPrikaz, idKmen, idOperace, idKoop, idKoopNew, typOper, cOrgKooperant, stavVPr: integer; idKoopObjH: integer; numDavka, kodOp, kodKoop, radaPrikaz, mjDavky, rc, altPrP: string; ksSum, ks, ksZive: Extended; typSkenKod, typDavky: byte; aktCisOrgKoop, aktIdOrgKoop: integer; implementation uses System.RegularExpressions, System.StrUtils, System.DateUtils, dataMod, helUtils; {$R *.dfm} procedure TformGenKoopObj.NactiKooperanty; var lSQL: string; nazevOrg: string; i, ii, iLoop, cOrg: integer; begin if (idKoop=0) then begin if (idKoopObj>0) then lSQL := 'SELECT o.Nazev, h.CisloOrg FROM ' + tblKoopH + ' h JOIN ' + tblCOrg + ' o ON (o.CisloOrg=h.CisloOrg) WHERE h.ID=' + idKoopObj.ToString else lSQL := 'SELECT k.CisloOrg, o.Nazev FROM ' + dataMod.tblHDCKooperanti + ' k JOIN ' + tblCOrg + ' o ON (o.CisloOrg=k.CisloOrg)' + ' WHERE o.Stav=0 AND k.Aktivni=1 And k.Typ=1 ORDER BY o.Nazev'; end // idKoop=0 else lSQL := 'IF OBJECT_ID(N''dbo._hdc_TabCKoopCena'', N''U'') IS NOT NULL' + CRLF + ' SELECT o.Nazev, o.CisloOrg FROM ' + tblCisKoop + ' ck JOIN ' + tblCOrg + ' o ON (o.ID=ck.dodavatel) WHERE o.Stav=0 AND ck.ID=' + idKoop.ToString + CRLF + ' UNION ALL' + CRLF + ' SELECT o.Nazev, o.CisloOrg FROM dbo._hdc_TabCKoopCena ckc JOIN ' + tblCOrg + ' o ON (o.CisloOrg=ckc.CisloOrg) WHERE o.Stav=0 AND ckc.IDKooperace=' + idKoop.ToString + CRLF + ' ELSE' + CRLF + ' SELECT o.Nazev, o.CisloOrg FROM ' + tblCisKoop + ' ck JOIN ' + tblCOrg + ' o ON (o.ID=ck.dodavatel) WHERE o.Stav=0 AND ck.ID=' + idKoop.ToString; i := 0; ii := 0; iLoop := 0; cbKooperanti.Items.Clear; if (idKoopObj=0) then cbKooperanti.Items.Add ('-- Vyberte --'); with Helios.OpenSQL (lSQL) do if (RecordCount>0) then begin First; while not(EOF) do begin cOrg := FieldByNameValues('CisloOrg'); if (cOrg=cOrgKooperant) then ii := iLoop; nazevOrg := FieldByNameValues('Nazev'); cbKooperanti.Items.AddObject (cOrg.ToString + ' - ' + nazevOrg, TKooperant.Create (nazevOrg, cOrg, Helios) ); Inc (iLoop); Next; end; end; end; procedure TformGenKoopObj.pM1SmazatClick (Sender: TObject); begin if Helios.YesNo('Smazat položku?', false) then dataMod.dm.tblInsOperace.Delete; end; procedure TformGenKoopObj.pM1ZmenaMnozClick (Sender: TObject); var iBox: string; mn, mnOrig: Extended; begin mnOrig := dataMod.dm.tblInsOperace.FieldByName('Kusy').AsExtended; iBox := InputBox('Změna množství (bylo ' + mnOrig.ToString + ')', 'Nové množství', mnOrig.ToString); if not(TryStrToFloat(iBox, mn)) then mn := -1; if (mn>0) and (mn<=mnOrig) then begin try dataMod.dm.tblInsOperace.Edit; dataMod.dm.tblInsOperace.FieldByName('Kusy').AsExtended := mn; dataMod.dm.tblInsOperace.Post; except dataMod.dm.tblInsOperace.Cancel; end; end; end; procedure TformGenKoopObj.btnNovaObjClick (Sender: TObject); var lSQL, ozn: string; begin shNovaObj.TabVisible := true; pgCtrl.ActivePage := shNovaObj; shHlavicky.TabVisible := false; self.Invalidate; if (idKoopObjH=0) then begin ozn := InputBox('NOVÁ OJEDNÁVKA', 'Vaše označení:', ''); lSQL := 'INSERT ' + tblKoopH + ' (TypObj, DeviceID, BlokujeDevice, Oznaceni) SELECT ' + typObj.ToString + ', N' + ('H-' + Helios.LoginName).QuotedString + ', N' + ('H-' + Helios.LoginName).QuotedString + ', N' + ozn.QuotedString + CRLF + 'SELECT SCOPE_IDENTITY() AS newID'; with Helios.OpenSQL (lSQL) do idKoopObjH := FieldByNameValues('newID'); end; end; procedure TformGenKoopObj.btnNovaPolClick (Sender: TObject); begin typSkenKod := 1; kodOp := ''; ks := 0; ksZive := 0; ksSum := 0; idOperace := 0; idPrikaz := 0;; radaPrikaz := ''; lblTypKodu.Caption := 'Kód DÁVKY / PŘÍKAZU'; edtBarcode.Visible := true; self.ActiveControl := edtBarcode; end; procedure TformGenKoopObj.btnPolSmazClick (Sender: TObject); begin if Helios.YesNo('Opravdu smazat zadané položky ?', false) then begin dataMod.dm.tblInsOperace.EmptyDataSet; edtBarcode.Text := ''; cbKooperanti.Clear; cbKooperanti.Enabled := true; self.ActiveControl := dtPozadDodani; end; end; procedure TformGenKoopObj.btnPolUlozClick (Sender: TObject); var lSQL: string; i: integer; idH: integer; begin if (dataMod.dm.tblInsOperace.RecordCount>0) then begin // lSQL := 'DECLARE @idH INT' + CRLF + 'INSERT ' + tblKoopH + ' (TypObj, SkenPrikaz, ) ' dataMod.dm.tblInsOperace.First; while not(dataMod.dm.tblInsOperace.Eof) do begin end; end else Helios.Error(#1'Objednávka nemá žádné položky.'#1); end; function TformGenKoopObj.SumPolozkyDleDavky (const idDavky: integer): Extended; begin result := 0; end; function TformGenKoopObj.SumPolozkyDlePrikazu (const idPrikaz: integer): Extended; begin result := 0; end; procedure TformGenKoopObj.cbKooperantiChange (Sender: TObject); var k: TKooperant; begin if (cbKooperanti.ItemIndex>-1) then begin k := TKooperant (cbKooperanti.Items.Objects[cbKooperanti.ItemIndex]); aktCisOrgKoop := k.CisloOrg; aktIdOrgKoop := k.IdOrg; end else begin aktCisOrgKoop := -1; aktIdOrgKoop := -1; end; end; procedure TformGenKoopObj.edtBarcodeExit (Sender: TObject); var lSQL, bc: string; canCont: boolean; tempSum1, tempSum2, tempSum3: extended; begin canCont:= true; edtBarcode.Text := edtBarcode.Text.Trim; if (edtBarcode.Text<>'') then begin bc := edtBarcode.Text; if (typSkenKod=1) then begin if (bc.StartsWith('420')) then begin if not(bc.EndsWith('D')) then bc := bc + 'D'; if not(bc.StartsWith('D')) then bc := 'D' + bc; end; ksSum := 0; idDavka := 0; idDavkaRodic := 0; locIDDavka := 0; locIDDavkaSelf := 0; if (bc.StartsWith('V')) and (bc.EndsWith('P')) then begin idPrikaz := TRegEx.Replace(bc.Trim, '\D', '').ToInteger; lSQL := 'SELECT 1 FROM ' + tblVPr + ' WHERE ID=' + idPrikaz.ToString; if not (helUtils.sqlExistsTestGeneral (Helios, lSQL)) then idPrikaz := 0; if (idPrikaz>0) then begin if not (helUtils.sqlExistsTestGeneral (Helios, lSQL + ' AND StavPrikazu=30')) then begin Helios.Error (#1'Chyba: '#1 + 'výrobní příkaz není ve stavu Zadáno, NELZE použít'); idPrikaz := 0; idDavka := 0; end else begin typSkenKod := 2; kodOp := ''; ks := 0; ksZive := 0; idOperace := 0; radaPrikaz := ''; lblTypKodu.Caption := 'Kód OPERACE'; skenPrikaz := true; edtBarcode.Text := ''; self.ActiveControl := edtBarcode; end; end; // idPrikaz >0 end // bc.startsWith V + bc.EndsWith P else begin skenPrikaz := false; if (bc.StartsWith('D420')) and (bc.EndsWith('D')) then begin lSQL := 'SELECT ID, IDRodic FROM ' + dataMod.tblDavky + ' WHERE KodDavky2=N' + bc.QuotedString + ' ORDER BY Pozice'; with Helios.OpenSQL (lSQL) do begin locIDDavkaSelf := FieldByNameValues('ID'); idDavka := locIDDavkaSelf; idDavkaRodic := FieldByNameValues('IDRodic'); locIdDavka := idDavkaRodic; end; if (idDavka>0) then begin lSQL := 'SELECT 1 FROM ' + dataMod.tblDavky + ' d JOIN ' + tblVPr + ' p ON (d.IDPrikazVyssiVyssi=p.ID) WHERE p.StavPrikazu<>30 AND d.ID=' + idDavka.ToString; if (helUtils.sqlExistsTestGeneral (Helios, lSQL)) then begin Helios.Error (#1'V dávce se nachází předzpracovaný/ukončený příkaz, NELZE použít'#1); idDavka := 0; edtBarcode.Text := ''; self.ActiveControl := edtBarcode; end else begin lSQL := 'SELECT CONVERT(nvarchar, DruhDavky) + N''/'' + CONVERT(nvarchar, Rok) + N'' - '' + CONVERT(nvarchar, Cislo) FROM ' + dataMod.tblDavky + ' WHERE ID=' + helUtils.IfThenInt (idDavkaRodic>0, idDavkaRodic, idDavka).ToString; numDavka := helUtils.getHeliosStrVal (Helios, '', lSQL); kodOp := ''; ks := 0; ksZive := 0; ksSum := 0; idOperace := 0; idPrikaz := 0; radaPrikaz := ''; typSkenKod := 2; edtBarcode.Tag := 2; lblTypKodu.Caption := 'Kód OPERACE'; edtBarcode.Text := ''; self.ActiveControl := edtBarcode; end; end; // idDavka >0 end; // bc.startsWith D420 + bc.EndsWith D end; // not bc.startsWith V + bc.EndsWith P end // typSkenKod=1 else if (typSkenKod=2) then begin if (bc.StartsWith('A')) and (bc.EndsWith('B')) then begin jsemKooperace := false; ksSum := 0; ksZive := 0; lSQL := 'SELECT p.ID, p.IDPrikaz, p.Kusy_pozadovane-p.KusyVKoop AS kzZive, k.RegCis, vp.RadaPrikaz, p.Doklad, p.Alt, p.IDkooperace, p.typ, k.ID AS idKmen' + ', ck.Kod AS KodKoop, p.Splneno FROM ' + tblPrPost + ' p JOIN ' + tblVPr + ' vp ON (vp.ID=p.IDPrikaz) JOIN ' + tblKZ + ' k ON (k.ID=vp.IDTabKmen)' + ' JOIN ' + tblCisKoop + ' ck ON (ck.ID=p.IDKooperace) WHERE p.IDOdchylkyDo IS NULL AND p.Priorita=0 AND p.BarCode=N' + bc.QuotedString; if (idPrikaz>0) then lSQL := lSQL + ' AND p.IDPrikaz=' + idPrikaz.ToString; with Helios.OpenSQL(lSQL) do if (RecordCount>0) then begin First; while not(EOF) do begin canCont := true; ksZive := FieldByNameValues('kzZive'); idKmen := FieldByNameValues('idKmen'); typOper := FieldByNameValues('typ'); operUzavrena := FieldByNameValues('Splneno'); rc := FieldByNameValues('RegCis'); radaPrikaz := FieldByNameValues('RadaPrikaz'); dokladPrP := FieldByNameValues('Doklad'); altPrP := FieldByNameValues('Alt'); kodKoop := ''; idKoop := 0; jsemKooperace := (typOper=2); if (jsemKooperace) then begin idKoop := FieldByNameValues('IDkooperace'); kodKoop := FieldByNameValues('KodKoop'); NactiKooperanty; if (cbKooperanti.Items.Count=2) then begin cbKooperanti.ItemIndex := 1; cbKooperanti.Enabled := false; end; end; if not(jsemKooperace) then begin Helios.Error (#1'Naskenovaná operace není kooperace nebude do objednávky přidána'#1); canCont := false; skipMe := true; end; if (canCont) and (operUzavrena) then begin Helios.Error (#1'Naskenovaná kooperace je uzavřena, nebude do objednávky přidána'#1); canCont := false; skipMe := true; end; if (canCont) and (ksZive<=0) then begin Helios.Error (#1'Naskenovaná kooperace nemá živé kusy, nebude do objednávky přidána'#1); canCont := false; skipMe := true; end; if (canCont) then begin idOperace := FieldByNameValues('ID'); // idPrPostup if (idPrikaz=0) then idPrikaz := FieldByNameValues('IDPrikaz'); ksNaStrom := 1; mjDavky := ''; if (skenPrikaz) then begin lSQL := 'SELECT TOP(1) k.MJEvidence FROM ' + tblVPr + ' p JOIN ' + tblKZ + ' k ON (k.ID=p.IDTabKmen) WHERE p.ID=' + idPrikaz.ToString; mjDavky := helUtils.getHeliosStrVal (Helios, '', lSQL); end else begin mjDavky := helUtils.getHeliosStrVal (Helios, '', 'SELECT TOP(1) MJ FROM ' + tblDavky + ' WHERE ID=' + helUtils.IfThenInt (idDavkaRodic>0, idDavkaRodic, idDavka).ToString); ksZive := helUtils.getHeliosFloatVal (Helios, 0, 'SELECT SUM(Mnozstvi-MnozstviVKoop) FROM ' + tblDavky + ' WHERE IDDavkyHlavni=' + idDavka.ToString); end; if (mjDavky.ToLower='str') then ksNaStrom := helUtils.getHeliosIntVal (Helios, 0, 'SELECT ISNULL(dbo.ef_HDC_PocetKsNaStromek (' + idKmen.ToString + ', NULL, NULL, NULL, NULL), 0)'); if not(skenPrikaz) then ksZive := helUtils.getHeliosFloatVal (Helios, 0, 'SELECT SUM(MnozstviKs-OdvedenoKs-MnozstviVKoop) FROM ' + tblDavky + ' WHERE IDDavkyHlavni=' + idDavka.ToString); if (ksZive<=0) and not(skenPrikaz) then begin Helios.Error ('V dávce '#1 + numDavka + #1 + ' nezbývají na tuto operaci kusy.'); edtBarcode.Text := ''; canCont := false; skipMe := true; end else begin if not(skenPrikaz) then begin lSQL := 'SELECT p.StavPrikazu FROM ' + tblVPr + ' p JOIN ' + tblDavky + ' d ON (d.IDPrikaz=p.ID) WHERE d.IDDavkyHlavni=' + idDavka.ToString; stavVPr := helUtils.getHeliosIntVal (Helios, 0, lSQL); if (stavVPr<>30) then canCont := false; end; if not(canCont) then begin Helios.Error (#1'Ne všechny příkazy této dávky jsou ve stavu Zadáno, NELZE pokračovat.'#1); edtBarcode.Text := ''; skipMe := true; end else begin if (idKoopNew=0) and (idKoop>0) then idKoopNew := idKoop; radaPrikaz := helUtils.getHeliosStrVal (Helios, '', 'SELECT RadaPrikaz FROM ' + tblVPr + ' WHERE ID=' + idPrikaz.ToString); typDavky := 0; if (radaPrikaz.StartsWith('224')) then typDavky := 4; if not(skenPrikaz) then tempSum3 := SumPolozkyDleDavky (locIDDavkaSelf) else tempSum3 := SumPolozkyDlePrikazu (idPrikaz); skipMe := false; lSQL := 'SELECT SUM(Kusy_pozadovane-KusyVKoop)-' + tempSum3.ToString.Replace(',', '.') + ' FROM ' + tblPrPost + ' WHERE IDOdchylkyDo IS NULL AND Typ=2'; if not(skenPrikaz) then lSQL := lSQL + ' AND IDPrikaz IN (SELECT IDPrikazVyssiVyssi FROM ' + tblDavky + ' WHERE DruhDavky=4 And IDDavkyHlavni=' + idDavka.ToString + ')' else lSQL := lSQL + ' AND IDPrikaz=' + idPrikaz.ToString + ' AND ID=' + idOperace.ToString; lSQL := lSQL + ' AND IDkooperace=' + idKoop.ToString; if not(skipMe) then begin if not(dataMod.dm.tblKoopObjR.Active) then dataMod.dm.tblKoopObjR.Open; if not(dataMod.dm.tblInsOperace.Active) then dataMod.dm.tblInsOperace.Open; dataMod.dm.tblInsOperace.Append; try try dataMod.dm.tblInsOperace.FieldByName('IdPrPostup').AsInteger := idOperace; dataMod.dm.tblInsOperace.FieldByName('IDVPr').AsInteger := idPrikaz; dataMod.dm.tblInsOperace.FieldByName('Kusy').AsExtended := ksZive; dataMod.dm.tblInsOperace.FieldByName('RegCis').AsString := rc; dataMod.dm.tblInsOperace.FieldByName('RadaPrikaz').AsString := radaPrikaz; dataMod.dm.tblInsOperace.FieldByName('Doklad').AsInteger := dokladPrP; dataMod.dm.tblInsOperace.FieldByName('Alt').AsString := altPrP; dataMod.dm.tblInsOperace.FieldByName('KsNaStr').AsInteger := ksNaStrom; dataMod.dm.tblInsOperace.FieldByName('IDDavka').AsInteger := idDavka; dataMod.dm.tblInsOperace.FieldByName('IDDavkaRodic').AsInteger := idDavkaRodic; dataMod.dm.tblInsOperace.FieldByName('IDKooperace').AsInteger := idKoop; dataMod.dm.tblInsOperace.FieldByName('KodKoop').AsString := kodKoop; dataMod.dm.tblInsOperace.Post; edtBarcode.Text := ''; lblTypKodu.Caption := ''; except dataMod.dm.tblInsOperace.Cancel; end; finally end; end; end; end; end; Next; end; end; end; // bc.startsWith A + bc.EndsWith B end; // typSkenKod=2 end; // edtBarcode.Text end; procedure TformGenKoopObj.FormShow (Sender: TObject); begin pgCtrl.ActivePage := shHlavicky; shNovaObj.TabVisible := false; if not(dataMod.dm.tblKoopObjH.Active) then dataMod.dm.tblKoopObjH.Open; end; procedure TformGenKoopObj.shNovaObjShow (Sender: TObject); begin typSkenKod := 1; cOrgKooperant := -1; dtPozadDodani.Date := IncDay (DateOf(Now), 1); self.ActiveControl := dtPozadDodani; edtBarcode.Visible := false; end; end.