Skriptovací programovací jazyk

Z K.A.P.
Skočit na navigaciSkočit na vyhledávání

V aplikaci je integrovaný modul pro podporu správy systému umožňující zpracování programových skriptů. Skripty je možné psát v integrovaném editoru (kód menu 90,20). Je možné psát skripty ve formátu Pascal, C++, Basic nebo JScript (stejné možnosti, jen jiná syntaxe použitá pro zápis skriptů). V aplikacích je možné použít mnoho různých objektů, funkcí a konstant.

Skripty nelze v programu spouštět přímo (pouze v integrovaném editoru skriptů, kde je možné i jednoduché krokování skriptů), ale je třeba je nejdříve tzv. podepsat. To zajišťuje nová funkce s kódem menu 90,21, která k vybranému vstupnímu souboru se souborem skriptu vytvoří soubor s podepsaným skriptem (stejné jméno jako zdrojový soubor, ale s příponou FSC). K tomu je třeba určit jméno uživatele a heslo, pod kterým se bude program do aplikace přihlašovat (pokud skript připravujete pro jinou instalaci aplikace, tak heslo nemusí souhlasit s aktuálním heslem). Je možné určit také jméno databáze (to je ale nepovinné, lze ho určit až při spouštění skriptu parametrem DB:jmenodatabaze). Podepsané soubory lze spouštět pomocí nového parametru FSC:jménopodepsanéhoskriptu, např. SKLAD6.EXE S:SYSTEM FSC:Test.FSC Výsledný podepsaný soubor je uložený v interním formátu a nelze ho již znovu podepisovat (je třeba podepisovat vždy zdrojový soubor). Program při podepisování nekontroluje syntaxi skriptu. Ta je kontrolována vždy až při spouštění skriptu. Chyby skriptu jsou zapisovány do textového LOG souboru (ne všechny jsou hlášeny na obrazovku). Obě funkce jsou ve výchozím stavu umístěny do menu Nástroje pro správu, které nahradilo stávající menu Rekonstrukce dat.

Objekty

Settings.Values['INI.fieldname']..vrací hodnoty polí z tabulky SKLADINI
Settings.Values['KFG.fieldname']..vrací hodnoty polí z tabulky SKLADKFG
Settings.Values['USER.fieldname']..vrací hodnoty polí z tabulky SYSTUSER
 (fieldname je jméno pole z dané tabulky dle struktury souborů)
Settings.Values['DPH.ProcentoN']..vrací sazbu DPH (N je od 0 do 6)
Settings.Values['DPH.OznaceniN']..vrací krátké označení DPH (N je od 0 do 6)
Settings.Values['DPH.PasmoN']..vrací pásmo DPH (N je od 0 do 6)
 (všechny hodnoty dle aktuálně přihlášeného uživatele a databáze)
Settings.Values['VAR.promenna']..vrací hodnotu INI proměnné dle nastavení proměnných (Oprava INI hodnot / F10)

Konstanty

_AktualniSklad_ .. číslo aktuálního skladu
_NazevSkladu_ .. název aktuálního skladu
_KonfigDir_ .. označení konfigurační složky včetně lomítka (např. UZIV\ )
_Mena_ .. hlavní měna (určená verzí programu)
_Direktivy_ .. direktivy dle verze aplikace (např. LCXX EXTUCTO ...)

Skriptovací jazyk - funkce


Funkce

Tvorba sestav

Modul pro práci se skripty podporuje vytváření sestav připravených v generátoru sestav. Příkaz pro spuštění výpočtu sestavy má následující syntaxi:

Function GSRunReport(SkupinaSestav : Integer; SestavaCislo : Integer; Parametry: String): String; Function GSRunReportV(SkupinaSestav : Integer; SestavaCislo : Integer; JmenaParametru: Array of String; Hodnoty: array of Variant): String;

SkupinaSestav a SestavaCislo je identifikace spouštěné sestavy.

V první variantě musí být parametry zapsány takto: promenna1=hodnota1 #13 promenna2=hodnota2 #13 ... promenna_n=hodnota_n

Například: GSRunReport(6, 2, 'DatumOd=01/01/12'+chr(13)+'DatumOd=01/01/12')

Ve druhé variantě jsou parametry zadávány formou dvojice hodnot: [promenna_1, ..., promenna_n], [hodnota_1, ..., hodnota_n]

Například GSRunReportV(6, 2, ['DatumOd', 'DatumDo'], ['01/01/12', '01/01/12'])

Doplněna je také funkce pro odeslání souboru mailem prostřednictvím protokolu SMTP: Function SendMailBySMTP(From, SendTo, FileAttach, Subject, SMTPServer, SMTPSenderName,SMTPPassword, BodyString : String; var ErrMessage : String) : Boolean;

From .. odesílatel (obvykle ve formátu e-mailové adresy) SendTo .. emailová adresa příjemce FileAttach .. jméno souboru s přílohou Subject .. předmět mailu SMTPServer .. jméno SMTP serveru nebo IP adresa SMTPSenderName .. přihlašovací jméno k SMTP serveru SMTPPassword .. přihlašovací heslo k SMTP serveru BodyString .. obsah zprávy - řádky odděleny znakem #13 neboli chr(13) ErrMessage .. návratový chybový kód nebo zpráva

Pokud jsou parametry SMTPServer, SMTPSenderName, SMTPPassword, From prázdné, tak se jejich hodnoty načítají z proměnných SMTP, 0 až SMTP, 3 (obsah proměnných lze nastavit pomocí dialogu "Nastavení SMTP" (kód menu 51,41)

Komunikace s MaximObjServerem

Modul pro práci se skripty nově podporuje komunikaci s MaximObjServerem. Je tak možné například snadno odeslat výsledek sestavy na vzdálený server a k dispozici jsou i funkce pro manipulaci s dokumenty uloženými na vzdáleném serveru. K dispozici je nový objekt s následujícími vlastnostmi a metodami: TMOSCommunicator = class

 property ErrMessage: string;
 property Connected: Boolean;
 constructor Create(IP, UserName, UserPswd: String; CodedLogin: LongInt); // aktualizace 19.11.2012
 function SetupConnection(BINfile, IP, UserName, UserPswd: String; CodedLogin: LongInt): Boolean;
 function SetupConnectionBinFile(BINfile: String): Boolean
 function Connect: Boolean;
 procedure Disconnect;
 function SendFile(FileName, AServerFileName, Email, Subject, TextMail:String; ANoPrefix: Boolean = False): Boolean;
 function SendFileByAlias(FileName, AServerFileName, Alias: String; FileTime: TDateTime = 0): Boolean;
 function SendSMS(TelNo, SMSMsg : String): Boolean;
 function GetFile(FileName, AServerFileName, Alias: String): Boolean;
 function GetFileInfo(Alias, FileName: String; var RemoteFileName: String; var FileSize: Extended; var FileTime: TDateTime): Boolean;
 function GetFileList(Alias, FileName: String; var FileNameList: String):Boolean
 function REMOTE_FileCopy  (FromAlias, FromDir, ToAlias, ToDir, FileName: String): Boolean;
 function REMOTE_FileMove  (FromAlias, FromDir, ToAlias, ToDir, FileName: String): Boolean;
 function REMOTE_FileRename(FromAlias, FromDir, FromFileName, ToFileName: String): Boolean;
 function REMOTE_FileDelete(FromAlias, FromDir, FromFileName: String): Boolean;
 function REMOTE_DirCreate (FromAlias, DirName: String): Boolean;
 function REMOTE_DirDelete (FromAlias, DirName: String): Boolean;

end;

Po vytvoření objektu pomocí Create je třeba nastavit parametry připojení pomocí SetupConnection. Pokud je k dispozici BIN soubor s parametry připojení, tak není třeba vyplňovat parametry IP, UserName a UserPswd. Většina funkci umožňuje pracovat v režimu, kdy se nejdříve zahájí připojení pomocí Connect, pak se provede příslušná komunikace a nakonec se provede odpojení pomocí Disconnect. Tento způsob komunikace může vyžadovat novou verzi MaximObjServeru (verze 28 a vyšší).


Objekt TKAPCommunicator Tento objekt slouží k připojení na MaximObjServer (MOS) a práci se soubory pomocí tohoto serveru.

Vlastnosti

ErrMessage Obsahuje chybové hlášení, pokud některá z následujících funkcí skončila chybou.

Connected Obahuje True pokud je objekt připojen k MOSu

Funkce constructor Create(BINfile, IP, UserName, UserPswd: String; CodedLogin: LongInt) Vytvoří objekt a nastaví hodnoty nezbytné pro připojení obdobně jako následující dvě funkce. Pokud je vyplněný parametr BINfile (jméno souboru s interním certifikátem pro připojení), tak se ostatní parametry ignorují.

function SetupConnection(IP, UserName, UserPswd: String; CodedLogin: LongInt): Boolean Nastaví hodnoty nezbytné pro připojení. Je třeba volat jen pokud je potřeba připojení k novému serveru nebo jinému uživatelskému účtu bez nutnosti rušit a znova vytvářet objekt. Volání této funkce způsobí přerušení spojení s MOSem (pokud bylo navázáno).

function SetupConnectionBinFile(BINfile: String): Boolean Obdoba funkce SetupConnection ale připojovací hodnoty načítá z BIN souboru. Ostatní vlastnosti jsou u obou funkcí shodné.

function Connect: Boolean Připojí se k MOSu a při úspěšném připojení nastaví vlastnost Connect na True.

procedure Disconnect Odpojí se od MOSu.

function SendFile(FileName, AServerFileName, Email, Subject, TextMail: String; ANoPrefix: Boolean = False): Boolean Odešle soubor z klientské stanice na server. Způsob zpracování serverem MIS se určuje podle přípony přenášeného souboru. Funkce je určená pro základní nastavení definované v sekci [Pripony] v souboru MaximObjServer.ini na serveru. Pokud nejsou určené parametry Email, Subject a TextMail, tak se provede odeslání mailu podle parametrů určených serverem. Pokud nastavíte parametr ANoPrefix na True, tak se na serveru ponechá jméno souboru dle parametru FileName, jinak je ke jménu souboru připojena časová značka (umožňuje ve stejnou dobu přijímat stejně pojmenované soubory).

function SendFileByAlias(FileName, AServerFileName, Alias: String; FileTime: TDateTime = 0): Boolean Obdoba SendFile, ale přenos souboru povoluje nastavení vlastností aliasu na MOSu. Využívá se nastavení v souboru MaximObjServer.xml na serveru. Parametr FileName určuje lokální jméno souboru. Parametr AServerFileName určuje jméno souboru na serveru včetně případné podsložky (hlavní složka na serveru je určená serverem na základě parametru Alias). Parametr Alias určuje jméno aliasu definovaného v MaximObjServer.xml. Parametr FileTime je nepovinný a určuje datum a čas poslední změny souboru, pod jakým se soubor uloží na serveru; pokud má hodnotu 0 nebo není uveden, tak se datum a čas souboru automaticky převezme z lokálního souboru.

function SendSMS(TelNo, SMSMsg : String): Boolean Pokud je MOS připojen k SMS bráně, je možné odesílat SMS.

function GetFile(FileName, AServerFileName, Alias: String): Boolean Načte soubor z MOSu na klienta. Využívá se nastavení v souboru MaximObjServer.xml na serveru. Parametr FileName určuje lokální jméno souboru. Parametr AServerFileName určuje jméno souboru na serveru včetně případné podsložky (hlavní složka na serveru je určená serverem na základě parametru Alias). Parametr Alias určuje jméno aliasu definovaného v MaximObjServer.xml.


function GetFileInfo(Alias, FileName: String; var RemoteFileName: String; var FileSize: Extended; var FileTime: TDateTime): Boolean Zjistí informace o souborech na MOSu. Ve FileName může být i maska pro výběr více souborů např.: *.*, *.jpg apod. Funkce v tom případě vrací informace o prvním nalezeném souboru. Soubory se vybírají z adresáře daného aliasem. Využívá se nastavení aliasů v souboru MaximObjServer.xml na serveru. Funkce vrací v parametru RemoteFileName jméno souboru ze serveru, v parametru FileSize velikost souboru v bytech a ve FileTime vrací datum a čas poslední změny souboru na serveru.

function GetFileList(Alias, FileName: String; var FileNameList: String):Boolean Načte seznam souborů z MOSu odpovídající zvolené masce souborů danou parametrem FileName. Ve FileName může být buď maska pro výběr více souborů např.: *.*, *.jpg nebo konkrétní jméno souboru. Funkce vrací seznam souborů ve formě jednoho stringu, kde jednotlivé názvy souborů jsou oddělené znakem #13 neboli chr(13). Soubory se vybírají z adresáře na serveru daného aliasem. Využívá se nastavení aliasů v souboru MaximObjServer.xml na serveru.


Skupina funkcí začínající REMOTE_... pracuje se soubory na serveru a není určena pro přenos mezi klientem a serverem. Využívá se nastavení aliasů v souboru MaximObjServer.xml na serveru (včetně nastavení přístupových práv pro uživatelské role pro jednotlivé aliasy).

function REMOTE_FileCopy (FromAlias, FromDir, ToAlias, ToDir, FileName: String): Boolean Kopíruje soubor mezi dvěma adresáři.

function REMOTE_FileMove (FromAlias, FromDir, ToAlias, ToDir, FileName: String): Boolean Přesune soubor mezi dvěma adresáři. To znamená, že původní soubor bude smazán.

function REMOTE_FileRename (FromAlias, FromDir, FromFileName, ToFileName: String): Boolean Soubor bude přejmenován.

function REMOTE_FileDelete (FromAlias, FromDir, FromFileName: String): Boolean Smaže soubor z disku.

function REMOTE_DirCreate (FromAlias, DirName: String): Boolean Vytvoří nový adresář.

function REMOTE_DirDelete (FromAlias, DirName: String): Boolean Smaže prázdný adresář. Pokud adresář nebude prázdný tak mazání skončí chybou.

Starší verze podporují režim bez předchozího připojení, tj. po Create je možné ihned zavolat funkci pro komunikaci (ta zajistí připojení, komunikaci i odpojení). Pro přenos jednotlivého souboru tedy doporučujeme použít tento druhý postup. Funkce začínající REMOTE jsou určené pro manipulaci s dokumenty na vzdáleném serveru (aliasy se definují v konfiguračním XML souboru na serveru).

Příklady

var 
 s: String; 
 d1, d2: TDateTime; 
 DD, MM, YY : word; 
begin 
 DecodeDate(Date, YY, MM, DD); 
 if MM=1 then begin // Zjisteni predchoziho mesice 
   MM := 12; 
   YY := YY - 1; 
 end else 
   MM := MM - 1; 
   D1 := EncodeDate(YY, MM, 1); 
   D2 := EncodeDate(YY, MM, DaysInMonth(YY, MM)); 
    S := GSRunReport(6, 1, 'KFG_Datum1='+StrDate(D1)+chr(13)+ 'KFG_Datum='+StrDate(D2)+chr(13)+ 'INI_Jmeno=Pokusný sklad');
  //S := GSRunReportV(6, 1, ['KFG_Datum1', 'KFG_Datum', 'INI_Jmeno'],[StrDate(D1), StrDate(D2), 'Pokusný sklad']); 
 ShowMessage(s); 
end. 

var 
 s: String; 
begin 
//From, SendTo, FileAttach, Subject, SMTPServer, SMTPSenderName, SMTPPassword, BodyString, ErrMessage 
  if SendMailBySMTP('odesilatel@posta.cz', 'prijemce@mail.com', 'UZIV\SESTAVA1.SLK'#9'UZIV\SESTAVA2.SES'#13'UZIV\vystup.pdf', 'Test scriptu', 'smtp.posta.cz', 'SMTPjmeno', 'SMTPheslo', 'Testovaci email.'#13'Konec', s) 
 then ShowMessage('OK '+ s) 
 else ShowMessage('CHYBA '+ s); 
end. 



var MOSCommunicator: TMOSCommunicator; 
begin 
 MOSCommunicator := TMOSCommunicator.Create('MOS.bin', , , , 0); 
 if MOSCommunicator.SendFile('C:\DIR\DATA1.xml', 'DATA1.XML', , , , True) 
 then LogWrite('Prenos OK'); 
 else LogWrite(MOSCommunicator.ErrMessage); 
 MOSCommunicator.Free; 
end. 



var MOSCommunicator: TMOSCommunicator; 
    Info: String; 
    Velikost: Extended; 
    Cas: TDateTime; 
begin 
 MOSCommunicator := TMOSCommunicator.Create(, '192.168.17.1', 'MOSuser', 'MOSpswd', 1); 
 try 
   if MOSCommunicator.Connect then begin  // pokud se připojím, pak se vše realizuje 
                                          // v rámci jednoho připojení 
                                          //    ShowMessage('Pripojeno'); 
  if MOSCommunicator.Connected then begin // test navic 
  if MOSCommunicator.SendSMS('111222333','Pokus o poslani SMS') then ShowMessage('SMS odeslana.') 
  else ShowMessage('Chyba pri odesilani SMS:'#13+MOSCommunicator.ErrMessage); 
  if MOSCommunicator.SendFile('C:\DIR\DATA1.xml', 'DATA1.XML', , , , False) then 
   begin 
    ShowMessage('Prenos OK'); 
    if MOSCommunicator.GetFileInfo('Sklad6DOC', 'Stavy.xml', Info, Velikost, Cas) then 
     begin 
      ShowMessage('GetFileInfo:'#13 + Info+ #13 + 
      FloatToStr(Velikost) + #13 + DateTimeToStr(Cas)); 
      if not MOSCommunicator.GetFile('C:\DIR\Stavy2.XML', 'Podslozka\Stavy.xml', 'Sklad6DOC') then ShowMessage('GetFile:'#13+MOSCommunicator.ErrMessage); 
     end 
    else 
     ShowMessage('GetFileInfo:'#13+MOSCommunicator.ErrMessage); 
   end 
  else 
   ShowMessage('SendFile'#13+MOSCommunicator.ErrMessage); 
  MOSCommunicator.Disconnect; 
  end else 
  ShowMessage(MOSCommunicator.ErrMessage); 
  end else 
  ShowMessage(MOSCommunicator.ErrMessage); 
 finally 
   MOSCommunicator.Free; 
 end; 
end. 

Můžete si stáhnout podrobnou příručku popisující syntaxi, základní možnosti a příklady skriptovacího jazyka.