...
*/HUOLETTOMATMUUTTUJAT Aivan hirveä parametri, aiheuttaa sen että muuttujia ei tarvitse määritellä. Kyseinen ominaisuus on mm. Fortran kielessä ja se aiheutti huhujen mukaan Nasan Venus-luotaimen tuhoutumisen. Katso Kielioppi.htmhtm#Muuttujat muuttujat
*/LOG:TIEDOSTO loki menee mainittuun tiedostoon. Lokeja pyöritetään s.e. max 20 logia pidetään ja yhden lokin koko on max 512 kt eli lokeihin menee korkeintaan 10 Mt. Ilman tätä parametria loki menee ohjelman suorituskansioon skjscript.log -tiedostoon.
...
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
|
...
- 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.itemsi);
Katso myös CSV_Tuonti.htm esimerkki.
...
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');
...
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); |
...
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'); slista.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); end; end; |
...
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;
|
...
- 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;
_
h1. TIEDOSTOT
*FindFirst, FindNext ja FindClose
**hakemisto läpikäyntiin ja tiedostojen etsintään
*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
...
- 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);
...
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;
|
...