Úpravy/doplnění min.množství pro příslušný sklad

Top  Previous  Next

Seznam témat:

řešení

 

Řešení

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.