if sqlca.sqlcode <> 0 then 
 
        messagebox("提示信息","获得销售单明细编号失败!") 
 
        return 
 
        end if 
 
        //得到最大销售单明细编号 
 
        select max(convert(decimal(8,0),编号)) into :ll_xhbh from 销售单明细; 
 
        if sqlca.sqlcode <> 0 then 
 
        messagebox("提示信息","获得销售单明细编号失败!") 
 
        return 
 
        end if 
 
        //得到最大销售明细编号 
 
        if ll_lsbh > ll_xhbh or isnull(ll_xhbh) then 
 
           ll_xhbh = ll_lsbh 
 
        end if 
 
        //循环赋值最大销售单编号 
 
        for i =1 to dw_1.rowcount() 
 
            ls_lsbh =dw_1.getitemstring(i,"编号") 
 
        //销售编号 +1 
 
        if isnull(ls_lsbh) or ls_lsbh =" " then 
 
           ls_xhbh +=1 
 
           if ls_xhbh = 0 or isnull(ll_xhbh) then 
 
              ls_xhbh ="1" 
 
           else 
 
              ls_xhbh =string(ll_xhbh) 
 
           end if 
 
           dw_1.setitem(i,"编号",ls_xhbh) 
 
        end if 
 
        dw_1.setitem(i,"销售单号",ls_bh) 
 
        ld_she =dw_1.getitemdecimal(i,"税额") 
 
        ld_sjhj =dw_1.getitemdecimal(i,"税价合计") 
 
        ld_bhsj =dw_1.getitemdecimal(i,"不含税价") 
 
        next 
 
         dw_bt.setitem(1,"税额",dw_1.getitemdecimal(1,"she")) 
 
         dw_bt.setitem(1,"税价合计",dw_1.getitemdecimal(1,"sjhj")) 
 
         dw_bt.setitem(1,"不含税价",dw_1.getitemdecimal(1,"bhsj")) 
 
       //更新 
 
        if dw_bt.update() =1 and dw_1.update() =1 then 
 
           commit ;  //提交数据                                    
 
           messagebox("提示信息","销售单保存成功!") 
 
        else 
 
           rollback;  //回滚 
 
           messagebox("提示信息","销售单保存失败,请重试!") 
 
           return 
 
        end if 
 

       (20)在数据窗cb_confirm的CLICKED事件加入如下代码,并调用存储过程. 
 
        //调用存储过程 
 
        declare sp_helptext procedure for sf_销售单; 
 
        //执行存储过程 
 
        execute sp_helptext; 
 
        close(parent) 
 
        因为改变了库存和应付款以后,不允许对销售单进行进一步的编辑,所以关闭窗口 
 

       (21)在数据窗cb_exit的CLICKED事件加入如下代码 

 

          integer msg 
 
        msg=messagebox("提示信息","你确定现在要退出吗?",question!,yesno!,2) 
 
        if msg =2 then return 
 
        close(this) 
 

       (22)在数据窗cb_print的CLICKED事件加入如下代码,调用打印窗口打印销售单,并询问用户是否确认销售单 

 

           string ls_dwfullstate,ls_bh 
 
         
 
         if dw_1.rowcount() < 1 then 
 
            msg=messagebox("提示信息","没有可以打印的销售单数据!") 
 
            return 
 
         end if 
 
         //得到销售单号 
 
         ls_bh =dw_1.getitemstring(1,"销售单号") 
 
         //检索数据 
 
         dw_print.retrieve(ls_bh) 
 
         dw_print.getfullstate(ls_dwfullstate) 
 
         //打开打印窗口 
 
         openwithparm(w_print,ls_dwfullstate) 
 
         if messagebox("提示信息","是否记账确认进货单!",question!,yesno!,1) =1 then 
 
            cb_confirm.triggerevent(clicked!) 
 
         end if 
 
    
 
    (23)创建一个数据窗对象"d_xsd_print",其风格为free form,data source为sql select 选择"销售单明细"的所有字段 
 
        和销售单的“编号”,客户编号和销售日期字段“商品清单”的品名,单位字段和“客户清单”的名称字段。 
 
    
 
//----------------------------------------------------------------------------------------------------------------------------------------    
 
   2.1.6.3 创建打印窗口 
 

     窗口各个控件的属性如下表 

 

     控件类型                    对象名称             属性                    取值 
 
   window                      w_print              window type             response! 
 
   datawindow                  dw_1                
 
   statictext                  st_1                 text                    缩放比例 
 
   statictext                  st_2                 text                    打印份数             
 
   singlelineedit              sle_1                text 
 
   editmask                em_zoom              text                    100 
 
   vscrollbar                vsb_zoom                 
 
   editmask                                                             1 
 
   vscrollbar                vsb_pages                 
 
   checkbox                    cbx_preview          text                    打印预览 
 
   commandbutton               cb_2                 test                    设置 
 
   commandbutton               cb_1                 test                    打印 
 
   commandbutton               cb_close             test                    关闭 
 

     注意:打印主要用到函数"setfullstate","getfullstate" 

 

          (1)在窗口w_print的open事件中加入如下代码 

 

             string ls_dwfullstate 
 
           ls_dwfullstate =message.stringparm 
 
           dw_1.setfullstate(ls_dwfullstate) 
 

  //----------------------------------------------------------------------------------------------------------------------------------------    

 

     2.1.7 库存查询 

 

      (1)创建一个窗口,保存名称为"w_kccx" 
 
    (2)设置窗口的属性为main! 
 
    (3)窗口各个控件的属性如下表 
 
   
 
   窗口各个控件的属性如下表 
 

     控件类型                    对象名称             属性                    取值 
 
   window                      w_kccx               window type             main! 
 
   datawindow                  dw_1                 dataobject              d_kzcx 
 
   datawindow                  dw_2                 dataobject              d_ck 
 
   statictext                  st_hh                text                    货号 
 
   statictext                  st_pym               text                    拼音编码 
 
   statictext                  st_ck                text                    仓库            
 
   singlelineedit              sle_hh               
 
   singlelineedit              sle_pym                
 
   commandbutton               cb_1                 test                    查询 
 
   
 
    (4)创建一个数据窗对象"d_kccx",其风格为free form,data source为sql select 选择"库存库"的所有字段 
 
       “商品清单”的品名,拼音码,单位字段 
 
    (5)在数据窗cb_1的CLICKED事件加入如下代码 
 
        
 
       string ls_hh,ls_pym,ls_ck 
 
       string ls_select 
 
       //得到输入的值 
 
       ls_hh=trim(sle_hh.text) 
 
       ls_pym=trim(sle_pym.text) 
 
       ls_ck=is_ck 
 
       //货号 
 
       if isnull(ls_hh) then 
 
          ls_hh ="%" 
 
       end if 
 
       //拼音码 
 
       if isnull(ls_pym) then 
 
          ls_pym="%" 
 
       end if   
 
       //仓库    
 
       if ls_ck =" " or isnull(ls_ck) then 
 
          ls_ck ="%" 
 
       end if 
 
       ls_hh ="%" +ls_hh+ "%" 
 
       ls_pym ="%" +ls_pym+ "%" 
 
       ls_ck ="%" +ls_ck+ "%" 
 
       //生成SQL语句 
 
       ls_select =" and 库存库.货号 LIKE '"+ ls_hh + "'" 
 
       ls_select =ls_select + " and 商品清单.拼音编码 LIKE '"+ ls_pym + "'" 
 
       ls_select =ls_select + " and 库存库.仓库 LIKE '"+ ls_ck + "'" 
 
       //生成数据窗SQL语句 
 
       ls_select =is_sql +ls_select 
 
       //赋值SQL语句 
 
       dw_1.setsqlselect(ls_select) 
 
       dw_1.retrieve() 
 

      (6)窗口各个控件的属性如下表 

 

  //----------------------------------------------------------------------------------------------------------------------------------------    

 

       2.1.8 权限管理 

 

     窗口各个控件的属性如下表 

 

     控件类型                    对象名称             属性                    取值 
 
   window                      w_qx_gl              window type             main! 
 
   datawindow                  dw_1                 dataobject              d_qx_user 
 
   datawindow                  dw_2                 dataobject              d_qx_qx 
 
   datawindow                  dw_2                 visible                 false 
 
   treeview                    tv_1                 checkboxes              true 
 
   注意:1> 在窗口打开的时候,数据窗dw_1检索出使用该系统的所有用户,数据窗dw_2即权限数据窗检索出该系统所拥有的所有权限, 
 
            并将权限都添加到树上,由于所有的权限以树的形式显示出来,所以将数据窗dw_2的visible属性设置为false 
 
         2> 然后建立一个数据存储"ids_qxyh",该数据存储保存的现有的各个用户所拥有的权限。,当在数据窗dw_1选择一个用户的时候 
 
            系统就根据选中的用户从过滤数据存储“ids_qxyh”中选中用户的权限,并且将树上给用户所拥有的权限的"checkbox"属性设置为true 
 
         3> 当对用户的权限进行增加和删除时,直接用SQL语句对数据进行修改,并实时的检索"ids_qxyh",这样当下次单击改变了权限的用户时 
 
            数据为最新修改的数据。 
 
      
 
       在窗OPEN事件代码如下(并建立数据存储"ids_qxyh"): 
 
          
 
         treeviewitem ltvi_item 
 
         long ll_tv,i,ll_rowcount 
 
         string ls_privilege 
 
         //连接数据库 
 
         dw_1.settranobject(sqlca) 
 
         dw_2.settranobject(sqlca) 
 
         //检索数据 
 
         dw_1.retrieve() 
 
         dw_2.retrieve()       
 
         //建立数据存储,并检索数据 
 
         ids_qxyh=create datastore 
 
         ids_qxyh.dataobject ="d_qx_yh" 
 
         ids_qxyh.settranobject(sqlca) 
 
         ids_qxyh.retrieve() 
 
         //生成菜单变量 
 
         im_privilege = create m_main 
 
         //赋值权限树根 
 
         ltvi_item.label = "所有权限" 
 
         ltvi_item.data = "all" 
 
         ltvi_item.pictureindex = 1 
 
         ltvi_item.selectedpictureindex = 1 
 
         ll_tv = tv_1.insertitemlast(0,ltvi_item) 
 
         ll_rowcount=dw_2.rowcount() 
 
         if ll_rowcount < 1 then return 
 
         /循环,给树赋值所有的权限名称 
 
         for i =1 to ll_rowcount 
 
             ls_privilege = dw_2.getitemstring(i,"权限名称") 
 
             ltvi_item.label = ls_privilege 
 
             ltvi_item.data = ls_privilege 
 
             ltvi_item.pictureindex = 2 
 
             ltvi_item.selectedpictureindex = 2 
 
             tv_1.insertitemlast(ll_tv,ltvi_item) 
 
         next 
 
         //tv_1.expanditem(2) 
 
         tv_1.expandall(1) 
 
         
 
      建立窗口函数“wf_setcheck”,返回值为integer,参数"al_handle"为树的句柄,"as_user"为选中的用户, 
 
      代码如下: 
 

            long li_handle,ll_row_found 
 
          treeviewitem ltvi_item 
 
          string ls_menu,ls_user 
 
          
 
          ls_user = as_user 
 
          li_handle=al_handle 
 
          //得到参数 
 
          if li_handle = 1 then 
 
             //得到子项目 
 
             li_handle = tv_1.finditem(childtreeitem!,1) 
 
          else 
 
             //否则,得到同级的下一个项目 
 
             li_handle = tv_1.finditem(nexttreeitem!,li_handle) 
 
          end if 
 
          do while li_handle <> -1 
 
             tv_1.getitem(li_handle,ltvi_item) 
 
             //得到菜单项 
 
          ls_menu=ltvi_item.data 
 
          ll_row_found =ids_qxyh.find("权限名称 ='" +ls_menu +"' and 用户编号='" +ls_user +"'",1,ids_qxyh.rowcount()) 
 
          if ll_row_found>0 then 
 
             ltvi_item.statepictureindex = 2 
 
          else 
 
             ltvi_item.statepictureindex = 1 
 
          tv_1.setitem(li_handle ,ltvi_item) 
 
             //递规调用 
 
             wf_setcheck(li_handle,ls_user) 
 
             //find next at this level 
 
             li_handle = tv_1.finditem(nexttreeitem!,li_handle) 
 
          loop 
 
          retrun 1 
 

         在数据窗dw_1 的clicked事件中加入以下代码,选中的用户调用窗口函数“wf_setcheck”来设置树的checkbox属性为true or false 
 
    
 
          treeviewitem ltvi_item 
 
          long li_handle,ll_row_found 
 
          string ls_user,ls_menu,ls_bm 
 
   
 
          if row < 1 then return 
 
          //选择单击的行 
 
          this.selectrow(0,false) 
 
          this.selectrow(row,true) 
 
          //得到用户编号和部门 
 
          ls_user=this.getitemstring(row,"用户编号") 
 
          ls_bm=this.getitemstring(row,"部门") 
 
          is_user= ls_user 
 
          is_bm = ls_bm 
 
          //调用函数显示权限 
 
          wf_setcheck(1,ls_user) 
 
          ltvi_item.statepictureindex = 2 
 
         
 
        在树tv_1的CLICKED事件中加入以下代码: 
 
           treeviewitem ltvi_item 
 
           string ls_data 
 
  
 
           //得到数据 
 
           this.getitem(handle,ltvi_item) 
 
           ls_data = ltvi_item.data 
 
           if handle > 1 then 
 
           if ltvi_item.statepictureindex = 1 then 
 
              //插入权限表 
 
              insert into 权限清单 
 
                          (用户编号, 
 
                           部门, 
 
                           权限名称 ) 
 
              values (:is_user, 
 
                      :is_bm, 
 
                      :ls_data); 
 
              if sqlca.sqlcode <> 0 then 
 
                 messagebox("提示信息","增加权限失败!") 
 
                 return 
 
              else 
 
                 commit; 
 
                 ids_qxyh.retrieve() 
 
              end if 
 
              else 
 
              //删除权限 
 
              delete from 权限清单 
 
                   where 用户编号 =:is_user and 部门 =:is_bm and 权限名称=:ls_data; 
 
              if sqlca.sqlcode <> 0 then 
 
                 messagebox("提示信息","删除权限失败!") 
 
                 rollback;//回滚数据; 
 
                 return 
 
              else 
 
                 commit; //提交数据 
 
                 ids_qxyh.retrieve() 
 
              end if 
 
             end if 
 
            end if 
 

  //----------------------------------------------------------------------------------------------------------------------------------------    
 
      2.1.8 系统编译并发布