added sysprog entities
This commit is contained in:
189
SYSPROG/STPROCINS/RTI_BROLIST_DATASOURCE_TEMPLATE.txt
Normal file
189
SYSPROG/STPROCINS/RTI_BROLIST_DATASOURCE_TEMPLATE.txt
Normal file
@ -0,0 +1,189 @@
|
||||
compile Insert RTI_BROLIST_DATASOURCE_TEMPLATE
|
||||
|
||||
Function RTI_BROLIST_DATASOURCE(ACTION, PARAM1, PARAM2, PARAM3)
|
||||
/*
|
||||
** Mimic using An SQL stored procedure to build a recordset
|
||||
** Build a workging table were oconv, sort is all done "server-side"
|
||||
** So report can just have groups with Break-on, minimal chatter with OI.
|
||||
**
|
||||
**
|
||||
*/
|
||||
|
||||
Declare Function dcount
|
||||
|
||||
$Insert logical
|
||||
If Assigned(ACTION) Else ACTION = ""
|
||||
If Assigned(PARAM1) Else PARAM1 = ""
|
||||
If Assigned(PARAM2) Else PARAM2 = ""
|
||||
If Assigned(PARAM3) Else PARAM3 = ""
|
||||
* {CMD}
|
||||
|
||||
common /brolist_ds_Com/selected%, keys%
|
||||
If Assigned(selected%) Else selected% = 0
|
||||
RSLT = ""
|
||||
Begin Case
|
||||
Case ACTION _EQC "FIELDS"
|
||||
* New report, cleasr the selected cache
|
||||
selected% = 0
|
||||
|
||||
* return:
|
||||
* <1> Field Name]
|
||||
* <2> Field #]
|
||||
* <3> conv code]
|
||||
* <4> MVFlag (0/1)]
|
||||
* <6> Association]
|
||||
|
||||
* For speed define a dict that is all hard fields, no oConv
|
||||
* Then on the read, do the calculations and oconv here, send result to BRW
|
||||
* Colname ; * Position ; * Conv
|
||||
{FIELDS_BLOCK}
|
||||
|
||||
Case action _eqc "DATATYPE"
|
||||
whichField = param1
|
||||
|
||||
{DATATYPE_BLOCK}
|
||||
|
||||
|
||||
Case ACTION _EQC "KEYS"
|
||||
* return:
|
||||
* <1-n> key
|
||||
* Build a dynamic select
|
||||
* Param1 looks like "100 WHERE FILTER = trUE
|
||||
|
||||
* Seems to come here twice, so do the select the first time, return the keys the second time
|
||||
If selected% Then
|
||||
transfer keys% To rslt
|
||||
selected% = 0
|
||||
End else
|
||||
keys% = ''
|
||||
selected% = 1
|
||||
selstmt = trim(param1)
|
||||
cmds = ''
|
||||
|
||||
firstword = selstmt[1,' ']
|
||||
tablename = "{TABLE}"
|
||||
If Num(firstword) Then
|
||||
num_to_select = firstword
|
||||
with_clause = trim(Field(selstmt, ' ', 2, Len(selstmt)))
|
||||
by_clause = ''
|
||||
End Else
|
||||
num_to_select = ""
|
||||
with_clause = selstmt
|
||||
by_clause = ''
|
||||
End
|
||||
|
||||
Begin Case
|
||||
Case with_clause[1,2] _eqc 'BY'
|
||||
by_clause = with_clause
|
||||
with_clause = ''
|
||||
|
||||
Case indexc(with_clause, ' BY ', 1) Or indexc(with_clause, ' BY-DSND', 1)
|
||||
pos1 = indexc(with_clause, ' BY ', 1)
|
||||
pos2 = indexc(with_clause, ' BY-DSND', 1)
|
||||
pos = If pos1 gt pos2 Then pos1 Else pos2
|
||||
If pos then
|
||||
by_clause = with_clause[pos,getByteSize(with_clause)]
|
||||
with_clause = with_clause[1,pos-1]
|
||||
End
|
||||
End case
|
||||
|
||||
If indexc(with_clause, 'WITH', 1) then
|
||||
CMDS<-1> = 'SELECT ': num_to_select:' ':tablename:' ' : with_clause
|
||||
end
|
||||
If indexc(by_clause, 'BY', 1) Then
|
||||
* Do the sort after the select
|
||||
CMDS<-1> = 'SELECT ': num_to_select:' ':tablename: ' ' : by_clause
|
||||
End
|
||||
If cmds = '' Then
|
||||
CMDS<-1> = 'SELECT ': num_to_select:' ':tablename
|
||||
end
|
||||
col = ''
|
||||
Loop
|
||||
Remove cmd From cmds At col Setting mark
|
||||
If cmd # '' then
|
||||
Call Rlist(cmd,5, '', '', '')
|
||||
End
|
||||
While @list.active And mark
|
||||
Repeat
|
||||
|
||||
rslt = ''
|
||||
If @list.active Then
|
||||
alloc_size = 0xFFFF
|
||||
buffer = space(alloc_size)
|
||||
bsize = alloc_Size
|
||||
bpos = 1
|
||||
|
||||
done = false$
|
||||
Loop
|
||||
Readnext val Else done = true$
|
||||
Until done
|
||||
Gosub Append
|
||||
Repeat
|
||||
If bpos gt 2 Then
|
||||
keys% = buffer[1,bpos-2]
|
||||
end
|
||||
end
|
||||
end
|
||||
Case ACTION _EQC "READ"
|
||||
rslt = ''
|
||||
@id = param1
|
||||
alloc_size = 500
|
||||
buffer = space(alloc_size)
|
||||
bsize = alloc_Size
|
||||
bpos = 1
|
||||
*LIST PERSON_SONG_PLAY FULL_NAME PLAY_COST PLAY_MONTH TITLE BY PLAY_MONTH BY TITLE
|
||||
tablename = "{TABLE}"
|
||||
dictname = "{DICTIONARY}"
|
||||
colnames = "{DATASOURCE_COLS}"
|
||||
convs = "{DATASOURCE_CONVS}"
|
||||
col_cnt = "{DATASOURCE_CNT}"
|
||||
Convert ',' To @vm In colnames
|
||||
Convert ',' To @vm In convs
|
||||
Open dictname To @dict Then
|
||||
Open tablename To f_psp Then
|
||||
ReadO @record From f_psp, @id Then
|
||||
clpos = 1
|
||||
cvpos = 1
|
||||
For col_nr = 1 To col_cnt
|
||||
colname = colnames[clpos,@vm,1];clpos = bcol2()+1
|
||||
conv = convs[cvpos,@vm,1];cvpos = bcol2()+1
|
||||
Begin Case
|
||||
Case colname _Eqc '@ID' Or colname _Eqc 'AT_ID'
|
||||
val = @id
|
||||
case Num(colname)
|
||||
val = @record<colname>
|
||||
Case 1
|
||||
val = calculate(colname)
|
||||
End case
|
||||
If conv # '' Then
|
||||
val = Oconv(val, conv)
|
||||
end
|
||||
Gosub append
|
||||
next
|
||||
If bpos gt 2 Then
|
||||
rslt = buffer[1,bpos-2]
|
||||
end
|
||||
end
|
||||
End
|
||||
End
|
||||
|
||||
Case ACTION _EQC "WRITE"
|
||||
id = param2
|
||||
rec = param3
|
||||
|
||||
Case ACTION _EQC "DELETE"
|
||||
id = param1
|
||||
|
||||
End Case
|
||||
|
||||
Return RSLT
|
||||
|
||||
append:
|
||||
vlen = getByteSize(val) + 1
|
||||
If vlen + bpos gt bsize then
|
||||
buffer := space(alloc_size)
|
||||
bsize += alloc_Size
|
||||
end
|
||||
putbinaryValue( buffer, bpos,CHAR, val:@fm)
|
||||
bpos += vlen
|
||||
return
|
Reference in New Issue
Block a user