【发布时间】:2017-05-22 10:18:34
【问题描述】:
这是我的 FoxPro 程序。 Select 子句导致错误。
PROCEDURE IFRS_Split_Cashflows_2_v7_4_CSV
PARAMETERS model_dir, cube2_output_path, output_path, scenario, version
temp_dir = GETENV("TEMP")
**** Load up utility function and Create an output folder ****
SET PROCEDURE TO model_dir + "\CUBE2_" + version + "\PRGS\Utilities_" + version + ".prg"
lcTextFile = cube2_output_path + "\IFRS_Split_Cashflows_2\run_" + scenario + ".csv"
Do delete_file WITH lcTextFile
Do create_folder WITH cube2_output_path + "\IFRS_Split_Cashflows_2"
**** Assign variables to the input files ****
moses_output_file = output_path + "\annuities~main10.dbf"
SELECT 0
Use (moses_output_file) ALIAS cube_output1
moses_output_file = output_path + "\annuities~main10~reinsured.dbf"
SELECT 0
Use (moses_output_file) ALIAS cube_output2
moses_output_file = output_path + "\annuities~main10~reinsurance_premium.dbf"
SELECT 0
Use (moses_output_file) ALIAS cube_output3
**** Split the group string and select relevant data ****
SELECT ;
c1.t_from AS t_from, ;
c1.cal_mth as calendar_month, ;
c1.cal_yr as calendar_year, ;
substr(c1.group,1,3) AS BUS_LINE, ;
padr( IIF( isnumeric( strextract(c1.group, "|", "|", 1, 1), ""), ;
substr(c1.group,1,4) + strextract(c1.group, "|", "|", 1, 1), ;
strextract( c1.group,"|", "|",1, 1)), 10) AS reinsurance_book,;
padr( strextract(c1.group, "|","|", 3,1),10) AS Esc_Index,;
padr( IIF( left(c1.group,3) = "LRT", ;
strextract(c1.group, "|", "|",5,1), ;
strextract(c1.group,"|","|",4,1)) ,10) AS MAP_ELIG,;
padr( IIF( left(c1.group,3) = "LRT", ;
strextract( trim(c1.group - "|"),"|","|", 6, 1), ;
strextract( trim(c1.group - "|"),"|","|", 5,1)), 10) AS MAP_STAT,;
SUM(c1.ann_ben_if) AS ann_ben_if, ;
SUM(c2.dth_out) AS c2death_outgo, ;
SUM(c3.dth_out) AS c3death_outgo;
FROM ;
cube_output1 c1, ;
cube_output2 c2, ;
cube_output3 c3;
INTO ;
CURSOR temp READWRITE;
WHERE ;
c1.t_from = 0 ;
AND ( ( c1.t_from = c2.t_from AND c1.group = c2.group) ;
OR ( c1.t_from = c3.t_from AND c1.group = c3.group)) ;
group by ;
c1.t_from, ;
c1.cal_mth, ;
c1.cal_yr, ;
BUS_LINE, ;
reinsurance_book, ;
Esc_Index, ;
MAP_ELIG, ;
MAP_STAT
**** Copy to a CSV file ****
COPY TO cube2_output_path + "\IFRS_Split_Cashflows_2\run_" + scenario + ".csv" TYPE CSV
它会生成错误,“文件 c:\users\jc\appdata\local\temp\00002jo9000h.tmp 太大。其他任务失败。”
我实际上从 select 语句中删除了几个与 c2 和 c3 相关的字段。我还将 where 子句的第一部分从 c1.t_from > 0 更改为 c1.t_from = 0,以减少观察。
错误仍然出现。我了解临时文件的文件大小上限为 2GB。大小方面,输入文件如下:c1 为 275MB,C2 为 275MB,c3 为 191MB。鉴于此,我对临时文件太大感到惊讶。为什么它太大了?有什么方法可以改进上面的 Select 语句,以正确返回请求的字段?
【问题讨论】:
-
您需要提供一些示例数据。您正在隐式创建内部连接,但它们的大小表并不重要。 c1 中的单行可能与 c2 和 c3 中的许多行匹配,产生太多行,最终超过 2 Gb。此外,您没有给我们完整的 sql,您的似乎正在利用 VFP8 之前版本中存在的错误。您不应该以这种方式求和,这可能会导致错误的结果。
-
我对输入数据不太熟悉,但您可能是对的。假设你是对的,最好的解决方法是什么?另外,你能详细说明你提到的错误吗?我正在使用 FP6。我已经更新了上面的代码以包含完整的程序。
标签: sql visual-foxpro foxpro