czech version | english version
  
     Aktuality
 
     O programu
 
     Download
 
     Manual
 
     Log změn
 
     Podpora
 
     Reference
 
     Objednávka
 
     Akce
  
Multidata » MarcMan  » MarcMan manuál

   1. Instalace
           a) Distribuční balíčky
           b) Instalační postup
   2. Spuštění
           a) Spouštění v režimu dávkového zpracování
           b) Spouštění v režimu klient/server
   3. Konfigurační soubory
           a) Příklad konfiguračního souboru
           b) Struktura konfiguračního souboru
           c) Parametry konfiguračního souboru
                  Licence
                  SourceFile
                  SourceFormat
                  DestinationFile
                  DestinationFormat
                  InRecordErrorFile
                  InRecordOKFile
                  IDAlephCoding
                  RulesFile
                  CodeFile
                  TablesDirectory
                  LogFile
                  EnableLogAll
                  ControlFile
                  PluginsDirectory
                  Plugins
   4. Chybová hlášení
   5. Formáty záznamů
           a) ISO formát
                  Popis
                  Definice
           b) Formát systému Aleph 500
                  Popis
                  Definice
                  Příklad
           c) Textový formát
                  Popis
                  Definice
                  Příklad
   6. Pravidla pro zpracování záznamů
           a) Struktura souboru pravidel
                  Komentáře
           b) Výrazy pro přístup k záznamům
                  Pravidla pro přístup k indikátorům polím, podpolím a vloženým polím
                  Speciální pravidla
                  Vícenásobná pravidla (konstrukce GROUP)
           c) Jazyk UseScript
                  Klíčová slova
                  Operátory
                  Řídící struktury
                  Proměnné
                  Funkce
           d) Soubory tabulek
   7. Kontrola záznamů
           a) Symbol entit polí a podpolí
           b) Symboly výčtu hodnot v indikátoru
           c) Symboly délky hodnot
           d) Symbol výčtu hodnot na pozicích v podpoli
           e) Symboly vložených polí
           f) Detailní kontrola
   8. Pluginy
           a) Instalace
           b) Plugin md5
                  Popis
                  Poskytované funkce
           c) Plugin unicode
                  Popis
                  Poskytované funkce

MarcMan

1. Instalace

a) Distribuční balíčky

Konvertor je dodáván ve formě balíčku obsahujícího kromě spustitelného souboru programu ještě mnoho dalších souborů, jejichž popis najdete níže.


Pro platformu Alpha (Tru64 UNIX) jsou dodávány tyto balíčky:


  • marcman-tru64.tar.gz

  • marcman-server-tru64.tar.gz



Pro platformu Linux jsou dodávány balíčky:


  • marcman-linux.tar.gz

  • marcman-server-linux.tar.gz



Pro platformu MS Windows je dodáván balíček:


  • marcman-win32.zip


Balíčky, v jejichž názvu je obsaženo slovo server, obsahují instalaci typu klient/server, která je však zatím k dispozici pouze pro platformy unixového typu. Ostatní balíčky obsahují verzi pro dávkové zpracování záznamů.


b) Instalační postup

Vytvořte na disku adresář pro instalaci konvertoru (v dalším budeme na tento adresář pro jednoduchost odkazovat jako na $MARCMAN_HOME).


Uložte distribuční balíček do adresáře $MARCMAN_HOME a rozbalte jej.


Na platformách unixového typu můžete rozbalení provést např. tímto způsobem:


cd $MARCMAN_HOME 
gunzip marcman-tru64.tar.gz 
tar xvf marcman-tru64.tar


Na platformách MW Windows použijte pro rozbalení distribučního balíčku některý z četných archivačních programů (např. WinRAR či WinZIP). Zkontrolujte, že spustitelný soubor MarcMan je po rozbalení přímo v adresáři $MARCMAN_HOME, tj. že archivační program nevytvořil při rozbalení další podadresář (pokud ano, zkopírujte obsah nově vytvořeného podadresáře přímo do adresáře $MARCMAN_HOME a příslušný podadresář smažte).


Po rozbalení distribučního balíčku se na disku v adresáři $MARCMAN_HOME vytvoří následující adresářová struktura:


$MARCMAN_HOME/      
      data/      
      modules/   
          c_marc21_unimarc/
             tbl/
             run.cfg
             conversion.rul
             marc21.ctr	    
	  .
          .
      out/
      plugins/
      marcman
      run_marc21_unimarc.bat
      run_marc21_unimarc_authority.bat
      run_unimarc_marc21.bat
      run_unimarc_marc21_authority.bat 


Význam jednotlivých položek je následující:


Adresář

Využití

data/

Příklady dat v různých formátech pro testování. Zdrojová data definujete v konfiguračním souboru a tam je můžete samozřejmě změnit.

modules/

Moduly.

modules/c_marc21_unimarc

Modul konverze marc21->unimarc. Takovýchto modulů můžete v adresáři modules nalézt více.

modules/c_marc21_unimarc/tbl/

Adresář s tabulkami pro konkrétní konverzi konkrétním modulem. Více se dočtete v popisu parametru TablesDirectory.

modules/c_marc21_unimarc/run.cfg

Příklad konfiguračního souboru pro konverzi konkrétního modulu.

modules/c_marc21_unimarc/conversion.rul

Soubor pravidel konverze. Jak psát soubory pravidel najdete v kapitole Pravidla pro zpracovávání záznamů. Jestliže vlastníte pouze light verzi programu, tento soubor bude mít koncovku .crul a nebude čitelný.

modules/c_marc21_unimarc/marc21.ctr

Kontrolní soubor pro konverzi. Jak tento soubor má vypadat najdete v kapitole Kontrolní soubor.

out/

Adresář, do kterého se ukládají výsledky konverze. Tento adresář definujete v konfiguračním souboru a tam ho můžete samozřejmě změnit.

plugins/

Adresář s pluginy. Více v kapitole Pluginy.


Struktura adresáře se v konkrétní distribuci může lišit, princip a přípony souborů zůstávají stejné.


Přidejte cestu $MARCMAN_HOME/bin do proměnné PATH, aby nebylo nutné zadávat při spuštění konvertoru úplnou cestu k programu. Způsob přidání cesty do proměnné PATH se značně liší podle operačního systému (na platformách unixového typu, pak ještě podle shell(u), případně distribuce). Z tohoto důvodu zde nastavení není popsáno, ale neměl by být problém postup nalézt v dokumentaci k operačnímu systému.




2. Spuštění

Způsob spouštění je závislý na režimu provozu tzn. je odlišný pro režim dávkového zpracování a pro režim klient/server.


V každém případě je třeba správně nakonfigurovat vaše licenční číslo. Více o parameru licence


a) Spouštění v režimu dávkového zpracování

V režimu dávkového zpracování se konvertor spouští tak, že se příslušnému programu (MarcMan) předá jediný argument, kterým je cesta ke konfiguračnímu souboru, v němž jsou definovány všechny další potřebné parametry (viz konfigurační soubory).

MarcMan <konfigracni soubor>


Spuštění konvertoru se tedy provede např. takto:


na platformě MS Windows:

MarcMan C:\marcman\run.cfg

na platformě unixového typu:

MarcMan ~/marcman/run.cfg


Pozor! Pro spouštění v režimu dávkového zpracování musíte mít příslušný distribuční balíček. Tzn. pokud máte pouze distribuční balíček pro provoz v režimu klient/server, není provoz v režimu dávkového zpracování možný (v režimu klient/server se využívá jiný program - marcmand).


Po spuštění konvertoru v režimu dávkového zpracování dojde k provedení následujících kroků:


  • načtení konfiguračního souboru

  • načtení pravidel pro zpracování záznamů

  • spočtení záznamů ve vstupním souboru

  • načtení a zpracování záznamů ve vstupním souboru

  • ukončení činnosti konvertoru


b) Spouštění v režimu klient/server


Podobně jako v režimu dávkového zpracování se i v režimu klient/server konvertor spouští tak, že se příslušnému programu (marcmand) předá jediný argument, kterým je cesta ke konfiguračnímu souboru, v němž jsou uvedeny všechny další potřebné parametry (viz konfigurační soubory).


marcmand <konfigracni soubor>


Spuštění serveru konvertoru se tedy provede např. takto:


pouze na platformě unixového typu:

marcmand ~/marcman/run.cfg


Pozor! Pro spouštění v režimu dávkového zpracování musíte mít příslušný distribuční balíček. Tzn. pokud máte pouze distribuční balíček pro provoz v režimu dávkového zpracování, není provoz v režimu klient/server možný (v režimu hromadného zpracování se využívá jiný program - MarcMan).


Po spuštění serveru konvertoru v režimu dávkového zpracování dojde k provedení následujících kroků:


  • načtení konfiguračního souboru

  • načtení pravidel pro zpracování záznamů

  • spuštění na pozadí běžícího procesu

  • poslouchání na pozadí běžícího procesu na unixovém socketu či TCP/IP portu a zpracovávání záznamů poslaných na tento port

  • případné ukončení na pozadí běžícího procesu uživatelským zásahem (příkazem kill)


Pro poslání záznamu (nebo více záznamů) na příslušný port, na kterém poslouchá server konvertoru, se používá klient konvertoru (marcc). Klient konvertoru se spouští se dvěma argumenty:


marcc <protokol> <adresa serveru:port>


Prvním argumentem je protokol, který se má použít pro komunikaci se serverem konvertoru, a druhým adresa serveru (případně včetně portu).


Podporované protokoly jsou následující:


  • unix - pro komunikaci přes unixové sockety (adresou je v tomto případě cesta k unixovému socketu)

  • tcp - pro komunikaci přes protokol TCP/IP (adresou je v tomto případě název serveru následovaný znakem : (dvojtečka) a číslem portu)


Předání záznamu ke zpracování se tedy provede např. takto:


v případě serveru poslouchajícího na unixovém socketu:

marcc unix marcmand.sock <zaznamy.iso

nebo

cat zaznamy.iso | marcc unix marcmand.sock


v případě serveru poslouchajícího na TCP/IP portu 12345 na serveru host.somewhere.com:

marcc tcp host.somewhere.com:12345 <zaznamy.iso

nebo

cat zaznamy.iso | marcc tcp host.somewhere.com:12345


Po spuštění klienta konvertoru dojde k provedení následujících kroků:


  • načtení záznamů ze standardního vstupu

  • odeslání záznamů na příslušný port

  • (zpracování záznamů serverem konvertoru)

  • přečtení zpracovaného záznamu z příslušného portu

  • výpis zpracovaného záznamu na standardní výstup


Výhodou provozu v režimu klient/server je především větší rychlost zpracování dat (odpadá nutnost opakovaného načítání konfiguračních souborů a pravidel (ta se načtou pouze jednou při startu serveru konvertoru) a navíc je možné provádět zpracování více záznamů paralelně.


Nevýhodou naopak může být nemožnost provádění některých operací, které mají smysl pouze při dávkovém zpracování, kdy je zaručeno, že proces konvertoru běží pouze jednou (např. nemohou být v pravidlech použity funkce pro uživatelský zápis do souboru).


3. Konfigurační soubory

Chcete-li začít zpracovávat (konvertovat, kontrolovat, filtrovat apod.) nějaké záznamy, musíte nejprve předat konvertoru určité vstupní parametry. Tyto parametry určují především režim práce konvertoru (klient/server nebo dávkové zpracování), vstupní formát záznamů (např. iso formát, textový formát, formát systému Aleph 500 apod.), vstup, ze kterého mají být záznamy přebírány ke zpracování, výstupní formát záznamů, výstup, kam mají být zpracované záznamy ukládány, jaká pravidla mají být pro zpracování použita apod.


Parametry se zapisují do konfiguračního souboru (obvykle mívá příponu cfg např. run.cfg). Cesta ke konfiguračnímu souboru se pak předává konvertoru jako jediný povinný argument při spouštění (viz kapitola spuštění).

a) Příklad konfiguračního souboru


[VSTUP] 
SourceFile=c:/marcman/data/output/zaznamy.iso 
SourceFormat=iso  

[VYSTUP]  
DestinationFile=C:/marcman/output/vystup.alf 
DestinationFormat=aleph 
InRecordErrorFile=C:/marcman/data/output/vystup_err.iso 
InRecordOkFile=C:/marcman/data/output/vystup_ok.iso 
IDAlephCoding=L  

[PRAVIDLA] 
RulesFile=C:/marcman/rules/conversion.rul
TablesDirectory=C:/marcman/tables/ 
LogFile=C:/marcman/log/log.txt 
EnableLogAll=No


b) Struktura konfiguračního souboru

V konfigračním souboru jsou uváděny parametry ve tvaru:


název parametru=hodnota

Např.

SourceFile=C:/marcman/data/input/zaznamy.iso


Pozor! - názvy parametrů jsou citlivé na velikost písmen, to znamená, že názvy parametrů je nutné uvést přesně v tom znění, v jakém jsou popsány níže.


Vedle parametrů samotných se mohou v souboru vyskytovat i další řádky, přičemž platí, že při načítaní se ignorují všechny řádky, na kterých se nevyskytuje znak = (rovnítko). Naopak řádky, které znak = (rovnítko) obsahují, se považují za definici parametru s hodnotou rovnou textu uvedenému za prvním znakem = (rovnítko).


Aby bylo možné se ve struktuře konfiguračního souboru snáze orientovat, používají se následující konvence zápisu.


Před skupinou parametrů, které se k sobě logicky váží, je uvedeno návěští ve hranatých závorkách, které tuto skupinu pojmenovává. Za skupinou je pak z důvodů větší přehlednosti uveden prázdný řádek.


Např.


[VSTUP] 
SourceFile=C:/marcman/data/input/zaznamy.iso 
SourceFormat=iso


c) Parametry konfiguračního souboru

V následujícím přehledu jsou uvedeny základní parametry, které je možné (a v některých případech rovněž nutné) v konfiguračním souboru definovat. Některá pravidla mohou vyžadovat dodefinování některých dalších parametrů, pak je ale jejich specifikace součástí dokumentace dodávané k daným pravidlům, případně je s takovými pravidly dodáván i vzorový konfigurační soubor, který pak stačí pouze upravit s ohledem na lokální prostředí.

Licence


Popis:


V paramteru Licence musíte uvést cislo vasi licence, jinak program nebude fungovat

Povinnost:

Povinný

Poznámky:

Příklad:

License=AEAVam2y59Mpen8rNj8g2

SourceFile

Popis:


Paramter SourceFile definuje cestu k souboru obsahujícímu vstupní záznamy.

Povinnost:

Povinný pro režim dávkového zpracování, není smysluplný pro režim klient/server.

Poznámky:

Pozor! - v cestách k souborům a adresářům musí být jednotlivé adresáře oddělovány znakem / (lomítko) a to nezávisle na operačním systému.

Příklad:

SourceFile=data/marc21/Zaznam02.txt

SourceFormat

Popis:

Parametr SourceFormat definuje formát vstupních dat.

Přípustné hodnoty

Povinnost:

Povinný pro oba režimy zpracování.

Poznámky:

Pozor! -v případě nesouladu formátu vstupního souboru s formátem uvedeným v tomto parametru nebude konvertor pracovat korektně.

Příklad:

SourceFormat=txt

DestinationFile

Popis:

Parametr DestinationFile definuje cestu k souboru, do kterého mají být ukládány dobře zkonvertované záznamy.

Povinnost:

Povinný pro režim dávkového zpracování, není smysluplný pro režim klient/server.

Poznámky:

Pozor! - soubor se při každém spuštění konvertoru přepisuje.

Pozor! - v cestách k souborům a adresářům musí být jednotlivé adresáře oddělovány znakem / (lomítko) a to nezávisle na operačním systému.

Příklad:

DestinationFile=out/vystup_out.txt

DestinationFormat

Popis:

Parametr DestinationFormat definuje formát výstupních dat.

Aktuální verze konvertoru rozpoznává následující formáty souborů:



Povinnost:

Povinný pro oba režimy zpracování.

Poznámky:

Pozor! - v případě nesouladu formátu vstupního souboru s formátem uvedeným v tomto parametru nebude konvertor pracovat korektně.

Pozor! - v případě, že je jako formát uveden formát systému Aleph 500, je nutné specifikovat rovněž parametr IDAlephCoding.

Příklad:

DestinationFormat=txt

InRecordErrorFile

Popis:


Parametr InRecordErrorFile definuje cestu k souboru, do kterého mají být ukládány záznamy, jejichž zpracování neproběhlo úspěšně. V tomto souboru jsou ve vstupní podobě. Program MarcMan tedy vlastně vstupní záznamy třídí na ty dobře zkonvertované a na ty špatně zkonvertované.

Povinnost:

Povinný pro režim dávkového zpracování, není smysluplný pro režim klient/server.

Poznámky:

Pozor! -soubor se při každém spuštění konvertoru přepisuje.

Pozor! - v cestách k souborům a adresářům musí být jednotlivé adresáře oddělovány znakem / (lomítko) a to nezávisle na operačním systému.

Příklad:

InRecordErrorFile=out/vystup_inerr.txt


InRecordOKFile

Popis:


Parametr InRecordOkFile definuje cestu k souboru, do kterého mají být ukládány záznamy, jejichž zpracování proběhlo úspěšně.V tomto souboru jsou ve vstupní podobě. Program MarcMan tedy vlastně vstupní záznamy třídí na ty dobře zkonvertované a na ty špatně zkonvertované.

Povinnost:

Povinný pro režim dávkového zpracování, není smysluplný pro režim klient/server.

Poznámky:

Pozor! - soubor se při každém spuštění konvertoru přepisuje.

Pozor! - v cestách k souborům a adresářům musí být jednotlivé adresáře oddělovány znakem / (lomítko) a to nezávisle na operačním systému.

Příklad:

InRecordOKFile=out/vystup_inOK.txt


IDAlephCoding

Popis:

Parametr IDAlephCoding má smysl jen pro formát aleph. Je to znak, který je potřeba v záznamu v alephu pro určení kódování. Více v kapitole formát Aleph.

Povinnost:

povinný pro režim dávkového zpracování, pokud je v parametru DestinationFormat volby aleph

Poznámky:

Pozor! - soubor se při každém spuštění konvertoru přepisuje.

Pozor! - tento parametr je nutné uvést, pokud je v parametru DestinationFormat specifikován jako výstupní formát systému Aleph 500.

Příklad:

IDAlephCoding=L

RulesFile

Popis:


Parametr RulesFile definuje cestu k souboru, ve kterém jsou definována pravidla pro zpracování záznamů. O tom, jestli se jedná o soubor zakódovaných pravidel nebo o soubor nezakódovaný, rozhoduje parametr CodeFile.

Povinnost:

Povinný pro oba režimy zpracování.

Poznámky:

Pozor! - v cestách k souborům a adresářům musí být jednotlivé adresáře oddělovány znakem / (lomítko) a to nezávisle na operačním systému.

Pozor! - I když máte light verzi, musíte nastavit parametr CodeFile na" Yes".

Pozor! - cesty k adresářům musí být zakončeny znakem / (lomítko).

Příklad:

RulesFile=modules/c_marc21_unimarc/conversion.rul

RulesFile=modules/c_marc21_unimarc/conversion.crul (pro light verzi)


CodeFile

Popis:


Parametr CodeFile určuje, zda je v parametru RulesFile definována cesta k zakódovanému nebo nezakódovanému souboru pravidel. Možné hodnoty je "Yes" nebo "No".

Přípustné hodnoty

  • Yes

  • No

Povinnost:

Parametr nemusí být uveden. Pak to znamená, že se jedná o nezakódovaný soubor pravidel.

Poznámky:

Pozor! - I když máte light verzi, musíte nastavit parametr CodeFile na " Yes".

Příklad:

CodeFile=Yes


TablesDirectory

Popis:


Parametr TablesDirectory definuje cestu k adresáři, ve kterém jsou uloženy tabulky vyžadované pravidly pro zpracování záznamů.

Povinnost:

Nepovinný pro oba režimy zpracování.

Poznámky:

Pozor! - v cestách k souborům a adresářům musí být jednotlivé adresáře oddělovány znakem / (lomítko) a to nezávisle na operačním systému.

Pozor! - cesty k adresářům musí být zakončeny znakem / (lomítko).

Příklad:

TablesDirectory=modules/c_marc21_unimarc/tbl/


LogFile

Popis:


Parametr LogFile definuje cestu k souboru, do kterého mají být ukládány informace o průběhu zpracování záznamů .

Povinnost:

Nepovinný pro režim dávkového zpracování, není smysluplný pro režim klient/server.

Poznámky:

Pozor! - soubor se při každém spuštění konvertoru přepisuje.

Pozor! - v cestách k souborům a adresářům musí být jednotlivé adresáře oddělovány znakem / (lomítko) a to nezávisle na operačním systému.

Pozor! - cesty k adresářům musí být zakončeny znakem / (lomítko).

Příklad:

LogFile=out/convert_log.txt



EnableLogAll

Popis:


Parametr EnableLogAll definuje úroveň podrobnosti informací o průběhu zpracování, které mají být ukládány do souboru určeného parametrem LogFile.

Je-li parametr nastaven na hodnotu Yes, je podrobnost informací o průběhu zpracování velmi vysoká. V takovémto výpisu najdete podrobný popis všech probíhajících operací, volání funkcí v pravidlech atd.

Je-li nastaven na hodnotu No nebo není nastaven, je úroveň podrobnosti informací o průběhu zpracování nižší.


Přípustné hodnoty:

  • Yes

  • No

Povinnost:

Nepovinný pro režim dávkového zpracování, není smysluplný pro režim klient/server.

Poznámky:

Pozor! - S touto volbou rozhodně nespouštějte velkou dávku záznamů, velikost logovacího souboru potom velmi narůstá a konverze je pomalá.

Příklad:

EnableLogAll=No


ControlFile

Popis:


Parametr ControlFile definuje cestu k souboru, který má být použit pro kontrolu záznamů před konverzí. Více o kontrolním modulu najdete v kapitole Kontrola záznamů. Soubor má standardně příponu ctr.


Povinnost:

Nepovinný pro režim dávkového zpracování.

Poznámky:

Příklad:

ControlFile=modules/c_marc21_unimarc/marc21.ctr


PluginsDirectory

Popis:


Parametr PluginsDirectory definuje cestu k adresáři, ve kterém jsou uloženy sdílené knihovny (pluginy) rozšiřující možnosti konvertoru. Hodnota tohoto parametru se připojuje na začátek všech cest uvedených v parametru Plugins, pokud je definován.

Povinnost:

nepovinný pro oba režimy zpracování

Poznámky:

Pozor! - v cestách k souborům a adresářům musí být jednotlivé adresáře oddělovány znakem / (lomítko) a to nezávisle na operačním systému

Pozor! - cesty k adresářům musí být zakončeny znakem / (lomítko)

Příklad:

PluginsDirectory=marcman/plugins/


Plugins

Popis:


Parametr Plugins definuje seznam cest ke sdíleným knihovnám (pluginům) rozšiřujícím možnosti konvertoru. Jednotlivé cesty se oddělují znakem , (čárka). Ke všem uvedeným cestám se na začátek připojí hodnota parametru PluginsDirectory, pokud je definován.

Povinnost:

nepovinný pro oba režimy zpracování

Poznámky:

Pozor! - v cestách k souborům a adresářům musí být jednotlivé adresáře oddělovány znakem / (lomítko) a to nezávisle na operačním systému

Pozor! - cesty k adresářům musí být zakončeny znakem / (lomítko)

Není-li tento parametr uveden, pluginový mechanismus se automaticky vypíná (tzn. není možné používat v pravidlech příslušná rozšíření, ale konvertor funguje se všemi základními vlastnostmi, kterými disponuje).

Pozor! - přípony sdílených knihoven se liší podle typu operačního systému (na platformách unixového typu se používá přípona .so zatímco na platformě MS Windows přípona .dll)

Příklad:

Plugins=plugin_md5.dll,plugin_unicode.dll


4. Chybová hlášení

Při otvírání souboru i při konverzi může nastat celá řada chyb. Všechny chyby se objevují buď na příkazovém řádku nebo v Logovacím souboru. I když konverze nějakého záznamu nedopadne dobře, program pokračuje konverzí dalšího záznamu, do DestinationFile špatně zkonvertovaný záznam nevytvoří a uloží vstupní záznam společně s chybovou zprávou do souboru InRecordErrorFile

5. Formáty záznamů

Aktuální verze konvertoru umí zpracovávat následující formáty záznamů:



a) ISO formát

Popis

Formát souboru pro přenos dat definovaný normou ISO 2790 na stránkách Library of Congress ( v angličtině).


Definice

Viz norma ISO 2790 na stránkách Library of Congress ( v angličtině).


b) Formát systému Aleph 500

Popis

Tento formát je používán automatizovaným knihovním systémem Aleph 500 společnosti Ex Libris (zastoupení pro ČR a SR). Jedná se o proprietární způsob zápisu MARC-ových záznamů do textového souboru. Vedle standardních MARC-ových prvků obsahuje rovněž informaci o interní jednoznačné identifikaci záznamu a o kódování polí.

Definice

Soubor se záznamy ve formátu systému Aleph 500 má níže popsanou strukturu.


Na každém řádku souboru je uvedeno právě jedno pole. Řádek se skládá ze sloupců popsaných v následující tabulce.


Popis sloupce

Formát sloupce

Poznámka

Číslo záznamu

N(9)

C(1)

oddělovací mezera

Kód pole vč. indikátorů

C(5)

C(1)

oddělovací mezera

Kódování

C(1)

konstanta L

C(1)

oddělovací mezera

Obsah pole

C(1,1992)


(písmeno C ve formátu sloupce označuje textový řetězec, písmeno N číslo; číslo v závorce označuje šířku sloupce, pokud jsou uvedena dvě čísla oddělená čárkou, jedná se o minimální a maximální možnou šířku sloupce)


Jednotlivé záznamy se neoddělují speciálním oddělovačem. Za začátek nového záznamu se považuje první pole, které začíná číslem záznamu odlišným od čísla záznamu předchozího pole.


Příklad


000009484 FMT   L BK
000009484 LDR   L -----nam-a22--------4500
000009484 001   L cd000165
000009484 005   L 19981002000000.0
000009484 008   L 981002s1990----xr-----f------------cze--
000009484 020   L $$a(váz.)
000009484 040   L $$aABD157$$bcze
000009484 080   L $$a504$$2h
000009484 080   L $$a316.3$$2h
000009484 1001  L $$aStrázský, Václav$$4aut
000009484 24510 L $$aObčan a životní prostředí
000009484 260   L $$aPraha,$$c1990
000009484 300   L $$a37 s. :$$btab., +$$e64 tab.
000009484 502   L $$aZávěrečná práce PGS
000009484 65004 L $$aspolečnost
000009484 65004 L $$aživotní prostředí
000009484 7102  L $$aUniverzita Karlova v Praze.
000009484 BAS   L 23
000009484 BAS   L 36
000009484 CAT   L $$aXUZP$$b30$$c20030115$$lCKS01$$h0000
000009484 CAT   L $$c20041017$$lCKS01$$h2115
000009484 CAT   L $$aBATCH$$b00$$c20041106$$lCKS01$$h1034
000009484 CAT   L $$aBATCH$$b00$$c20041106$$lCKS01$$h1046
000009484 IAH   L $$lPGS 165$$g6177
000009484 910   L $$aABD157$$b6177


c) Textový formát



Popis

Textový formát byl vytvořen pro účely testování pravidel pro zpracování záznamů. Jeho hlavní předností je větší přehlednost oproti předcházejícím formátům, což uživateli umožňuje snadnější vizuální kontrolu výstupních záznamů i úpravu záznamů vstupních. Textový formát by měl být využíván pouze na jeden vstupní a jeden výstupní soubor při testování. Rozhodně by neměl sloužit k ukládání záznamů.


Definice

Soubor se záznamy v textovém formátu má níže popsanou strukturu.


Každý záznam v souboru začíná řádkem obsahujícím pouze znak @ (tzv. "zavináč") - tj. tento znak nesmí být na řádku uvozen či následován ani mezerami nebo tabulátory. Na dalším řádku je uvedeno návěští (label) záznamu v délce 24 znaků. Na každém dalším řádku v souboru je pak uvedeno vždy jedno pole záznamu až do dalšího výskytu znaku @ (tzv. "zavináč") resp. do konce souboru.


Struktura řádku obsahujícího pole je následující. Na začátku řádku je vždy uveden kód pole následovaný oběma indikátory. Pakliže se jedná o pole bez jednoho či obou indikátorů, jsou místo chybějících indikátorů uvedeny mezery. Za indikátory začíná samotný obsah pole. Pokud se obsah pole dělí na podpole, je každé podpole uvozeno znakem $ (dolar), následované jedním písmenem určujícím dané podpole.


Příklad


@
nam 2200229 a 4500
001  zpk20010038759
005  20010110000000.0
008  $a010110s19989999 ger
020  $a3857921552 (2 Bände)
040  $aABD044$eAACR2
0410 $ager 044 $asz
080  $a581.9 24510$aFlora von Basel und Umberbung
260  $aBasel :$bNatursforschende Gesellschaft
300  $aS. 546-1003.
440 0$aMitteilungen der Naturforschenden
65004$aflóra.
651 4$aBasilej (Švýcarsko)
651 4$aBasilej okolí (Švýcarsko)
7001 $aBrodtbeck, Thomas.$4aut


6. Pravidla pro zpracování záznamů

Pravidla pro zpracování záznamů určují, jaké operace se vstupními záznamy se mají provést. Pomocí pravidel je například možné nadefinovat konverzi UNIMARC->MARC21 či MARC21->UNIMARC, a dále provést kontrolu validnosti záznamů v daném formátu, roztřídit záznamy na korektně a nekorektně zkatalogizované (podle vlastních kriterií) apod. Pravidla se zapisují v jazyce Usescript. Jazyk usescript je jednoduchým neprocedurálním, interpretovaným jazykem podobným jazyku BASIC, se zabudovanou podporou pro manipulaci s bibliografickými záznamy uloženými ve formátech odvozených z formátu MARC.


a) Struktura souboru pravidel

Pravidla pro zpracování záznamů se v typickém případě ukládají do souborů s příponou .rul. V souboru může být uvedeno libovolně mnoho pravidel. Pravidla mají takovouto strukturu:


odkud->kam { pravidlo v jazyce usescript }


přičemž význam jednotlivých částí pravidla je takovýto:


  • odkud - je výraz určující jaké pole (podpole, indikátor) vstupního záznamu se má zpracovat pomocí daného pravidla, tento výraz se zapisuje ve formě výrazů pro přístup k záznamům

  • kam - je výraz určující do jakého pole (podpole, indikátoru) výstupního záznamu se má výsledná hodnota uložit, tento výraz se zapisuje ve formě výrazů pro přístup k záznamům

  • pravidlo v jazyce usescript - je posloupnost výrazů a příkazů jazyka usescript, která definuje jakým způsobem se má hodnota pole resp. podpole zpracovat


Příklad:


100$a->200$b { }


Konstrukce odkud a kam se zapisují ve formě výrazů pro přístup k záznamům. Mezi nimi musí být znaky "->", jinak je při spuštění programu oznámena chyba. Mezi složenými závorkami můžete psát scripty jazyka usescript. Příklad úplného okomentovaného pravidla by mohl vypadat takto:


/*
	Pravidlo převádějící druhý indikátor 
        všech polí 207 do prvního indikátoru polí 362.
	Je-li hodnota druhého indikátoru pole 207 rovna 
        mezeře je do 362I1 převeden text "1"
*/

207I2->362I1 {
	If S==" " Then S="1"
}


Pravidlo může být také prázdné - znamená to, že se hodnota odkud převádí beze změny do kam

Nesmíte zapomenout na to, že při konverzi se neprovádějí pravidla postupně tak jak jsou uvedeny v souboru .rul, ale provádějí se za sebou podle toho, jak vypadá konvertovaný záznam. Program kontroluje pole v záznamu v následujícím pořadí:


  • Návěstí (provedou se všechny pravidla začínající na LAB)

  • 1. Indikátor pole

  • 2. Indikátor pole

  • (u všech podpolí pole) konverze podpole

  • (u všech podpolí pole) konverze 1. Indikátoru vloženého pole

  • (u všech podpolí pole) konverze 2. Indikátoru vloženého pole


Jediné pořadí v polích, které máte zaručené je tedy to, že indikátory konkrétního pole se konvertují dříve než samotná podpole tohoto pole. Chcete-li si tedy uložit nějaký údaj pro konverzi celého pole, je pro to nejlepším místem právě pravidlo pro jeden z indikátorů.

Existují čtyři speciální pravidla a to pravidlo:


Komentáře

Do souboru je možné vedle pravidel samotných vkládat rovněž komentáře.


Komentovat můžeme buď v souboru pravidel jako celek, nebo můžeme vytvářet komentáře přímo v jednotlivých pravidlech. Pro oba způsoby platí jiný mechanismus:



Komentování uvnitř pravidla

Vložení komentáře je možné provést dvojím způsobem. Jednořádkové komentáře jsou uvozeny znakem ' (apostrof) - veškerý text na řádku za tímto znakem je interpretován jako komentář.


Příklad:


100$a->200$b {
 	' Toto pravidlo funguje 
}



Komentování v rámci souboru pravidel

Komentář je nutno uvést mezi znaky /* (lomítko a hvězdička) a */ (hvězdička a lomítko). Mezi tyto znaky je možné uvést i víceřádkové komentáře. V takovém případě je třeba zakomentovat celé pravidlo jako celek!


/*
	Skupina pravidel pro konverzi pole 100
*/

100$a->200$b {
 	' Toto pravidlo funguje 
}
/* zakomentované pravidlo
100$b->200$c {
 	' Toto pravidlo funguje 
}*/


Pozor! - komentáře se nesmí křížit ani vnořovat.



b) Výrazy pro přístup k záznamům



Pravidla pro přístup k indikátorům polím, podpolím a vloženým polím

Píšete-li pravidla, pak musíte programu nějak zadat s jakým polem(podpolem, indikátorem, vloženým polem) chcete pracovat. To uděláte pomocí výrazu, jehož nejsložitější podoba může vypadat takto:


423(1)L200$a(2)/1-5/

Znamená to, že chcete pracovat s polem 423 (konkrétně s prvním), a to s druhým podpolem $a jeho vloženého podpole 200. Chcete pracovat pouze s jeho pěti prvními znaky.

Uvěďme další jednoduché příklady:


100$a

Chci pracovat se všemi podpoli $a ve všech polích 100


100(1)$a

Chci pracovat s se všemi podpoli $a prvního pole 100


100$a(3)

Chci pracovat pouze s třetím podpolem $a všech polí 100


100I1

Chci pracovat s prvním indikátorem všech podpolí 100


100I2

Chci pracovat s druhým indikátorem všech podpolí 100


LAB/1-3/

Chci pracovat s prvními třemi znaky (od prvního do třetího znaku) návěští


423L100I1

Chci pracovat s prvním indikátorem vloženého podpole 100 všech polí 423


100$a/2-5/

Chci pracovat s druhým až pátým znakem všech podpolí $a všech polí 100


A nyní už:

423(1)L200$a(2)/1-5/

Znamená to, že chcete pracovat s polem 423(konkrétně s prvním) a to s druhým podpolem $a jeho vloženého podpole 200. Chcete pracovat pouze s jeho pěti prvními znaky.


Program MarcMan u každého pole předpokládá podpole. Pokud pole žádné podpole nemá, MarcMan k němu přistupuje jako k speciálnímu podpoli $E . Chcete-li tedy pracovat s řetězcem v poli "001 zpk20010038759", přistoupíte k němu:

001$E


Další zvláštností, se kterou se můžete v pravidlech setkat, je například pravidlo. All znamená, že není na začátku pravidla jasné, kam výsledek bude směřovat a bylo by tedy matoucí sem psát nějaký výraz. V tomto pravidle ale musí potom být nutně změněna proměnná TOC, jinak při konverzi nastane chyba.



207I2->All {        
    'nejaky kod ktery zmeni promenou TOC  
}



Speciální pravidla

V pravidlech je možné použít některá speciální pravidla


BeforeAll->BeforeAll { nějaký script }

Before->Before { nějaký script }

After->After { nějaký script }

AfterAll->AfterAll { nějaký script }


Pravidlo BeforeAll je provedeno ještě před konverzí celého balíku záznamů. Není v něm tedy žádný záznam přístupný. Všechna pravidla Before jsou provedena ještě před konverzí záznamu a všechna pravidla After po konverzi celého záznamu (zde můžete setřiďovat podpole atd..). Pravidlo AfterAll je provedeno po konverzi celého balíku záznamů. Nejedná se o klasická pravidla, tudíž není přítomna standardní kolekce proměnných jako v jiných pravidlech. Jedinou možností jak v těchto pravidlech něco se záznamem provést je tedy použití funkcí SetValue.



Vícenásobná pravidla (konstrukce GROUP)

Pokud chcete použít stejné pravidlo pro konverzi několika položek, můžete uvést více výrazů (odkud) a více výrazů (kam) oddělenými čárkou. Platí ale, že musíte výrazů (odkud) i (kam) musí být stejný počet jinak program zahlásí chybu. Například:


207I2,209I2->362I1,822I2 
{        
    If S=="" Then S="1"  
}


Může nastat případ, že takto oddělených položek může být velké množství. K tomuto účelu můžete použít makro konstrukci GROUP(proměnná). Proměnná musí být globální a musí být uvedena bud v konfiguračním souboru nebo v pravidle BeforeAll. Tato proměnná musí obsahovat řetězce oddělené čárkou. Podle těchto řetězců se výrazy (odkud) i výrazy (kam) rozvinou. Uveďme si příklad:


V pravidle BeforeAll bude uvedeno:


MOJE_ODKUD=700,701,702,703,704 
MOJE_KAM=400,401,402,456,480


V souboru pravidel bude uvedeno pravidlo:


/*skupinove pravidlo*/
GROUP(MOJE_ODKUD)$a->GROUP(MOJE_KAM)$a { 

}


A je to totéž jako byste napsali:


/*skupinove pravidlo*/
700$a,701$a,702$a,703$a,704$a->400$a,401$a,402$a,456$a,480$a  { 

}


Skupinu pak můžete použít ve více pravidlech a nemusíte ji neustále vypisovat.


c) Jazyk UseScript

Jazyk pravidel byl navrhován s cílem vytvořit co nejjednodušší syntaxi. Proto vychází ze syntaxe jazyka Basic, přejímá však některé prvky z jiných programovacích jazyků. Má jenom základní kolekci operátorů a řídících struktur, přesně pro potřeby psaní jednoduchých pravidel. Jeho vlastnosti jsou následující:


  • V programu není možno definovat vlastní funkce.

  • Jazyk má pouze dva datové typy. Typ Integer(Číslo) a typ String(Řetězec).

  • Jazyk dynamicky identifikuje typy. To znamená, že nemusíte zadávat jakého je proměnná typu.

  • Jazyk patří do skupiny interpretový jazyk, neprobíhá tedy žádný překlad.

  • Proměnné je třeba inicializovat nějakou hodnotou před použitím. To znamená, že první výskyt proměnné musí být vždy na levé straně přiřazovacího příkazu.

  • Jazyk pracuje interně s type Integer z jazyka C, hodnota Integeru může být tedy v příslušném rozsahu.

  • Komentáře se uvádějí za znak jednoduchá uvozovka ' a komentář je pak vše od tohoto znaku do konce řádku. Komentáře přes více řádků jazyk nepodporuje.

  • Jazyk UseScript je tzv. Case sensitive, neboli záleží na tom, zdali napíšete While nebo WHILE nebo while. Správně je pouze první případ a ostatní bude považováno za chybu. To samé platí v případě proměnných. Proměnná Moje a proměnná MOJE jsou dvě různé proměnné.



Klíčová slova

V následující tabulce je přehled klíčových slov jazyka usescript. Jedná se o rezervovaná slova, která není možné použít pro názvy proměnných a která odpovídají elementárním příkazům jazyka usescript pro řízení běhu programu.


  • If

  • Then

  • Else

  • Endif

  • While

  • Wend

  • For

  • To

  • Next

  • Exit


Operátory


V jazyce usescript jsou definovány tyto operátory s níže uvedenými prioritami vyhodnocení:


Operátor

Symbol

Popis

Priorita

*

hvězdička

násobení

5

/

lomítko

dělení

5

+

plus

sčítání

4

-

minus

odčítání

4

==

dvojice rovnítek

je rovno?

3

!=

vykřičník a rovnítko

není rovno?

3

>

většítko

větší než?

2

<

menšítko

menší než?

2

&

ampersand

logická spojka AND (a zároveň)

1

|

tzv. "svislítko"

logická spojka OR (a nebo)

1


Priorita určuje pořadí vyhodnocení operátorů v neuzávorkovaném výrazu. Čím vyšší číslo je uvedeno v sloupci priorita, tím dříve je daný operátor vyhodnocen. Operátory stejné priority jsou vyhodnocovány zleva doprava.


Příklad:


12*5+2


Nejprve se vynásobí čísla 12 a 5 (operátor * s prioritou 5) a poté se k mezivýsledku přičte číslo 2 (operátor + s prioritou 4).


Pro provedení součtu čísel 5 a 2 a následné vynásobení číslem 12 je nutné zapsat výraz takto:


Příklad:


12*(5+2)


V případě logických podmínek je situace analogická. Podmínka:


Příklad:


a > 5 | a < -5


je vyhodnocena takto: nejdříve proběhne vyhodnocení, zda hodnota proměnné a je větší než 5, následně vyhodnocení, zda hodnota proměnné a je menší než -5 a v posledním kroku se provede vyhodnocení, zda hodnota levého argument operátoru | (znak svislítko) je pravda a pokud se pak se provede vyhodnocení, zda hodnota pravého argumentu je pravda.


Pozor! - jazyk usescript nepoužívá zkrácené vyhodnocení podmínky s logickou spojkou OR - tzn. pravý argument operátoru | (tzv. "svislítko") se vyhodnotí vždy.




Řídící struktury


V následujícím přehledu jsou uvedeny základní příkazy jazyka Usescript, které se používají pro řízení běhu programu.


If

Zápis:

If podminka Then prikaz [Else prikaz]

Popis:

Podmíněný příkaz.

Je-li splněna podmínka uvedená mezi klíčovými slovy If a Then, vykonají se příkazy uvedené mezi slovy Then a Else resp. Endif v opačném případě se vykonají příkazy uvedené mezi slovy Else a Endif. Konstrukce Else nemusí být v podmíněném příkazu uvedena.

Příklady:

Příklad zápisu bez uvedení slova Else:


If a>10 Then
	WriteToLog("a je vetsi nez deset")
Endif


Příklad zápisu úplné podmínky:


If a>10 Then
   WriteToLog("a je vetsi nez deset")
Else
   WriteToLog("a je mensi nebo rovno nez deset") 
Endif


Příklad zkráceného zápisu podmíněného příkazu na jeden řádek. Na jeden řádek je možno příkaz zapsat pouze v případě, že za Then resp. Else je uveden pouze jediný příkaz. V tomto případě:


If a>10 Then WriteToLog("a je vetsi nez deset")

For

Zápis:

For ridici promenna = pocatecni hodnota To cilova hodnota

prikazy

Next

Popis:

Iterační příkaz. Příkazy uvedené mezi řádky obsahujícími slova For a Next se vykonávají v cyklu. Při každém cyklu se řídící proměnná s počáteční hodnotou "počáteční hodnota" zvětšuje o jedničku, dokud nedosáhne hodnoty "cílová hodnota" uvedené za klíčovým slovem To. V okamžiku, kdy řídící proměnná cílové hodnoty dosáhne, provede se poslední cyklus a vykonání příkazu se ukončí.

Příklady:

Příklad pro vypsání hodnot proměnné i v intervalu 1 až 10 do logového souboru:


For i=1 To 10
	WriteToLog("i=" + i)
Next


Záznam o vykonání výše uvedeného příkladu v logu by vypadal takto:


i=1
i=2
i=3
i=4
i=5
i=6
i=7
i=8
i=9
i=10

While

Zápis:

While podminka

prikazy

Wend

Popis:

Cyklus s podmínkou na začátku. Příkazy mezi řádky obsahujícími While a Wend se vykonávají v cyklu, dokud je splněna podmínka uvedená za klíčovým slovem While.

Příklady:

Příklad pro vypsání hodnot proměnné i v intervalu 1 až 10 do logového souboru:


i=0
While i<11
   i=i+1
   WriteToLog("i=" + i)
Wend 


Záznam o vykonání výše uvedeného příkladu v logu by vypadal takto:


i=1
i=2
i=3
i=4
i=5
i=6
i=7
i=8
i=9
i=10

Exit

Zápis:

Exit

Popis:

Příkaz pro ukončení vykonávání skriptu.

Příklady:

Příklad pro vypsání hodnot proměnné i v intervalu 1 až 10 do logového souboru s ukončením po první iteraci:


i=0
While i<11
	i=i+1
	WriteToLog("i=" + i)
	Exit
Wend


Záznam o vykonání výše uvedeného příkladu v logu by vypadal takto:


i=1

Poznámky:

Pozor! - příkaz musí být uveden na samostatném řádku, není jej tedy možné uvést např. ve zkrácené formě zápisu příkazu If.

Proměnné

1. Uživatelsky definované proměnné

Proměnnou si můžete představit jako jakýsi pojmenovaný úložný prostor. Do tohoto prostoru je možné v jazyce usescript ukládat číslo nebo text.

Chceme-li do nějaké proměnné něco uložit, je třeba nejprve zvolit její název a přiřazovacím příkazem = (tj. rovnítko) do ní vložit hodnotu.


Tedy příkaz:

a=10


způsobí, že se do proměnné a uloží číslo 10. Pokud nyní proměnnou a použijeme v nějakém výrazu, místo názvu proměnné se použije příslušná hodnota, tedy v tomto případě číslo 10.


Tedy příkaz:


b=a+10


způsobí, že se do proměnné uloží číslo 20 (tedy 10 + 10).


Název proměnné je možné volit libovolně, pokud se název skládá z alfanumerických znaků a podtržítek a nekoliduje s klíčovými slovy jazyka usescript. Je vhodné proměnné pojmenovávat tak, aby název proměnné odpovídal významu ukládané hodnoty.


Do proměnné můžeme ukládat i textové řetězce.


Tedy příkaz:


nazev_autora="Milne, A.A."


způsobí, že se do proměnné nazev_autora uloží textový řetězec "Milne, A.A.".


Proměnné se pro jednoduchost ukládají do jediného úložiště proměnných. Znamená to tedy, že nadefinujete-li proměnnou v jednom pravidle, tato proměnná bude přítomna i v jakémkoli dalším pravidle a to i při konverzi dalšího záznamu!!!!


2. Předdefinované proměnné

Před použitím jakéhokoliv pravidla se nejprve inicializují některé proměnné. Jejich význam a použití je popsáno v této kapitole. Tyto proměnné je možné v pravidle dále modifikovat a ovlivňovat tak chování programu.


1. Proměnná S

V proměnné "S" je hodnota aktuálně zpracovávané položky a po vykonání pravidla je hodnota z této proměnné vložena do výstupní předepsané položky

Příklad:


200$a->300$b  {      
        ' Do logu se zapíše obsah pole 200$a
        WriteToLog(S)           
	
        ' Do pole 300$b se vloží řetězec "test" 
	' následovaný obsahem pole 200$a 
	S="test" + S            
}


Znamená to tedy, že pokud je pravidlo prázdné (200$a->300$b{ }), hodnota S se přenese beze změny a pole 300$b bude obsahovat totéž, co obsahovalo pole 200$a


2. Proměnná TOC

V proměnné TOC je uložen řetězec pravidla za šipkou, tedy v případě 200$a->300$b{ } je zde uloženo "300$b" a v případě, že v průběhu pravidla toto změníte, výstup v proměnné S bude směřovat jinam. Například:



200$a->300$b  {      
        TOC="300$c"         
}


je totéž jako kdyby jste napsali:


200$a->300$c  {      

}


Tímto způsobem můžete dynamicky v průběhu provádění pravidla měnit cíl výsledné hodnoty. V případě, že je hodnota měněna v pravidle, mělo by pravidlo vypadat pro přehlednost spíše takto.


200$a->All  {      
        TOC="300$c"         
}


Hodnota All říká čtenáři pravidel, že proměnná TOC se v pravidle modifikuje a je tedy lhostejné co je ve výraze napravo za šipkou-


3. Proměnná FROMC

V proměnné FROMC je uložen řetězec pravidla před šipkou, tedy v případě 200$a->300$b{ } je zde uloženo 200$b. Proměnná je pouze ke čtení - tj. změnou její hodnoty ničeho nedosáhnete.


4. Proměnná FROM_IDF

V proměnné FROM_IDF je uložena část proměnné FROMC a to konkrétně první tři znaky (Mid(FROMC,1,3)). Tato část označující zpravidla název pole (ve 200$a je to retezec "200") se používá tak často, že pro ní vznikla tato nová proměnná, aby se nemusela požívat konstrukce uvedená v závorce.


5. Proměnná SET

Proměnná SET má standardně hodnotu 1, pokud ji změníte na nulu, znamená to, že po dokončení tohoto pravidla se nebude už nic nastavovat. To znamená že hodnoty S a TOC přijdou vniveč.


6. Proměnná ADD

Proměnná ADD má standardně hodnotu 0, pokud ji nastavíte na jedna, znamená to, že nechcete hodnotu v aktuálním výstupu nahradit, ale proměnnou S přidat k hodnotě stávající.


7. Proměnné NF,NS

Proměnné NF, NS jsou asi nejkomplikovanější záležitostí konverze. Řeší situaci, kdy je například některé pole ve vstupním formátu opakovatelné, ale pole kam hodnoty směřují je neopakovatelné a hodnoty z více podpolí na vstupu se řekněme kupí v jediném poli na výstupu:


To je rozdíl oproti situaci, kdy by při každém novém poli 200 vzniklo na výstupu nové pole 100. Toto chování upravíte právě nastavením hodnot NF(Number field), NS(NumberSubfield). Jedná se v podstatě o hodnoty indexů, podobně jako je tomu ve výrazech typu 200(1)$a(3).

Podobně jako je proměnná S zároveň vstupní a zároveň výstupní hodnotou jsou také proměnné NF,NS zároveň vstupními a zároveň výstupními hodnotami.


Mějme záznam:


200  $aprvní hodnota 
200  $adruhá hodnota
200  $atřetí hodnota


a pravidlo


200$a->100$a { WriteToLog("NF:" + NF + " - NS:" + NS) }


V proměnné NF je při vstupu index aktuálně zpracovávaného pole (v našem případě by proměnná obsahovala postupně 1,2,3 a NS by bylo ve všech třech případech 1 ($a je vždy jediné a první). Z pravidla uvedeného výše by se tedy objevily tři řádky v logu


NF:1 - NS:1 
NF:2 - NS:1 
NF:3 - NS:1


Výstup by tedy směřoval do pole 100(NF)$a(NS) tedy postupně do:


100(1)$a(1)
100(2)$a(1)
100(3)$a(1) 


Jelikož před provedením pravidla žádné pole 100 neexistovalo, vytvořili by se postupně tři nová pole s indexy 1-3. To je standardní chování. Chcete-li toto chování změnit, aby situace vypadala jako na obrázku,Vaše pravidlo by vypadalo následovně:


200$a->100$a { NS=NF; NF=1 }


Výstup by tedy směřoval do pole 100(NF)$a(NS) tedy postupně do:


100(1)$a(1) 
100(1)$a(2)  
100(1)$a(3)


Vzniklo by tedy pouze jediné pole 100 s třemi podpoli $a. Chtěli-li byste aby všechny podpole $a se spojili do jediného podpole $a jediného pole $100, udělali byste to takhle:


200$a->100$a { NS=1; NF=1; ADD=1 }


Výsledek by byl


100$aprvní hodnotadruhá hodnotatřetí hodnota



Funkce


Vedle řídících struktur existuje v jazyce usescript množství funkcí.. Tyto funkce jsou popsány v této kapitole.


Abecední seznam funkcí:



Pozor! - Jazyk usescript v této chvíli nepodporuje definici vlastních funkcí.


1. Funkce pro ladění
WriteToLog

Popis:

Funkce zapíše do logovacího souboru řádek "hodnota"

Vzor volání:

WriteToLog(hodnota)

Vstupní argumenty:

Označení

Datový typ

Poznámka

hodnota

textový řetězec nebo číselná hodnota

libovolný textový řetězec nebo číselná hodnota

Návratová hodnota:

-

Příklad:

WriteToLog("hodnota proměnné i=" + i)


Provedení výše uvedeného příkladu způsobí vypsání hodnoty proměnné i do logu.

GetRecord

Popis:

GetRecord vrátí výstupní tedy vznikající záznam ce formátu txt. Více o tomto forámtu najdete v kapitole Textový formát

Vzor volání:

GetRecord()

Návratová hodnota:

rekord ve formátu txt.

Příklad:

V případě takovéhoto výstupního záznamu


nam 2200229 a 4500
001  zpk20010038759
005  20010110000000.0
260  $aBasel :$bNatursforschende Gesellschaft
7001 $aBrodtbeck, Thomas.$4aut
7001 $aBrodtbeck, Thomas.$4aut


by příkaz


WriteToLog("*******************************")
WriteToLog(GetRecord())
WriteToLog("*******************************")


způsobil vypsání do logu:


*******************************
nam 2200229 a 4500
001  zpk20010038759
005  20010110000000.0
260  $aBasel :$bNatursforschende Gesellschaft
7001 $aBrodtbeck, Thomas.$4aut
7001 $aBrodtbeck, Thomas.$4aut
*******************************


2. Funkce pro práci se soubory
ClearFile

Popis:

Funkce slouží ke zkrácení souboru se zadaným jménem na nulovou velikost. Pokud soubor doposud neexistuje, je vytvořen prázdný soubor se zadaným názvem.

Vzor volání:

ClearFile(název souboru)

Vstupní argumenty:

Označení

Datový typ

Poznámka

název souboru

textový řetězec

název souboru, který se má zkrátit na nulovou velikost, soubor nemusí existovat

Pozor! - konvertor musí mít právo takový soubor vytvořit resp. do něj zapisovat

Návratová hodnota:

Návratovou hodnotou je 0, pokud zkrácení souboru proběhlo úspěšně, v opačném případě je vypsáno chybové hlášení do logu o nemožnosti provedení operace zkrácení záznamu.

Příklad:

ClearFile("/tmp/outrecord.txt")


Provedení výše uvedeného příkladu způsobí zkrácení souboru /tmp/outrecord.txt na nulovou velikost.

WriteOutRecordToFile

Popis:

Funkce slouží k vyvolání okamžitého zápis vstupního záznamu, včetně případných již provedených modifikací do souboru v daném formátu. Pokud soubor doposud neexistuje, je zavoláním této funkce vytvořen, pokud již existuje, je zapisovaný záznam připojen na konec souboru.

Vzor volání:

WriteOutRecordToFile(název souboru,formát záznamu)

Vstupní argumenty:

Označení

Datový typ

Poznámka

název souboru

textový řetězec

název souboru, do kterého se má záznam zapsat, soubor nemusí existovat

Pozor! - konvertor musí mít právo takový soubor vytvořit resp. do něj zapisovat

formát záznamu

textový řetězec

přípustnými hodnotami jsou pouze tyto: aleph, iso a txt (více o formátech záznamu viz formáty záznamů)

Návratová hodnota:

Návratovou hodnotou je 0, pokud zápis proběhl úspěšně, v opačném případě je vypsáno chybové hlášení do logu o nemožnosti provedení operace zápisu.

Příklad:

WriteOutRecordToFile("/tmp/outrecord.txt","txt")


Provedení výše uvedeného příkladu způsobí okamžitý zápis vstupního záznamu včetně případných již provedených modifikací do souboru /tmp/outrecord.txt v textovém formátu.

3. Funkce pro práci z řetězci
TranslateAsciiChars

Popis:

Funkce převede v zadaném vstupním textovém řetězci znak po znaku všechny výskyty znaků ze zdrojové množiny znaků na znaky z cílové množiny znaků

Vzor volání:

TranslateAsciiChars(text,zdrojová množina znaků, cílová množina znaků)

Vstupní argumenty:

Označení

Datový typ

Poznámka

text

textový řetězec

libovolný textový řetězec; není-li argumentem textový řetězec, vypíše se chybové hlášení do logu

zdrojová množina znaků

textový řetězec

Pozor! - zadány mohou být pouze ASCII znaky a jejich počet musí odpovídat počtu znaků argumentu cílová množina znaků

cílová množina znaků

textový řetězec

Pozor! - zadány mohou být pouze ASCII znaky a jejich počet musí odpovídat počtu znaků argumentu zdrojová množina znaků

Návratová hodnota:

Návratovou hodnotou je zadaný vstupní textový řetězec v němž jsou všechny výskyty znaků ze zdrojové množiny znaků nahrazeny odpovídajícími znaky z cílové skupiny znaků.

Příklad:

t = TranslateAsciiChars("male","elma","ELMA")
WriteToLog("male -> "+t)


Záznam o vykonání výše uvedeného příkladu v logu by vypadal takto:


male -> MALE

StripAsciiChars

Popis:

Funkce odstraní ze zadaného vstupního textového řetězce všechny výskyty znaků z dané množiny znaků resp. odstraní znaky, které v zadané množině znaků nejsou uvedeny

Vzor volání:

StripAsciiChars(text,množina znaků,doplněk)

Vstupní argumenty:

Označení

Datový typ

Poznámka

text

textový řetězec

libovolný textový řetězec; není-li argumentem textový řetězec, vypíše se chybové hlášení do logu

množina znaků

textový řetězec

Pozor! - zadány mohou být pouze ASCII znaky

cílová množina znaků

číslo

Pozor! - zadána může být pouze hodnota 1 nebo 0, je-li uvedena jiná hodnota, nedojde k žádné změně vstupního textového řetězce;


pokud je zadána hodnota 0, odstraní se ze vstupního řetězce všechny znaky uvedené v zadané množině znaků


pokud je zadána hodnota 1, odstraní se ze vstupního řetězce doplněk k zadané množině znaků, tedy znaky v neuvedené

Návratová hodnota:

Návratovou hodnotou je zadaný vstupní textový řetězec, v němž jsou všechny výskyty znaků ze zdrojové množiny znaků nahrazeny odpovídajícími znaky z cílové skupiny znaků.

Příklad:

t = StripAsciiChars("p r o k l a d a n y - t e x t"," ",0)
WriteToLog("text bez mezer = "+t)


Záznam o vykonání výše uvedeného příkladu v logu by vypadal takto:


text bez mezer = mezerami-prokladany-text


Podobně:


t = StripAsciiChars(".0a9de8f7g6ty5j4k3ad2a","0123456789",1)
WriteToLog("pouze cisla = "+t)


Záznam o vykonání výše uvedeného příkladu v logu by vypadal takto:


pouze cisla = 0987654321


Mid

Popis:

Funkce vrátí část řetězce počínajícího začátkem o délce délka.

Vzor volání:

Mid(řetězec, začátek, délka) nebo Mid(řetězec, začátek)

Vstupní argumenty:

Označení

Datový typ

Poznámka

řetězec

textový řetězec

libovolný textový řetězec; není-li argumentem textový řetězec, vypíše se chybové hlášení do logu

začátek

číslo

začátek části řetězce. Pro první písmeno by byla hodnota 1.

[délka]

číslo

nepovinný parametr. Jestliže parametr neuvedete, vrácená část bude od argumentu začátek do konce řetězce.

Návratová hodnota:

Návratovou hodnota je odpovídající část řetězce.

Příklad:

WriteToLog("Zkrácený text = " + Mid("nějaký text",3,3))


Provedení výše uvedeného příkladu zapíše do logu následující text:


Zkrácený text = jak


Len

Popis:

Funkce vrátí část délku řetězce.

Vzor volání:

Len(řetězec)

Vstupní argumenty:

Označení

Datový typ

Poznámka

řetězec

textový řetězec

libovolný textový řetězec; není-li argumentem textový řetězec, vypíše se chybové hlášení do logu

Návratová hodnota:

Návratovou hodnota je délka řetězce jako číslo.

Příklad:

WriteToLog("Délka textu je = " + Len("nějaký text"))


Provedení výše uvedeného příkladu zapíše do logu následující text:


Délka textu je = 11


Find

Popis:

Funkce vyhledá v řetězci hledaný text a vrátí pozici prvního výskytu hledaného textu buď od počátku řetězce nebo od pozice start.

Vzor volání:

Find(řetězec, hledaný text, start) nebo Find(řetězec, hledaný text)

Vstupní argumenty:

Označení

Datový typ

Poznámka

řetězec

textový řetězec

libovolný textový řetězec; není-li argumentem textový řetězec, vypíše se chybové hlášení do logu

hledaný text

textový řetězec

libovolný řetězec, který se má vyhledat v řetězci zadaným jako první argument

[start]

číslo

pozice v řetězci řetězec kde má začít hledání řetězce hledaný text

Návratová hodnota:

Návratovou hodnota je číslo - pozice výskytu počítána od 1.

Příklad:

WriteToLog("Pozice=" + Find("nějaký text text","te"))


Provedení výše uvedeného příkladu zapíše do logu následující text:


Pozice=8


kdežto:


WriteToLog("Pozice=" + Find("nějaký text text","te",9))


Provedení výše uvedeného příkladu zapíše do logu následující text:


Pozice=13


FindReverse

Popis:

Funkce vyhledá v řetězci hledaný text odzadu a vrátí pozici prvního výskytu hledaného textu buď od konce řetězce nebo od pozice start.

Vzor volání:

FindReverse(řetězec, hledaný text, start) nebo FindReverse(řetězec, hledaný text)

Vstupní argumenty:

Označení

Datový typ

Poznámka

řetězec

textový řetězec

libovolný textový řetězec; není-li argumentem textový řetězec, vypíše se chybové hlášení do logu

hledaný text

textový řetězec

libovolný řetězec, který se má vyhledat v řetězci zadaným jako první argument hledáno odzadu

[start]

číslo

pozice v řetězci řetězec kde má začít hlední řetězce hledaný text

Návratová hodnota:

Návratovou hodnota je číslo - pozice výskytu počítána od 1.

Příklad:

WriteToLog("Pozice=" +FindReverse("nějaký text text","te"))

Provedení výše uvedeného příkladu zapíše do logu následující text:


Pozice=13


kdežto:


WriteToLog("Pozice=" + FindReverse("nějaký text text","te",9))

Provedení výše uvedeného příkladu zapíše do logu následující text:


Pozice=8


Trim

Popis:

Funkce odstraní ze řetězce zprava i zleva mezery. Neodstraní mezery, které jsou uvnitř textu.

Vzor volání:

Trim(řetězec)

Vstupní argumenty:

Označení

Datový typ

Poznámka

řetězec

textový řetězec

libovolný textový řetězec; není-li argumentem textový řetězec, vypíše se chybové hlášení do logu

Návratová hodnota:

návratovou hodnotou je řetězec zbavený zprava i zleva mezer

Příklad:

WriteToLog("Bezmezer<" +Trim("   nějaký text ") + ">")


Provedení výše uvedeného příkladu zapíše do logu následující text:


Bezmezer<nějaký text>


TrimChars

Popis:

Funkce odstraní ze řetězce zprava i zleva znaky, které se nacházejí ve skupině znaků. Neodstraní znaky, které jsou uvnitř textu, který nezačíná ani nekončí žádným znakem ze skupiny znaků.

Vzor volání:

TrimChars(řetězec, skupina znaků)

Vstupní argumenty:

Označení

Datový typ

Poznámka

řetězec

textový řetězec

libovolný textový řetězec; není-li argumentem textový řetězec, vypíše se chybové hlášení do logu

skupina znaků

textový řetězec

skupina znaků, které se mají z konce a začátku řetězce odstranit. Znamená to, že se odstraní z konce a začátku řetězce skupina znaků, která obsahuje libovolný počet výskytů znaků z tohoto parametru.

Návratová hodnota:

Návratovou hodnotou je řetězec zbavený zprava i zleva mezer.

Příklad:

WriteToLog("bez<"+TrimChars(";(( t-ext,a ,,/",",()/;: -")+">")

Provedení výše uvedeného příkladu zapíše do logu následující text:


bez<t-ext,a>


Replace

Popis:

Funkce prohledá řetezec a všechny výskyty hledaného textu nahradí textem nahrazení

Vzor volání:

Replace(řetězec, hledaný text, nahrazení)

Vstupní argumenty:

Označení

Datový typ

Poznámka

řetězec

textový řetězec

libovolný textový řetězec

hledaný text

textový řetězec

libovolný textový řetězec, který se má vyhledat v řetězci zadaném jako první argument a nahradit jej třetím argumentem

nahrazení

textový řetězec

libovolný textový řetězec, kterým se má nahradit řetězec zadaný jako druhý argument

Návratová hodnota:

Návratovou hodnotou je řetězec.

Příklad:

WriteToLog("Přepsaný = " + Replace("tento text","te","---"))


Provedení výše uvedeného příkladu zapíše do logu následující text:


Přepsaný = ---nto ---xt


SplitByChars

Popis:

Funkce rozloží řetězec na pole hodnot, které jsou v řetězci odděleny jedním z prvků pole oddělovače. Výsledek se objeví v poli s názvem název pole a v poli název pole značek jsou uvedeny oddělovače, kterými byly jednotlivé hodnoty odděleny. Metoda udává jakým způsobem se má oddělování provádět.

Vzor volání:

SplitByChars(řetězec, oddělovače, název pole, název pole značek, metoda)

Vstupní argumenty:

Označení

Datový typ

Poznámka

řetězec

textový řetězec

libovolný textový řetězec

oddělovače

textový řetězec

název pole jehož prvky jsou oddělovače jako řetězce

název pole

textový řetězec

název pole,které ještě nemusí existovat a v němž po provedení příkazu najdete jednotlivé oddělené hodnoty.

název pole oddělovačů

textový řetězec

název pole,které ještě nemusí existovat a v němž po provedení příkazu najdete oddělovače, kterými byl řetězec skutečně oddělen tak jak šly za sebou

metoda

textový řetězec

Může nabývat následujících hodnot:

  • "BYALL"

    v řetězci nemusí jít oddělovače popořadě tak, jak jsou uvedeny v poli oddělovačů

  • "BYORDER"

    v řetězci musí jít oddělovače popořadě tak, jak jsou uvedeny v poli oddělovačů, některé však mohou být vynechány

  • "BYORDERDIRECT"

    v řetězci musí jít oddělovače popořadě tak, jak jsou uvedeny v poli oddělovačů, žádný nesmí být

Návratová hodnota:

Jedna jestliže proběhl příkaz úspěšně nebo nula v opačném případě.

Příklad:

V takovémto vstupním záznamu:


nam 2200229 a 4500
001  zpk20010038759
005  20010110000000.0
260  $aČapek, Karel ; spisovatel (dramatik)
7001 $aBrodtbeck, Thomas.$4aut
7001 $aBrodtbeck, Thomas.$4aut



A v takovémto pravidle:


260$a->All {
   Array("Separators" , "," , " ; " , "(" , ")") 
   If SplitByChars( S , "Separators" , "Hodnoty" , "Znacky" ,
           "BYORDERDIRECT" )==0 Then
     WriteToLog("Chyba")
     Exit
   Endif
   For i=1 To CountArray("Hodnoty")
   WriteToLog("Hodnota: " + GetArray("Hodnoty",i) + 
           "- Oddělovač: " + GetArray("Znacky",i)) 
Next 


Výsledek v logu by byl:


Hodnota: Čapek - Oddělovač: ,
Hodnota: Karel - Oddělovač:  ; 
Hodnota: spisovatel - Oddělovač:  ( 
Hodnota: dramatik - Oddělovač:  ) 


4. Funkce pro konverzi
Table

Popis:

Funkce otevře tabulku uloženou v souboru s daným názvem a vyhledá v ní hodnotu odpovídající zadanému hledanému heslu.


Struktura souboru definujícího tabulku je stejná jako struktura souboru s parametry konvertoru a pro zápis hesel platí stejná pravidla jako pro zápis parametrů (viz struktura konfiguračního souboru)

Vzor volání:

Table(název souboru, hledané heslo, alternativní návratová hodnota) nebo Table(název souboru, hledané heslo)

Vstupní argumenty:

Označení

Datový typ

Poznámka

název souboru

textový řetězec

libovolný textový řetězec; není-li argumentem textový řetězec, vypíše se chybové hlášení do logu


Pozor! - soubor s daným názvem již musí existovat v adresáři TablesDirectory (viz parametr konvertoru TablesDirectory)

hledané heslo

textový řetězec

heslo, jemuž odpovídající hodnota se má v tabulce vyhledat

[alternativní návratová hodnota]

textový řetězec

nepovinný argument

libovolný textový řetězec, který se má vrátit, pokud není heslo v tabulce nalezeno

Návratová hodnota:

návratovou hodnotou je buď hodnota příslušného hesla dohledaná v zadané tabulce nebo hodnota třetího argumentu, pokud heslo nebylo v tabulce nalezeno, pokud není třetí argument uveden a heslo nebylo nalezeno, je návratovou hodnotu řetězec složený z písmen "X" o takové délce, jakou má zadané heslo

Příklad:

Pokud v adresáři specifikovaném parametrem TablesDirectory existuje soubor den.tbl s obsahem:


1=pondělí
2=úterý
3=středa
4=čtvrtek
5=pátek
6=sobota
7=neděle


Pak provedení následujícího příkladu:


t = Table("den.tbl","1","nenalezeno")
WriteToLog("den = "+t)
t = Table("den.tbl","8","nenalezeno")
WriteToLog("den = "+t)


by zůsobilo, že záznam v logu by vypadal takto:


den = pondělí
den = nenalezeno


GetMarcInValue

Popis:

Funkce vrátí hodnotu podle příkazu v aktuálním záznamu na vstupu. Příkaz vyžaduje stejnou syntaxi jakým jsou psána samotná pravidla. Jak se tyto pravidla píšou najdete v kapitole Výrazy pro přístup k záznamům.

Tj. výrazy typu:

GetMarcInValue("200(2)$a(1)")

Narozdíl od výrazů pro přístup k záznamům v hlavičkách pravidel je ovšem nutné uvádět indexy polí i podpolí. Musí být tedy jednoznačně jasné, jaké pole nebo podpole máte na mysli. Například kdyby jste zavolali:

GetMarcInValue("200$a")

Není programu jasné, které z polí 200 a které z podpolí $a máte na mysli. Tento postup selže, i když je takovéto pole a jeho podpole v záznamu jediné. Je třeba konkrétně uvést:

GetMarcInValue("200(1)$a(1)")



Vzor volání:

GetMarcInValue(výraz)

Vstupní argumenty:

Označení

Datový typ

Poznámka

výraz

textový řetězec

textový řetězec ve tvaru Výrazu pro přístup k záznamům

Návratová hodnota:

Návratovou hodnotou je hodnota entity, kterou jste označili ve výraze. Pokud je váš výraz chybně nebo daná entita nebyla nalezena, vrátí funkce prázdný řetězec.

Příklad:

V takovémto vstupním záznamu:


nam 2200229 a 4500
001  zpk20010038759
005  20010110000000.0
260  $aBasel :$bNatursforschende Gesellschaft
7001 $aBrodtbeck, Thomas.$4aut


By následující příkaz:


WriteToLog("hodnota = " + GetMarcInValue("260(1)$a(1)"))


způsobil zapsání do logu následující text:


hodnota = Basel :


a následující


WriteToLog("hodnota = " + GetMarcInValue("700(1)I1"))


způsobil zapsání do logu následující text:


hodnota = 1


GetMarcOutValue

Popis:

Funkce vrátí hodnotu podle příkazu v aktuálním záznamu na výstupu. (Tím se myslí záznam, který při konverzi vzniká. ) Příkaz vyžaduje stejnou syntaxi, jakou jsou psána samotná pravidla. Jak se tyto pravidla píší najdete v kapitole Výrazy pro přístup k záznamům.

Tj. výrazy typu:

GetMarcOutValue("200(2)$a(1)")

Narozdíl od výrazů pro přístup k záznamům v hlavičkách pravidel je ovšem nutné uvádět indexy polí i podpolí. Musí být tedy jednoznačně jasné, jaké pole nebo podpole máte na mysli. Například kdyby jste zavolali:

GetMarcOutValue("200$a")

Není programu jasné, které z polí 200 a které z podpolí $a máte na mysli. Tento postup selže, i když je takovéto pole a jeho podpole v záznamu jediné. Je třeba konkrétně uvést:

GetMarcOutValue("200(1)$a(1)")



Vzor volání:

GetMarcOutValue(výraz)

Vstupní argumenty:

Označení

Datový typ

Poznámka

výraz

textový řetězec

textový řetězec ve tvaru Výrazu pro přístup k záznamům

Návratová hodnota:

Návratovou hodnotou je hodnota entity, kterou jste označili ve výraze. Pokud je váš výraz chybně nebo daná entita nebyla nalezena, vrátí funkce prázdný řetězec.

Příklad:

V takovémto výstupním záznamu:


nam 2200229 a 4500
001  zpk20010038759
005  20010110000000.0
260  $aBasel :$bNatursforschende Gesellschaft
7001 $aBrodtbeck, Thomas.$4aut


By následující příkaz:


WriteToLog("hodnota = " + GetMarcOutValue("260(1)$a(1)"))


způsobil zapsání do logu následující text:


hodnota = Basel :


a následující


WriteToLog("hodnota = " + GetMarcOutValue("700(1)I1"))


způsobil zapsání do logu následující text:


hodnota = 1


MaxI

Popis:

Funkce vrátí maximální index příkazu na vstupu. Příkaz vyžaduje stejnou syntaxi, jakou jsou psána samotná pravidla. Jak se tyto pravidla píší najdete v kapitole Výrazy pro přístup k záznamům.


Tj. výrazy typu:

MaxI("200(1)$a")

Narozdíl od výrazů pro přístup k záznamům v hlavičkách pravidel nesmí být uváděn index entity, na kterou se ptáte. Zároven nemá smysl ptát se index indikátorů, uvádět konstrukce části entit v ležatých závorkách a podpobně. Přípustné příkazy by byly například

MaxI("200")

nebo

MaxI("200(1)$a")

nikoliv však

MaxI("200$a")

protože není jasné, které z polí 200 myslíte.

A také nikoliv

MaxI("200(1)$a(1)")

protože v tomto případě není co počítat.


Vzor volání:

MaxI(výraz)

Vstupní argumenty:

Označení

Datový typ

Poznámka

výraz

textový řetězec

textový řetězec ve tvaru Výrazu pro přístup k záznamům

Návratová hodnota:

Návratovou hodnotou je číslo které udává počet entit na které se ptáte ve výrazu.

Příklad:

V takovémto vstupním záznamu:


nam 2200229 a 4500
001  zpk20010038759
005  20010110000000.0
260  $aBasel :$bNatursforschende Gesellschaft
7001 $aBrodtbeck, Thomas.$4aut
7001 $aBrodtbeck, Thomas.$4aut


By následující příkaz:


WriteToLog("počet = " + MaxI("260(1)$a"))


způsobil zapsání do logu následující text:


počet = 1


a následující


WriteToLog("počet = " + MaxI("700"))


způsobil zapsání do logu následující text:


počet = 2


MaxO

Popis:

Funkce vrátí maximální index příkazu na výstupu. (Tím se myslí záznam, který při konverzi vzniká. ) Příkaz vyžaduje stejnou syntaxi, jakou jsou psána samotná pravidla. Jak se tyto pravidla píší, najdete v kapitole Výrazy pro přístup k záznamům.


Tj. výrazy typu:

MaxO("200(1)$a")

Narozdíl od výrazů pro přístup k záznamům v hlavičkách pravidel nesmí být uváděn index entity, na kterou se ptáte. Zároven nemá smysl ptát se index indikátorů, uvádět konstrukce části entit v ležatých závorkách a podpobně. Přípustné příkazy by byly například

MaxO("200")

nebo

MaxO("200(1)$a")

nikoliv však

MaxO("200$a")

protože není jasné které z polí 200 myslíte.

A také nikoliv

MaxO("200(1)$a(1)")

protože v tomto případě není co počítat.


Vzor volání:

MaxO(výraz)

Vstupní argumenty:

Označení

Datový typ

Poznámka

výraz

textový řetězec

textový řetězec ve tvaru Výrazu pro přístup k záznamům

Návratová hodnota:

Návratovou hodnotou je číslo, které udává počet entit, na které se ptáte ve výrazu.

Příklad:

V takovémto výstupním záznamu:


nam 2200229 a 4500
001  zpk20010038759
005  20010110000000.0
260  $aBasel :$bNatursforschende Gesellschaft
7001 $aBrodtbeck, Thomas.$4aut
7001 $aBrodtbeck, Thomas.$4aut


By následující příkaz:


WriteToLog("počet = " + MaxO("260(1)$a"))


způsobil zapsání do logu následující text:


počet = 1


a následující


WriteToLog("počet = " + MaxO("700"))


způsobil zapsání do logu následující text:


počet = 2


NeibField

Popis:

Prozkoumá okolí aktuálního zpracovávaného pole ve vstupním záznamu a vrátí název pole. Posunutí určuje kam do svého okolí se má podívat. Například při


NeibField(-1)


vrátí pole, které se nachází první před aktuálně zpracovávaným polem.

A při


NeibField(1)


vrátí pole, které se nachází první za aktuálně zpracovávaným polem


Vzor volání:

NeibField(posunutí)

Vstupní argumenty:

Označení

Datový typ

Poznámka

posunutí

číslo

Kladné nebo záporné číslo určující posunutí.

Návratová hodnota:

Nenajde-li takové vrátí prázdný rětězec

Příklad:

V takovémto vstupním záznamu:


nam 2200229 a 4500
001  zpk20010038759
005  20010110000000.0
260  $aBasel :$bNatursforschende Gesellschaft
7001 $aBrodtbeck, Thomas.$4aut
7001 $aBrodtbeck, Thomas.$4aut


By následující příkaz:


260$a->150$a {
   WriteToLog("před = " + NeibField(-1))
}


způsobil zapsání do logu následující text:


před = 005


a následující


700$a->150$a {
   WriteToLog("před = " + NeibField(-1))
}


způsobil zapsání do logu následující text:


před = 260
před = 700


NeibSubField

Popis:

Prozkoumá okolí aktuálního zpracovávaného podpole ve vstupním záznamu a vrátí název podpole. Posunutí určuje kam do svého okolí se má podívat. Funkce nepřekračuje hranice pole, to znamená že operuje pouze v aktuálním poli. Například při


NeibSubField(-1)


vrátí podpole, které se nachází první před aktuálně zpracovávaným podpolem v aktuálně zpracovávaném poli.

A při


NeibField(1)


vrátí podpole, které se nachází první za aktuálně zpracovávaným podpolem v aktuálně zpracovávaném poli.


Vzor volání:

NeibSubField(posunutí)

Vstupní argumenty:

Označení

Datový typ

Poznámka

posunutí

číslo

Kladné nebo záporné číslo určující posunutí.

Návratová hodnota:

Nenajde-li takové vrátí prázdný rětězec.

Příklad:

V takovémto vstupním záznamu:


nam 2200229 a 4500
001  zpk20010038759
005  20010110000000.0
260  $aBasel :$bNatursforschende Gesellschaft
7001 $aBrodtbeck, Thomas.$4aut
7001 $aBrodtbeck, Thomas.$4aut


By následující příkaz:


260$a->150$a {
   WriteToLog("za = " + NeibField(1))
}


způsobil zapsání do logu následující text:


za = b


a následující


700$4->150$a {
   WriteToLog("před = " + NeibField(-1))
}


způsobil zapsání do logu následující text:


před = a
před = a


IsSubBefore

Popis:

Ve vstupním záznamu prohlédne podpole předcházející aktuálně zpracovávanému podpoli v aktuálně zpracovávaném poli a zjistí, zdali se tam vyskytuje pole s identifikatorem název podpole

Vzor volání:

IsSubBefore(název podpole)

Vstupní argumenty:

Označení

Datový typ

Poznámka

název podpole

textový řetězec o délce 1.

identifikátor podpole které má být vyhledáno

Návratová hodnota:

Vrátí číslo 1 pokud se tam pole s identifikatorem název podpole nachází nebo 0 pokud se tam nenachází.

Příklad:

V takovémto vstupním záznamu:


nam 2200229 a 4500
001  zpk20010038759
005  20010110000000.0
260  $aBasel :$bNatursforschende Gesellschaft
7001 $aBrodtbeck, Thomas.$4aut
7001 $aBrodtbeck, Thomas.$4aut


By následující příkaz:


260$b->150$a {
   WriteToLog("je tam a = " + IsSubBefore("a"))
}


způsobil zapsání do logu následující text:


je tam a = 1


a následující


700$4->150$a {
   WriteToLog("je tam b = " + IsSubBefore("b"))
}


způsobil zapsání do logu následující text:


je tam b = 0
je tam b = 0


SetValue

Popis:

Funkce podle příkazu ve tvaru výrazu pro přístup k záznamům nastaví hodnotu ve vznikajícím tedy výstupním záznamu. Hodnota je hodnota entity, která se má nastavit (obdoba proměnné S v pravidle), index pole je index pole, do kterého má hodnota směřovat (obdoba proměnné NF v pravidle), index podpole je index podpole, do kterého má hodnota směřovat (obdoba proměnné NS v pravidle) a jestliže je přidat nastaveno na 1 hodnota bude přidána k hodnotě již existující (obdoba proměnné ADD v pravidle) Je-li index nula znamená to podobně jako u proměnné NF a NS, že se má pole respektive podpole přidat, jinak se vyhledá pole o příslušném indexu a podpole o příslušném indexu a hodnota se do něj buď vloží (jeli přidat rovno nule) nebo přídá(je-li přidat rovno jedné).

Tento příkaz je alternativní cesta, jak v pravidle ovlivnit výstupní záznam. Touto cestou je možno z jednoho pravidla vytvořit více výstupů.


Vzor volání:

SetValue(příkaz, hodnota, index pole,index podpole, přidat)

Vstupní argumenty:

Označení

Datový typ

Poznámka

příkaz

textový řetězec

textový řetězec ve tvaru výrazu pro přístup k záznamům

hodnota

textový řetězec

nastavovaná hodnota

index pole

číslo

index pole, do kterého má hodnota směřovat

index podpole

číslo

index podpole, do kterého má hodnota směřovat

přidat

číslo

má-li se stávající hodnota přepsat nebo k ní hodnotu připojit

Možné hodnoty

  • 0

  • 1

Návratová hodnota:

-

Příklad:

V takovémto vstupním záznamu:


001  zpk20010038759
005  20010110000000.0
260  $aBasel :$bNatursforschende Gesellschaft
7001 $aBrodtbeck, Thomas.$4aut
7001 $aBrodtbeck, Thomas.$4aut


Po následujícím příkaze:


260$b->All {
   SetValue("500$a","hodnotaA",1,1,0)
   SetValue("500$b","hodnotaB",1,1,0)
   SET=0
}


by výstupní záznam vypadal takto:


001  zpk20010038759
005  20010110000000.0
500  $ahodnotaA$bhodnotaB
7001 $aBrodtbeck, Thomas.$4aut
7001 $aBrodtbeck, Thomas.$4aut


Nebo po následujícím příkaze:


260$b->All {
   SetValue("500I1","1",1,0,0)
   SetValue("500$a","hodnotaA",1,1,0)
   SetValue("500$b","hodnotaB",1,1,0)
   SetValue("500$a","hodnotaA",1,1,1)
   SetValue("500$b","hodnotaB",0,0,0)
   SET=0
}


by výstupní záznam vypadal takto:


001  zpk20010038759
005  20010110000000.0
5001 $ahodnotaAhodnotaA$bhodnotaB$bhodnotaB
7001 $aBrodtbeck, Thomas.$4aut
7001 $aBrodtbeck, Thomas.$4aut




BreakError

Popis:

Touto funkcí se přeruší konverze aktuálního záznamu, záznam se označí jako vadný a společně se zprávou se s ním naloží jako s každým jiným špatně zkonvertovaným záznamem. Pokračuje se s konverzí dalšího záznamu v balíku. Záznam se uloží do souboru InRecordErrorFile a v logu se objeví Vaše zpráva.

Vzor volání:

BreakError(zpráva)

Vstupní argumenty:

Označení

Datový typ

Poznámka

zpráva

textový řetězec

libovolný textový řetězec obsahující zprávu o problému

Návratová hodnota:

-

Příklad:

ContinueError

Popis:

Touto funkcí se záznam označí jako špatný, nicméně se nepřeruší konverze aktuálního záznamu, záznam se označí jako vadný a společně se zprávou se s ním naloží jako s každým jiným špatně zkonvertovaným záznamem. S konverzí se pokračuje, jako kdyby k žádné chybě nedošlo. Záznam se uloží do souboru InRecordErrorFile a v logu se objeví Vaše zpráva. Tato funkce se používá například v detailní kontrole záznamu pomocí pravidel. Více o této kontrole se dočtěte v kapitole Kontrolní soubor

Vzor volání:

ContinueError(zpráva)

Vstupní argumenty:

Označení

Datový typ

Poznámka

zpráva

textový řetězec

libovolný textový řetězec obsahující zprávu o problému

Návratová hodnota:

-

Příklad:

5. Pomocné funkce
GetMaxUnsignedInteger

Popis:

Funkce vrátí hodnotu největšího celého čísla, které se vyskytuje v zadaném řetězci, ve formě textového řetězce. Jakýkoliv nečíslicový znak se považuje za oddělovač čísel. Znaménko - (tj. minus) se interpretuje rovněž jako oddělovač.

Vzor volání:

GetMaxUnsignedInteger(text)

Vstupní argumenty:

Označení

Datový typ

Poznámka

text

textový řetězec

libovolný textový řetězec; není-li argumentem textový řetězec, vypíše se chybové hlášení do logu

Návratová hodnota:

Nejvyšší celé číslo vyskytující se v zadaném řetězci ve formě textového řetězce nebo prázdný řetězec v případě, že zadaný řetězec neobsahuje ani jednu číslici.

Příklad:

i = GetMaxUnsignedInteger("A10-11.20")
WriteToLog("i = "+GetString(i))


Záznam o vykonání výše uvedeného příkladu v logu by vypadal takto:


i = 20

GetInteger

Popis:

Funkce se pokusí převést řetězec na číslo

Vzor volání:

GetInteger(text)

Vstupní argumenty:

Označení

Datový typ

Poznámka

text

textový řetězec

libovolný textový řetězec; není-li argumentem textový řetězec, vypíše se chybové hlášení do logu

Návratová hodnota:

Bud číslo odpovídající číslu v textovém řetězci jinak vrátu nulu

Příklad:

Příkaz


WriteToLog("Soucet = " + (GetInteger("125") + 3))


Vykonání výše uvedeného příkladu by v logu vypadalo takto:


Soucet = 128

GetString

Popis:

Funkce převede řetězec na číslo

Vzor volání:

GetString(číslo)

Vstupní argumenty:

Označení

Datový typ

Poznámka

číslo

číslo

Návratová hodnota:

Text odpovídají číslu

Příklad:

Příkaz


WriteToLog("Cislo = " + GetString(5))


Vykonání výše uvedeného příkladu by v logu vypadalo takto:


Cislo = 5


Coz v tomto případě nemá žádný smysl, protože automatická typová konverze by udělala v následujícím případě totéž


WriteToLog("Cislo = " + 5)


Například ale v případě:


i=200 
MaxI(GetString(i))


by to smysl mělo


Modulo

Popis:

Funkce vrátí zbytek po dělení čísla1 číslem2

Vzor volání:

Modulo(číslo1, číslo2)

Vstupní argumenty:

Označení

Datový typ

Poznámka

číslo1

číslo

dělenec

číslo2

číslo

dělitel

Návratová hodnota:

zbytek po dělení čísla1 číslem2

Příklad:

Příkaz


WriteToLog("Zbytek = " + Modulo(20,3))


Vykonání výše uvedeného příkladu by v logu vypadalo takto:


Zbytek = 2


Array

Popis:

Funkce založí nové pole název pole, s prvky prvek1 až prvekN. Funkce má proměnný počet parametrů. První prvek je název pole a další prvky jsou prvky pole...

Vzor volání:

Array(název pole, prvek1,prvek2 ......)

Vstupní argumenty:

Označení

Datový typ

Poznámka

název pole

textový řetězec

libovolný textový řetězec; není-li argumentem textový řetězec, vypíše se chybové hlášení do logu

hodnota1

textový řetězec nebo číslo

libovolná hodnota

hodnota2

textový řetězec nebo číslo

libovolná hodnota

...

...

...

Návratová hodnota:

-

Příklad:

Array("Dny","Po","Út","St","Čt","Pá","So","Ne")
WriteToLog("prvni = " + GetArray("Dny",1))


Záznam o vykonání výše uvedeného příkladu v logu by vypadal takto:


prvni = Po

AddArray

Popis:

Funkce přidá na konec existujícího pole s daným názvem další hodnotu..

Vzor volání:

AddArray(název pole, hodnota)

Vstupní argumenty:

Označení

Datový typ

Poznámka

název pole

textový řetězec

libovolný textový řetězec; není-li argumentem textový řetězec, vypíše se chybové hlášení do logu

hodnota

textový řetězec nebo číslo

libovolná hodnota

Návratová hodnota:

-

Příklad:

a = Array("A")
AddArray("A","a")
AddArray("A","b")
WriteToLog("A = ("+GetArray("A",1)+","+GetArray("A",2)+")")


Záznam o vykonání výše uvedeného příkladu v logu by vypadal takto:


A = (a,b)

GetArray

Popis:

Funkce vrátí hodnotu, která je uložena v poli s daným názvem na pozici dané zadaným indexem

Vzor volání:

GetArray(název pole, index)

Vstupní argumenty:

Označení

Datový typ

Poznámka

název pole

textový řetězec

libovolný textový řetězec; není-li argumentem textový řetězec, vypíše se chybové hlášení do logu


Pozor! - pole s daným názvem již musí být vytvořeno

index

číslo

index umístění hodnoty v poli, prvky pole jsou indexovány od jedničky

Návratová hodnota:

-

Příklad:

a = Array("dny","po","út","st","čt","pá","so","ne")
WriteToLog("paty den = "+GetArray("dny",5))


Záznam o vykonání výše uvedeného příkladu v logu by vypadal takto:


paty den = pá

CountArray

Popis:

Funkce vrátí velikost pole název pole

Vzor volání:

CountArray(název pole)

Vstupní argumenty:

Označení

Datový typ

Poznámka

název pole

textový řetězec

libovolný textový řetězec; není-li argumentem textový řetězec, vypíše se chybové hlášení do logu


Pozor! - pole s daným názvem již musí být vytvořeno

Návratová hodnota:

-

Příklad:

a = Array("dny","po","út","st","čt","pá","so","ne")
WriteToLog("velikost = "+CountArray("dny"))


Záznam o vykonání výše uvedeného příkladu v logu by vypadal takto:


velikost = 7

SetMem

Popis:

Funkce vytvoří proměnou z výrazu, který jí je předán jako řetězec. To může být výhodné, jestliže potřebujete vytvářet proměnné na základě nějakého parametru. Funkce dělá prakticky totéž jako kdyby jste napsali

název proměnné=hodnota


Vzor volání:

SetMem(název proměnné,hodnota)

Vstupní argumenty:

Označení

Datový typ

Poznámka

název proměnné

textový řetězec

libovolný textový řetězec reprezentující název proměnné

hodnota

textový řetězec nebo číslo.

libovolná hodntoa

Návratová hodnota:

-

Příklad:

Následující příklad objasní účel funkce:


SetMem("skupina" + 1,20)
WriteToLog("hodnota = " + skupina1)


vypíše do logu:


hodnota = 20


Tato funkce se využívá poměrně často kvůli následujícímu principu. Máme následující vstupní záznam:


2602 $aBasel :$bNatursforschende Gesellschaft
7001 $aBrodtbeck, Thomas.$4aut
7001 $aBrodtbeck, Thomas.$4aut


a následující pravidla, kde dvě pravidla vedou do stejného výstupního pole a naším cílem je, aby se vytvářeli vždy nová pole pro oba případy:


/*pole 260*/
260I1->300I1 { WriteToLog("300 NF = " + NF) }
260$a->300$a { WriteToLog("300 NF = " + NF) }

/*pole 700*/
700I1->300I1 { WriteToLog("700 NF = " + NF) }
700$a->300$a { WriteToLog("700 NF = " + NF) }


V tomto případě by výsledek dopadl následovně:


3001 $aBrodtbeck, Thomas
3001 $aBrodtbeck, Thomas


A do logu by se napsalo:


300 NF = 1
300 NF = 1
700 NF = 1
700 NF = 1
700 NF = 2
700 NF = 2


To ale není to, co chceme. Jde o to, že hodnoty proměnných NF,NS určují do jakého indexu výstupního pole se má výsledek uložit. Jelikož je u prvního pole 700 index jedna napíše se výsledná hodnota do pole 300 s indexem a přepíše se tedy pole 300 vzniklé při konverzi pole 260.

Nepomohla by nám ani následující konstrukce, která říká že se má vyrobit vždy nové pole:


/*pole 260*/
260I1->300I1 { NF=0 }
260$a->300$a { NF=0 }

/*pole 700*/
700I1->300I1 { NF=0 }
700$a->300$a { NF=0 }


výsledek by totiž byl:


3002 
300  $aBasel :
3001 
300  $aBrodtbeck, Thomas
3001
300  $aBrodtbeck, Thomas


Jediná správná cesta je následující:


/*pole 260*/
260I1->300I1 { 
  SetMem("IF" + FROM_IDF + NF, MaxO("300")+1)
  NF=GetMem("IF" + FROM_IDF + NF) 
}
260$a->300$a { 
  NF=GetMem("IF" + FROM_IDF + NF)	
}

/*pole 700*/
700I1->300I1 {
  SetMem("IF" + FROM_IDF + NF, MaxO("300")+1)
  NF=GetMem("IF" + FROM_IDF + NF) 
}
700$a->300$a { 
  NF=GetMem("IF" + FROM_IDF + NF)
}


Tato složitá konstrukce v pravidle pro první indikátor, který se zaručeně první provede ve skupině pravidel pro pole 700, zjistí pomocí funkce MaxO kolik již existuje na výstupu polí 300. Tuto hodnotu zvětší o jedničku a to bude index, do kterého se toto pole bude konvertovat. Tento index si musí zapamatovat a musí ho poskytnout dalším pravidlům pro toto pole. Název proměnné musí být tedy jedinečný pro tento výskyt pole a proto vytvoří pomocí funkce SetMem jedinečnou proměnnou pro každé pole(pomocí proměnné FROM_IDF) Vznikaly by tedy tyto proměnné:


IF2601=1 
IF7001=2 
IF7002=3


a výsledek by vypadal:


3002 $aBasel :
3001 $aBrodtbeck, Thomas.
3001 $aBrodtbeck, Thomas.


Tuto konstrukci pomocí funkce SetMem byste měli použít vždy, když si nemůžete být jisti, že pole, do kterého Vaše pole směřuje, je opakovatelné a může vzniknout i jinak, než z pole, jehož konverzi právě vytváříte!




GetMem

Popis:

Funkce vrátí hodnotu zapamatovanou předem funkcí SetMem a označenou názvem název proměnné.

Vzor volání:

GetMem(název proměnné)

Vstupní argumenty:

Označení

Datový typ

Poznámka

název proměnné

textový řetězec

libovolný textový řetězec reprezentující název proměnné

Návratová hodnota:

Hodnota proměnné. Může být číslo i textový řetězec

Příklad:

Přečtěte si podrobně nápovědu k funkci SetMem

IsSet

Popis:

Funkce zjistí zda existuje proměnná název proměnné.

Vzor volání:

IsSet(název proměnné)

Vstupní argumenty:

Označení

Datový typ

Poznámka

název proměnné

textový řetězec

libovolný textový řetězec, reprezentující název proměnné

Návratová hodnota:

číslo jedna pokud proměnná existuje v opačném případě nula

Příklad:

Přečtěte si podrobně nápovědu k funkci SetMem

6. Funkce pro procházení celých záznamů
MarcFieldsCount

Popis:

Funkce zjistí počet polí ve vstupním nebo ve výstupním záznamu podle hodnoty parametru Zdroj.

Poznámka: Návěští se nepovažuje za pole

Vzor volání:

MarcFieldsCount(zdroj)

Vstupní argumenty:

Označení

Datový typ

Poznámka

zdroj

textový řetězec

Možné hodnoty

  • "I"

    Jedná se o vstupní záznam

  • "O"

    Jedná se o výstupní záznam

Návratová hodnota:

číslo udávající počet polí

Příklad:

V takovémto vstupním záznamu:


nam 2200229 a 4500
001  zpk20010038759
005  20010110000000.0
260  $aBasel :$bNatursforschende Gesellschaft
7001 $aBrodtbeck, Thomas.$4aut
7001 $aBrodtbeck, Thomas.$4aut


By následující příkaz:


Before->Before {
  WriteToLog("pocet vstupních polí  = " + MarcFieldsCount("I"))
}


způsobil zapsání do logu následující text:


pocet vstupních polí  = 5

MarcGetFieldInfo

Popis:

Funkce vrátí informace o poli s Indexem Index ve vstupním nebo ve výstupním záznamu podle hodnoty parametru Zdroj.

Poznámka: Návěští se nepovažuje za pole

Vzor volání:

MarcGetFieldInfo(zdroj, index, zjistovana vlastnost)

Vstupní argumenty:

Označení

Datový typ

Poznámka

zdroj

textový řetězec

Možné hodnoty

  • "I"

    Jedná se o vstupní záznam

  • "O"

    Jedná se o výstupní záznam

index

číslo

pořadové číslo pole, které máte na mysli počítáno od nuly. Maximální hodnotu zjistíte pomocí funkce MarcFieldsCount

zjistovana vlastnost

textový řetězec

  • "ID" - název pole

  • "I1" - první indikátor

  • "I2" - druhý indikátor

  • "CountSub" - počet podpolí pole

Návratová hodnota:

hodnota obsahující žadanou informaci

Příklad:

V takovémto vstupním záznamu:


nam 2200229 a 4500
001  zpk20010038759
005  20010110000000.0
260  $aBasel :$bNatursforschende Gesellschaft
7001 $aBrodtbeck, Thomas.$4aut
7001 $aBrodtbeck, Thomas.$4aut


By následující příkaz:


Before->Before {
    FCount = MarcFieldsCount("I")
    'procházení všech polí
    For i=0 To FCount-1
        WriteToLog("pole = " + MarcGetFieldInfo("I",i,"ID"))
    Next
}


způsobil zapsání do logu následující text:


pole = 001
pole = 005
pole = 260
pole = 700
pole = 700

MarcSetFieldInfo

Popis:

Funkce nastaví informaci poli s Indexem Index ve vstupním nebo ve výstupním záznamu podle hodnoty parametru Zdroj.

Poznámka: Návěští se nepovažuje za pole

Vzor volání:

MarcSetFieldInfo(zdroj, index, nastavovana vlastnost, hodnota)

Vstupní argumenty:

Označení

Datový typ

Poznámka

zdroj

textový řetězec

Možné hodnoty

  • "I"

    Jedná se o vstupní záznam

  • "O"

    Jedná se o výstupní záznam

index

číslo

pořadové číslo pole, které máte na mysli počítáno od nuly. Maximální hodnotu zjistíte pomocí funkce MarcFieldsCount

nastavovaná vlastnost

textový řetězec

  • "ID" - název pole

  • "I1" - první indikátor

  • "I2" - druhý indikátor

hodnota

textový řetězec

nastavovaná hodnota

Návratová hodnota:

-

Příklad:

V takovémto výstupním záznamu:


nam 2200229 a 4500
001  zpk20010038759
005  20010110000000.0
260  $aBasel :$bNatursforschende Gesellschaft
7001 $aBrodtbeck, Thomas.$4aut
7001 $aBrodtbeck, Thomas.$4aut


By následující příkaz:


After->After {
    FCount = MarcFieldsCount("O")
    'procházení všech polí
    For i=0 To FCount-1
        MarcSetFieldInfo("O",i,"ID","111")
    Next
}


způsobil následující výstupní záznam:


nam 2200229 a 4500
111  zpk20010038759
111  20010110000000.0
111  $aBasel :$bNatursforschende Gesellschaft
1111 $aBrodtbeck, Thomas.$4aut
1111 $aBrodtbeck, Thomas.$4aut

MarcGetSubFieldInfo

Popis:

Funkce vrátí informace o podpoli s Indexem index podpole náležejícímu poli s indexem index pole ve vstupním nebo ve výstupním záznamu podle hodnoty parametru Zdroj.

Poznámka: Návěští se nepovažuje za pole

Vzor volání:

MarcGetSubFieldInfo(Zdroj, index pole, index podpole, zjišťovaná vlastnost)

Vstupní argumenty:

Označení

Datový typ

Poznámka

zdroj

textový řetězec

Možné hodnoty

  • "I"

    Jedná se o vstupní záznam

  • "O"

    Jedná se o výstupní záznam

index pole

číslo

pořadové číslo pole, které máte na mysli počítáno od nuly. Maximální hodnotu zjistíte pomocí funkce MarcFieldsCount

index podpole

číslo

pořadové číslo podpole, které máte na mysli počítáno od nuly. Maximální hodnotu zjistíte pomocí funkce MarcGetFieldInfo s parametrem "CountSub"

zjistovana vlastnost

textový řetězec

  • "ID" - název podpole

  • "Value" - hodnota podpole

  • "Index" - index podpole (hodnota (NS)

  • "LinkingFieldID" - obsahuje-li podpole vložené pole, vrací funkce název tohoto pole , jinak prázný řetězec

  • "LinkingFieldI1" - obsahuje-li podpole vložené pole, vrací funkce první indikátor tohoto pole , jinak prázný řetězec

  • "LinkingFieldI2" - obsahuje-li podpole vložené pole, vrací funkce druhý indikátor tohoto pole , jinak prázný řetězec

  • "LinkingFieldCount" - počet podpolí ve vloženém poli

Návratová hodnota:

hodnota obsahující žadanou informaci

Příklad:

V takovémto vstupním záznamu:


nam 2200229 a 4500
001  zpk20010038759
005  20010110000000.0
260  $aBasel :$bNatursforschende Gesellschaft
7001 $aBrodtbeck, Thomas.$4aut
7001 $aBrodtbeck, Thomas.$4aut


By následující příkaz:


Before->Before {
    'procházení všech polí
    FCount = MarcFieldsCount("I")
    For i=0 To FCount-1
        IDF = MarcGetFieldInfo("I",i,"ID")
	'prochazeni vsech podpoli pole
	SCount=MarcGetFieldInfo("I",i,"CountSub")
	For j=0 To SCount
          IDS = MarcGetSubFieldInfo("I",i,j,"ID")
	  WriteToLog("pole=" + IDF + ";podpole=" + IDS)
        Next
    Next
}


způsobil zapsání do logu následující text:


pole=001;podpole=E
pole=005;podpole=E
pole=260;podpole=a
pole=260;podpole=b
pole=700;podpole=a
pole=700;podpole=4
pole=700;podpole=a
pole=700;podpole=4

MarcSetSubFieldInfo

Popis:

Funkce nastavuje hodnotu podpole s Indexem index podpole náležejícímu poli s indexem index pole ve vstupním nebo ve výstupním záznamu podle hodnoty parametru Zdroj.

Poznámka: Návěští se nepovažuje za pole

Vzor volání:

MarcSetSubFieldInfo(zdroj, index pole, index podpole, zjistovana vlastnost, hodnota)

Vstupní argumenty:

Označení

Datový typ

Poznámka

zdroj

textový řetězec

Možné hodnoty

  • "I"

    Jedná se o vstupní záznam

  • "O"

    Jedná se o výstupní záznam

index pole

číslo

pořadové číslo pole, které máte na mysli počítáno od nuly. Maximální hodnotu zjistíte pomocí funkce MarcFieldsCount

index podpole

číslo

pořadové číslo podpole, které máte na mysli počítáno od nuly. Maximální hodnotu zjistíte pomocí funkce MarcGetFieldInfo s parametrem "CountSub"

zjistovana vlastnost

textový řetězec

  • "ID" - název podpole

  • "Value" - hodnota podpole

  • "LinkingFieldID" - obsahuje-li podpole vložené pole, vrací funkce název tohoto pole , jinak prázný řetězec

  • "LinkingFieldI1" - obsahuje-li podpole vložené pole, vrací funkce první indikátor tohoto pole , jinak prázný řetězec

  • "LinkingFieldI2" - obsahuje-li podpole vložené pole, vrací funkce druhý indikátor tohoto pole , jinak prázný řetězec

hodnota

textový řetězec

nastavovaná hodnota

Návratová hodnota:

-

Příklad:

V takovémto výstupním záznamu:


nam 2200229 a 4500
001  zpk20010038759
005  20010110000000.0
260  $aBasel :$bNatursforschende Gesellschaft
7001 $aBrodtbeck, Thomas.$4aut
7001 $aBrodtbeck, Thomas.$4aut


By následující příkaz:


After->After {
    'procházení všech polí
    FCount = MarcFieldsCount("O")
    For i=0 To FCount-1
        IDF = MarcGetFieldInfo("O",i,"ID")
	'prochazeni vsech podpoli pole
	SCount=MarcGetFieldInfo("O",i,"CountSub")
	For j=0 To SCount
          MarcSetSubFieldInfo("O",i,j,"ID","x")
        Next
    Next
}


způsobil takovýto výstup


nam 2200229 a 4500
001  $xzpk20010038759
005  $x20010110000000.0
260  $xBasel :$xNatursforschende Gesellschaft
7001 $xBrodtbeck, Thomas.$xaut
7001 $xBrodtbeck, Thomas.$xaut

MarcGetLinkingSubFieldInfo

Popis:

Funkce vrátí informace o vloženém podpoli s indexem Index podpole vloženého pole podpole s indexem Index podpole pole s Indexem Index pole . ve vstupním nebo ve výstupním záznamu podle hodnoty parametru Zdroj.

Poznámka: Návěští se nepovažuje za pole

Vzor volání:

MarcGetLinkingSubFieldInfo(zdroj, index pole, index podpole, index podpole vloženého pole, zjišťovaná vlastnost)

Vstupní argumenty:

Označení

Datový typ

Poznámka

zdroj

textový řetězec

Možné hodnoty

  • "I"

    Jedná se o vstupní záznam

  • "O"

    Jedná se o výstupní záznam

index pole

číslo

pořadové číslo pole, které máte na mysli počítáno od nuly. Maximální hodnotu zjistíte pomocí funkce MarcFieldsCount

index podpole

číslo

pořadové číslo podpole, které máte na mysli počítáno od nuly. Maximální hodnotu zjistíte pomocí funkce MarcGetFieldInfo s parametrem "CountSub"

index podpole vloženého pole

číslo

pořadové číslo podpole které máte na mysli počítáno od nuly.

zjišťovaná vlastnost

textový řetězec

  • "ID" - název podpole

  • "Value" - hodnota podpole

  • "Index" - index podpole

Návratová hodnota:

hodnota obsahující žadanou informaci

Příklad:

V takovémto vstupním záznamu:


nam 2200229 a 4500
001  zpk20010038759
005  20010110000000.0
460  $120012$apodpole1$bpodpole2  
7001 $aBrodtbeck, Thomas.$4aut
7001 $aBrodtbeck, Thomas.$4aut


By následující příkaz:


Before->Before {
    'procházení všech polí
    FCount = MarcFieldsCount("I")
    For i=0 To FCount-1
	'prochazeni vsech podpoli pole
	SCount=MarcGetFieldInfo("I",i,"CountSub")
	For j=0 To SCount
          'prochazeni vsech podpoli linkovaneho pole
          LCount = MarcGetSubFieldInfo("I",i,j,
               "LinkingFieldCount")
	  If LCount > 0 Then
	    For k=0 To LCount
   	       IDL=MarcGetLinkingSubFieldInfo("I",i,j,k,"ID")
               WriteToLog("linkovane=" + IDL)
	    Next
          Endif
        Next
    Next
}


způsobil zapsání do logu následující text:


linkovane=a
linkovane=b

MarcSetLinkingSubFieldInfo

Popis:

Funkce nastaví hodnotu o vloženém podpoli s indexem Index podpole vloženého pole podpole s indexem Index podpole pole s Indexem Index pole ve vstupním nebo ve výstupním záznamu podle hodnoty parametru Zdroj.

Poznámka: Návěští se nepovažuje za pole

Vzor volání:

MarcSetLinkingSubFieldInfo(zdroj, index pole, index podpole, index podpole vloženého pole, nastavovaná vlastnost, hodnota)

Vstupní argumenty:

Označení

Datový typ

Poznámka

zdroj

textový řetězec

Možné hodnoty

  • "I"

    Jedná se o vstupní záznam

  • "O"

    Jedná se o výstupní záznam

index pole

číslo

pořadové číslo pole které máte na mysli počítáno od nuly. Maximální hodnotu zjistíte pomocí funkce MarcFieldsCount

index podpole

číslo

pořadové číslo podpole které máte na mysli počítáno od nuly. Maximální hodnotu zjistíte pomocí funkce MarcGetFieldInfo s parametrem "CountSub"

index podpole vloženého pole

číslo

pořadové číslo podpole které máte na mysli počítáno od nuly.

zjišťovaná vlastnost

textový řetězec

  • "ID" - název podpole

  • "Value" - hodnota podpole

hodnota

textový řetězec

nastavovaná hodnota

Návratová hodnota:

-

Příklad:

V takovémto výstupním záznamu:


nam 2200229 a 4500
001  zpk20010038759
005  20010110000000.0
460  $120012$apodpole1$bpodpole2  
7001 $aBrodtbeck, Thomas.$4aut
7001 $aBrodtbeck, Thomas.$4aut


By následující příkaz:


After->After {
    'procházení všech polí
    FCount = MarcFieldsCount("O")
    For i=0 To FCount-1
	'prochazeni vsech podpoli pole
	SCount=MarcGetFieldInfo("O",i,"CountSub")
	For j=0 To SCount
          'prochazeni vsech podpoli linkovaneho pole
          LCount = MarcGetSubFieldInfo("O",i,j,
               "LinkingFieldCount")
	  If LCount > 0 Then
	    For k=0 To LCount
   	       MarcSetLinkingSubFieldInfo("I",i,j,k,"ID","x")
	    Next
          Endif
        Next
    Next
}

způsobil takovýto výsledek


nam 2200229 a 4500
001  zpk20010038759
005  20010110000000.0
460  $120012$xpodpole1$xpodpole2  
7001 $aBrodtbeck, Thomas.$4aut
7001 $aBrodtbeck, Thomas.$4aut

GetLabel

Popis:

Funkce vrátí hodnotu návěští jako řetězec buď ve vstupním nebo ve výstupním záznamu podle hodnoty parametru zdroj.

Vzor volání:

GetLabel(zdroj)

Vstupní argumenty:

Označení

Datový typ

Poznámka

zdroj

textový řetězec

Možné hodnoty

  • "I"

    Jedná se o vstupní záznam

  • "O"

    Jedná se o výstupní záznam

Návratová hodnota:

hodnotu návěští jako řetězec

Příklad:

V takovémto vstupním záznamu:


nam 2200229 a 4500
001  zpk20010038759
005  20010110000000.0
260  $aBasel :$bNatursforschende Gesellschaft
7001 $aBrodtbeck, Thomas.$4aut
7001 $aBrodtbeck, Thomas.$4aut


By následující příkaz:


Before->Before {
    WriteToLog("Navesti = " + GetLabel("I"))
}


způsobil zapsání do logu následující text:


Navesti = nam 2200229 a 4500

SetLabel

Popis:

Funkce nastaví hodnotu návěští jako řetězec buď ve vstupním nebo ve výstupním záznamu podle hodnoty parametru zdroj. Hodnota by měla být dlouhá 24 znaků.

Vzor volání:

SetLabel(zdroj)

Vstupní argumenty:

Označení

Datový typ

Poznámka

zdroj

textový řetězec

Možné hodnoty

  • "I"

    Jedná se o vstupní záznam

  • "O"

    Jedná se o výstupní záznam

Návratová hodnota:

-

Příklad:

V takovémto výstupním záznamu:


-----nkm  22-----   450-
001  zpk20010038759
005  20010110000000.0
260  $aBasel :$bNatursforschende Gesellschaft
7001 $aBrodtbeck, Thomas.$4aut
7001 $aBrodtbeck, Thomas.$4aut


By následující příkaz:


After->After {
    SetLabel("O","-----akm  23-----   450-"))
}


způsobil následující výstup:


-----akm  23-----   450-
001  zpk20010038759
005  20010110000000.0
260  $aBasel :$bNatursforschende Gesellschaft
7001 $aBrodtbeck, Thomas.$4aut
7001 $aBrodtbeck, Thomas.$4aut

CopyField

Popis:

Funkce vytvoří kopii pole o indexu index ve výstupním záznamu. Kopie vznikne včetně indikátorů podpolí a vložených polí...

Vzor volání:

CopyField(index)

Vstupní argumenty:

Označení

Datový typ

Poznámka

index

číslo

pořadové číslo pole, které máte na mysli počítáno od nuly. Maximální hodnotu zjistíte pomocí funkce MarcFieldsCount

Návratová hodnota:

-

Příklad:

V takovémto výstupním záznamu:


nam 2200229 a 4500
001  zpk20010038759
005  20010110000000.0
260  $aBasel :$bNatursforschende Gesellschaft
7001 $aBrodtbeck, Thomas.$4aut
7001 $aBrodtbeck, Thomas.$4aut


By následující příkaz:


After->After {
    'procházení všech polí
    FCount = MarcFieldsCount("I")
    For i=0 To FCount-1
        CopyField(i)
    Next
}


způsobil výstup



nam 2200229 a 4500
001  zpk20010038759
005  20010110000000.0
260  $aBasel :$bNatursforschende Gesellschaft
7001 $aBrodtbeck, Thomas.$4aut
7001 $aBrodtbeck, Thomas.$4aut
001  zpk20010038759
005  20010110000000.0
260  $aBasel :$bNatursforschende Gesellschaft
7001 $aBrodtbeck, Thomas.$4aut
7001 $aBrodtbeck, Thomas.$4aut


SortSubfields

Popis:

Funkce setřídí buď vstupní nebo výstupní pole o indexu pole(případně s názvem název pole) podle pravidla pravidlo.

Pravidlo může vypadat například takto: "[a,b,e,f](x,y,z)[1]". V tomto případě jde o tři skupiny identifikátorů podpolí. Každá skupina je uzavřena buď do hranatých nebo do kulatých závorek. Je-li skupina uzavřena do hranatých závorek znamená to, že ve výsledku se vyberou pole ze setřiďovaného pole, ale ponechají se v pořadí, v jakém byly v původním poli. Je-li uzavřena skupina v závorkách kulatých, znamená to, že se takto vybrané znaky navíc setřídí podle pořadí uvedených v závorkách.

Vzor volání:

SortSubfields(zdroj, index pole nebo název pole, pravidlo)

Vstupní argumenty:

Označení

Datový typ

Poznámka

zdroj

textový řetězec

Možné hodnoty

  • "I"

    Jedná se o vstupní záznam

  • "O"

    Jedná se o výstupní záznam

index pole nebo název pole

číslo nebo textový řetězec

pořadové číslo pole které máte na mysli počítáno od nuly. Maximální hodnotu zjistíte pomocí funkce MarcFieldsCount nebo identifikátor pole (potom platí pravidlo pro všechna pole tohoto typu)

pravidlo

textový řetězec

pravidlo setřidování

Návratová hodnota:

-

Příklad:

V takovémto uspořádaném poli vstupního záznamu:


$200 $b$a$y$1$2$e$f$x


By následující příkaz:


SortSubfields("I","200","[a,b,e,f](x,y,z)[1]")


způsobil takovýto výsledek


$200 $b$a$e$f$x$y$1$2


Nejprve se ze vstupu vybrali pole ze skupiny 1 [a,b,e,f] a nechali se v původním pořadí, pak se vybrali ze vstupu pole ze skupiny 2 (x,y,z) a setřídili se podle pořadí uvedeného v pravidle, pak se vybraly vsechny prvky ze skupiny [1] a teprve pak se uvede vše co tam ještě zbylo tj podpole $2.


d) Soubory tabulek


Soubory tabulek slouží pro zpřehlednění kódu souboru pravidel. V případech, kdy je velmi mnoho možností, kterých může nějaké pole či část pole nabývat, je lépe v konverzi použít soubor tabulek. Soubor tabulek musí být předně umístěn v adresáři, který jste nastavili pomocí parametru TablesDirectory v konfiguračním souboru. Soubor může mít například následující tvar


Soubor 105_1.tbl

[105$a/1-4/->008/18-21/] - toto je pouze komentář
a=a
b=b
c=c
d=d
e=e
f=f
g=g
h=h
i=i
j=j
k=k
l=l
m=m
n=a
o=p
y=
|=|


Příklad použítí tabulek najdete v popisu funkce Table

V souborech tabulek se podobně jako v konfiguračním souboru ignorují všechny řádky, na kterých se nevyskytuje = a rovněž jako v konfiguračním souboru lze znaky nahrazovat escape sekvencemi.

7. Kontrola záznamů

Jesliže je v parametru ControlFile v konfiguračním souboru uvedena cesta ke kontrolnímu souboru, bude ještě před konverzí každého záznamu probíhat kontrola záznamu. V případě, že kontrola dopadne dobře konverze konkterétního záznamu se spustí, v opačném případě nikoliv. Výsledek kontroly si přečtete v logu i se statistikou kontroly celého balíku.

Kontrolní soubor dokáže kontrolovat:


  • Opakovatelnost, neopakovatelnost, potřebnost či nepotřebnost polí

  • Opakovatelnost, neopakovatelnost, potřebnost či nepotřebnost podpolí

  • Možné hodnoty na pozicích indikátorů

  • Možné hodnoty na pozicích v pozičních polích a podpolích a jejich délky


Příklad kontrolního souboru může vypadat takto:


<LAB_><E_>/*[24](&,&,&,&,&,cdnop,abcdefgijklmr,amsci,
    S012,S,2,2,S,S,S,S,S,S123,Sin,S,4,5,0,S)*/
<001?>(S)(S)<E_>
<005?>(S)(S)<E_>
<010*>(S)(S)<a?><b?><d?><z*>
<011*>(S)(S)<a?><b?><d*><y*><z*>
<012*>(S)(S)<a?><b?><5?>
<013*>(S)(S)<a?><b?><d?><z*>


Základním principem je, že pokud pole, podpole nebo hodnota v kontrolním souboru nejsou a v záznamu se vyskytují, pak je konvertor rozněž považuje za chybu.


Význam jednotlivých symbolů v kontrolním souboru:



a) Symbol entit polí a podpolí

Popis:

Symbol udává název pole nebo podpole a definuje možný počet výskytů tohoto pole respektive podpole ve validním záznamu daného formátu

Symbol:

<entita(symbol počtu výskytů)>

Možné hodnoty

Označení

Datový typ

Poznámka

entita

textový řetězec

musí obsahovat tři znaky označující název pole, na který se kontrolní záznam vztahuje nebo jeden znak označující název podpole. Tento znak může být také zastoupen znakem &, který označuje libolné podpole. V poli tento znak pouzít nelze!

symbol počtu výskytů

textový řetězec

jednoznakový textový řetězec. Možnéí hodnoty jsou:

+

povinné a opakovatelné

_

povinné a neopakovatelné

*

nepovinné a opakovatelné

?

nepovinné a neopakovatelné

Poznámky:

Pozor! - symbol pro kontrolu pole musí být vždy první na řádku.

Pozor! - jestliže pole nemá podpole, přesto musí být uvedeno podpole E. Co znamená, se dočtěte v kapitole Výrazy pro přístup k záznamům.

Pozor! - symbol počtu výskytů musí být jednoznakový

Příklad:

při takovém poli ve vstupním záznamu:


2001 $aPraha$bgrafika$hVI$ufoto Jan Holý
2001 $aPraha$bgrafika$hVI$ufoto Jan Holý


by následující záznam v kontrolním souboru


<200?>(01)(S)<a+><b*><c*><d*><e*><f*><g*><h*><i*><v?><z*>


způsobil chybu


#200$u#: Podpole 'u' v poli '200' není v kontrolním souboru
#200$u#: Podpole 'u' v poli '200' není v kontrolním souboru
#200#: Pole '200' není opakovatelné


b) Symboly výčtu hodnot v indikátoru

Popis:

Symbol udává výčet hodnot, které jsou možné v indikátoru. U polí bez indikátoru se bere jako by měli na obou místech znak mezera.

Symbol:

(seznam hodnot)

Možné hodnoty

Označení

Datový typ

Poznámka

seznam hodnot

textový řetězec

seznam znaků, které se mohou vyskytovat v konkrétním indikátoru. Speciální hodnota S označuje mezeru. Speciální hodnota & označuje libolnou hodnotu

Poznámky:

Pozor! - dva symboly pro kontrolu indikátoru musí být vždy první a druhý za symbol pro kontrolu pole.

Příklad:

při takovém poli ve vstupním záznamu:


200 4$aPraha$bgrafika$hVI


by následující záznam v kontrolním souboru


<200?>(01)(S)<a+><b*><c*><d*><e*><f*><g*><h*><i*><v?><z*>


způsobil chybu


#200#: První indikátor pole '200' obsahuje špatnou hodnotu
       (hodnota: ' ' možné hodnoty: '01')
#200#: Druhý indikátor pole '200' obsahuje špatnou hodnotu 
       (hodnota: '4' možné hodnoty: 'S')   


c) Symboly délky hodnot

Popis:

Symbol udává povinnou délku podpole. Jestliže délka v záznamu nebude odpovídat, do logu se zapíše chyba

Symbol:

[délka]

Možné hodnoty

Označení

Datový typ

Poznámka

délka

číslo

číslo které udává požadovanou délku podpole.

Poznámky:

Pozor! - symbol musí následovat ihned za symbolem podpole

Příklad:

při takovém poli ve vstupním záznamu:


102  $aCZZ


by následující záznam v kontrolním souboru


<102?>(S)(S)<a*>[2]<b*>[2]


způsobil chybu


#102$a#: Podpole 'a' má nesprávnou délku
         (délka: '3' potřebná délka: '2') v poli '102' 


d) Symbol výčtu hodnot na pozicích v podpoli

Popis:

Symbol udává výčet hodnot, které jsou možné na určité pozici, jednotlivé pozice jsou odděleny čárkou. Tomuto výčtu musíé předcházet Symboly délky hodnot ([délka]) a počet oddělených seznamů hodnot musí odpovídat počtu uvedeném Symboly délky hodnot

Symbol:

(seznam hodnot,seznam hodnot....)

Možné hodnoty

Označení

Datový typ

Poznámka

seznam hodnot

textový řetězec

seznam znaků, které se mohou vyskytovat v konkrétním indikátoru. Speciální hodnota S označuje mezeru. Speciální hodnota & označuje libolnou hodnotu.

Poznámky:

Pozor! - dva symboly pro kontrolu indikátoru musí být vždy první a druhý za symbol pro kontrolu pole.

Příklad:

při takovém poli ve vstupním záznamu:


106  $ax


by následující záznam v kontrolním souboru


<106?>(S)(S)<a_>[1](defghijrz)


způsobil chybu


#106$a#:  Podpole 'a' obsahuje špatný znak na pozici '0' 
          (hodnota: 'x' možné hodnoty: 'defghijrz') v poli 
          '106'


e) Symboly vložených polí

Popis:

Symbol udává pravidla pro vložená podpole v poli.

Symbol:

{výraz pro celé pole}

Možné hodnoty

Označení

Datový typ

Poznámka

výraz pro celé pole

skupina symbolů

ve výraze pro vložené pole se musí vyskytovat kompletní kontrolní předpis pro pole. To znamená pole, jeho indikátory a jeho podpole...

Poznámky:

Pozor! - symbol musí následovat ihned za symbolem podpole, v němž je podpole vložené, tj. ve většině případů v unimarcu <1*>

Příklad:

při takovém poli ve vstupním záznamu:


410 0$1200  $jDocumenta Pragensia


by následující záznam v kontrolním souboru


<423*>(S9)(01)<a?><h?><i?><m?><1*>{
    <200_>(01)(S)<a_><b*><c*><d*><e*><f*><g*>
                          <h*><i*><v?><z*><5?>}


způsobil chybu


LINKING#200#:  První indikátor pole '200' obsahuje špatnou 
               hodnotu (hodnota: ' ' možné hodnoty: '01')
LINKING#200$a#:Podpole 'a' je povinné v poli '200'
LINKING#200$j#:Podpole 'j' v poli '200' není deklarováno 
               v kontrolním souboru



f) Detailní kontrola

Po kontrole pomocí kontrolního souboru můžete ještě provádět detailní kontrolu pomocí pravidel, které mohou postihovat libovolné závislosti v záznamu. Jesliže Vaše pravidlo narazí na nějakou chybu, použijte funkci ContinueError pro vypsání zprávy do logu a označení záznamu jako špatného. Provádění dalších pravidel tak nepřerušíte. Příklad takového souboru kontrolních pravidel by vypadal takto:


Before->Before
{
   WriteToLog("Detailed verification");
   WriteToLog("=====================");  
}

102$a->All
{
   SO=Table("Country_Code.tbl",S)
   If SO=="XX" Then 
       If Language=="CZE" Then
          ContinueError("#DET_" + FROMC + "# Neznámý kód země " + S)
       Else
          ContinueError("#DET_" + FROMC + "# Unknown country code " + S)
       Endif   
   Endif    
   SET=0
}


Při tvoření kontrolních pravidel mějte na paměti:


  • Pravidla fungují standardním způsobem, to znamená, že se snaží na výstupu vytvářet nějaký záznam. Vaše pravidla by tedy měli mít jako výstup klíčové slovo All a měli by být každopádně ukončeny příkazem SET=0, aby konvertor neohlásil chybu.

  • I při kontrole z kontrolními pravidly vzniká nějaký výstupní soubor DestinationFile ten však nemá v takovémto případě žádný význam. Význam má v případě, že využíváte kontrolní soubor a zároveň konvertujete pravidly, ale pokud jsou pravidla pouze pro detailní kontrolu, nevzniká samozřejmě žádný smysluplný výstup.



8. Pluginy


Pluginy rozšiřují možnosti konvertoru o další funkce, které by bylo obtížné či nemožné realizovat standardními prostředky jazyka usescript. Pluginy jsou implementovány formou sdílených knihoven (soubory s příponou .dll v prostředí MS Windows resp. soubory s příponou .so v unixovém prostředí), takže přidání pluginu je možné provést bez nutnosti instalace nové verze programu.


a) Instalace


Instalace pluginu spočívá v následujících krocích:


  • stažení a uložení sdílené knihovny pro danou platformu do vhodného adresáře (v typickém případě $MARCMAN_HOME/plugins)

  • specifikace cesty ke sdílené knihovně v konfiguračním souboru konvertoru )způsob specifikace cesty ke sdíleným knihovnám je popsán v kapitole zabývající se konfiguračními parametry konvertoru - viz parametry PluginsDirectory a Plugins)

  • instalace souborů vyžadovaných příslušným pluginem podle Požadavků pro instalaci uvedených v jeho popisu (viz např. plugin unicode)

  • opětovné spuštění konvertoru (po opětovném spuštění konvertoru je vhodné prohlédnout log konvertoru a ujistit se, že plugin byl v pořádku inicializován a že je funkční)


b) Plugin md5

Popis


Název pluginu:

md5

Název sdílené knihovny:

plugin_md5.so / plugin_md5.dll

Popis:

Plugin rozšiřuje funkcionalitu konvertoru o možnost výpočtu tzv. MD5 hash(e). MD5 hash je hexadecimální řetězec pevné délky (32 znaků), vypočtený ze zadaného vstupního řetězce libovolné délky. Hlavní charakteristikou MD5 hash(e) je, že pravděpodobnost, že pro dva různé vstupní řetězce bude výsledkem stejný MD5 hash je relativně malá. Vzhledem k vlastnostem, které MD5 hash má, tj. že jde o hexadecimální řetězec délky 32 znaků, existuje samozřejmě množina vstupních dat, pro které MD5 hash stejný, ale takové případy se v případě "rozumných" vstupních dat, jakými jsou např. texty v přirozeném jazyce nevyskytují.

Požadavky pro instalaci:

-

Poskytované funkce

ComputeHash

Popis:

Funkce spočte MD5 hash ze zadaného vstupního textového řetězce

Vzor volání:

md5.ComputeHash(text)

Vstupní argumenty:

Označení

Datový typ

Poznámka

text

textový řetězec

libovolný textový řetězec; není-li argumentem textový řetězec, vypíše se chybové hlášení do logu

Návratová hodnota:

návratovou hodnotou je spočtený MD5 hash ze zadaného textového řetězce

Příklad:

t = md5.ComputeHash("test")
WriteToLog("MD5 hash = "+t)


Záznam o vykonání výše uvedeného příkladu v logu by vypadal takto:


MD5 hash = 098f6bcd4621d373cade4e832627b4f6


c) Plugin unicode

Popis


Název pluginu:

unicode

Název sdílené knihovny:

plugin_unicode.so / plugin_unicode.dll

Popis:

Plugin rozšiřuje funkcionalitu konvertoru o možnost odstranění diakritiky z textu zapsaného v kódování UTF-8. Předpokladem je, že vstupní text již v tomto kódování je, plugin nepodporuje konverzi mezi různými znakovými sadami.

Požadavky pro instalaci:

V adresáři specifikovaném parametrem konvertoru TablesDirectory musí být umístěn soubor s definicemi rozkladu složených UTF-8 znaků na základní elementy. Soubor musí být pojmenován UnocodeData.txt a jeho aktuální verzi je možné stáhnout z tohoto umístění: http://www.unicode.org/Public/UNIDATA/UnicodeData.txt.

Poskytované funkce



Utf8ToAscii

Popis:

Funkce rozloží zadaný vstupní textový řetězec v kódování UTF-8 na základní elementy a ponechá pouze ty, které patří do znakové sady ASCII.

Vzor volání:

unicode.Utf8ToAscii(text)

Vstupní argumenty:

Označení

Datový typ

Poznámka

text

textový řetězec

libovolný textový řetězec; není-li argumentem textový řetězec, vypíše se chybové hlášení do logu

Návratová hodnota:

návratovou hodnotou je zadaný vstupní text řetězec převedený do znakové sady ASCII

Příklad:

t = unicode.Utf8ToAscii("Příliš žluťoučký kůň")
WriteToLog("UTF-8 To ASCII = "+t)


Záznam o vykonání výše uvedeného příkladu v logu by vypadal takto:


UTF-8 To ASCII = Prilis zlutoucky kun