1.IsNull和空字符串不一样,空字符串不能使用IsNull开判断;
2.完整示例代码:
==========================================================
====================普通差分–按年度差========================
$(Include=comm\BatCom.qvs);

$(Include=comm\BatYearDiffCom.qvs);

// if vDateYear variable not null, load data
IF not IsNull($(vDateYear)) THEN 

    LET vQVDExist = not isnull(QVDCreateTime('$(vQvdPath)\KDMDM004.qvd'));
    // if qvd file is exist
    IF vQVDExist THEN
		KDMDM004_模試科目マスタ:
		LOAD 登録日付 AS 登録日付,
			登録PG AS 登録PG,
			更新日付 AS 更新日付,
			更新PG AS 更新PG,
			年度 AS 年度,
			模試コード AS 模試ID,
			科目コード AS 科目コード,
			科目名 AS 科目名,
			科目短縮名 AS 科目短縮名,
			配点 AS 配点
		FROM
		[$(dataSourcePath)\06_受験科目マスタ.csv]
		(txt, codepage is 932, embedded labels, delimiter is ',', msq)
		Where 年度 = '$(vDateYear)';
		// the above need to change from sybase SQL
		
		 ( combine keyword)//add QV merge keyword
		
		LOAD 登録日付,
			登録PG,
			更新日付,
			更新PG,
			年度,
			模試ID,
			科目コード,
			科目名,
			科目短縮名,
			配点
		FROM [$(vQvdPath)\KDMDM004.qvd](qvd)
		
		Where 年度 < '$(vDateYear)';
		
		Store KDMDM004_模試科目マスタ into $(vQvdPath)\KDMDM004.qvd(qvd);
	ELSE
		KDMDM004_模試科目マスタ:
		LOAD 登録日付 AS 登録日付,
			登録PG AS 登録PG,
			更新日付 AS 更新日付,
			更新PG AS 更新PG,
			年度 AS 年度,
			模試コード AS 模試ID,
			科目コード AS 科目コード,
			科目名 AS 科目名,
			科目短縮名 AS 科目短縮名,
			配点 AS 配点
		FROM
		[$(dataSourcePath)\06_受験科目マスタ.csv]
		(txt, codepage is 932, embedded labels, delimiter is ',', msq)
		Where 年度 <= '$(vDateYear)';
		Store KDMDM004_模試科目マスタ into $(vQvdPath)\KDMDM004.qvd(qvd);
	ENDIF
ENDIF
==========================================================
===================普通差分–按25个月差分======================
$(Include=comm\BatCom.qvs);

$(Include=comm\Bat25MonthsDiffCom.qvs);

KDTDM017_接触アプローチ情報:
LOAD 登録日付 AS 登録日付,
	登録PG AS 登録PG,
	更新日付 AS 更新日付,
	更新PG AS 更新PG,
	顧客ID AS 顧客ID,
	接触アプローチNO AS 接触アプローチNO,
	接触アプローチ年度 AS 接触アプローチ年度,
	接触アプローチ日 AS 接触アプローチ日,
	接触アプローチ区分 AS 接触アプローチ区分,
	接触アプローチ大分類 AS 接触アプローチ大分類_コード,
	接触アプローチ小分類 AS 接触アプローチ小分類_コード,
	接触アプローチ内容 AS 接触アプローチ内容_コード,
	接触アプローチ校舎 AS 接触アプローチ校舎,
	接触アプローチ担当者コード AS 接触アプローチ担当者コード,
	件数 AS 件数
FROM
[$(dataSourcePath)\BIBT0330_接触アプローチ情報.qvd](qvd)
Where Date(接触アプローチ日, 'YYYY/MM/DD') >= Date('$(v25MonthDate)', 'YYYY/MM/DD');
Store KDTDM017_接触アプローチ情報 into $(vQvdPath)\KDTDM017.qvd(qvd);
==========================================================
===================全国周别差分–按周差分======================
$(Include=comm\BatCom.qvs);

// select today data from Table[カレンダ] データ年度 and データ週名 and 週ソート value
CALENDER_カレンダ:
LOAD データ年度,
	データ週名,
	週ソート
FROM
[$(vExcelPath)\カレンダ.xlsx]
(ooxml, embedded labels, table is Sheet1)
Where 日 = '$(nowDate)' AND 前年度FLG = 0;

// get today データ年度 and データ週名 and 週ソート value
LET vNowDateYear=FieldValue('データ年度',1);
LET vNowWeekDateWeekName=FieldValue('データ週名',1);
LET vNowWeekSortNo=FieldValue('週ソート',1);
LET vLastWeekSortNo=$(vNowWeekSortNo)-1;

// drop SQL table cache 
DROP TABLE CALENDER_カレンダ;

// select last week data from Table[カレンダ] データ週名 value
CALENDER_カレンダ:
LOAD Distinct データ週名
FROM
[$(vExcelPath)\カレンダ.xlsx]
(ooxml, embedded labels, table is Sheet1)
Where 週ソート = $(vLastWeekSortNo);
// get last week データ週名 value
LET vLastWeekDateWeekName=FieldValue('データ週名',1);

// drop SQL table cache 
DROP TABLE CALENDER_カレンダ;

// select 25months before data from Table[カレンダ] データ週名 value
CALENDER_カレンダ:
LOAD Distinct データ週名
FROM
[$(vExcelPath)\カレンダ.xlsx]
(ooxml, embedded labels, table is Sheet1)
Where 日 = AddMonths('$(nowDate)', -$(effectiveMonths));
// get 25months before データ週名 value
LET v25MonthDateWeekName=FieldValue('データ週名',1);


// if vNowDateYear and vNowWeekDateWeekName and vLastWeekDateWeekName  and v25MonthDateWeekName variable not null, load data
IF not IsNull($(vNowDateYear)) and not IsNull($(vNowWeekDateWeekName)) and not IsNull($(vLastWeekDateWeekName)) and not IsNull($(v25MonthDateWeekName)) THEN 

	LET vQVDExist = not isnull(QVDCreateTime('$(vQvdPath)\KDTDM015.qvd'));
    // if qvd file is exist
    IF vQVDExist THEN
    
		KDTDM015_週別STAGE人数サマリ:
		LOAD 登録日付 AS 登録日付,
			登録PG AS 登録PG,
			更新日付 AS 更新日付,
			更新PG AS 更新PG,
			エリアコード AS エリアコード,
			校舎コード AS 校舎コード,
			データ区分 AS データ区分,
			年度 AS 年度,
			みなし学年 AS 学年,
			表示STAGE区分 AS 表示STAGE区分,
			週 AS 週,
			STAGE区分1 AS STAGE区分1,
			STAGE区分2 AS STAGE区分2,
			人数 AS 人数
		FROM
		$(vExcelPath)\週別STAGE人数サマリ.xlsx
		(ooxml, embedded labels, table is Sheet1)
		WHERE 年度 = '$(vNowDateYear)' and 週 = '$(vNowWeekDateWeekName)';
		
		 ( combine keyword)//add QV merge keyword
		
		LOAD 登録日付, 
		     登録PG, 
		     更新日付, 
		     更新PG, 
		     エリアコード, 
		     校舎コード, 
		     データ区分, 
		     年度, 
		     学年, 
		     表示STAGE区分, 
		     週, 
		     STAGE区分1, 
		     STAGE区分2, 
		     人数
		FROM
		[$(vQvdPath)\KDTDM015.qvd]
		(qvd)
		WHERE 週 >= '$(vLastWeekDateWeekName)' and 週 <= '$(v25MonthDateWeekName)';
		
		Store KDTDM015_週別STAGE人数サマリ into $(vQvdPath)\KDTDM015.qvd(qvd);
	ELSE
		KDTDM015_週別STAGE人数サマリ:
		LOAD 登録日付 AS 登録日付,
			登録PG AS 登録PG,
			更新日付 AS 更新日付,
			更新PG AS 更新PG,
			エリアコード AS エリアコード,
			校舎コード AS 校舎コード,
			データ区分 AS データ区分,
			年度 AS 年度,
			みなし学年 AS 学年,
			表示STAGE区分 AS 表示STAGE区分,
			週 AS 週,
			STAGE区分1 AS STAGE区分1,
			STAGE区分2 AS STAGE区分2,
			人数 AS 人数
		FROM
		$(vExcelPath)\週別STAGE人数サマリ.xlsx
		(ooxml, embedded labels, table is Sheet1)
		WHERE 週 >= '$(vNowWeekDateWeekName)' and 週 <= '$(v25MonthDateWeekName)';
		
		Store KDTDM015_週別STAGE人数サマリ into $(vQvdPath)\KDTDM015.qvd(qvd);
	ENDIF
ENDIF
3.文件操作及排序
$(Include=comm\BatCom.qvs);

LET vLogPath='$(vBatPath)\..\Logs';
LET vNowDateTime = Date(ReloadTime(),'YYYYMMDDhhmmss');

// Del Logs file
EXECUTE cmd.exe /C del $(vLogPath)\KBODF090_*.err;

// Description: copy Qvd folder to Backup folder by date name
EXECUTE cmd.exe /C $(vBatPath)\KBODF090.bat $(vNowDateTime);

LET vErrFileExist = not isnull(QVDCreateTime('$(vLogPath)\KBODF090_$(vNowDateTime).err'));
// if err file is exist,throw exception
IF vErrFileExist THEN
	call ThrowException('Error: KBTDM090.qvw execute ocurr error .');
ENDIF


// get zip file path
LET vHonbanPath='$(vBatPath)\..';
LET vQvdArr = "";
LET vViewArr = "";
LET vQvdArrIndex = 0;
LET vViewArrIndex = 0;
// list the zip files
sub ScanFolder(Root, FolderName)
	for each FileExtension in 'zip'
        for each FoundFile in filelist(Root & '\$(FolderName)*.' & FileExtension)
            LET vFilePath = '$(FoundFile)';
            LET vFileName  = subfield(vFilePath,'\',SubStringCount(vFilePath,'\')+1);

			// get qvd zip file list
            IF FolderName = 'QVD_' THEN
            	LET vQvdArr[$(vQvdArrIndex)] = '$(vFilePath)';
            	LET vQvdArrIndex = vQvdArrIndex+1;
            	FileTable:
				LOAD '$(vFilePath)' AS FileName,
					'$(vFileName)' AS FileNameIndex
				AUTOGENERATE 1;
            ENDIF

			// get view zip file list
            IF FolderName = 'VIEW_' THEN
            	LET vViewArr[$(vViewArrIndex)] = '$(vFilePath)';
            	LET vViewArrIndex = vViewArrIndex+1;
            	FileTable:
				LOAD '$(vFilePath)' AS FileName,
					'$(vFileName)' AS FileNameIndex
				AUTOGENERATE 1;
            ENDIF
        next FoundFile
	next FileExtension
end sub

// del zip files
sub DelZipSub
	// get the total number of rows in QvdFileTableSort table
	LET rowNo = NoOfRows('FileTable');
	IF rowNo > vZipEffectiveNums THEN
	    // sort the FileTable
		FileTableSort:
		LOAD FileName
		RESIDENT FileTable
		ORDER BY FileNameIndex desc;
	
		for i=0 to rowNo-vZipEffectiveNums-1
			//get the value for "text" field on each row
		    LET vFilePath = FieldValue('FileName',$(rowNo)-$(vZipEffectiveNums)-$(i));
		    LET vFileExist = not isnull(QVDCreateTime(vFilePath));
	        IF vFileExist THEN
	        	EXECUTE cmd.exe /C del $(vFilePath);
	        ENDIF
		next
	ENDIF
	
	DROP Table FileTable;
	DROP Table FileTableSort;
end sub

// list the qvd zip files
Call ScanFolder('$(vHonbanPath)', 'QVD_');

// del qvd zip files
Call DelZipSub;

// list the view zip files
Call ScanFolder('$(vHonbanPath)', 'VIEW_');

// del view zip files
Call DelZipSub;