Hromadná změna prodejních cen

Top  Previous  Next

Seznam témat:

řešení

 

Řešení

Skript pro hromadnou změnu prodejních cen. Nutná asociace skriptu k browseru skladových položek.

 

Skript se nejprve zeptá na procento navýšení ceny. Pak se vezmou všechny označené záznamy a u všech změní hodnota ve sloupci prodejní cena o zvolené procento (bez DPH i s DPH). Pokud se narazí na nulovou cenu, zobrazí název skladové položky a poslední nákupní cena a zeptá se uživatele na novou prodejní cenu. Všechny provedené změny se logují do jednoduchého reportu.

 

{

*************************************************

  Skript pro hromadnou změnu prodejní ceny

  (nutná asociace s browserem skladových položek)

*************************************************

}

 

//pomocné funkce

function DejNakupCenu(KodMat: string): double;

var

 V: Variant;

begin

 V := Query('select first i.nakupcena '+

                          'from DBA.osklprijemit as i, DBA.udokhd as u, DBA.osklprijemhd as h '+

                            'where '+

                            'i.material_id = :kodmat and '+

                            'i.zruseno = 0 and i.druhdokl = 0 and i.storno = 0 and i.prevedeno = 0 and i.mnoz > i.mnozstor and i.nakupcena > 0 and '+

                            'u.obd = i.obd_id and u.age = i.age_id and u.rada = i.rada_id and u.id_dokl = i.dokl_id and '+

                            'h.obd_id = i.obd_id and h.age_id = i.age_id and h.rada_id = i.rada_id and h.dokl_id = i.dokl_id and h.druhdokl = i.druhdokl '+

                            'order by u.datprip desc,i.id_poradi desc', [KodMat]);

 if V = Null then

   Result := 0 //artikl není v příjemkách

 else

   Result := V;

end;

 

function ZeptejSeNaCenu(NazevMat: string; var Cena: double): Boolean;

begin

 Result := InputBox('Nulová cena', Format('Artikl (%s) má nulovou prodejní cenu. Zvolte novou cenu na základě poslední nákupní ceny.', [NazevMat]), Cena);

end;

 

function DejSazbuDPH(KodDph: integer): integer;

begin

 Result := Query('select o_getsazbuDPH(:dph, null, null, null)', [KodDph]);

end;

 

//vlastní skript

var

 Qry: TQuery;

 KodDph: integer;

 KodMat,NazevMat: string;

 Proc: double;

 PrCena,PrCenasDPH: double;

 PrCenaNew,PrCenasDPHNew: double;

 Report: TProgressLog;

begin

 //zeptej se na procento navýšení

 if not InputBox('Změna prodejních cen', 'Navýšení ceny [%]', Proc) then Exit;

 Report := TProgressLog.Create('Změna prodejních cen', 'Probíhá změna prodejních cen');

 try

   Report.Write('Akce zahájena.');

   Report.Write('Kód; Název; Původní cena (bez DPH); Nová cena (bez DPH)');

   Report.Write('-------------------------------------------------------');

   //otevři dotaz nad množinou vybraných artiklů (#selrows)

   Qry := TQuery.Create(nil);

   try

     Qry.DatabaseName := DefaultDatabaseName;

     Qry.SQL.Add('select id_material, nazev, prcena, prcenasdph, dph from #selrows');

     Qry.Open;

     while not Qry.Eof do begin

       //získej data ze záznamu

       KodMat := Qry.Fields[0].AsString;

       NazevMat := Qry.Fields[1].AsString;

       PrCena := Qry.Fields[2].AsFloat;

       PrCenasDPH := Qry.Fields[3].AsFloat;

       KodDph := Qry.Fields[4].AsInteger;

   

       //pokud je prod. cena nulová, nabídni poslední nákupní cenu a zeptej se na prod. cenu

       if PrCena = 0 then begin

         PrCenaNew := DejNakupCenu(KodMat);

         if not ZeptejSeNaCenu(NazevMat, PrCenaNew) then Exit;

         PrCenasDPHNew := PrCenaNew*(1+DejSazbuDPH(KodDph)/100);

       end

       else begin

         //jinak přepočítej cenu

         PrCenaNew := PrCena*(1+Proc/100);

         PrCenasDPHNew := PrCenasDPH*(1+Proc/100);

       end;

   

       //aktualizuj cenu v databázi pro daný artikl

       ExecSQL('update dba.omater set prcena=:prcena, prcenasdph=:prcenasdph where id_material=:kodmat', [PrCenaNew, PrCenasDPHNew, KodMat]);

     

       Report.Write(Format('%s; %s; %n; %n', [KodMat, NazevMat, PrCena, PrCenaNew]));

 

       //posuň se na další vybraný záznam

       Qry.Next;

     end;

   finally

     Qry.Free;

   end;

 finally

   Report.Write('-------------------------------------------------------');

   Report.Write('Akce dokončena.');

   Report.Finish;

   Report.Free;

 end;

 //refresh browseru

 Browser.DoCommand(BrowserForm, cmRefresh);

end.

 

 

Související témata

Evidence skladových položek