Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

*/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
language
delphi
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
      languagedelphi
      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
languagedelphi
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
languagedelphi
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
languagedelphi

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;

...

  1. tietokanta - kanta josta asetukset haetaan
  2. Myyja - myyjän numero
  3. Näytä dialog true/false näytetäänkö s-postin lähetysdialogia
  4. Ostikko
  5. viestin runko
  6. Liitetiedostot, puolipisteerotettu lista
  7. Lähettäjä, jos tyhjä käytetään winskj:n asetuksista löytyvää
  8. 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;

...