Xspecial

Aus bafbal.de
Zur Navigation springen Zur Suche springen

xspecial - Nachschlagelisten aus SQL-Abfragen

Das Formular

Specials sind auch Nachschlageliste, allerdings werden sie im Gegensatz zu xlookup als SQL-Statement definiert.

Nachschlageliste aus einer SQL-Abfrage

Die Bedienung ist recht selbsterklärend: Mit dem Button Special hinzufügen wird exakt dies getan, neben einer Kategorie und einem Namen muss in Code ein SQL-Statement angegeben werden; dabei muss die Spalte mit den Schlüssel ckey und die Spalte für den (angezeigten) Wert cvalue heißen. (Das Prefix c steht für column und ist erforderlich, weil bei manchen Datenbanksysteme key und/oder value geschützte Bezeichner sind.)

Mit dem Button Special testen kann das SQL-Statement ausgeführt werden.

Tabelle

create table data_special (
  data_special_id varchar(40) not null primary key,
  category varchar(40),
  name varchar(40) not null unique,
  description varchar(80),
  code text(4000),
  status int,
  datechg date,
  usrchg varchar(40),
  progchg varchar(40)       
);

Code

xspecial

#rights  n=frm   r_user=r  r_user.admin=w
#frm   c=xspecial   flt=xspecial_flt   w=300   r=frm

#btn  y=save   s=#save  se=c
#btn  y=cancel   s=#cancel  se=cp
#btn  y=back   s=#treeback  se=b
#btn  y=backback   s=#treebackback  se=b
#btn  y=export   s=xspecial_eximport(ex)  se=b
#btn  y=import   s=xspecial_eximport(im)  se=b
#btn  c=$T(Add_special)   w=120    s=xspecial_add   se=b

#filter

Die Formulardefinition ist ziemlich "Standard", User haben Leserechte, Administratoren Schreibrechte.

xspecial_add

~ $EMPTY($FND(s,category))
#tree_add u=root   c=$T(new_special)  t=data_special     c1=name   s="#page_fill  d=xspecial_page_list"   si=Y  

~ $EMPTY($FND(s,data_special_id))
#tree_add u=sel   c=$T(new_special)  t=data_special   c1=name   s="#page_fill  d=xspecial_page_list"   si=Y    

~ 
#tree_add u=selp   c=$T(new_special)  t=data_special   c1=name    s="#page_fill  d=xspecial_page_list"   si=Y    

~~

Je nach dem, ob, und wenn ja, welcher Baumeintrag selektiert ist, muss der Parameter u auf einen anderen Wert gesetzt werden (wurde schon bei xlookup_add ausführlich erklärt).

xspecial_eximport

~ $ICP(0,ex)
#val_set  n=1  z=$FILEDIALOG(save,$T(filter_baf),baf)
#sql_exporttables   fn=$VAL(1)   t=data_special

~ $ICP(0,im)
#val_set  n=1  z=$FILEDIALOG(open,$T(filter_baf),baf)
#sql_importdefs   t=data_special
#sql_importtables   fn=$VAL(1)   t=data_special

~~

Ex- und Import ist auch ziemlich "Standard".

xspecial_flt

#tree_clear

#sql select *    from data_special      order by category, name;
#tree_node  u=root      k=category  c1=category   nc=Y   s="#page_fill  d=xspecial_page_category"
#tree_node  u=last     t=data_special     c1=name     s="#page_fill  d=xspecial_page_list"  
#tree_fillsql  mex=3

Die Specials werden in zwei Baumebenen als Kategorie und Name angezeigt. Mit mex=3 werden bei bis zu drei Kategorien diese gleich geöffnet.

xspecial_page_list

#page

#prim  as=Y  sz=800
#cat  as=Y    sz=800   c=$T(Special)

#vl_seg  cc=3  clt=ss   w1=100  w2=300   wst2=300  w3=0   n=vl   
#vl_line   c1="ID"   f2=data_special_id   ro2=Y   nvic2=$GUID()   f3=code
#vl_line   c1="Category"   f2=category   nv2=$FND(s,category)
#vl_line   c1="Name"   f2=name
#vl_line   c1="Description"   f2=description
#sql select * from data_special where data_special_id = :kid
#vl_data   q=sql   t=data_special   kid=$FND(s,data_special_id)   

#memo_seg   i=vl   f=code   q=link   c="Code"   b=H

#prim  as=Y  sz=800
#cat  as=Y    sz=800   c=$T(test)

#btns_seg  
#btns_btn  c=$T(Test_special)  w=150   cmd="#page_fill  d=xspecial_page_list(test)"

~ $ICP(0,test)
#grd_seg   frc=0   fcc=0   clt=ss   n=grid
#grd_col   f=ckey   c1="Key"   w=250   ro=Y
#grd_col   f=cvalue   c1="Value"   w=400   wst=400   ro=Y
#sql $PVAL(vl,2,0)
#grd_data   q=sql  

~~

Im VL-Segment können Kategorie, Name und Beschreibung gepflegt werden. Der Code wird in einer unsichtbaren Zelle gehalten, darum ist die Zahl der Spalten drei (#vl_seg cc=3 w3=0) und in der ersten Zeile wird der Code geladen (#vl_line f3=code). Angezeigt und bearbeitet wird der Code in einem Memo-Segment; damit dieses mit der unsichtbaren Zelle verbunden ist, muss mit i=vl auf das VL-Segment und mit f=code auf die Zelle verwiesen werden. Zudem muss mit q=link die Datenquelle des Memo-Segments angegeben werden.

Soll der Code getestet werden, so wird dieselbe Seite, aber mit dem Parameter test aufgerufen. Mit ~ $ICP(0,test) wird geprüft, ob ein solcher Aufruf erfolgt ist und gegebenenfalls der darauffolgende Code ausgeführt. Zur Anzeige wird ein simples Grid-Segment mit zwei Spalten verwendet. Mit $PVAL(vl,2,0) wird das SQL-Statement aus dem VL-Segment geholt und dann gleich ausgeführt.