unit uSvcCustomSDG; interface uses System.Generics.Collections, System.DateUtils, System.SysUtils, JsonDataObjects, uSvc_Base, uSvc_ObehZbozi, uCommons, // kvuli EServiceException helTabsBIDs, uHeOObj_Base, uHeOObj_CustomSDG; const {$I globalConsts.inc} selSpecDoklSD = '(SELECT CisloOrg FROM ' + tblCOrg + ' WHERE ID=main.IDOrg) AS CisloOrg'; type TGatemaSDDokladService = class(TServiceBase) public function GetAll: TObjectList; function GetByParams (params: TDictionary): TObjectList; function GetByID (const AID: integer; const bezPolozek: boolean=false): TGatemaSDDoklad; function GetMeta: TJSONObject; end; TGatemaSDScanDataService = class(TServiceBase) public function GetByParams (params: TDictionary): TObjectList; function GetByID (const AID: integer): TGatemaSDScanData; function GetMeta: TJSONObject; end; TSDGPolozkaOZService = class(TPolozkaOZService) function GetByID (const AID: integer): TPohybOZ; end; implementation uses System.StrUtils, FireDAC.Stan.Option, FireDAC.Comp.Client, FireDAC.Stan.Param, MVCFramework.FireDAC.Utils, MVCFramework.DataSet.Utils, MVCFramework.Serializer.Commons; { TGatemaSDDokladService } function TGatemaSDDokladService.GetAll:TObjectList; var lSQL: string; begin lSQL:= 'SELECT ' + GetTabCols('dbo', tblGSDDoklady) + ' FROM ' + tblGSDDoklady + ' ORDER BY ID'; FDM.sqlQry1.Open(lSQL, []); result:= FDM.sqlQry1.AsObjectList; FDM.sqlQry1.Close; end; function TGatemaSDDokladService.GetByParams(params: TDictionary): TObjectList; var lSQL, where, odDatum, doDatum, sklad, formatX, druhPohybuZbo, strTemp: string; lQry: TFDQuery; datOd, datDo: TDateTime; id, iDZ, cnt, rNo: integer; jenSeznam: Boolean; d: TGatemaSDDoklad; dList: TObjectList; begin jenSeznam:= false; if (params.ContainsKey('seznam')) then jenSeznam:= true; formatX:= ''; if (params.ContainsKey('format')) then formatX:= params.Items['format']; if (formatX<>'') then begin end else begin if not(jenSeznam) then lSQL:= 'SELECT ' + GetTabCols('dbo', tblGSDDoklady, 'main', false) + IfThen(selSpecDoklSD<>'', ',' + selSpecDoklSD, '') + ' FROM ' + tblGSDDoklady + ' main' else lSQL:= 'SELECT main.ID, main.TypDokladu, main.PodtypDokladu, main.RadaDokladu, main.Sklad, main.RadaDokladuCil, main.SkladCil, main.IDDokZbo, main.IDDokZbo_New' + ', main.IDOrg' + IfThen(selSpecDoklSD<>'', ',' + selSpecDoklSD, '') + ', main.DatPorizeni, main.DatGenerovani, main.DatumPripadu, main.PopisDodavky' + ' FROM ' + tblGSDDoklady + ' main'; end; where:= ''; id:= 0; if (params.ContainsKey('id')) then if (params.Items['id']<>'') then if (params.Items['id']<>'0') then begin id:= params.Items['id'].ToInteger; where:= where + 'main.ID=' + id.ToString; end; if (params.ContainsKey('typDokladu')) then if (params.Items['typDokladu']<>'') then where:= where + IfThen(where<>'', ' AND ', '') + 'main.TypDokladu=N' + params.Items['typDokladu']; if (params.ContainsKey('druhPohybu')) then if (params.Items['druhPohybu']<>'') then where:= where + IfThen(where<>'', ' AND ', '') + 'main.DruhPohybuZbo=N' + params.Items['druhPohybu']; if (params.ContainsKey('sklad')) then if (params.Items['sklad']<>'') then where:= where + IfThen(where<>'', ' AND ', '') + 'main.Sklad=N' + params.Items['sklad'].QuotedString; if (params.ContainsKey('odDatum')) then if (params.Items['odDatum']<>'') then odDatum:= params.Items['odDatum']; if (odDatum<>'') then begin if (Length(odDatum)=8) then odDatum:= odDatum + '000000'; if (Length(odDatum)=10) then odDatum:= odDatum + '00'; odDatum:= MidStr(odDatum, 7, 2) + '.' + MidStr(odDatum, 5, 2) + '.' + LeftStr(odDatum, 4) + ' ' + MidStr(odDatum, 9, 2) + ':' + MidStr(odDatum, 11, 2) + ':' + MidStr(odDatum, 13, 2); if not(TryStrToDateTime(odDatum, datOd)) then datOd:= IncDay(Now, -180) end else datOd:= IncDay(Now, -180); if (params.ContainsKey('doDatum')) then if (params.Items['doDatum']<>'') then odDatum:= params.Items['doDatum']; if (doDatum<>'') then begin if (Length(doDatum)=8) then doDatum:= doDatum + '235959'; if (Length(doDatum)=10) then doDatum:= doDatum + '59'; doDatum:= MidStr(doDatum, 7, 2) + '.' + MidStr(doDatum, 5, 2) + '.' + LeftStr(doDatum, 4) + ' ' + MidStr(doDatum, 9, 2) + ':' + MidStr(doDatum, 11, 2) + ':' + MidStr(doDatum, 13, 2); if not(TryStrToDateTime(doDatum, datDo)) then datDo:= Now end else datDo:= Now; strTemp:= ''; if (odDatum<>'') then strTemp:= 'CONVERT(datetime, N' + FormatDateTime('dd.mm.yyyy', datOd).QuotedString + ',104)' else strTemp:= 'DATEADD(day, -1, GETDATE())'; where:= where + IfThen(where<>'', ' AND ', '') + 'main.DatPorizeni>=' + strTemp; if (doDatum<>'') then begin strTemp:= 'CONVERT(datetime, N' + FormatDateTime('dd.mm.yyyy', datDo).QuotedString + ',104)'; where:= where + IfThen(where<>'', ' AND ', '') + 'main.DatPorizeni<=' + strTemp; end; if (where<>'') then lSQL:= lSQL + ' WHERE ' + IfThen(id>0, 'main.ID=' + id.ToString, where); lSQL:= lSQL + ' ORDER BY main.ID'; lSQL:= lSQL.Replace('Gatema_SDDoklady.', 'main.'); lQry:= TFDQuery.Create(nil); try lQry.Connection:= FDM.sqlConn; lQry.FetchOptions.AutoClose:= false; lQry.FetchOptions.Mode:= fmAll; lQry.Open(lSQL); cnt:= lQry.RecordCount; if (cnt>0) then begin d:= TGatemaSDDoklad.Create; dList:= TObjectList.Create; try rNo:= 1; lQry.First; while (rNo<=cnt) do // nouzove reseni, lQry se po nacteni GetbyID sama uzavre !! begin lQry.RecNo:= rNo; iDZ:= lQry.FieldByName('ID').AsInteger; d:= self.GetByID(iDZ, jenSeznam); dList.Add(d); if not(lQry.Active) then lQry.Open; Inc(rNo); end; result:= dList; except on E:Exception do raise EServiceException.Create('Chyba načítání dokladu: ' + E.Message); end; end else raise EServiceException.Create('Vybraným podmínkám neodpovídá žádný naskenovaný doklad'); finally FreeAndNil(lQry); end; end; function TGatemaSDDokladService.GetByID (const AID: integer; const bezPolozek: boolean=false): TGatemaSDDoklad; var lSQL: string; p: TDictionary; ps: TGatemaSDScanDataService; lQry: TFDQuery; sqlConnX: TFDConnection; begin ps:= TGatemaSDScanDataService.Create(self.FDM); p:= TDictionary.Create; p.Add('iddoklad', AID.ToString); sqlConnX:= TFDConnection.Create(nil); sqlConnX.ConnectionDefName:= sqlPoolName; lSQL:= 'SELECT ' + GetTabCols('dbo', tblGSDDoklady, 'main', false) + IfThen(selSpecDoklSD<>'', ',' + selSpecDoklSD, '') + ' FROM ' + tblGSDDoklady + ' main WHERE main.ID=:ID'; lQry:= TFDQuery.Create(nil); try lQry.Connection:= sqlConnX; lQry.Open (lSQL, [AID]); lQry.First; if not(lQry.EOF) then begin result:= lQry.AsObject; if not(bezPolozek) then result.ScanData:= ps.GetByParams(p); end else raise EServiceException.Create('Naskenovaný doklad s ID ' + AID.ToString + ' nebyl nalezen.'); finally p.Free; ps.Free; FreeAndNil(lQry); end; sqlConnX.Close; sqlConnX.Free; end; function TGatemaSDDokladService.GetMeta: TJSONObject; var lSQL: string; lQry: TFDQuery; begin lSQL:= 'SELECT ' + GetTabCols('dbo', tblGSDDoklady, 'main', false) + IfThen(selSpecDoklSD<>'', ',' + selSpecDoklSD, '') + ' FROM ' + tblGSDDoklady + ' main WHERE 1=0'; lQry:= TFDQuery.Create(nil); // lQry.FetchOptions.AutoClose:= false; // lQry.FetchOptions.Mode:= fmAll; try lQry.Connection:= FDM.sqlConn; lQry.Open(lSQL); Result:= lQry.MetadataAsJSONObject(); finally lQry.Free; end; end; { TGatemaSDScanDataService } function TGatemaSDScanDataService.GetByID (const AID: integer): TGatemaSDScanData; var lSQL: string; lQry: TFDQuery; begin lSQL:= 'SELECT ' + GetTabCols('dbo', tblGSDScanData) + ' FROM ' + tblGSDScanData + ' WHERE ID=:ID'; lQry:= TFDQuery.Create(nil); try lQry.Connection:= FDM.sqlConn; lQry.Open(lSQL, [AID]); lQry.First; if not(lQry.EOF) then result:= lQry.AsObject else raise EServiceException.Create('Naskenovaná položka s ID ' + AID.ToString + ' nebyla nalezena.'); finally lQry.Free; end; end; function TGatemaSDScanDataService.GetMeta: TJSONObject; var lSQL: string; lQry: TFDQuery; begin lSQL:= 'SELECT ' + GetTabCols('dbo', tblGSDScanData) + ' FROM ' + tblGSDScanData + ' WHERE 1=0'; lQry:= TFDQuery.Create(nil); lQry.Connection:= FDM.sqlConn; lQry.FetchOptions.AutoClose:= false; lQry.FetchOptions.Mode:= fmAll; try lQry.Open(lSQL); Result:= lQry.MetadataAsJSONObject(); finally lQry.Free; end; end; function TGatemaSDScanDataService.GetByParams(params: TDictionary): TObjectList; var lSQL, where: string; id,idPZ, cnt, rNo: integer; lQry: TFDQuery; pList: TObjectList; p: TGatemaSDScanData; begin p:= TGatemaSDScanData.Create; pList:= TObjectList.Create; lSQL:= 'SELECT ' + GetTabCols('dbo', tblGSDScanData, '', false) + ' FROM ' + tblGSDScanData; where:= ''; id:= 0; if (params.ContainsKey('id')) then if (params.Items['id']<>'') then if (params.Items['id']<>'0') then begin id:= params.Items['id'].ToInteger; where:= where + 'ID=' + id.ToString; end; if (params.ContainsKey('iddoklad')) then if (params.Items['iddoklad']<>'') then where:= where + IfThen(where<>'', ' AND ', '') + 'IDDokladSD=' + params.Items['iddoklad']; if (where<>'') then lSQL:= lSQL + ' WHERE ' + IfThen(id>0, 'ID=' + id.ToString, where); lSQL:= lSQL + ' ORDER BY IDDokladSD, ID'; // lSQL:= lSQL.Replace('TabPohybyZbozi.', 'main.'); lQry:= TFDQuery.Create(nil); lQry.Connection:= FDM.sqlConn; lQry.FetchOptions.AutoClose:= false; lQry.FetchOptions.Mode:= fmAll; lQry.Open(lSQL); try cnt:= lQry.RecordCount; pList:= TObjectList.Create; try lQry.First; rNo:= 1; while (rNo<=cnt) do begin lQry.RecNo:= rNo; idPZ:= lQry.FieldByName('ID').AsInteger; p:= self.GetByID (idPZ); pList.Add(p); if not(lQry.Active) then lQry.Open; Inc(rNo); end; result:= pList; except on E:Exception do raise EServiceException.Create('Chyba načítání naskenované položky/položek dokladu: ' + E.Message); end; finally FreeAndNil(lQry); end; end; { TSDGPolozkaOZService } function TSDGPolozkaOZService.GetByID (const AID: Integer): TPohybOZ; begin result:= nil; end; end.