繁体   English   中英

用于添加新字段的 QlikView“未找到字段”解决方法

[英]QlikView “field not found” workaround for adding a new field

我试图让我的脚本在 QlikView 中重新加载但没有成功。 我在最近生成的 QVD 文件中添加了一个新字段(名为Litres )。 但是,我的旧 QVD 文件没有这个Litres字段,因此会导致脚本出错并显示“Field not found”错误。

我正在尝试执行以下操作:

  • 搜索 QV​​D 中的所有字段
  • 如果Litres字段存在,则将数据加载到 QlikView。
  • 如果不是,请创建值为 0 的字段并继续。

以上不应导致错误。

我当前的脚本如下:

/* get all sales csvs */
sales:
load 2014 as Year 
AutoGenerate 0;

set FilePath = ..\..\SourceData\qv-sales*.csv;

for each File in filelist('$(FilePath)')

/* load qvd file if it is newer than csv file */


  temptable1:
    first 1 LOAD           
    *
    FROM $(File)
    (txt, codepage is 1252, embedded labels, delimiter is ',', msq);

   IF FieldNumber('Litres' , 'temptable1') <> null then

  SET  "Litres";
  SET  "Litres LY" ;
  SET dyncode2 = P-Value;
  SET dyncode3 = O-P-Value;
  SET dyncode4 = P-Value LY;
  SET dyncode5 = O-P-Value LY;
  SET dyncode6 = P-Qty;
  SET dyncode7 = P-O-Qty;
  SET dyncode8 = P-Qty LY;
  SET dyncode9 = P-O-Qty LY;




ENDIF;



 DROP TABLE temptable1; 


   let qvdFile = replace('$(File)','csv','qvd');

   if (QvdCreateTime('$(qvdFile)') >= FileTime('$(File)')) then

       /* load qvd file if it is newer than csv file */
       sales:
       Concatenate (sales) load

         "GP",
         "O-GP",
         "Litres",
         "Litres LY",
         "GP LY",
         "O-GP LY",
         $(dyncode2) as "P-Value",
         $(dyncode3) as "O-P-Value",
         $(dyncode4) as "P-Value LY",
         $(dyncode5) as "O-P-Value LY",
         $(dyncode6) as "P-Qty",
         $(dyncode7) as "P-O-Qty",
         $(dyncode8) as "P-Qty LY",
         $(dyncode9) as "P-O-Qty LY" from $(qvdFile) (qvd);


   else

        /* create temp store key1 & key2 are manually handled synthetic keys */
        /* Dummy field is to prevent autoconcatenation problems.             */
       temptable:
       noconcatenate Load 

         "GP",
         "O-GP",
         "Litres" ,
         "Litres LY",
         "GP LY",
         "O-GP LY",
         $(dyncode2) as "P-Value",
         $(dyncode3) as "O-P-Value",
         $(dyncode4) as "P-Value LY",
         $(dyncode5) as "O-P-Value LY",
         $(dyncode6) as "P-Qty",
         $(dyncode7) as "P-O-Qty",
         $(dyncode8) as "P-Qty LY",
         $(dyncode9) as "P-O-Qty LY",

         autonumber(1) as dummy1  
       FROM $(File) (ansi, txt, delimiter is ',', embedded labels); 

        /* create qvd file from temp table */
        if (ScriptErrorCount = 0) then
          Store temptable into $(qvdFile);
      endif

        sales:
        concatenate("sales") load

         "Litres",
         "Litres LY",
         "GP LY",
         "O-GP LY"  
         "P-Value",
         "O-P-Value",
         "P-Value LY",
         "O-P-Value LY",
         "P-Qty",
         "P-O-Qty",
         "P-Qty LY",
         "P-O-Qty LY" 
         resident temptable;

        /* drop temp table */

          DROP TABLE temptable;

   endif

next File  

提前致谢!

您可以使用FieldNumber函数来确定某个字段是否存在于表中。 例如FieldNumber('MyField', 'MyTable')返回MyFieldMyTable的位置。 如果MyFieldMyTable中不存在,则函数返回零。

您可以通过将 QVD 中的所有字段加载到临时表中,然后检查该表是否包含该字段来适应您的优势。 如果是,您可以继续加载。 如果没有,您可以简单地将该字段设置为零。

我已经修改了您的脚本并为此插入了一个 IF:

/* get all sales csvs */
sales:
load 2014 as Year 
AutoGenerate 0;

set FilePath = ..\..\SourceData\qv-sales*.csv;

for each File in filelist('$(FilePath)')

    /* load qvd file if it is newer than csv file */   
    temptable1:
    first 1 LOAD           
        *
    FROM $(File)
    (txt, codepage is 1252, embedded labels, delimiter is ',', msq);

    IF FieldNumber('Litres' , 'temptable1') <> null then
        SET  "Litres";
        SET  "Litres LY" ;
        SET dyncode2 = P-Value;
        SET dyncode3 = O-P-Value;
        SET dyncode4 = P-Value LY;
        SET dyncode5 = O-P-Value LY;
        SET dyncode6 = P-Qty;
        SET dyncode7 = P-O-Qty;
        SET dyncode8 = P-Qty LY;
        SET dyncode9 = P-O-Qty LY;
    ENDIF

DROP TABLE temptable1; 

let qvdFile = replace('$(File)','csv','qvd');

if (QvdCreateTime('$(qvdFile)') >= FileTime('$(File)')) then

    /* load qvd file if it is newer than csv file */
    fieldcheck:
    FIRST 1
    NOCONCATENATE
    LOAD
        *
    FROM $(qvdFile) (qvd);

    if FieldNumber('Litres','fieldcheck') = 0 then

        drop table fieldcheck;

        sales:
        Concatenate (sales) load
        "GP",
        "O-GP",
        0 as "Litres",
        0 as "Litres LY",
        "GP LY",
        "O-GP LY",
        $(dyncode2) as "P-Value",
        $(dyncode3) as "O-P-Value",
        $(dyncode4) as "P-Value LY",
        $(dyncode5) as "O-P-Value LY",
        $(dyncode6) as "P-Qty",
        $(dyncode7) as "P-O-Qty",
        $(dyncode8) as "P-Qty LY",
        $(dyncode9) as "P-O-Qty LY" from $(qvdFile) (qvd);

    else

        drop table fieldcheck;

        sales:
        Concatenate (sales) load
        "GP",
        "O-GP",
        "Litres",
        "Litres LY",
        "GP LY",
        "O-GP LY",
        $(dyncode2) as "P-Value",
        $(dyncode3) as "O-P-Value",
        $(dyncode4) as "P-Value LY",
        $(dyncode5) as "O-P-Value LY",
        $(dyncode6) as "P-Qty",
        $(dyncode7) as "P-O-Qty",
        $(dyncode8) as "P-Qty LY",
        $(dyncode9) as "P-O-Qty LY" from $(qvdFile) (qvd);

    endif

else
        /* create temp store key1 & key2 are manually handled synthetic keys */
        /* Dummy field is to prevent autoconcatenation problems.             */
       temptable:
       noconcatenate Load 

         "GP",
         "O-GP",
         "Litres" ,
         "Litres LY",
         "GP LY",
         "O-GP LY",
         $(dyncode2) as "P-Value",
         $(dyncode3) as "O-P-Value",
         $(dyncode4) as "P-Value LY",
         $(dyncode5) as "O-P-Value LY",
         $(dyncode6) as "P-Qty",
         $(dyncode7) as "P-O-Qty",
         $(dyncode8) as "P-Qty LY",
         $(dyncode9) as "P-O-Qty LY",

         autonumber(1) as dummy1  
       FROM $(File) (ansi, txt, delimiter is ',', embedded labels); 

        /* create qvd file from temp table */
        if (ScriptErrorCount = 0) then
          Store temptable into $(qvdFile);
      endif

        sales:
        concatenate("sales") load

         "Litres",
         "Litres LY",
         "GP LY",
         "O-GP LY"  
         "P-Value",
         "O-P-Value",
         "P-Value LY",
         "O-P-Value LY",
         "P-Qty",
         "P-O-Qty",
         "P-Qty LY",
         "P-O-Qty LY" 
         resident temptable;

        /* drop temp table */

          DROP TABLE temptable;

   endif

next File  

如果我的理解是正确的,您需要重新生成 QVD,因为您添加了一个在以前的字段中不存在的新字段,因此您从源 (txt) 重新创建它们并存储它们。 实现这一点的一种更简单的方法是利用这样一个事实,即当您对表进行强制连接时,缺失的字段将生成为空值,我们可以使用函数alt将空值转换为 0。例子:

/* get all sales csvs */
sales:
load 2014 as Year 
AutoGenerate 0;

set FilePath = ..\..\SourceData\qv-sales*.csv;

for each File in filelist('$(FilePath)')
   let qvdFile = replace('$(File)','csv','qvd');

   //this generate the field Litres, exists or not
   tmp: noconcatenate load null() as Litres autogenerate(0);    

    if (QvdCreateTime('$(qvdFile)') >= FileTime('$(File)')) then    
        /* load qvd file if it is newer than csv file */
       concatenate(tmp) LOAD * FROM $(qvdFile) (qvd);
    else
       concatenate(tmp) LOAD * FROM $(File) 
       (txt, codepage is 1252, embedded labels, delimiter is ',', msq);
    endif;

    tmp_sales:
    noconcatenate
    load
        alt(Litres,0) as Litres,
        "Litres LY",
        "GP LY",
        "O-GP LY"  
        "P-Value",
        "O-P-Value",
        "P-Value LY",
        "O-P-Value LY",
        "P-Qty",
        "P-O-Qty",
        "P-Qty LY",
        "P-O-Qty LY" 
     resident tmp;
     drop table tmp;
    
     //if it was newer that the csv we store it
     if (QvdCreateTime('$(qvdFile)') >= FileTime('$(File)')) then 
         Store tmp_sales into $(qvdFile);
     endif

     concatenate(sales) load * resident tmp_sales;
     drop table tmp_sales;

next File

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM