Info |
---|
...
Sisällysluettelo | |
---|---|
|
Yleistä
SKJScript on SKJ:n oma 'ohjelmointiympäristö'.
...
- csv -tiedoston käsittely
- csv -tiedoston tuonti apu
- Ftp -siirrot
- Sähköpostin lähetys
- SQL -kyselyt
- Winskj -taulukäsittely
- Xml -käsittely
- Sisäänrakennettu debuggeri
- Merkkijonojen ja numeroiden käsittely
Ohjelman komentoriviparametrit
Ohjelma ymmärtää vakiona seuraavat komentoriviparametrit:
...
Scriptikohtaisesti voidaan määritellä omia parametrejä.
Ohjelman asetukset
Ohjelma tarvitsee varsinaisesti yhden asetustiedoston, skjscript.ini:n, jossa kerrotaa lisenssin sijainti. Skjscript.ini:n pitää sijaita samassa kansiossa kuin käynnistettävä skjscript.exe.
Code Block |
---|
[SKJSCRIPT] LISENSSITIEDOSTO=C:\winskj\files\lisenssi.xml |
Funktio ja aliohjelmalista
Dokumentoinnissa on funktioiden ja muuttujien tyypit näytetty, vaikka ei tarvitsisi.
Tämä on selvyyden vuoksi, jotta esim. tietokantamuuttujan asemasta ei laitettaisi merkkijonoa.
- Abs - palauttaa itseisarvon f:= abs(f);
- Append - avaa tekstitiedoston ja siirtää kirjoituskohdan perään
- Assigned - Palauttaa TRUE jos parametri <> nil
- AssignFile - määrittää tiedostomuuttujan. assignfile(f, 'koe.txt');
- Beep - piip
- Chdir - vaihtaa hakemiston
- Chr -palauttaa ascii -koodia vastaavan merkin esim. s := 'testi'chr(13)+chr(10)'data';
- CloseFile - sulkee tiedoston
- Copy - kopioi osan merkkijonosta copy('suomen kassajärjestelmät, 7,5) -> 'kassa'
- Cos - cosini, erittäin tarpeellinen toimialalle ja paljon käytetty mm. myyntien laskennassa. (vitsi...)
- CreateOleObject
- EOF - eof(tiedostomuuttuja) - true jos tiedosto loppu
- Exp
- FilePos - peräkkäistiedoston luku/kirjoituspaikan sijainti
- FileSize - tiedoston koko
- FloatToStr - liukuluku merkkijonoksi
- Format - muotoilee dataa
- FormatFloat - muotoilee liukulukua
- Frac - luvun desimaaliosa
- GetActiveOleObject
- High - taulukon korkein indeksi
- IncMonth - kasvatetaan päiväystä kk määrällä
- InputQuery - kysyy yksinkertaisella dialogilla merkkijonon
- Insert - lisää keskelle merkkijonoa
- Int - muutta liukuluvun kokonaisluvuksi (tyyppi = integer) *
- Interpret
- IntToHex muutaan integerin hexaksi
- IntToStr muutaan integerin merkkijonoksi
- IsValidIdent
- Length - merkkijonon pituus
- Ln - luonnollinen logritmi
- Low - taulukon alin elementti
- LowerCase - merkkijono pienille kirjaimille *
- Machine
- Odd
- Ord
- Pyorista - pyöristää luvun pyorista(luku,-2) pyöristää 2 desimaaliin. Jos pyorista(luku,2) pyöristää lähimpään sataan.
- PyoristaSentit - pyöristää annetun luvun senttisääntöjen mukaan (ylös tai alas 0/5 senttiä).
- Raise
- Random
- ReadLn
- Reset
- Rewrite
- Round
- *Scripter
*
- SetOf
- ShowMessage
- Sin
- Sqr
- Sqrt
- VarArrayCreate
- VarArrayHighBound
- VarArrayLowBound
- VarIsNull
- VarToStr
- Write
- WriteLn
Merkkijono
- AnsiCompareStr
- AnsiCompareText
- AnsiLowerCase
- AnsiUpperCase
- CompareStr
- CompareText
- Delete
- StrToFloat
- StrToInt
- StrToIntDef
- Trim
- TrimLeft
- TrimRight
- Trunc
- UpperCase
- AnsiUpperCase
...
Function StrToF(s: string): Double;
- muuntaa merkkijono liukuluvuksi. poistaa välilyönnit ja huolehtii piste/pilkku muunnoksesta.
- procedure CSVToStringList(Lahde: String; Kohde: TStringList; Erotin: Char; RiisuLainausMerkit: Boolean);
purkaa csv muodossa olevan merkkijono StringListaksi esim.
lista := TStringList.create;Panel s := '1;"ohje esimerkki";12,2';
CSVToStringList(s,lista,';',true);
for i:= 0 to Lista.count -1 do
ShowMessage(Lista.items[i]);
Katso myös CSV_Tuonti.htm esimerkki.
Numerot
- Arc
- Tan
- Dec
- Inc
- Lisää yhden muuttujaan, esim Inc(count)
- Pyorista(Luku; tarkkuus)
- Pyöristää luvun annettuun tarkkuuteen, esim -2 -> 2 desimaaliin, 2 = lähimpään 100:n
- SimpleRoundTo
- Sama kuin pyöristä, mutta johtuen d7 system kirjaston bugista, toimii väärin jossain tilanteissa. Pyorista korjaa sen. D2007 versioon korjautunut.
- RoundTo
- Kuten SimpleRoundto, mutta käyttää pyöristykseen Pankkiirin pyöristystä (??) tarkempi selvitys esim. tässä linkissä.
Päiväys
- function Date:TDateTime;
- palauttaa nykyisen päiväyksen DateTime tyyppinä
- function DateTimeToStr(DateTime: TDateTIme):String;
- muuntaa annetun päiväyksen / kellonajan merkkijonoksi windowin asetusten mukaan.
- function DateToStr (Date: TDateTime): String;
- muuntaa annetun päiväyksen merkkijonoksi windowsin asetusten mukaan.
- function DayOfWeek (date: TdateTime):Integer;
- palauttaa viikonpäivän numerovälillä su (1) .. la (7)
- function DayOfTheWeek (date: TdateTime):Integer;
- palauttaa viikonpäivän numerovälillä ma (1) .. su (7). ANSI -standardin mukainen.
- function SqlDateToDate(dateString: String): Tdatetime;
- Muuttaa yyyy-mm-dd muotoisen päiväysmerkkijonon sisäiseksi Tdatetime -tyypiksi.
- DecodeDate
- DecodeTime
- EncodeDate
- EncodeTime
- IsLeapYear
- StrToDate
- StrToDateTime
- Functon Now: TdateTime
- palauttaa nykyhetken
- function FormatDateTime(format: string; DateTime: Tdatetime):String;
- Muotoilee ajan ja päivän annetulla formaatilla kts.
- StrToTime
- Time
- TimeToStr
Bonuslaskenta
- function AlustaBonus(Tietokanta): Bonusluokka;
- lataa bonusasetukset. Kutsu vain kerran ja jokaista AlustaBonus rutiinin kutsua kohden pitää kutsua vapautabonus.
- procedure VapautaBonus(Bonusluokka);
- vapauttaa aiemmin AlustaBonus funktiolla luodun bonusmuuttuja.
- function BonusPros(kertyma:Double): Double;
- palauttaa bonusprosentin johon ostokertymä oikeuttaa
Tietokanta
Titan -komponentin liityntä tauluun luodaan seuraavasti
Code Block | ||
---|---|---|
| ||
Tuotetaulu := TTbTable.create(nil);
tuotetaulu.tablename := 'tuote';
tuotetaulu.databasename := 'testikanta';
tuotetaulu.open;
... ja lopuksi
tuotetaulu.free;
|
- function TTbTable.TryEdit (ms_viive: integer);
tTbTable-luokan menetelmä. Yrittää saada muokkausoikeuden taulun nykyiseen tietueeseen ja yritetään korkeintaan ms_viiveen ajan. Aika on millisekunteina. Palauttaa false jos epäonnistui, esim.
Code Block language delphi if not tuote.tryedit(2000) then showmessage('Tuotetta ei voi muokata');
- function TTbTable.TryPost (ms_viive: integer);
tTbTable-luokan menetelmä. Yrittää saada muokkausoikeuden taulun nykyiseen tietueeseen ja yritetään korkeintaan ms_viiveen ajan. Aika on millisekunteina. Palauttaa false jos epäonnistui, esim.
Code Block language delphi if varsaldo.tryEdit(2000) then begin varsaldo.fieldbyname('saldo').asfloat := 0; varsaldo.fieldbyname('muutosklo').asdatetime := now; if not varsaldo.trypost(2000) then begin logentry('Varsaldoa ei voi tallentaa'); varsaldo.cancel; end; end else showmessage('Saldoa ei voi muokata');
Pervasive sql
Koska pervasiven PDAC komponenttikirjastoista ei ole saatavilla lähdekoodeja, siitä emme ole voineet tuottaa titan rajanpinnan kaltaista liittymää. Sql rajapinta on tehty omilla rutiineilla jotka ovat
*function LuoSql(TietokantaAlias, sql, tapa) - luo kyselyn ja palauttaa sen muuttujan (jatkossa alla kysely). Voidaan myös lisätä suoraan sql parametriksi esim. q := luosql(dbname,'select count as c from from tuote'); joka tekee luonnin lisäksi sql lauseen asettamisen. Vapaaehtoinen 3. parametri tapa voidaan myös antaa. Se voi olla välillä 1-3, 1= avaa kyselyn, 2 = ajaa kysely (update, insert, delete tms), 3= ajaa kyselyn ja vapauttaa sql muutujan. Kun tapa=3, paluu arvona on vaikutettujen rivien määrä.
- procedure VapautaSql(Kysely) - vapauttaa LuoSql:llä luodun kysely
- procedure Asetasq(Kysely, SqlLause) - asettaa kyselylle sqllauseen
- procedure Avaasql(kysely) - avaa sql lauseen esim. raportointia tai aineiston muuta läpikahlausta varten
- procedure AjaSql(kysely) - ajaa sql lauseen esim. update, insert tai delete.
- procedure SuljeSql(kysely) - sulkee sql kyselyn
- function eofSql(kysely) - palautaa True jos kysely on loppu
- function SqlFirst(kysely) - palaa ensimmäiseen tietueeseen
- function Sqlnext(kysely) - siirtyy seuraavaan tietueeseen
- function SqlPrev(kysely) - siirtyy edelliseen tietueeseen
- function SqlLast(kysely) - siirtyy viimeiseen tietueeseen
- function Sqlfbi(kysely,kentta) - palauttaa avatusta kyselystä kentän integerinä
- function Sqlfbb(kysely,kentta) - palauttaa avatusta kyselystä kentän Booleanin
- function Sqlfbs(kysely,kentta) - palauttaa avatusta kyselystä kentän stringinä
- function Sqlfbd(kysely,kentta) - palauttaa avatusta kyselystä kentän DateTimeä
Huom! Kysellessä memokenttiä (tuotetxt.teksti, astxt.teksti tms) joiden sisältö on yli 1024 merkkiä, tulee virhe.
Sen voi kiertää ainakin jossain määrin muuttamalla kyselyn "select tuotenro, teksti from tuotetxt" muotoon "select tuotenro, convert(teksti,sql_varchar) as teksti from tuotetxt".
Toinen vaihtoehto on käyttää taulukomponenttia.
Code Block | ||
---|---|---|
| ||
kysely := LuoSql('testikanta');
asetasql(kysely,'select tuote,sum(summa) as myynti from tuotemyy where tuotelaji in (0,2) and pvm>''2011'' ');
avaasql(kysely);
while not eofsql(kysely) do
begin
showmessage(sqlfbs(kysely,'tuote')+' '+formatfloat('#0.00',sqlfbf(kysely,'myynti')));
sqlnext(kysely);
end;
suljesql(kysely);
vapautasql(kysely);
kysely1 := CreateSql('testikanta','select count(*) as maara from tuote where ryhma = :r');
preparesql(kysely1);
for i := 1 to 10 do
begin
sqlSetParam(kysely1,'r',i);
opensql(kysely1);
showmessage('Tuoteryhmässä '+inttostr(i)+' on tuotteita '+inttostr(sqlfbi(kysely1,'maara')));
closesql(kysely1);
end;
unprepareSql(kysely1);
vapautasql(kysely1);
|
Excel liityntä
Excel yhteys perustaa AdoDb:n. Esimerkki avauksesta, tässä excel avataan vain luku tilaan. Lisäksi kerromme että headereita ei ole (HDR=NO) jolloin kentät ovat f1, f2 jne sekä excel ei yritä päätellä datatyyppejä (IMEX=1). Jälkimmäinen on tarpeen jos siellä on tyhjiä tai sekalaisia arvoja samassa sarakkeessa.
...
language | delphi |
---|
...
Eroja normaaliin pascal syntaksiin
Eroja on, tässä muutama maininta.
Muuttujat ovat pääsääntöisesti aina variantteja.
Case lause on erilainen , lauseessa ei vaadi että casen arvot ovat vakiota. Ehto totetuu kun funktio paluu arvo täsmää verrattavaan
Code Block | ||
---|---|---|
| ||
sanat := 'SIKA;PORSAS;LEHMA;KISSA';
s := 'elainLehma';
case lowercase(copy(s,5)) of
lowercase(extractWord(1,sanat,';')) : showmessage('RÖH');
lowercase(extractWord(2,sanat,';')) : showmessage('röh');
lowercase(extractWord(3,sanat,';')) : showmessage('ammuu');
lowercase(extractWord(4,sanat,';')) : showmessage('miau');
end; |
Numerot
- Arc
- Tan
- Dec
- Inc
- Lisää yhden muuttujaan, esim Inc(count)
- Pyorista(Luku; tarkkuus)
- Pyöristää luvun annettuun tarkkuuteen, esim -2 -> 2 desimaaliin, 2 = lähimpään 100:n
- SimpleRoundTo
- Sama kuin pyöristä, mutta johtuen d7 system kirjaston bugista, toimii väärin jossain tilanteissa. Pyorista korjaa sen. D2007 versioon korjautunut.
- RoundTo
- Kuten SimpleRoundto, mutta käyttää pyöristykseen Pankkiirin pyöristystä (??) tarkempi selvitys esim. tässä linkissä.
- Ceil
- Pyöristä ylöspäin 17,01 → ceil(17,01*10)/10 → 17,10
Päiväys
- function Date:TDateTime;
- palauttaa nykyisen päiväyksen DateTime tyyppinä
- function DateTimeToStr(DateTime: TDateTIme):String;
- muuntaa annetun päiväyksen / kellonajan merkkijonoksi windowin asetusten mukaan.
- function DateToStr (Date: TDateTime): String;
- muuntaa annetun päiväyksen merkkijonoksi windowsin asetusten mukaan.
- function DayOfWeek (date: TdateTime):Integer;
- palauttaa viikonpäivän numerovälillä su (1) .. la (7)
- function DayOfTheWeek (date: TdateTime):Integer;
- palauttaa viikonpäivän numerovälillä ma (1) .. su (7). ANSI -standardin mukainen.
- function SqlDateToDate(dateString: String): Tdatetime;
- Muuttaa yyyy-mm-dd muotoisen päiväysmerkkijonon sisäiseksi Tdatetime -tyypiksi.
- DecodeDate
- DecodeTime
- EncodeDate
- EncodeTime
- IsLeapYear
- StrToDate
- StrToDateTime
- Functon Now: TdateTime
- palauttaa nykyhetken
- function FormatDateTime(format: string; DateTime: Tdatetime):String;
- Muotoilee ajan ja päivän annetulla formaatilla kts.
- StrToTime
- Time
- TimeToStr
- formatdatetime('yyyy-mm-dd hh:nn:ss', d);
- formatdatetime('yyyy-mm-dd', d);
Bonuslaskenta
- function AlustaBonus(Tietokanta): Bonusluokka;
- lataa bonusasetukset. Kutsu vain kerran ja jokaista AlustaBonus rutiinin kutsua kohden pitää kutsua vapautabonus.
- procedure VapautaBonus(Bonusluokka);
- vapauttaa aiemmin AlustaBonus funktiolla luodun bonusmuuttuja.
- function BonusPros(kertyma:Double): Double;
- palauttaa bonusprosentin johon ostokertymä oikeuttaa
Tietokanta
Titan -komponentin liityntä tauluun luodaan seuraavasti
Code Block | ||
---|---|---|
| ||
Tuotetaulu := TTbTable.create(nil);
tuotetaulu.tablename := 'tuote';
tuotetaulu.databasename := 'testikanta';
tuotetaulu.open;
... ja lopuksi
tuotetaulu.free;
|
- function TTbTable.TryEdit (ms_viive: integer);
tTbTable-luokan menetelmä. Yrittää saada muokkausoikeuden taulun nykyiseen tietueeseen ja yritetään korkeintaan ms_viiveen ajan. Aika on millisekunteina. Palauttaa false jos epäonnistui, esim.
Code Block language delphi if not tuote.tryedit(2000) then showmessage('Tuotetta ei voi muokata');
- function TTbTable.TryPost (ms_viive: integer);
tTbTable-luokan menetelmä. Yrittää saada muokkausoikeuden taulun nykyiseen tietueeseen ja yritetään korkeintaan ms_viiveen ajan. Aika on millisekunteina. Palauttaa false jos epäonnistui, esim.
Code Block language delphi if varsaldo.tryEdit(2000) then begin varsaldo.fieldbyname('saldo').asfloat := 0; varsaldo.fieldbyname('muutosklo').asdatetime := now; if not varsaldo.trypost(2000) then begin logentry('Varsaldoa ei voi tallentaa'); varsaldo.cancel; end; end else showmessage('Saldoa ei voi muokata');
Pervasive sql
Hakuindeksin vaihtaminen; esim toimittajataulussa key0=tunnus, key1 nimi, jos halutaan hakea nimellä vaihdetaan haun kohdistuminen niin käytetään: taul.indexname := '1';
Tällä voi tarkistaa onko joku taulu olemassa: Select count(*) from X$File where Xf$Name = 'taulunnimi' , palauttaa 1 jos taulu olemassa
Koska pervasiven PDAC komponenttikirjastoista ei ole saatavilla lähdekoodeja, siitä emme ole voineet tuottaa titan rajanpinnan kaltaista liittymää. Sql rajapinta on tehty omilla rutiineilla jotka ovat
- function LuoSql(TietokantaAlias, sql, tapa) - luo kyselyn ja palauttaa sen muuttujan (jatkossa alla kysely). Voidaan myös lisätä suoraan sql parametriksi esim.
q := luosql(dbname,'select count ( * ) as c from from tuote');
joka tekee luonnin lisäksi sql lauseen asettamisen. Vapaaehtoinen 3. parametri tapa voidaan myös antaa. Se voi olla välillä 1-3, 1= avaa kyselyn, 2 = ajaa kysely (update, insert, delete tms), 3= ajaa kyselyn ja vapauttaa sql muutujan. Kun tapa=3, paluu arvona on vaikutettujen rivien määrä. - procedure VapautaSql(Kysely) - vapauttaa LuoSql:llä luodun kysely
- procedure Asetasq(Kysely, SqlLause) - asettaa kyselylle sqllauseen
- procedure Avaasql(kysely) - avaa sql lauseen esim. raportointia tai aineiston muuta läpikahlausta varten
- procedure AjaSql(kysely) - ajaa sql lauseen esim. update, insert tai delete.
- procedure SuljeSql(kysely) - sulkee sql kyselyn
- function eofSql(kysely) - palautaa True jos kysely on loppu
- function SqlFirst(kysely) - palaa ensimmäiseen tietueeseen
- function Sqlnext(kysely) - siirtyy seuraavaan tietueeseen
- function SqlPrev(kysely) - siirtyy edelliseen tietueeseen
- function SqlLast(kysely) - siirtyy viimeiseen tietueeseen
- function Sqlfbi(kysely,kentta) - palauttaa avatusta kyselystä kentän integerinä
- function Sqlfbb(kysely,kentta) - palauttaa avatusta kyselystä kentän Booleanin
- function Sqlfbs(kysely,kentta) - palauttaa avatusta kyselystä kentän stringinä
- function Sqlfbd(kysely,kentta) - palauttaa avatusta kyselystä kentän DateTimeä
Huom! Kysellessä memokenttiä (tuotetxt.teksti, astxt.teksti tms) joiden sisältö on yli 1024 merkkiä, tulee virhe.
Sen voi kiertää ainakin jossain määrin muuttamalla kyselyn "select tuotenro, teksti from tuotetxt" muotoon "select tuotenro, convert(teksti,sql_varchar) as teksti from tuotetxt".
Toinen vaihtoehto on käyttää taulukomponenttia.
Code Block | ||
---|---|---|
| ||
kysely := LuoSql('testikanta');
asetasql(kysely,'select tuote,sum(summa) as myynti from tuotemyy where tuotelaji in (0,2) and pvm>''2011'' ');
avaasql(kysely);
while not eofsql(kysely) do
begin
showmessage(sqlfbs(kysely,'tuote')+' '+formatfloat('#0.00',sqlfbf(kysely,'myynti')));
sqlnext(kysely);
end;
suljesql(kysely);
vapautasql(kysely);
kysely1 := CreateSql('testikanta','select count(*) as maara from tuote where ryhma = :r');
preparesql(kysely1);
for i := 1 to 10 do
begin
sqlSetParam(kysely1,'r',i);
opensql(kysely1);
showmessage('Tuoteryhmässä '+inttostr(i)+' on tuotteita '+inttostr(sqlfbi(kysely1,'maara')));
closesql(kysely1);
end;
unprepareSql(kysely1);
vapautasql(kysely1);
|
Excel liityntä
Excel yhteys perustaa AdoDb:n. Esimerkki avauksesta, tässä excel avataan vain luku tilaan. Lisäksi kerromme että headereita ei ole (HDR=NO) jolloin kentät ovat f1, f2 jne sekä excel ei yritä päätellä datatyyppejä (IMEX=1). Jälkimmäinen on tarpeen jos siellä on tyhjiä tai sekalaisia arvoja samassa sarakkeessa.
Code Block | ||
---|---|---|
| ||
var
q;
begin
q := TAdoQuery.Create(nil);
// onko uudempi xcls
if pos('.XLSX', Uppercase(lahdetiedosto) ) = length(lahdetiedosto)-4 then
q.connectionString :='Provider=Microsoft.ACE.OLEDB.12.0;Data Source='+lahdetiedosto+';'+
'Extended Properties="Excel 12.0 Xml;HDR=No;IMEX=1"'
else
q.connectionString :='Provider=Microsoft.JET.OLEDB.4.0;Data Source='+lahdetiedosto+';'+
'Extended Properties="Excel 8.0;HDR=No;IMEX=1"'
q.sql.text := 'select f1 as numero,f2 as tilauskoodi,f3 as nimi, '+
'f4 as paaryhma,f5 as tuoteryhma ,f6 as aliryhma, '+
'f7 as vero,f8 as toimittaja,f9 as hinta,f10 as keskihinta,f11 as tilauskoko,f12 as hrkerroin, f13 as hryksikko, '+
'f14 as vyks, f15 as myks, f16 as tilyks, f17 as lisatunnus, '+
'f18 as vari, f19 as koko, f20 as viivakoodi '+
'from [Tuote$]';
q.active := true;
while not q.eof do
begin
showmessage(q.fieldbyname('numero').asstring+' '+q.fieldbyname('nimi').asstring);
q.next;
end;
q.close;
q.free; |
...
64 bittisessä ympäristössä uuden excel driverin kanssa voi olla ongelmaa, jos se ei toimi, kannattaa kokeilla 2007 versio ajuria
https://www.microsoft.com/en-us/download/details.aspx?id=23734
Muut
- procedure ShowMessage(s);
- näyttää MessageBoxin.
- function OnkoParam(parametri): string;
- Palauttaa parametrin arvon tai vakion NOPARAM jos parametria ei ole annettu. Esim.
lahdetiedosto := onkoparam('lahde');
if lahdetiedosto = NOPARAM then
lahdetiedosto := 'c:winskjdata.txt';
komentorivillä parametri olisi annettu skjscript /f:skriptinnimi.pas /run /lahde:c:\data\joku.txt
- Palauttaa parametrin arvon tai vakion NOPARAM jos parametria ei ole annettu. Esim.
FTP /SFTP
- procedure LuoFtp(Serveri,Username,password: String; Ftp: tFtpLuokka)
- avaa passiivi ftp -yhteyden serveriin. Jos serverin nimessä perässä lukee ;PASSIVE pakotetaan passiivi -yhteys, jos jotain muuta esim ;A tai ;ACTIVE tulee aktiivi -yhteys. Ftp -muuttujassa palaa ftp-luokka
- Ftp <>0 jos toiminto onnistunut.
- function CdFTP(Ftp: TFtpLuokka; Hakemisto:String):string;
- vaihtaa hakemistoa ja palauttaa uuden hakemiston paluuarvona. Ftp on luotu LuoFtp:llä.
- function ListaaFtp(Ftp: TFtpLuokka; Haettava:String; Tarkka:Integer):String;
*ottaa hakemistolistauksen. Ftp on luotu LuoFtp:llä. Haettava on esim. '.zip'. Tarkka = 1 jos halutaan koot ja päivät. Huom. muoto vaihtelee lähdejärjestelmän mukaan.- Palauttaa merkkijonona hakemistorakenteen, yksi tiedosto rivillään. Voidaan asettaa suoraan TStringList -luokan text -ominaisuuteen.
- procedure GetFtp(ftp: TFtpLuokka;LahdeTiedosto,KohdeTiedosto: String; String);
- noutaa tiedoston. Valinnainen parametrityyppi 'A' tai 'B' määrää onko se ascii vai binary. Oletusarvo on Ascii. Arvo jää voimaan ftp -muuttujan vapautukseen asti.
- procedure PutFtp(ftp: TFtpLuokka;LahdeTiedosto,KohdeTiedosto: String; String);
- lähettää tiedoston, Valinnainen parametrityyppi 'A' tai 'B' määrää onko se ascii vai binary. Oletusarvo on Ascii. Arvo jää voimaan ftp -muuttujan vapautukseen asti.
- procedure DelFtp(ftp: TFtpLuokka; TiedostoRaukka: String);
- Poistaa tiedoston kohdepalvelimelta
esimerkki tiedoston lähetyksestä ftp:llä.
Code Block | ||
---|---|---|
| ||
LuoFtp(FtpPalvelin, FtpTunnus, FtpSalasana, Ftp);
if ftp <> 0 then
begin
CdFtp(ftp,'out');
putFtp(ftp,fn,fn);
SuljeFtp(ftp);
end
else
LogEntry('Ftp kohteeseen '+ftppalvelin+' epäonnistui');
|
SFTP Rutiinit toimivat seuraavan mallin mukaan
Code Block | ||
---|---|---|
| ||
var
ftp;
s:String;
function validoi(avain);
begin
if avain = '1a:1b:23:4e:3e:19:63:ce:3d:17:01:ed:bf:9b:68:bd' then // serverin avain
result := 'OK'
else
result := '';
end;
begin
ftp := LuoSFtp('sftp.firma.com,'username','password',0, 'validoi'); // 0 = oletusporttinumero, anna muu arvo jos sftp -palvelin on poikkeavassa portissa
// validointirutiinin nimi annetaan parametrina.
if assigned(ftp) then
begin
lista := tstringlist.create;
PutSFtp(ftp,'c:\temp\koe.txt','koe.txt');
lista.text := ListaaSFtp(ftp, '.', false); // listaasftp palauttaa aina hakemiston sisällön, ei voi valita esim *.txt
showmessage(lista.text);
for i:= 0 to lista.count -1 do
begin
s := uppercase(l ista.strings[i] );
if copy(s,1,7) = 'SISAAN_' then
showmessage(s);
end;
s := ListaaSFtp(ftp, 'alihakemisto', false);
showmessage(s);
GetSFtp(ftp,'koe.txt','koe1.txt');
suljesftp(ftp);
lista.free;
end;
end;
|
Huom. Erona normaalin ftp komentoon on se että cd (hakemiston vaihto) ei ole tuettu. Eli joudutaan aina viittamaan absoluuttisilla poluilla.
Esimerkki tiedostojen lähetyksestä SFTP:llä:
Code Block |
---|
var
ftp;
fs;
s;
dir;
i;
fn: string;
target,source;
fingerprint,host,user,pass,port,directory,wildcard;
tiedosto;
st;
lista,nimi;
function validoi(avain);
begin
if avain = fingerprint then // serverin avain
result := 'OK'
else
result := '';
end;
begin
// Muuttujat alkaa
fingerprint := '1b:1b:dd:e2:bb:a6:02:2d:14:86:2e:e2:ac:40:2b:ee'; // SSH host fingerprint
host := '1.2.3.4'; // SFTP palvelin
user := 'username'; // SFTP username
pass := 'password'; // SFTP password
port := '22'; // SFTP portti, oletus 22
directory := '/mnt/finvoice/' ; // hakemisto, mihin tiedostot tallennetaan palvelimella, loppuun /
wildcard := 'F*.*' ;
source := 'C:\TEMP\'; // mist‰ laskut luetaan, \ per‰‰n
// Muuttujat loppuu
st := CreateStatus('SFTP lähetys');
ShowStatus(st,'Yhdistäminen','');
ftp := LuoSFtp(host,user,pass,port,'validoi');
if assigned(ftp) then
begin
ShowStatus(st,'hakemiston vaihto','');
// kohdehakemisto palvelimella
lista := tstringlist.create;
listaatiedostot(source+wildcard,0,0,lista);
for i:= 0 to lista.count -1 do
begin
tiedosto := lista.strings[i];
nimi := justfilename(tiedosto);
showstatus(st,'Siirto ',nimi);
try
PutSFtp(ftp,tiedosto,directory+nimi);
deletefile(tiedosto);
LogEntry('Tiedosto ' + tiedosto + ' siirretty SFTP-palvelimelle ' + directory+nimi + ' ja poistettu.');
except
LogEntry('Siirto virhe '+tiedosto+' '+lastExceptionmessage);
end;
sleep(1000);
end;
lista.free;
suljesftp(ftp);
end;
CloseStatus(st);
end;
|
Sähköpostin lähetys
Sähkopostin lähetys käyttää winskj:n tallennettuja asetuksia, joten sen tarvitsee tietää tietokannan nimi, josta ne haetaan.
Eli parametrit ovat
- tietokanta - kanta josta asetukset haetaan
- Myyja - myyjän numero
- Näytä dialog true/false näytetäänkö s-postin lähetysdialogia
- Ostikko
- viestin runko
- Liitetiedostot, puolipisteerotettu lista
- Lähettäjä, jos tyhjä käytetään winskj:n asetuksista löytyvää
- viestin Body html formaatissa.
lahetasahkoposti(dbname,1,false,osoite,'Myyntidata','Liitteenä automaattisesti generoitu myyntidata', fn,'yoajo@skj.fi',);
Huom. Huomaa että monet smtp palvelimet suuttuvat jos samasta paikasta tulee postia liian tiheään, pidä 1 sek väli eri postien välillä jos lähetät useampia.
h1. Asiakasmuutosten seuranta
Jos halutaan seura muutoslogissa skjscriptin tekemiä asiakasmuutoksia (esim replikointi skjinterfacella tai kkalleclientilla) toimitaan alle olevan esimerkin mukaan
_
Code Block |
---|
var
a,a2,mr;
dbname;
s: string;
i: integer;
myymala:integer;
begin
dbname := 'SKJ';
// alustetaan asiakasmuutostietue
myymala := 1; // minkä myymälän nimiin muutokset kirjataan
LuoAsiakasMuutostietue(dbname,myymala,mr);
a := ttbtable.Create(nil);
a.databasename := dbname;
a.tablename := 'asiakas';
a.open;
a2 := ttbtable.Create(nil);
a2.databasename := dbname;
a2.tablename := 'asiakas2';
a2.open;
while not a.eof do
begin
if (WordCount(trim(a.FieldByName('nimi').AsString),' ')>0) and ( trim(a.FieldByName('nimi2').AsString) = '') then
begin
// alustetaan muutosten seuanta tälle asiakkaalle
AloitaAsiakasmuutos(a,a2,mr);
// tässä muunnetaan nimi kenttä muodosta "Möttönen Marko Uolevi" -> Nimi: Möttönen Nimi2: Marko Uolevi
a.edit;
s := a.FieldByName('nimi').AsString;
a.FieldByName('nimi').AsString := ExtractWord(1,s,' ');
a.FieldByName('nimi2').AsString := '';
for i:=2 to wordCount(s,' ') do
a.FieldByName('nimi2').AsString := a.FieldByName('nimi2').AsString+' '+extractWord(i,s,' ');
a.FieldByName('nimi2').AsString := trim(a.FieldByName('nimi2').AsString)
logEntry('Muutettu '+s+':->'+a.FieldByName('nimi').AsString+', '+a.FieldByName('nimi2').AsString);
a.post;
// tallennetaan mahdolliset muutokset
LopetaAsiakasmuutos(a,a2,mr,false);
end;
a.next;
end;
a.close;
a2.close;
end; |
Tiedostot
hakemisto läpikäyntiin ja tiedostojen etsintään
FindFirst, FindNext ja FindClose
- function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer;
- function FindNext(var F: TSearchRec): Integer;
- procedure FindClose(var F: TSearchRec);
- 'Attr''' kertoo minkätyyppisiä tiedostoja haetaan:
- faReadOnly: Read-only files
- faHidden: Hidden files
- faSysFile: System files
- faVolumeID: Volume ID files
- faDirectory: Directory files
- faArchive: Archive files
- faAnyFile: Any file
Type
- TSearchRec = record
- Time: Integer;
- Size: Integer;
- Attr: Integer;
- Name: TFileName;
- ExcludeAttr: Integer;
- FindHandle: THandle;
- FindData: TWin32FindData;
Esimerkki:
Code Block |
---|
if FindFirst('c:\temp\data\ana*.txt',0,fs)=0 then
begin
repeat
s := 'c:\temp\data\'+fs.name;
showmessage(s);
until findnext(fs)<>0;
findclose(fs);
end;
|
- procedure ListaaTiedostot(Polku,attribuutit, rekursio, lista);
- Hoitaa tiedostojen listaamisen.
- Lista = luotu TStringList
- Polku = mitä haetaan , attribuutit, yleensä 0.
Rekursio, käydäänkö alihakemistot. Ei tehty vielä.
esim.Code Block lista := tstringlist.create; listaatiedostot('c:\winskj\*.txt',0,false,lista); showmessage(lista.text);
XML käsittely
Xml käsittely tehdään käyttäen microsoftin xmldom -komponenttia, tässä pari esimerkkiä.
SKJ Tuote import
export-lause taustaa varten, jotta saadaan jo olemassa olevasta kannasta tiedot muokattavaksi:
Code Block |
---|
select t.numero, t.toimtunnus, t.nimi,
t.paaryhma, t.ryhma, t.aliryhma, t.lvv,t.toimittaja,
t.hinta, t.keskihinta, t.tilauskoko, t.hrkerroin,
t.hryksikko
from tuote t
where t.passiivinen <> 1;
|
Huom! VERHINTA ei ole käytössä SKJTuoteImport.xls :ssä.
JSON käsittely
Json käsittely on toteuttu pohjautuen mormot kirjastoon. Väliin on jouduttu tekemään muutama rutiini.
Alla luodaan
...
language | delphi |
---|
...
Excel välilehtien luku
Code Block | ||
---|---|---|
| ||
var
lahdetiedosto,q;
con;
ds: TAdoDataSet;
lista;
begin
lista := tstringlist.create;
LahdeTiedosto := 'c:\temp\testi.xlsx';
ds := TAdodataSet.create(nil); // dataset taulurakenteen hakuun
// Luodaan ADODb:llä excel yhteys
con := TAdoconnection.create(nil);
con.connectionstring := 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source='+lahdetiedosto+';'+
'Extended Properties="Excel 12.0 Xml;HDR=No;IMEX=1"';
con.loginprompt := false; // ei suotta kysely käyttäjätunnusta
con.OpenSchema(20,emptyparam, emptyparam, ds);
while not ds.eof do
begin
lista.add(ds.fieldbyname('TABLE_NAME').asstring);
ds.next;
end;
// tässä kohden meillä on selvillä välilehtien nimet lista-nimisessä merkkijono listasas
logentry('välilehdet ovat:');
logentry(lista.text);
// avataan kysely ekalle välilehdelle
q := TAdoQuery.Create(nil);
Q.connection := con;
q.sql.text := 'select '+
'f1 as paaryhma, '+
'f2 as ryhma, '+
'f7 as nimi, '+
'f15 as lvv, '+
'f17 as viimostohinta, '+
'f18 as keskihinta '+
'from ['+lista.strings[0]+']';
q.active := true;
// sitten jatketaan normalisti |
Muut
- procedure ShowMessage(s);
- näyttää MessageBoxin.
- function OnkoParam(parametri): string;
- Palauttaa parametrin arvon tai vakion NOPARAM jos parametria ei ole annettu. Esim.
lahdetiedosto := onkoparam('lahde');
if lahdetiedosto = NOPARAM then
lahdetiedosto := 'c:winskjdata.txt';
komentorivillä parametri olisi annettu skjscript /f:skriptinnimi.pas /run /lahde:c:\data\joku.txt
- Palauttaa parametrin arvon tai vakion NOPARAM jos parametria ei ole annettu. Esim.
- function runexe(ohjelma, parametrit): integer;
- Ajaa ohjelman ja antaa sille parametrit. Odottaa ohjelman loppumisen.
FTP /SFTP
- procedure LuoFtp(Serveri,Username,password: String; Ftp: tFtpLuokka)
- avaa passiivi ftp -yhteyden serveriin. Jos serverin nimessä perässä lukee ;PASSIVE pakotetaan passiivi -yhteys, jos jotain muuta esim ;A tai ;ACTIVE tulee aktiivi -yhteys. Ftp -muuttujassa palaa ftp-luokka
- Ftp <>0 jos toiminto onnistunut.
- function CdFTP(Ftp: TFtpLuokka; Hakemisto:String):string;
- vaihtaa hakemistoa ja palauttaa uuden hakemiston paluuarvona. Ftp on luotu LuoFtp:llä.
- function ListaaFtp(Ftp: TFtpLuokka; Haettava:String; Tarkka:Integer):String;
*ottaa hakemistolistauksen. Ftp on luotu LuoFtp:llä. Haettava on esim. '.zip'. Tarkka = 1 jos halutaan koot ja päivät. Huom. muoto vaihtelee lähdejärjestelmän mukaan.- Palauttaa merkkijonona hakemistorakenteen, yksi tiedosto rivillään. Voidaan asettaa suoraan TStringList -luokan text -ominaisuuteen.
- procedure GetFtp(ftp: TFtpLuokka;LahdeTiedosto,KohdeTiedosto: String; String);
- noutaa tiedoston. Valinnainen parametrityyppi 'A' tai 'B' määrää onko se ascii vai binary. Oletusarvo on Ascii. Arvo jää voimaan ftp -muuttujan vapautukseen asti.
- procedure PutFtp(ftp: TFtpLuokka;LahdeTiedosto,KohdeTiedosto: String; String);
- lähettää tiedoston, Valinnainen parametrityyppi 'A' tai 'B' määrää onko se ascii vai binary. Oletusarvo on Ascii. Arvo jää voimaan ftp -muuttujan vapautukseen asti.
- procedure DelFtp(ftp: TFtpLuokka; TiedostoRaukka: String);
- Poistaa tiedoston kohdepalvelimelta
esimerkki tiedoston lähetyksestä ftp:llä.
Code Block | ||
---|---|---|
| ||
LuoFtp(FtpPalvelin, FtpTunnus, FtpSalasana, Ftp);
if ftp <> 0 then
begin
CdFtp(ftp,'out');
putFtp(ftp,fn,fn);
SuljeFtp(ftp);
end
else
LogEntry('Ftp kohteeseen '+ftppalvelin+' epäonnistui');
|
SFTP Rutiinit toimivat seuraavan mallin mukaan
Code Block | ||
---|---|---|
| ||
var
ftp;
s:String;
function validoi(avain);
begin
if avain = '1a:1b:23:4e:3e:19:63:ce:3d:17:01:ed:bf:9b:68:bd' then // serverin avain
result := 'OK'
else
result := '';
end;
begin
ftp := LuoSFtp('sftp.firma.com,'username','password',0, 'validoi'); // 0 = oletusporttinumero, anna muu arvo jos sftp -palvelin on poikkeavassa portissa
// validointirutiinin nimi annetaan parametrina.
if assigned(ftp) then
begin
lista := tstringlist.create;
PutSFtp(ftp,'c:\temp\koe.txt','koe.txt');
lista.text := ListaaSFtp(ftp, '.', false); // listaasftp palauttaa aina hakemiston sisällön, ei voi valita esim *.txt
showmessage(lista.text);
for i:= 0 to lista.count -1 do
begin
s := uppercase(l ista.strings[i] );
if copy(s,1,7) = 'SISAAN_' then
showmessage(s);
end;
s := ListaaSFtp(ftp, 'alihakemisto', false);
showmessage(s);
GetSFtp(ftp,'koe.txt','koe1.txt');
suljesftp(ftp);
lista.free;
end;
end;
|
Huom. Erona normaalin ftp komentoon on se että cd (hakemiston vaihto) ei ole tuettu. Eli joudutaan aina viittamaan absoluuttisilla poluilla.
Esimerkki tiedostojen lähetyksestä SFTP:llä:
Code Block |
---|
var
ftp;
fs;
s;
dir;
i;
fn: string;
target,source;
fingerprint,host,user,pass,port,directory,wildcard;
tiedosto;
st;
lista,nimi;
function validoi(avain);
begin
if avain = fingerprint then // serverin avain
result := 'OK'
else
result := '';
end;
begin
// Muuttujat alkaa
fingerprint := '1b:1b:dd:e2:bb:a6:02:2d:14:86:2e:e2:ac:40:2b:ee'; // SSH host fingerprint
host := '1.2.3.4'; // SFTP palvelin
user := 'username'; // SFTP username
pass := 'password'; // SFTP password
port := '22'; // SFTP portti, oletus 22
directory := '/mnt/finvoice/' ; // hakemisto, mihin tiedostot tallennetaan palvelimella, loppuun /
wildcard := 'F*.*' ;
source := 'C:\TEMP\'; // mist‰ laskut luetaan, \ per‰‰n
// Muuttujat loppuu
st := CreateStatus('SFTP lähetys');
ShowStatus(st,'Yhdistäminen','');
ftp := LuoSFtp(host,user,pass,port,'validoi');
if assigned(ftp) then
begin
ShowStatus(st,'hakemiston vaihto','');
// kohdehakemisto palvelimella
lista := tstringlist.create;
listaatiedostot(source+wildcard,0,0,lista);
for i:= 0 to lista.count -1 do
begin
tiedosto := lista.strings[i];
nimi := justfilename(tiedosto);
showstatus(st,'Siirto ',nimi);
try
PutSFtp(ftp,tiedosto,directory+nimi);
deletefile(tiedosto);
LogEntry('Tiedosto ' + tiedosto + ' siirretty SFTP-palvelimelle ' + directory+nimi + ' ja poistettu.');
except
LogEntry('Siirto virhe '+tiedosto+' '+lastExceptionmessage);
end;
sleep(1000);
end;
lista.free;
suljesftp(ftp);
end;
CloseStatus(st);
end;
|
Sähköpostin lähetys
Sähkopostin lähetys käyttää winskj:n tallennettuja asetuksia, joten sen tarvitsee tietää tietokannan nimi, josta ne haetaan.
Eli parametrit ovat
- tietokanta - kanta josta asetukset haetaan
- Myyja - myyjän numero
- Näytä dialog true/false näytetäänkö s-postin lähetysdialogia
- Ostikko
- viestin runko
- Liitetiedostot, puolipisteerotettu lista
- Lähettäjä, jos tyhjä käytetään winskj:n asetuksista löytyvää
- viestin Body html formaatissa.
lahetasahkoposti(dbname,1,false,osoite,'Myyntidata','Liitteenä automaattisesti generoitu myyntidata', fn,'yoajo@skj.fi',);
Huom. Huomaa että monet smtp palvelimet suuttuvat jos samasta paikasta tulee postia liian tiheään, pidä 1 sek väli eri postien välillä jos lähetät useampia.
h1. Asiakasmuutosten seuranta
Jos halutaan seura muutoslogissa skjscriptin tekemiä asiakasmuutoksia (esim replikointi skjinterfacella tai kkalleclientilla) toimitaan alle olevan esimerkin mukaan
_
Code Block |
---|
var
a,a2,mr;
dbname;
s: string;
i: integer;
myymala:integer;
begin
dbname := 'SKJ';
// alustetaan asiakasmuutostietue
myymala := 1; // minkä myymälän nimiin muutokset kirjataan
LuoAsiakasMuutostietue(dbname,myymala,mr);
a := ttbtable.Create(nil);
a.databasename := dbname;
a.tablename := 'asiakas';
a.open;
a2 := ttbtable.Create(nil);
a2.databasename := dbname;
a2.tablename := 'asiakas2';
a2.open;
while not a.eof do
begin
if (WordCount(trim(a.FieldByName('nimi').AsString),' ')>0) and ( trim(a.FieldByName('nimi2').AsString) = '') then
begin
// alustetaan muutosten seuanta tälle asiakkaalle
AloitaAsiakasmuutos(a,a2,mr);
// tässä muunnetaan nimi kenttä muodosta "Möttönen Marko Uolevi" -> Nimi: Möttönen Nimi2: Marko Uolevi
a.edit;
s := a.FieldByName('nimi').AsString;
a.FieldByName('nimi').AsString := ExtractWord(1,s,' ');
a.FieldByName('nimi2').AsString := '';
for i:=2 to wordCount(s,' ') do
a.FieldByName('nimi2').AsString := a.FieldByName('nimi2').AsString+' '+extractWord(i,s,' ');
a.FieldByName('nimi2').AsString := trim(a.FieldByName('nimi2').AsString)
logEntry('Muutettu '+s+':->'+a.FieldByName('nimi').AsString+', '+a.FieldByName('nimi2').AsString);
a.post;
// tallennetaan mahdolliset muutokset
LopetaAsiakasmuutos(a,a2,mr,false);
end;
a.next;
end;
a.close;
a2.close;
end; |
Tiedostot
hakemisto läpikäyntiin ja tiedostojen etsintään
FindFirst, FindNext ja FindClose
- function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer;
- function FindNext(var F: TSearchRec): Integer;
- procedure FindClose(var F: TSearchRec);
- 'Attr''' kertoo minkätyyppisiä tiedostoja haetaan:
- faReadOnly: Read-only files
- faHidden: Hidden files
- faSysFile: System files
- faVolumeID: Volume ID files
- faDirectory: Directory files
- faArchive: Archive files
- faAnyFile: Any file
Type
- TSearchRec = record
- Time: Integer;
- Size: Integer;
- Attr: Integer;
- Name: TFileName;
- ExcludeAttr: Integer;
- FindHandle: THandle;
- FindData: TWin32FindData;
Esimerkki:
Code Block |
---|
if FindFirst('c:\temp\data\ana*.txt',0,fs)=0 then
begin
repeat
s := 'c:\temp\data\'+fs.name;
showmessage(s);
until findnext(fs)<>0;
findclose(fs);
end;
|
- procedure ListaaTiedostot(Polku,attribuutit, rekursio, lista);
- Hoitaa tiedostojen listaamisen.
- Lista = luotu TStringList
- Polku = mitä haetaan , attribuutit, yleensä 0.
Rekursio, käydäänkö alihakemistot. Ei tehty vielä.
esim.Code Block lista := tstringlist.create; listaatiedostot('c:\winskj\*.txt',0,false,lista); showmessage(lista.text);
XML käsittely
Xml käsittely tehdään käyttäen microsoftin xmldom -komponenttia, tässä pari esimerkkiä.
Xml kompontin ohjeita voi lukea täältä, hieman joutuu soveltamaan mutta kohtuu hyvä viite. https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms766487(v=vs.85)
SKJ Tuote import
export-lause taustaa varten, jotta saadaan jo olemassa olevasta kannasta tiedot muokattavaksi:
Code Block |
---|
select t.numero, t.toimtunnus, t.nimi,
t.paaryhma, t.ryhma, t.aliryhma, t.lvv,t.toimittaja,
t.hinta, t.keskihinta, t.tilauskoko, t.hrkerroin,
t.hryksikko
from tuote t
where t.passiivinen <> 1;
|
Huom! VERHINTA ei ole käytössä SKJTuoteImport.xls :ssä.
JSON käsittely
Json käsittely on toteuttu pohjautuen mormot kirjastoon. Väliin on jouduttu tekemään muutama rutiini.
Alla luodaan koodissa json oliota.
Code Block | ||
---|---|---|
| ||
a := jsonnewdoc; // luodaan dokumentti
a := jsonaddvalue(a,'nimi','KOISTINEN'); // asetaa dokumenttiin kentän "nimi" arvoon "KOISTINEN", kohde dokumentti on 1. parametri ja uusi dokumentti on fuktion paluuarvo
a := jsonaddvalue(a,'osoite':'sotinkatu 4c');
// {"nimi":"KOISTINEN","osoite","sotinkatu 4c"}
a := jsonsetvalue(a,'osoite':'Sorinkatu 4c');
// {"nimi":"KOISTINEN","osoite","sorinkatu 4c"}
b := jsonnewdoc; // uusissa versiossa voi sanoa suoraan b := jsonaddvalue(null, 'gsm','0500..'); kun ensimmäistä kenttää laitetaan ja luodaan dokumentti samalla
b := jsonaddvalue(b, 'gsm','0500..');
a := jsonaddvalue(b, 'puhelimet',b);
// {"nimi":"KOISTINEN","osoite":"sorinkatu 4c","puhelimet":{"gsm":"0500.."}}
showmessage(a); // pitäisi näyttää json sisältö |
Alla otetaan jsonia ja muutetaan se olioksi
Code Block |
---|
b:= JsonNewDocFromjson('{"id":"A000173","group":12,"department":1,"float":12.32,"name":"3.3. A3 + F1 P4suora erikois","name2":""}');
maara := jsongetcount( b );
id := jsongetvalue(b, "id");
for i:= 0 to jsongetcount(b)-1 do
begin
showmessage(jsongetname(b,i)+'='+jsontostring ( jsongetvalue(b,i,true)));
end;
|
REST Rajapinta
function RestCall(Url: string; data: String; BasicAuth_username: string; Basic_Auth_password: string; var status: integer; var statustxt: string; method: string='post'): string;
Tällä funktiolla voidaan tehdä rest kutsu. vaatii restcall.dll:n olemassaolon, tämä dll päivittyy skj:n mukana. Parametri
- URL: osoite ja parametrit esim https://api.liittyma.com/setproductdata?identification=foobar
- data: Post metodin lähetettävä data. jos method on get, tämän voi jättää tyhjäksi
- Basic_Auth_username, Basic_Auth_password jos palvelin haluaa basica autentication niin niiden salasanat
- status: muuttuja johon laitetaan pyynnön status. 200 = OK
- statustxt: status selväkielisenä
- method: kutsun metodi joko post (oletus, ei tarvitse laittaa) tai get. Kirjankoolla ei väliä.
- Paluuarvona tulee palvelimen lähetämä vastaus
- D10 versiossa (29.6.2020) on metodin jälkeen valinnainen headers parametri, joka on muotoa stringlist
Code Block | ||
---|---|---|
| ||
var
s,s1,status,statustxt;
b,n;
nro;
sl;
begin
sl := tstringlist.create;
sl.values['Authorization']:='bearer xxxxxxx'; // tämä siis toimii vain D10 versiosaa
s := restCall('https://t.skj.fi/tapahtuma/products?apikey=wont_tell_you','{"name":"taas uusi tuote"}', '', '', status, statustxt, sl);
showmessage(s+#13+inttostr(status)+#13+inttostr(statustxt));
if status=200 then
begin
b:= JsonNewDocFromjson(s); // b on koko dokkari
n := jsongetvalue(b,'products'); // n : products elementti, joka on array yhdestä tuotteesta
n := jsongetvalue(n,0,true); // n on tämän jälkeen eka alkio tuotearraysta
nro := jsongetvalue(n,'id'); // otetaan vastauksesta id - tuotenumero
s1 := restCall('https://t.skj.fi/tapahtuma/products/'+nro+'?apikey=wont_tell_you','', '', '', status, statustxt,'get');
showmessage(s1); // s ja s1 pitäisi olla samat
b := jsonnewdoc;
b := jsonaddvalue(b, 'id', nro);
b := jsonaddvalue(b, 'group', 12);
b := jsonaddvalue(b, 'name', 'lahden kotiin');
s := restCall('https://t.skj.fi/tapahtuma/products?apikey=wont_tell_you', b, '', '', status, statustxt);
showmessage(s);
end;
sl.free;
end;
|
Jatkuva toiminta
Skjscript voidaan laittaa pöyrimään taustalle silmukassa esim lähettämään muutoksia aikaajoin. Tähän pitää rakentaa myös poistumismekanismi. Jos ohjelma pyörii näkyvillä työasemassa, voidaan se hoitaa aiemmilla versiolla, mutta palveluna vaati 28.9.2018 tai uudemman version.
Code Block | ||
---|---|---|
| ||
var
postaaja;
s;
laskuri;
st;
begin
st := CreateStatus('Päivitys');
laskuri := 0;
// allaoleva showstatus palauttaa false jos käyttäjä on painanut peruuta tai skjscript
// on saanut wm_close viestin. esim process -q skjscript.exe
while showstatus(st,'Päivitän asiakasdataa ','Päivitetty '+inttostr(laskuri)) do
begin
postaaja := LuoPostaaja;
postaaja_lisaakentta(postaaja,'id','1212');
postaaja_lisaakentta(postaaja,'data','adadada');
s := postaaja_post(postaaja,'https://jotain.skj.fi/joku.php','');
logentry('vastaus'+s);
sleep(1000);
inc(laskuri);
logentry('virhe'+postaaja_virhe(postaaja));
postaaja_sulje(postaaja);
end;
closestatus(st);
end; |
Uudet funktiot (D10 versio)
Code Block |
---|
function LisaaAsiakas(kanta: string; Numero:integer=0; valialku, valiloppu: integer=0): integer |
Lisää asiakkaan ja palauttaa lisätyn numeron. Parametrina voidaan antaa numeroväli ja numero. Palauttaa -1 jos epäonnistuu. Asikkaasta lisään vaan numerot. ei muita tietoja.
Code Block |
---|
function PaivitaAsiakas(kanta: string; Numero:integer; data: docvar): boolean |
Päivittää asiakkaan tiedot "json-dokkarista" eli muuttujasta joka on luotu esim JsonNewDocFromjson. json dokumenttien kenttänimet pitää vastata asiakastaulun kenttänimiä
Tekstitiedoston muutos UTF8→ansi. Voi olla tarpeen jos käsitellään tiedostoa jollain esim d2007 versiolla tehdyällä ohjelmalla.
Code Block | ||
---|---|---|
| ||
sl := tstringlist.create;
sl.loadfromfile('unicodefile.txt');
sl.converttoansi;
sl.savetofile('ansifile.txt');sl.free; |
Myynti2skj tiedoston tuottaminen
Tällä voidan tehdää myynti2skj hyväksymää tiedostomuotoa. Logiikka mene karkeasti
- luo luokka
- kutsu aloita
- kutsu tuoterivejä ja tekstirivejä haluttu määrä. Ulosmaksut/kassaanmaksut tulossa
- lisää maksutapa (summien pitäisi täsmätä rivien summaan)
- kutsu lopeta
- tallenna tiedostoa
Code Block | ||
---|---|---|
| ||
var
m:tmyynti2skjtiedostoluoja;
sl;
begin
m := tmyynti2skjtiedostoluoja.create;
sl := tstringlist.create;
// aika, tosite, myymälä, kassa, myyjä, asiakas, tyyppi (0=normaali,1=tositetallennus)
m.aloita(now, 100,1,'00099',10,0,0);
// tuote,määrä, ahinta, alepros, alvpros, yht
m.lisaatuote('100221', 2, 50, 5, 24, 95);
m.lisaaTekstiRivi('Tuotteella ei ole takuuta');
// maksutavan nro, summa, erikoistoiminto, annettusumma
m.lisaaMaksutapa(2,95,0,0);
m.lopeta( sl );
sl.savetofile('c:\temp\tosite.txt');
end; |