JLABS

VaxNt.PGuide.Příkazy po "do"

Programátorská příručka.Přikazy do

Bullet


Funkce "do" slouží ke zhutnění kódu a k jednořádkovému zápisu mnoha často se opakujících obratů - přiřazení, useknutí,
verifikace a ukončení. Obvykle je tedy v lineárním toku argumentů zleva doprava "užráno" patřičné množství argumentů a
interpretuje se dále. U některých příkazů nedává smyslu pokračovat nebo se vrátit. Například nedává smyslu "rt" nebo
po "jsr" nutno interpretaci ukončit. Je to oprvdu jen pro zkrácení často se opakujícího kódu.

    Přikaz je tedy tvaru "do A1,A2,A3,...,Ax". Má ještě alias setup, jiné jméno téhož.

    A je proměnná a V je hodnota. Je-li V očekáváno jako char nebo pojmenovaný char, píše se také C místo V. Z důvodů
    uniformity je párkrát proměnná zbytečná. napřáklad u konkatenace s mezerou. Pak je nadbytečný parametr označen X.

    Zde je nutno dát pozor na to, že tak, jak postupuje interpretace zleva doprava, mohou se měnit i hodnoty užitých
    proměnných. Naopak, "do !A1,A2,A3,...,Ax" vezme pro substituci za znakem ! právě aktuální hodnoty.

    Kód se díky substitucím může stát nepredikovatelným tam, kde se do proměnných cpou čárky apod. Proto u složitějších
    příkazů je možno s výhodou použít i nepřímou referenci, která se substitucí méně poškozuje. Zde @A je vlastně
    uložená v A. Je možno ji referencovat i jako $(A). Avšak u "do" se předpokládá dlouhý řádek a je-li v A hodnota
    obsahující čárku, může to pak interpretaci rozházet. U jednotlivých příkazů se nanejvýš rozhodí interpretace jednoho
    příkazu. Ale u "do" to může mít dalekosáhlé následky.

    Paste - funkce spojující dva stringy buď pomocí CrLf nebo \n - to podle toho, zda se hodnota ukládá či ne. Varianta s
    otazníkem ignoruje prázdný string.

    Všechny do-příkazy jsou motivovány jediným - maximální snahou o zhutnění kódu a často obsahuje do i dosti absurdní
    příkazy. Jde o to, aby se opakované věci daly vyřešit na jednom řádku. Je to možné také zavedením knihovní funkce. Ale
    zhutnění pomocí do se ukázalo jako nejproduktivnější. Kód je zhuštěn a přtom je v případě potřeby hned po ruce.

    Command              Synopsis                                                            Příklad
    ------------------------------------------------------------------------------------------------------------------
Práce s časem, datumem apod:
    DateTime             A - naplní další atom na řádku hodnotou DateTime                    do DateTime,DT
    ServerTime           A - naplní další atom na řádku hodnotou času na serveru             do DateTime,DT,ServerTime,DS
    Computer             A - naplní další řádek jménem počítače
    Today                A - naplní další atom na řádku hodnotou Today ve tvaru YYYYMMDD
    DefaultToday         A - provede Today pokud je hodnota následující proměnné prázdná
    Yesterday            A - naplní další proměnnou hodnotou Yesterday ve tvaru YYYYMMDD
    Yesterday7           A
    Yesterday2           A
    Yesterday3           A
    Yesterday4           A
    Yesterday5           A
    Yesterday6           A
    Yesterday14          A
    Yesterday30          A
    Yesterday60          A
    Yesterday90          A
    Yesterday180         A
    Yesterday360         A
    Yesterday365         A
    Yesterday730         A
    Tomorrow             A
    TimeNow              A - naplní časem ve formátu HHMMSS
    TimeNowHHMM          A
    TimeNowCz            A - čas je ve formátu HH:MM:SS
    TodayCz              A - den je DD.MM.YYYY
    JustNowCz            A - stamp je ve formátu DD.MM.YYYY HH:MM:SS
    JustNow              A - stamp je ve formátu YYYYMMDDHHMMSS
    PrevMonth            A - nastaví do A hodnotu ve tvaru YYYYMM
    PrevMonthFirst       A - nastaví do A hodnotu ve tvaru YYYYMMDD
    PrevMonthLast        A 
    PrevWeekMonday       A - nastaví hodnotu podle dneška
    PrevWeekXMonday      A1,A2 - do A1 dá relativní hodnotu podle A2, A2 může být i tvaru @B, tedy nepřímá reference
    WeekOf               A1,A2 do A1 dá číslo odpovídajícího týdne, A2 zase může být i nepřímá reference
    PrevWeekSunday       A
    PrevWeekXSunday      A1,A2
    ThisWeekMonday       A
    ThisWeekXMonday      A1,A2
    ThisWeekSunday       A
    ThisWeekXSunday      A1,A2
    ThisWeekNumber       A a řídí se přes Now na daném PC
    _yyyymmdd            @V,A - vezme hodnotu na řádku, případně ji dereferencuje a převede YYYYMMDD na DD.MM.YYYY a uloží do A
    yyyymmdd             dtto
    tomorrow             A,V - posune datum z A o udaný počet dnů
    yesterday            A,V - posune datum z A o udaný počet dnů
    ddmmrr               A1,A2 - udělá transformaci YYYYMDD na DDMMYY
    hhmm                 A1,A2 - povede konverzi HHMM na HH:MM
    d.m.yyyy2yyyymmdd    A1,A2 - do A2 dá zkonvertovanou hodnotu z A1, konverze je D.M.YYYY na YYYYMMDD
    d.m.yyyy             Dtto
    rmq                  A1,A2,A3,A4 - v A1 se čeká datum ve tvaryu YYYYMMDD a vrací se A2 jako rok, A3 jako měsíc a Ač jako kvartál

Uživatel PC:
    User                 A - různé varianty uživatele podle způsobu přihlášení k aplikaci
    LoggedUser           A
    WindowsUser          A

Generování identifikátorů:
    Generate             A - naplní stampem a k tomu připojeným náhodným stringem
    GenId16              A - dtto a usekne výsledek na 16 znaků

Plnění jmény adresářů:
    Param                A - naplní různými adresaři, zde parametry
    ParamDir             A - alias za Param
    ParDir               A - dtto
    EmailDir             A
    SetsDir              A
    PrgDir               A
    LogDir               A
    DocDir               A
    PicDir               A
    XmlDir               A
    RootDir              A
    TmpDir               A
    NetTmpDir            A
    DataDir              A
    ExportDir            A
    DailyDir             A

Plnění jmény souborů, aliasů apod:
    VaxNtPath            A
    VaxNtName            A
    AliasName            A

Banální transformace a linearizace zápisu:
    Nop                  - žádná operace, typicky jen pro zvýšení čitelnosi vydatného kódu
    NumericPrefix        A1,A2 - vezme numerický prefix z hodnoty proměnné A1 a uloží to do proměnné A2
    UpperCase            A
    LowerCase            A
    SplitByDot           A1,A2,A3 - vezme hodnotu z A1 případně nepřímo referencovanou. Rozdělí ji pomocí tečky na dvě časti a ty uloží do A2 a A3
    append.c             A1,V2 - k hodnotě v A1 apenduje V2
    append.v             A1,A2 - dtto, ale appenduje hodnotu uloženou a A2
    upper                A
    lower                A
    remove.undesired     A,V - z hodnoty uložené v A vyháže zakázané znaky a vrátí zpět do A
    slashes              A - všechny možné slashe a backslashe nahradí za /
    backslashes          A - dtto nahradí za \
    pad                  A,V - doplní nuly zleva
    spad                 A,V - doplní mezery zleva
    wide                 A,V - doplní zprava
    unczech              A - odčeští string
    tail                 A,V - do A dá zpět posledních V znaků
    trailing.chars.out   A,C - do A dá zpět osekáno zezadu a vyhazuje se pojmenovaný znak z V
    eliminate            A,V - vezme hodnotu z A a vyhazuje z ní V, dokud to jde a vrátí do A to, co zůstane
    substr               A1,A2,V1,V2 - do A1 vrátí substring A2 začínající na V1 a V2 dlouhý
    trump                A,V - je-li v A prádno, naplní jej V
    chop                 A,V - usekne hodnotu v A na délku z konstanty V
    set                  A,V - do A dá V
    set@                 A1,A2 - do A1 dosadí hodnotu referencovanou případně A2 via fAt
    clear                Vymaže všechny hodnoty
    clear.except         A - vymaže všechno krom uvedeného v A a to je středníky delimitovaná konstanta
    use                  Vezme předávané hodnoty z view, nad kterým je volaná
    use.ifvoid           A - pokud je hodnota uložená v A prázdná, pak vezme předávaná hodnoty
    have.or.return       A - vezme hodnotu uloženou v A a je=li tato prázdná, pak skončí s hodnotou 0
    use.the              A - do A dá předávanou hodnotu A
    unless               Povolí unless klauzuli
    clear.hidden.strings Vymaže všech 16 skrytých stringů
    quit                 V - skončí s hláškou V
    _quit                Dtto
    quit.ifvoid          A,V - skončí s hláškou V za podmínky, že v A je prázdno
    quit.iffvoid         Dtto
    save                 A - schová hodnotu obsaženou v A
    restore              A - zrestauruje hodnotu A podle předešlého save
    my.save              A - dtto uschová jinde
    my.restore           A - dtto zrestauruje odjinud
    exit                 V - provede "exit" z interpretace a vrátí naznačenou hodnotu  (a tím pádem ukončí do ...)
    return               Provede exit 0  (a tím pádem ukončí do ...)
    goto                 V - skočí na udané návěští (a tím pádem uko
    goto@                A - skočí na nepřímo adresované návěští
    return.ifvoid        A - udělá return, je-li daná proměnná prázdná
    call                 A - udělá ekvivalent "call A"
    fms.step             A - udělá jeden krok definice formu
    setv                 A1,A2 - dosadí do A1 hodnotu nalezenou v A2
    inc                  A - inkrementuje danou proměnnou
    ++                   A - dtto
    dec                  A - dekrementuje danou proměnnou
    --                   A - dtto
    trim                 A - oseká danou proměnnou
    push                 A - provede jeden push
    pop                  A - provede jeden pop
    _return              vrátí se jako se subroutine a tím pádem ukončí interpretaci do
    rt                   dtto 
    kkk                  Nastavi proměnná KdoZapsal a spol
    xxx                  Dtto pro proměnné XWho a spol
    xxxkkk               Provede obojí
    exit.ifvoid          A - otestuje A a je-li to prázdné, pak exit 0
    trump                A,V - trumfne hodnotu v A, ale jen kdyz ve V neprázdná
    common               A,V - v hodnotě V se hledá get, put nebo clear a podle toho se udělá operace s contextem XCommon
    default              A,V - naplní defaultem, je=li hodnota A prázdná
    defaultv             A1,A2 - vezme default z proměnné A2
    on.error.goto        V - při chybě skočí na V
    on.success.goto      V - skočí na V, pokud naopak k chybě nedošlo
    numbers              A - v A ponechá jen znaky odpovídající číslu (0123456789.,+-)a čárku nahradí tečkou
    length               A1,A2 - do A2 dá délku hodnoty z A1
    suffix.v             A1,A2 - do A1 dá konkatenaci hodnot z A1 a A2
    suffix.c             A,V - dtto, ale konkatenuje konstantu V
    suffix.space         A,X - konkatenuje mezeru
    suffix.comma         A,X - dtto s čárkou
    prefix.v             A1,A2 - přidává zleva, tedy ze začátku
    prefix.c             A,V - dtto, ale konkatenuje konstantu V
    prefix.space         A,X 
    prefix.comma         A,X
    utf8.to.win1250      A1,A2 - vezme hodnotu z A1, zkonvertuje ji a pak uloží do  A2
    last.part            A1,A2 - hodnotu z A1 zkracuje zepředu, dokud tato obsahuje mezeru. Výsledek dá do A2
    getsql.or.break      Ukončí řádek a chová se jako ?getsql break
    ?getsql              Dtto

Složité operace:
    GrepOut              A1,A2 Vezme hodnotu z A1') then
    GetSelectedRows      A1,A2 - šíleně složité ... jestliže je voláno nad pohledem, vezme to zaškrtnuté řádky na nahradí v nich nejprve ; za | a
                         pak | za CrLf. Do A2 soupne počet provedených substitucí a do A1 celý získaný seznam. Je-li A1=ConstructedList tak místo toho
                         naplní tuto systémovou proměnnou.
    Paste                A1,A2 - Vezme z A1 string a ten pastne pres hodnotu A2 a výsledek uloží do A1
    Paste?               A1,A2 - totéž za podmínky, že hodnota uložená v A2 je neprázdná
    PasteAndPref         A1,A2,A3 - do A1 dosadí hodnotu získanou pomocí Paste a to hodnotou v A1 nad konkatenací hodnot A3 a A2
    PasteAndPref?        A1,A2,A3 - dtto když hodnota A2 je neprázdná
    format               A1,A2,A3 - zformátuje string, A2 může být i nepřímo adresováno
    Global               V1,A2 - Vezme hodnotu dalšího atomu, obalí jej $( a), vyřeší to jako globál a vzniklý string uloží do A2
    flip.flop.chars      A,C1,C2,C3 - A je hodnota, C1, C2 a C3 pojmenované znaky. Projde hodnotu v A a nahradí C1 buď C2 nebo C3 a vždy se přitom přepne.
                             začíná se s C2 a výsledek se pak vrátí do A.
    percent              A1,A2,A3 - uloží do A1 hodnotu jako procenta V1 z V2
    percent.comma        Dtto. jen oddělovač desetinných míst je čárka
    percent.round        Dtto a procenta zaokrouhlí na celá čísla
    version.info         A - uloží informaci o verzi SW
!!! split.pair           A1,A2,A3,A4 - vezme hodnotu z A1 a rozdělí ji na číslice, ne-číslice a pak zase číslice.
                             Tři výsledky dá do A2, A3 a A4. 
    day.name.abbr        A1,A2,A3,V - v A1 se očekává datum, do A2 a A3 se vrací číslo dne v týdnu a jeho jméno, česky pokud je V cz nebo CZ
    arglist              V1,V2,A1,A2 - provede náhrady atd podle schématu"

                         V1 je change
                            V2 je commas - do A1 dá dodnotu z A2, kde všechny výskyty ' jsou nahrazenu čárkou
                            V2 je pipes - dělá to obráceně
!!!                      V1 je set - vezme hodnotu V2 a v A2 čeká řadu jmen proměnných, do kterých narve V2
                         V1 je default - udělá totéž, ale dosadí jen do prázných


Získání či nastavení všemožných proměnných:
    GetFormCurrentItem   A1,A2 - naplní A1 hodnotou @wCurrentItem a A2 @@wCurrentItem, používá se pro zjednodušení skriptů při volání z formulářu
    GetSwitch            A1,A2 - do A2 dá hodnotu uvedeného switche z A1, rozumí se z command line či vlastností aplikace = cíl.
    GetSwitchQ           - Vezme hodnotu switche Q a celou ji chápe jako A1=V1,...,Ax=Vx a provede odpovídající přiřazení. Pouzívá se pro import
                         nějakých hodnot až při spuštění.
    CurrentSwitchU       A - naplní podle aktuální hodnoty, což je typicky hodnota swiche U
    LofCurrentSwitchU    A - dtto, jen se liší case
    AsyncLevel           A - naplní A danou hodnotou
    ScriptLevel          A - dtto, hodnota je zanoření interpretace skriptů
    clear.shorts         - vyprázdní "krátké" proměnné tvaru A,A01,...,Z99
    fms.name             A - do hodnoty FormName dá následující atom z rádku
    ThisProgramName      A - do A nasadi jméno aktuálního skriptu
    ThisScriptName       A  dtto
    GetSwitch            A1,A2 - do A1 dá hodnotu switche z A2

    VersionSW            A - dosadí verzi do A
    CompanySW            A
    CopyrightSW          A
    CopyRightAuto        A
    ThisViewSql          A - dosadí do A SQL query, nad kterým je ev. volána
    *^*                  ???
    global.get           A1,A2 - Nastaví A1 podle toho, co je v A2:
                             GlobalKey
                             GlobalScratch
                             WizardKeyHandler
    global.set           A1,A2 - Vezme hodnotu obsaženou v A2, případně je dereferencuje a podle toho. co je a A1 to nastaví:
                             GlobalKey
                             GlobalScratch
                             WizardKeyHandler
    _dateslashchar       V - nastaví DateSlashChar
    dateslashchar        V - dtto
    autosize             V - nastaví globální proměnno GlobalAutosize
    PrevKeys             A - vrazí obsah A do globální proměnné PrevKeys
    Privilege            A - vrátí privilegium usera:
                             RUser
                             WUser
                             DAdmin
                             SAdmin
                             Nobody
    Parameter            V,A - Do A dosadí hodnotu z parametrů A a všechny slashe dá do unixové podoby
    KeyDebug             V - nastaví globální debugování kláves
    nospacing            Nastaví spacing na prázdno
    _cache.clear         Vymaže vyrovnávací paměť
    cache.clear          Dtto
    fms.buttons          Řekne, že se mají ve formuláři ukazovat buttony na tisk apod.
    GlobalViewItem       A - nastaví proměnnou GlobalViewItem, je to typicky a implicitně jméno aktuálního sloupce v pohledu
    set.success          Nastaví CC na true
    set.error            Nastaví CC na false
    fms.prepare          V - vyčistí vše a připraví se na definování formu ve V
    fms.ready            V - řekne. že form V je hotov

Práce se soubory a jejich jmény:
    fsplit               A - rozdělí jméno souboru a výsledek uloží do proměnných:
                               _FilePath
                               _FileBaseName
                               _FileExt
                               _FileName
    ferase               V1,V2 - smaže seznam souborů V2 z adresáře V1
    f.close              uzavře pracovní soubor f - typicky na zápis
    g.close              uzavře pracovní soubor g - typicky na čtení
    f.create             V - vytvoří f na zápis a exitne s hláškou, když to nejde
    f.append             V - dtto, ale appenduje to
    g.open               V - totéž pro g, ale na čtení
    rm                   V - smaže soubory a directory si domyslí
    view.inner           V - vyvolá viewer na udaný soubor
    viewer.inner         dtto
    view                 V - vyvolá lepší viewer na udaný soubor
    viewer               dtto
    subst                V1,V2 - provede substituci
    subst.xml            dtto a zakóduje vadící znaky
    subst.xml.cdata      dtto, ale sekci CDATA nezakóduje

Práce s tabulkami:
    try.update           V - selfexplanatory
    try.insert           V
    try.delete           V
    try.insert.or.update V
    update               V - crashne, když se to nepovede
    insert               V - dtto
    worktable.reset      Resetuje pracovní tabulku
    lk                   V1,V2 - načte z tabulky V1 hodnotu podle stringového klíče V2. V2 se bere jako jméno a
                             po druhé se bere hodnota
    lki                  Totéž pro číselný klíč


Vypisování do logů a debugování:
    dump                 V - vydumpuje aktuální context pod udaným jménem
    dump.prg             Vydumpuje akorát jméno programu
    debuglevel           V - nastaví debuglevel podle udané konstanty
    nodebug              V - nastaví DebuggingAllowed:=NextAtom='1'

Potvrzování a dotazování:
    confirm              V - potvrdí V a jinak skončí s kódem 2
    confirm.twice        V - dvakrát potvrdí
    ask.ifvoid           A1,V2 - pokud je hodnota A1 prázdná, pak se zeptá na její hodnotu. Kdyý je hodnota XY, pak provede exit 0
    ask.iffvoid          dtto
    show.message         V - ukáže hlášku
    show.message.exit    V - ukáže hlášku a skončí skript

Pseudonáhodná čísla:
    randomize            Zavolá Randomize a tím inicializuje generátor náhodných čísel
    random               Do vnitřní proměnné RandomString uloží hodnotu Random mod 4096
    GetRandom            A,V1,V2 - do A dosadí hodnotu V1 plus Random(V2)
    rnd                  A - nastaví do A náhodný string


Připojování k databázi:
    connect              V - přijpojí se k databázi, bez parametrů se vrátí k defaultu. Platí pouze v rámci daného skriptu a automaticky se pak ukončí

Plnění proměnné znaky, které se špatně píšou nebo jsou frekventní:
    void                 A - vyprázdní danou proměnnou
    comma                A - naplní čárkou
    dot                  A - naplní tečkou
    semicolon            A - naplní středníkem
    colon                A - naplni dvojtečkou
    colon.space          A - naplní ': '
    zero                 A - naplní nulou
    space                A - naplní mezerou
    one                  A - naplní jedničkou
    two                  A - naplní dvojkou
    Dollar               A - dosadí do A konstantu $
    Space                A - dosadí do A mezeru
    Chr                  A1,A2 - dosadí do A2 hodnotu Chr(IntOf(A1))
    be.hash              A - do A dá konstantu #



BulletRejstřík kapitoly
BulletNadřízená kapitola dokumentace / rejstřík


JLABS Aktualizováno dne 20170425. Komentář: info@jlabs.cz