open-insight/SYSPROG/STPROCINS/RTI_BROLIST_DATASOURCE_TEMPLATE.txt
2024-03-25 15:17:34 -07:00

190 lines
4.6 KiB
Plaintext

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