Немножко вне рутины...
Код то производит запись в поток, значит как раз то очень и относится.
-----
Код должен породить текст.
Вот тот текст, который порождается, меня интересует и интересует очень и очень сильно.
Именно то, какой текст будет порожден кодом и насколько сложно будет модифицировать
порождаемый код и составляет проблему.
То, как это будет реализовано технически - интересует только с позиции чтобы оно никак не
влияло на решение основной задачи.
Т.е. если мне для решения задачи не нужно знать об стреаме, не нужно его передавать или
еще как-то упоминать - это, несомненно, плюс.
Аналогично и по параметрам (тут не использовались) - если они НЕ болтаются под руками
- это тоже плюс.
Можно переписать немного по другому
-----
Можно. И даже - будет работать. Мало того - даже пару раз за последние полгода использовал
именно этот формат - нужно было обойти ошибку в подстановке значения с апострофами в
СКЛ. Но это было две строки на 1-1.5 мбайт шаблонов.
Вот два куска кода, делающие одно и то же:
VB
sql = "SELECT " & _
"TO_CHAR(fc.FC_BARCODE,'000000') ""bcd"", " & _
"fc.FC_BATCH_NO ""batchNo"", " & _
"fc.FC_SEQUENCE_NO ""seqNo"", " & _
"fc.FC_PANE_NO ""paneNo"", " & _
"fc.FC_GLAS_SEQ ""compNo"", " & _
"ps.PS_ORDER_NO ""orderNo"", " & _
"ps.PS_ORDER_POS ""itemNo"" " & _
"" & _
"FROM PRD_SEQ ps, PLAN_PARA pp, DAYBOOK db, FLOW_CTRL fc WHERE " & _
"" & _
"fc.FC_BATCH_NO=ps.PS_BATCH_NO AND " & _
"fc.FC_SEQUENCE_NO=ps.PS_SEQUENCE_NO AND " & _
"" & _
"ps.PS_ORDER_NO=db.DB_ORDER_NO AND " & _
"ps.PS_BATCH_NO BETWEEN db.DB_BATCH_NO_FROM AND db.DB_BATCH_NO_TO AND " & _
"" & _
"db.DB_MODE=pp.PP_NUMBER AND " & _
"DECODE(pp.PP_PURPOSE,3,1,4,1,0)=1 AND " & _
"" & _
"NOT EXISTS (" & _
"SELECT LBS_BCD " & _
"FROM C_LOG_BCD_STOCK WHERE " & _
"LBS_BCD=fc.FC_BARCODE AND " & _
"LBS_BATCH_NO=fc.FC_BATCH_NO AND " & _
"LBS_SEQUENCE_NO=fc.FC_SEQUENCE_NO" & _
") AND " & _
"" & _
"ps.PS_ORDER_NO=" & DRBcdStock.Item("orderNo").ToString & " AND " & _
"ps.PS_ORDER_POS=" & DRBcdStock.Item("itemNo").ToString & " AND " & _
"fc.FC_PANE_NO=" & DRBcdStock.Item("paneNo").ToString & " AND " & _
"fc.FC_GLAS_SEQ=" & DRBcdStock.Item("compNo").ToString & " " & _
"ORDER BY TO_CHAR(fc.FC_BARCODE,'000000')"
шаблон
<#@ template language="C#" inherits="Templates.Sql.TSqlTemplateBase" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
SELECT
TO_CHAR(fc.FC_BARCODE,'000000') "bcd",
fc.FC_BATCH_NO "batchNo",
fc.FC_SEQUENCE_NO "seqNo",
fc.FC_PANE_NO "paneNo",
fc.FC_GLAS_SEQ "compNo",
ps.PS_ORDER_NO "orderNo",
ps.PS_ORDER_POS "itemNo"
FROM PRD_SEQ ps,
PLAN_PARA pp,
DAYBOOK db,
FLOW_CTRL fc
WHERE fc.FC_BATCH_NO = ps.PS_BATCH_NO
AND fc.FC_SEQUENCE_NO = ps.PS_SEQUENCE_NO
AND ps.PS_ORDER_NO = db.DB_ORDER_NO
AND ps.PS_BATCH_NO BETWEEN db.DB_BATCH_NO_FROM AND db.DB_BATCH_NO_TO
AND db.DB_MODE = pp.PP_NUMBER
AND DECODE(pp.PP_PURPOSE,3,1,4,1,0) = 1
AND NOT EXISTS (
SELECT LBS_BCD
FROM C_LOG_BCD_STOCK
WHERE LBS_BCD = fc.FC_BARCODE
AND LBS_BATCH_NO = fc.FC_BATCH_NO
AND LBS_SEQUENCE_NO = fc.FC_SEQUENCE_NO
)
AND ps.PS_ORDER_NO = <#= OrderNo #>
AND ps.PS_ORDER_POS = <#= ItemNo #>
AND fc.FC_PANE_NO = <#= PaneNo #>
AND fc.FC_GLAS_SEQ = <#= CompNo #>
ORDER BY TO_CHAR(fc.FC_BARCODE,'000000')
Какой из них проще?
И нахрена во втором писать каждую строку через writer.StoreData(...)?
Тем более, что это сделает компилятор...
И если мне где-то надо вставить этот текст в другой, то
<#@ template language="C#" inherits="Templates.Sql.TSqlTemplateBase" #><#@ assembly name="System.Core" #><#@ import namespace="System.Linq" #><#@ import namespace="System.Text" #><#@ import namespace="System.Collections.Generic" #><#TAsql asql = new TASql();#>WITH A AS ( <#= asql.TransformText() #> )SELECT * FROM A
решает проблему и добавлять сюда какой-то стреам мне ну никак не хочется. Чем проще - тем лучше. Но работать - должно.
ВБшный код, если нужен, сам нарисуешь.
а каждая Бэшка реализует интерфейс IStoreData
-----
Можно. Нужно только поменять компилятор шаблонов. Или писать это дело руками для каждого класса...