Úpravy/doplnění min.množství pro příslušný sklad |
Top Previous Next |
Seznam témat:
Jedná se o dva skripty, z nichž jeden vytvoří xls, v něm je možno provést úpravy/doplnění minimální množství pro příslušný sklad a druhý pak naimportuje zpět do db
Prodej a simulace nim. množství { Skript slouží k vytvorení xls souboru s položkama dle vybraného druhu. U položek jsou dopocteny výdeje na všech skladech dohromady (mimo prevody) a to v obdobích: - posledních 12 mesícu, - 3 mesícu - v období pred 9 až 11 mesíci Dále je uveden stav na sklade dle výberu, stav na všech skladech dohromady V posledním žlutém sloupci je možno doplnit minimální množství které lze naimportovat jiným skriptem Odladeno na verzi MSExcel2007 }
var Excel: Variant; WorkBook: Variant; WorkSheet: Variant; CellTL,CellBR :Variant; tmpfile,FName: string; Qry: TQuery; i,Row,Col: integer; WaitBox: TProgress;
s,ico,sklad,druh : String; multi,mesic,rok,den,pocetradku : Integer; obd : TDateTime; skonto : Double ; begin
sklad := LookupBox('Vyberte sklad pro zjištení stavu','id_sklad','select id_sklad,nazev from dba.osklady where pouz=1 order by 1',nil); druh := LookupBox('Vyberte druh skladových položek','id_druh','select id_druh,nazev from dba.omdruh order by 1',nil); //Vyexportuj šablonu a otevri ji a uklid // tmpfile := ExportDocument('Šablony\Šablona_skonto.xls',GetTempPath); //inicializuj Excel try Excel := CreateOLEObject('Excel.Application'); //príprav sheet // WorkBook := Excel.WorkBooks.Open(tmpfile); WorkBook := Excel.WorkBooks.Add; WorkSheet := WorkBook.WorkSheets[1]; CellTL.create(nil); CellBR.create(nil); DeleteFile(tmpfile); except ErrorBox('Na této stanici není instalován MS Excel.'); Exit; end;
WaitBox := TProgress.CreateSimple('Export do XLS','Probíhá export. Prosím, cekejte...'); //priravit tmp tabulku a do ní vložit položky a jejich výdeje try ExecSQL('drop table #polozky',nil); except end; // založit tmp table s := 'create local temporary table #polozky(mat material_,nazev char(255),V12m float,V03m float,V09_10_11m float,nasklade float,navsech float, primary key(mat)) on commit preserve rows'; ExecSQL(s,nil); // naplnit položkama s := ' insert into #polozky on existing skip '+ ' select mat=id_material,nazev,V12m=.0,V03m=.0,V09_10_11m=.0,nasklade=.0,navsech=.0 from dba.omater where druh_id=:p0 and vobj=0'; ExecSQL(s,[druh]);
// nyní update výdeju s := 'insert into #polozky on existing update '+ ' select id_material, o.nazev, '+ ' V12m = sum((1-2*v.druhdokl)*(1-2*v.storno)*v.mnoz), '+ ' V03m = sum((1-2*v.druhdokl)*(1-2*v.storno)*if datediff(month,h.datprip,now())<=3 then v.mnoz else 0 endif), '+ ' V09_10_11m = sum((1-2*v.druhdokl)*(1-2*v.storno)*if datediff(month,h.datprip,now())between 9 and 11 then v.mnoz else 0 endif), '+ ' nasklade = omater_getnasklade(:p0,id_material), '+ ' navsech = isnull((select sum((1-2*pp.storno)*(1-2*pp.druhdokl)*(pp.mnoz-pp.mnozvydano)) from dba.osklprijemit pp where pp.material_id=o.id_material and vydano=0),0) '+ 'from dba.omater o, dba.osklvydejit v, dba.udokhd h '+ 'where id_material=v.material_id '+ ' and h.obd=v.obd_id and h.age=v.age_id and h.rada=v.rada_id and h.id_dokl=v.dokl_id '+ ' and not exists(select * from dba.osklprijemit p where p.vydejdata_id=v.data_id and p.vydejporadi_id=v.id_poradi) '+ ' and datediff(month,h.datprip,now())between 1 and 12 '+ ' and o.druh_id=:p1 '+ 'group by id_material, o.nazev'; ExecSQL(s,[sklad,druh]);
try //otevri dataset a zapiš do XLS všechny rádky a sloupce Qry := TQuery.Create(nil); try Qry.DatabaseName := DefaultDatabaseName; Qry.SQL.Add('select * from #polozky order by mat');
Qry.Open;
//do prvního rádku v XLS zapiš názvy polí for Col := 1 to Qry.FieldCount do begin WorkSheet.Cells(1, Col) := Qry.Fields[Col-1].FieldName; WorkSheet.Cells(1, Col).Font.Bold := True; end;
WorkSheet.Cells(1, Col+1) := 'Avg12'; WorkSheet.Cells(1, Col+2) := 'Avg03'; WorkSheet.Cells(1, Col+3) := 'Avg09_11'; WorkSheet.Cells(1, Col+4) := 'PrumVýdej'; WorkSheet.Cells(1, Col+5) := 'Min.Množství'; WorkSheet.Cells(1, Col+1).Font.Bold := True; WorkSheet.Cells(1, Col+2).Font.Bold := True; WorkSheet.Cells(1, Col+3).Font.Bold := True; WorkSheet.Cells(1, Col+4).Font.Bold := True; WorkSheet.Cells(1, Col+5).Font.Bold := True;
//do dalších rádku zapiš hodnoty datasetu Row := 2; pocetradku := 0; while not Qry.Eof do begin for Col := 1 to Qry.FieldCount do begin if Col=1 then WorkSheet.Cells(Row, Col).NumberFormat := '@'; // první sloupec naformátuje jako text i císlo... WorkSheet.Cells(Row, Col) := Qry.Fields[Col-1].Value; end;
With Worksheet do begin Cells(Row,Col+1).FormulaR1C1 := '=+RC[-5]/12'; Cells(Row,Col+2).FormulaR1C1 := '=+RC[-5]/3'; Cells(Row,Col+3).FormulaR1C1 := '=+RC[-5]/3'; Cells(Row,Col+4).FormulaR1C1 := '=AVERAGE(RC[-3]:RC[-1])'; end; Inc(Row); Inc(pocetradku); Qry.Next; end; finally Row := Row-1; Qry.Free; end; finally WaitBox.Free; end;
/////////////////////////////////////// //Nafornátuj worksheet
// Nastav šírky sloupcú //Worksheet.Columns('E').ColumnWidth := 25; Worksheet.Columns('A:L').EntireColumn.AutoFit; // roztáhne sloupce na potrebnou šírku
// Nakreslit ohranicení { Enumerace pro excel 2007 Bordes xlDiagonalDown 5 Border running from the upper left-hand corner to the lower right of each cell in the range. xlDiagonalUp 6 Border running from the lower left-hand corner to the upper right of each cell in the range. xlEdgeLeft 7 Border at the left-hand edge of the range. xlEdgeTop 8 Border at the top of the range. xlEdgeBottom 9 Border at the bottom of the range. xlEdgeRight 10 Border at the right-hand edge of the range. xlInsideVertical 11 Vertical borders for all the cells in the range except borders on the outside of the range. xlInsideHorizontal 12 Horizontal borders for all cells in the range except borders on the outside of the range.
XlBorderWeight Enumeration - Specifies the weight of the border around a range. Name Value Description xlHairline 1 Hairline (thinnest border). xlMedium -4138 Medium. xlThick 4 Thick (widest border). xlThin 2 Thin.
XlLineStyle Enumeration Specifies the line style for the border. Name Value Description xlContinuous 1 Continuous line. xlDash -4115 Dashed line. xlDashDot 4 Alternating dashes and dots. xlDashDotDot 5 Dash followed by two dots. xlDot -4118 Dotted line. xlDouble -4119 Double line. xlLineStyleNone -4142 No line. xlSlantDashDot 13 Slanted dashes. } CellTL := Worksheet.Cells(1,1); // do CeellTL vloží objekt typy Worksheet.Cells - bunka A4 - oznacující TopLeft bunku CellBR := Worksheet.Cells(1,Col+5); // dtto pro BottomRight bunku WorkSheet.Range(CellTL,CellBR).Borders(9).LineStyle := 1; // první rádek orámuj zdola Worksheet.Range(CellTL,CellBR).Borders(9).Weight := 2; //.. tence
CellBR := Worksheet.Cells(Row,Col+5); // dtto pro BottomRight bunku WorkSheet.Range(CellTL,CellBR).Borders(7).LineStyle := 1; // 1 -> plné cáry WorkSheet.Range(CellTL,CellBR).Borders(8).LineStyle := 1; WorkSheet.Range(CellTL,CellBR).Borders(9).LineStyle := 1; WorkSheet.Range(CellTL,CellBR).Borders(10).LineStyle := 1; WorkSheet.Range(CellTL,CellBR).Borders(11).LineStyle := 1; WorkSheet.Range(CellTL,CellBR).Borders(7).Weight := 2; WorkSheet.Range(CellTL,CellBR).Borders(8).Weight := 2; WorkSheet.Range(CellTL,CellBR).Borders(9).Weight := 2; WorkSheet.Range(CellTL,CellBR).Borders(10).Weight := 2; WorkSheet.Range(CellTL,CellBR).Borders(11).Weight := 2;
// Podbarvení CellTL := Worksheet.Range('L2'); WorkSheet.Range(CellTL,CellBR).Interior.Color := 65535; // Oblast podbarví žlute
// naformátuj císla CellTL := Worksheet.Cells(2,3); // do CeellTL vloží objekt typy Worksheet.Cells - bunka A4 - oznacující TopLeft bunku CellBR := Worksheet.Cells(Row,Col+5); // dtto pro BottomRight bunku Worksheet.Range(CellTL,CellBR).NumberFormat := '# ### ##0,00';
// dpoln?hlavicku Worksheet.Rows('1:3').Insert; // na zacátek vloží 3 rádky With WorkSheet.Range('B1') do begin Value := 'Výpocet minimálního stavu pro sklad ' + sklad; Font.Bold := True; Font.Size := 14; end; With WorkSheet.Range('A2') do begin Value := 'Datum: '; Font.Bold := True; end; With WorkSheet.Range('B2') do begin Value := Date(); Font.Bold := True; end; With WorkSheet.Range('J2') do begin Value := 'Sklad: '; Font.Bold := True; end; With WorkSheet.Range('L2') do begin NumberFormat := '@'; Value := sklad; Font.Bold := True; Interior.Color := 65535; end;
//zeptej se na soubor a ulož sheet with TSaveDialog.Create(nil) do try DefaultExt := 'xls'; Filter := 'Soubory MS Excel|*.xls'; if Execute then begin FName := FileName; WorkBook.SaveAs(FName,56); //FileFormat:=xlExcel8 end; finally Free; end; //ukonci Excel Excel.Quit; //Oteri explorer v okne se souborem; if pocetradku > 0 then ShellExec('explorer',FName,False); end.
Import min. množství ( XLS ) { Import z Excelu: Slouží pro import min stavu ve sloupci L od rádku 5 na sklade uvedeném v bunce L2 Kódy položek jsou uvedeny ve sloupci A od rádku 5 Odladeno na verzi MSExcel2007 }
var Excel: Variant; WorkBook: Variant; WorkSheet: Variant; FName: string; Qry: TQuery; i,Row,Col: integer;
s,sklad,t,tt,ttt : String; multi,mesic,rok,den,pocetradku : Integer; obd : TDateTime;
Log: TProgressLog;
begin
//zeptej se na soubor a ulož sheet with TOpenDialog.Create(nil) do try DefaultExt := 'xls'; Filter := 'Soubory MS Excel|*.xls;*.xlsx'; if Execute then begin FName := FileName; end; finally Free; end;
//inicializuj Excel try try Excel := CreateOLEObject('Excel.Application'); //príprav sheet WorkBook := Excel.WorkBooks.Open(FName); WorkSheet := WorkBook.WorkSheets[1]; except ErrorBox('Na této stanici není instalován MS Excel.'); Exit; end;
sklad := WorkSheet.Range('L2').Value; if not YesNoBox('Chcete importovat minimální mnžství pro sklad: '+sklad+'?') then exit;
// Postupne naimportuj všechny minmnoz i := 5; s := 'insert into dba.ommnoz (mat, sklad, minmnoz) on existing update ' + 'select :p0,:p1,:p2 ';
Log := TProgressLog.Create('Cekejte', 'Probíhá Import');
While i <> 0 do begin if Worksheet.Cells(i,1).Value = '' then i:= 0 else begin try ExecuteSQL(s,[Worksheet.Cells(i,1).Value,Worksheet.Cells(2,12).Value,StrToFloat(Worksheet.Cells(i,12).Value)]); // Log.Write('Import z rádku' + IntToStr(i) + ' OK '); except Log.Write('Chyba pri importu z excelu na rádku ' + IntToStr(i)); end; Inc(i); end; end; Log.Finish;
finally //uvolni Log Log.Free; //ukonci Excel Excel.Quit; end; end.
Související témata. |