zoukankan      html  css  js  c++  java
  • CREATE_RECORD或者NEXT_RECORD导致 FRM-40102 错误:记录必须首先被输入或者删除

    在做Form开发中,经常会遇到需要在一个块中创建一条或者是多条数据。首先,一般我们会先定位到最后一条记录(有时候会先执行查询:app_find.find('BLOCK_NAME ');查询出需要的数据然后做最后一条记录的定位)。移动当前记录到最后一条记录可以使用下面的语法:

    GO_BLOCK('BLOCK_NAME');    
    FIRST_RECORD;    
    LOOP    
      EXIT WHEN :SYSTEM.LAST_RECORD = 'TRUE';    
          
      NEXT_RECORD;  --do_key(‘NEXT_RECORD’);    
    END LOOP;  
    或者是使用:

    [html]
    view plaincopyprint?
    WHILE TRUE LOOP    
      IF :SYSTEM.LAST_RECORD <> 'TRUE' THEN    
        NEXT_RECORD;    
      ELSE    
        EXIT;    
      END IF;    
    END LOOP;  
    在记录指向了块中的最后一条记录后,一般使用循环开始创建新记录:

    [html]
    view plaincopyprint?
    FOR kpi_rec IN kpi_cur LOOP     
      CREATE_RECORD;    
      --对块中的项进行赋值    
    END LOOP;   
    注:也可以使用 NEXT_RECORD 代替 CREATE_RECORD。CREATE_RECORD是在当前记录的下方创建一条新记录,然后定位到这条新纪录上,而 NEXT_RECORD 如果是最后一条记录的话,则会自动创建一条新纪录。

    用这样的方法创建一条新纪录是没问题的,但是如果连续创建两条新纪录,则Form会报出:FRM-40102:记录必须首先被输入或者删除。也就是上一条记录的状态是有问题的,可是问题在哪呢?

    经过多次的测试,不难发现:如果块中已经存在记录,那么使用上面的代码是不会报出错误的,但是如果块中本来是空的,是一个新块,那么使用上面的代码来处理的话,在创建第二条记录的时候将会报出错误。

    那么只要处理好第一条记录,就能解决这个问题。采用的方法是在循环中增加一个判断,如果是新记录,这直接进行赋值,而不执行 CREATE_RECORD 语句(虽然执行看上去也不会出错)。

    下面给出例子:

    [html]
    view plaincopyprint?
    IF :EVALUATION_LINE.kpi_code IS NULL AND –判断记录是否为空    
      :EVALUATION_LINE.meaning IS NULL THEN     
      :EVALUATION_LINE.kpi_code := kpi_rec.lookup_code;--执行赋值    
      :EVALUATION_LINE.meaning := kpi_rec.meaning;    
    ELSE    
      CREATE_RECORD; --否者创建新纪录,赋值    
      :EVALUATION_LINE.kpi_code := kpi_rec.lookup_code;    
      :EVALUATION_LINE.meaning := kpi_rec.meaning;    
    END IF;   

  • 相关阅读:
    Visual C#常用函数和方法集汇总
    基于窗体的/Cookie 身份验证示例
    ASP.NET状态存储管理九大兵器之六(缓存)
    ASP.NET中TreeView控件使用
    用.net操作word
    Array排序函数
    用C#制作PDF文件全攻略
    TreeView IE Web 控件的使用(很直观)
    windows共享与权限问题(总结)
    RndNum 生成随机字符串,包含数字和小写字母
  • 原文地址:https://www.cnblogs.com/gary-bao/p/5012356.html
Copyright © 2011-2022 走看看