ALIS

Software pro veřejnou správu

Vzdálená pomoc

Export do formátu DBF

Export do formátu DBF je rozumnou cestou převodu FANDovských dat do jiných systémů. PC FAND sám "uznává" formát DBF (dBase III), ale není jednoduché DBF soubory deklarovat, protože některé typy údajů formát DBF nezná.

Export je nejlépe realizovat přímo v úloze, kde jsou datové soubory deklarovány; stačí přidat jeden parametrický soubor a dvě procedury. Takto vytvořené soubory lze přímo zpracovat např. v Excelu (textové údaje musí být v kódu Latin 2).

K automatickému převodu deklarace je možno využít málo známého FAND-Prologu. L-procedura pro převod může vypadat takto:

{L DeklDBF - Vytvoří deklaraci souboru *.DBF (jen uložené údaje)}

#DOMAINS
  Příznak = Integer

#CONSTANTS
  Příznak: uložený=1,  šifrovaný=2, sMaskou=4, myšČárka=8, zarovnaný=16

#DATABASE    
 @prevpara (Soubor/String)                       {parametrický soubor PREVPARA}

#PREDICATES
 @zapišDBFdek['(Text: String) Begin PREVPARA.DBFdek:= Text End;'](LongString)
                                     {zápis do param. souboru - přímo to nejde}
  intStr(Integer,&String)                            {převod Integer -> String}
  druhÚdaje(Příznak,&String)                      {označení vypočítaných údajů}
  listLong(L_String,&LongString)                    {převod List -> LongString}
  převeď(String,Integer,Integer,&String)  {převod kódovaného typu do textového}
  deklÚd(String,&String)           {převod kódované deklarace údaje do textové}

#CLAUSES
  intStr(I,str(I)).
  druhÚdaje(uložený,'').
  listLong([],'').
  listLong([H|T],H+'\13'+LS):- listLong(T,LS).

{definice převodu typů *.000 do typů *.DBF}
  převeď('F',M,N,'F,'+X+'.'+Y):- intStr(M,X), intStr(N,Y).
  převeď('A',M,_,'A,'+X):-       intStr(M,X).
  převeď('N',M,_,'A,'+X):-       intStr(M,X).                   {N převeď na A}
  převeď('D',_,_,'D').
  převeď('B',_,_,'B').
  převeď('T',_,_,'T').
  převeď('R',_,_,'F,12.6').                                     {R převeď na F}

  deklÚd(Soubor,PředZn+NázÚd+':'+SpecifÚd+';'):-
                                 fandfield(Soubor,NázÚd,TypÚd,M,N,F,_),
                                 druhÚdaje(F&&uložený,PředZn),
                                 převeď(TypÚd,M,N,SpecifÚd).
#CLAUSES
  main:- prevpara(Soubor),                         {načti zadané jméno souboru}
         zapišDBFdek(''),                           {vyprázdni PREVPARA.DBFdek}
         fandfile(Soubor,_,_,_),     {vyhledej Soubor v úloze (není-li, konec)}
         all_String(deklÚd(Soubor,Dek1),Dek1,SezDek),   {seznam jeho deklarací}
         listLong(SezDek,Dekl),                                {převeď na text}
         zapišDBFdek(Dekl).                        {a zapiš do PREVPARA.DBFdek}
{-----------------------------------------------------------------------------}

Procedura vyzvedne jméno převáděného souboru z globální proměnné PREVPARA.Soubor a vytvoří k němu DBF deklaraci, kterou uloží do globální proměnné PREVPARA.DBFdek (logická procedura nemůže mít parametry, proto komunikuje přes parametrický soubor).

Parametrický soubor má deklaraci

{F PREVPARA}
Soubor: A,8;
DBFdek: T;

#K @@
{-----------}

Exportní procedura může být např.

{P Převod}

Var 
  Soubor,ExpDekl: String;

Begin
  Soubor:= TrailChar(' ',UpCase(Prompt('Soubor k převodu: ':A,8)));
  If EscPrompt|Soubor='' then Exit;
  PREVPARA.Soubor:= Soubor;
  Lproc(DeklDBF);
  ExpDekl:= TrailChar(';',TrailChar('\13',PREVPARA.DBFdek));
                                    {odstranit  poslední ';' a CR na konci}
  EXPDBF.Path:= TrailChar(' ',Soubor)+'.DBF';  {EXPDBF musí být v katalogu}
  Proc(['Var EXPDBF: File.DBF['+ExpDekl+'];
             sRec: Record of '+Soubor+'; eRec: Record of EXPDBF;
         Begin '
         +'ForAll sRec % do '
         +'  Begin eRec:=sRec; WriteRec(eRec,0); End;'
         +'Close(EXPDBF); End;']);
End;
{--------------------------------------------------------------------------}

Před spuštěním exportu je třeba zapsat do katalogu soubor EXPDBF

NazUlohy NazSouboru Ar                     Cesta                      Navesti
PREVODBF  EXPDBF    00 

Tím se obejde shoda jmen původního a exportního souboru (mají ovšem různé přípony).