какие-либо советы от гуру по развитию 4GL взглянуть на блок кода 4GL, приведенный ниже, и посмотреть, не слишком ли это сделано? можно ли сделать так, чтобы было легче следить / было легче читать?
У меня есть TblA
Report
6998077
6998078
6998097
7062816
И TblB
+-----------+------------+-----------+
| ID | Source| Report |
+-----------+------------+-----------+
| 4976117 | 6998077 | 6998077 |
| 4976118 | 6998078 | 6998078 |
| 4976137 | 6998097 | 6998097 |
| 5107798 | 7062816 | 6998078 |
| 5107799 | 7062816 | 6998097 |
+-----------+------------+-----------+
и у меня, на мой взгляд, сложный цикл Progress 4GL:
def temp-table TblTemp no-undo
field cTypeOfRec as char
field Report as int
field Source as int
field ID as int
index key is unique primary Report Source ID.
procedure SOOptimize:
output stream dOut1 to value("/OutPut.txt").
export stream dOut1 delimiter "|"
"Report"
"Source"
"ID".
for each TblA no-lock
on error undo, return error on stop undo, return error:
for each TblB no-lock where
TblB.Source = TblA.Report
on error undo, return error on stop undo, return error:
find TblTemp exclusive-lock where
TblTemp.SrcPltSeq = TblA.Report and
TblTemp.RptPltSeq = TblB.Report and
TblTemp.ID = TblB.ID
no-error.
if NOT available TblTemp
then do:
create TblTemp.
assign
TblTemp.cTypeOfRec = "From LoopA"
TblTemp.SrcPltSeq = TblA.Report
TblTemp.RptPltSeq = TblB.Report
TblTemp.ID = TblB.ID.
end.
end.
for each TblB no-lock where
TblB.Report = TblA.Report
on error undo, return error on stop undo, return error:
find TblTemp exclusive-lock where
TblTemp.SrcPltSeq = TblB.Source and
TblTemp.RptPltSeq = TblA.Report and
TblTemp.ID = TblB.ID
no-error.
if NOT available TblTemp
then do:
create TblTemp.
assign
TblTemp.cTypeOfRec = "From LoopB"
TblTemp.SrcPltSeq = TblB.Source
TblTemp.RptPltSeq = TblA.Report
TblTemp.ID = TblB.PltSrcSeq.
end.
end.
end.
for each TblTemp no-lock
on error undo, return error on stop undo, return error:
export stream dOut1 delimiter "|"
TblTemp.
end.
end procedure.
Тогда результат моего кода прогресса:
+------------+---------+---------+---------+
| cTypeOfRec | Source | Report | ID |
+------------+---------+---------+---------+
| From LoopA | 6998077 | 6998077 | 4976117 |
| From LoopA | 6998078 | 6998078 | 4976118 |
| From LoopB | 7062816 | 6998078 | 5107798 |
| From LoopA | 6998097 | 6998097 | 4976137 |
| From LoopB | 7062816 | 6998097 | 5107799 |
+------------+---------+---------+---------+
У меня очень ограниченные знания о Progress 4GL. Этот код кажется чрезмерно готовым? может быть проще?
Я исхожу из фона SQL. Таким образом, в SQL я могу решить эту проблему довольно быстро и легко. Под этим я подразумеваю, что ВСЕ этот блок выполнения кода в основном просто говорит: «Из LoopA», если NULL в LoopB, в противном случае - «из LoopB».
Вот эквивалент SQL, который я придумал:
Select
case when B.ID is null then 'From LoopA'
else B.cTypeOfRec
End "cTypeOfRec"
, A.*
from #TblTemp A
left join (
select A.*, 'From LoopB' "cTypeOfRec" from ( select * from #TblTemp)A
left join (
select B.Source, A.Report, B.ID from #TblA A
Inner join #TblB B
on B.Report=A.Report)B
on A.Source = B.Report
where B.Source is null) B
on A.Report=B.Report
and a.ID = b.ID
and a.Source= b.Source
order by A.Report
, case when B.ID is null then 'From LoopA'
else B.cTypeOfRec
End
какие-либо советы от гуру прогресса 4GL взглянуть на блок кода 4GL выше и посмотреть, не слишком ли это сделано? можно ли сделать так, чтобы было легче следить / читать?
Но я открыт для любого ответа, если это правильный способ кодирования в 4GL для достижения конечного результата, тогда я в порядке.
Спасибо Спасибо