zoukankan      html  css  js  c++  java
  • 时空KSOA之CS表单工具说明

    CS表单工具说明 
    1、调用: 
    1.1、单据事件调用 
    runbill_表单sn 调用无窗口表单 
    loadbill_表单sn 调用窗口表单 
    1.2、功能调用 
    功能号:LOADCSBILL 参数表单名称 
    1.3、表单中调用表单 
    OPENBILL_表单sn 

    2、对象 
    2.1、DJForm: // 特指单据调用表单,此为单据窗体对象 
    如果以单据为基础调用表单,则表单中全局对象DJForm <> nil; 
    DJForm即为当前单据对象,可以通过此对象与单据进行交互, 

    2.2、ParentForm: // 上一层调用表单窗体对象 
    2.3、SKPrint: 
    SKPrint.ShowBillReport; // 打印预览 
    SKPrint.PrintBillReport; // 打印 
    SKPrint.DesignBillReport; // 打印设计
    2.4、PrnValList: // 打印变量列表 

    3、全局变量 
    __dbname 用DatabaseName 
    单据变量: 
    MX_字段名 
    HZ_字段名 

    4、函数 
    4.1、直接使用 
    4.1.1、万能打印 
    ShowReport // 打印预览 
    PrintReport // 打印 
    DesignReport // 打印设计 
    RUNCALC // 计算器 
    SelectDate // 日期选择 
    ZL_SELECT_方案号 // 资料选择方案 
    Close // 关闭窗口 

    4.2、在代码中使用 
    procedure SetFldDisplay(DataSet: TDataSet); // 翻译中文字段 
    procedure OpenBill(Self, 表单SN); // 打开新表单 
    procedure Close; // 关闭窗体 
    function GetMaxBh(const biaoshi: string; const IsNew: Boolean = True): string; // 得到最大编号,不含分店标识 
    procedure SelectDate(Sender: TWinControl; DateStr: string); // 选择日期 
    procedure GetTickCount; // 用于计算自windows启动后到现在的毫秒数 



    如: 
    DjForm.djfmxtable.locate('fieldname','gzid',1); 
    0: [] 
    1: [loCaseInsensitive] 
    2: [loPartialKey] 
    3: [loCaseInsensitive, loPartialKey] 

    ---------------------------------------------------------------------------------------------------------- 
    资料检索方案调用:ZL_SELECT_方案号 

    代码中调用资料检索方案:zl_select(DsMain, 'pos_pdb', 'amxl'); 
    //数据集,方案号,所要传递的参数。 
    比如: 
    zl_select(DsMain, 'qy', DsMain.FieldByName('hzflbh').AsString); 
    这是'qy'的检索方案,其中:v_zjm 可以看成 ‘%所传参数%’ 

    select qyid,qybh,qymch,zjm,qyms from hzfa a(nolock) 
    join hzfamx b(nolock) on a.hzcode=b.hzcode 
    join spxxqyzl c(nolock) on b.hzflbh=LEFT(c.qybh,LEFT(a.fjrule,1)) 
    where a.hzcode='qy_init' and c.beactive='是' 
    and LEFT(c.qybh,LEFT(a.fjrule,1)) like :v_zjm 

    ---------------------------------------------------------------------------------------------------------- 
    为事件指定方法:SetEvent(Self, SKBILLgrid1, 'OnColEnter', 'Edit2Change', False); 
    参数:表单,数据集,自己找delphi事件,自定义事件,不知道 
    procedure Edit2Change(Sender: TObject); 
    begin 
    ShowMessage('a'); 
    end; 
    -------------------------------------------------------------------------------- 
    将当前表单的数据集取出来赋值到另一个数据集里。 

    单据提取方案 
    function DJ_Select(Self: TForm; FAID: string; MainDataSet, SubDataSet: TDataSet): Boolean; 
    begin 
    Self.ObjList.Clear; 
    Self.ObjList.AddObject('HZDataSet', MainDataSet); 
    Self.ObjList.AddObject('MXDataSet', SubDataSet); 
    Self.ObjList.Add('FAID=' + FAID); 
    OpenBill(Self, 'hr_fhl_test1'); 
    end; 

    赋值 
    ---------------------- 
    ParentForm.ObjList.Add('djbh='+dssub1.FieldByName('djbh').AsString); 
    self.close; 
    --------------------- 
    取值 
    if self.ObjList.Values['djbh'] = '' then exit; 


    DJForm.SetDJValue('dwbh',''); 
    ---------------------------------------------------------------------------------------------------------- 
    初始化的时候,需要对主数据集DsMain的值初始化。否则无法操作 
    //with DsMain do 
    //if Active then Close; 
    with DsMain do 
    begin 
    if Active then Close; 
    SQL.Text:='select space(20) as spid,space(20) as spbh,space(20) as spmch,space(20) as dw,space(20) as shpchd,' 
    + 'space(20) as shpgg'; 
    Open; 
    ---------------------------------------------------------------------------------------------------------- 
    SKDBTreeView 树控件 
    能支持,关键字段code,name,id,sqls,active 
    用法: 
    SKDBTreeView1.codemode :='2,2,3';显示格式 
    tmp :=' select hzflbh as code,rtrim(hzflbh)+'':''+hzflchina as name,hzflbh as id' 
    +' from hzfamx where hzcode = ''qy_init''' 
    +' order by hzflbh'; 
    SKDBTreeView1.SQLS:=tmp; 
    SKDBTreeView1.Active := true; 
    --------------------------------------------------------------------------------------------------------- 

    要有写注释的习惯。 

    注释用 (**)也可用{}以及// 

    //回写的时候是对编辑的数据写回数据集中,提交是一行写入数据集的时候,但是直接赋值的话不会触发回写, 
    ------------------------------------------------------------------------------------------- 
    异常的使用: 自我感觉是没用,因为是二次开发嘛,错误还是报,最后还是的关了单子,从新打开。 
    try //try 保护代码块 
    被保护语句
    except //异常处理块 
    on <异常对象类型 1> do <语句 1> //捕获指定类型的异常对象,进行处理 
    on <异常对象类型 n> do <语句 n> //捕获指定类型的异常对象,进行处理 
    else
    <语句 n+1> //默认的异常处理代码 
    end; 
    注意:运行时必须先编译生成 exe 文件,然后在 Windows 中运行,否则在发生异常时仍将 出现系统的错误信息。 


    try....finally...end; 
    ------------------------------------------------------------------------------------------- 
    for i :=LenBH downto 1 do 
    嵌套循环的用法,以及数据集取值和赋值的用法。 有时用上dssub1.MoveBy()一起用的话 两个for也能用吧。 
    dssub1.First; 
    while not dssub1.Eof do 
    begin 
    for i := 0 to dssub1.FieldCount do 
    begin 
    dssub1.Fields[i].FieldName; 
    dssub1.Field('beactive').Value := '否'; 
    end; 
    dssub1.Next; 
    end; 
    因为语法是强数据类型,所以最好知道所取和所设值的类型,以下为string型。 
    dssub1.FieldByName('qybh').AsString; 
    ----------------------------------------------------------------------------------------------- 
    列选择和数据集与数据的脱钩与挂钩 书签等。 
    --鼠标选择 
    SKBILLgrid1.selectedfield.value 此为选中的当前值 
    SKBILLgrid1.selectedfield.FieldName 此为选中的当前列 
    --指针******自己查找关于Delphi的指针@和Pointer函数等知识 
    var p : pointer; 

    if SKBILLgrid1.selectedfield.FieldName = '类别/区域' then 
    begin 
    alert('请选择需要选中的列!'); 
    exit; 
    end; 
    try 
    p := dssub1.GetBookmark;//取得当前指针 
    dssub1.DisableControls;//使当前数据集与数据源切断 
    dssub1.First; 
    while not dssub1.Eof do 
    begin 
    dssub1.Edit; 
    SKBILLgrid1.selectedfield.value := 'Y'; 
    dssub1.Next; 
    end; 
    finally 
    dssub1.GotoBookmark(p);//跳到指针处 
    dssub1.EnableControls;//恢复与数据源的联系 
    dssub1.FreeBookmark(p);//释放内存 
    end; 
    程序修改或后台有刷新记录的时候切断数据组件,如果没有切断,数据源中只要一有数据的改动,尤其是批量改动的话,每一笔的改动都会更新窗口中数据浏览组件的显示,这样会急剧减慢处理过程而且浪费时间, 这两个函数主要阻止组件感应显示,以加快语句执行速度。 比如,用大量的循环的时候,最好用他们。 
    -------------------------------------------------------------------------------------- 
    运算符的优先级 

    级 别 运 算 符 
    第一级 (最高级) .^ 
    第二级 @ not 
    第三级 * / div mod and as shl shr 
    第四级 + - or xor 
    第五级(最低级) = <> < > <= >= in is 

    需要注意的是,在 Object Pascal 中,“and”和“or”运算符的优先级比关系运算符高, 
    因此,对于表达式“a<b and c<d”,编译器会首先编译“and”运算符,由此导致编译错误。 
    因此,应该把该表达式用小括号括起来,即:(a<b)and(c<d)。 
    ----------------------------------------------------------------------------------------------------- 
    一些经常碰到的函数 
    select convert(char(10),getdate(),20) 日期 
    inc 应该是自增 
    IsSpace(); 
    length('abc'); 
    strtoint(); 
    inttostr(); 
    ansilowercase 函数 将字符转换为小写 
    ansiuppercase 函数 将字符转换为大写 
    SKDBedit5.Text := FormatDateTime('YYYY-MM-DD', Now - 60); 
    SKDBedit6.Text := FormatDateTime('YYYY-MM-DD', StrToDate(SKDBedit5.Text) - 60); 

    copy(a,b,c)字符串处理函数。--->substr 
    参数: a 字符串 
    b 从第几个字符(从0和1开始算都一样) 
    c 取多长字符 (length) 

    Copy(s + inttostr(Fields[0].AsInteger + 1), length(inttostr(Fields[0].AsInteger + 1))+1, length(s) ) 
    ---------------------------------------------------------------------------------------------------------- 
    临时的查询 
    var tmp_qry:TQuery; 声明----?????? 

    tmp_qry := TQuery.Create(nil); 
    with tmp_qry do 
    try 
    DatabaseName := __dbname;//上行 和 这行 的顺序不能颠倒 
    SQL.Text := 'if exists(select top 1 1 from spxxqyzl where qybh like :fangabh)' 
    + ' select substring(max(qybh),'+inttostr(length(fangabh)+1)+',100) as qybh from spxxqyzl c(nolock)' 
    + ' where c.qybh like :fangabh' 
    + ' else ' 
    + ' select qybh from spxxqyzl where 1=2'; 
    ParamByName('fangabh').AsString := fangabh+'%'; 
    Open; 
    finally 
    free; 
    end; 
    返回的是单个值就用Fields[0].AsInteger或Fields[0].AsString 
    ------------------------------------------------------- 
    关于数据集dssub或SK 
    -----判断数据集是否为空 
    if (dssub1.FieldByName('dj_sn').AsString = '') and (dssub1.RecordCount = 0) 
    if dssub1.IsEmpty then 

    if messagebox('确定删除该记录吗?','系统提示',36) <> 6 then 
    begin 
    exit; 
    end; 
    -----清空数据集 
    dssub1.close; 
    dssub1.open; 
    ----指针 
    dssub1.MoveBy(2); 
    dssub1.firset; 
    dssub1.last; 
    dssub1.next; 
    dssub1.eof 
    dssub1.bof 
    dssub1.append(); 
    alert(dssub1.FieldByName('qybh').Value);//返回的是append新增一行的数据,所以一直是空。

    ----数据集已经查出来,对其中的数据查询,及过滤 
    数据集过滤的用法,且K,D 是变量的时候,最后会将数据集过滤。 
    dssub2.Filtered:=false; 
    dssub2.Filter:='(KH='+ QuotedStr(k) +') and (DH='+QuotedStr(d) + ')';//QUotedStr是单引号的意思,没用过。 
    dssub2.Filtered:=true; 
    findRowNumR := dssub2.RecordCount; 
    返回的是当前过滤完的数据集个数 

    ----数据集返回值 
    if dssub2.Active then dssub2.Close; 有时呢如果不关闭数据集,结果程序为了显示结果,将不会退出继续执行。 
    dssub1.SQL.text := 'declare @col varchar(100), @sql varchar(8000)' 
    + ' select @col = '' '', @sql = '' ''' 
    + ' select @col = @col + '','''''' '''''' as ['' + dictlist + '']'' ' 
    + ' from (select dictlist from gldict where bianh = ''kehulb'') a' 
    + ' select @sql = @sql + ''select '''''''''' + qyid + '''''''''' as qyid,'''''''''' + qymch + '''''''''' as ''''''区域/类别'''''''''' + @col + '' union all ''' 
    + ' from (select c.qyid,c.qymch from hzfa a(nolock)join hzfamx b(nolock) on a.hzcode=b.hzcode ' 
    + ' join spxxqyzl c(nolock) on b.hzflbh=left(qybh,len(hzflbh)) ' 
    + ' where a.hzcode=''qy_init'' and c.beactive=''是'' and left(qybh,len(hzflbh))= :leib ) a ' 
    + ' set @sql = left(@sql,len(@sql)-10)' 
    + ' exec(@sql)'; 
    dssub1.ParamByName('leib').AsString := SKDBTreeView1.id; 
    dssub1.Open; 
    返回数据用open,不返回光执行用ExecSQL 

    ----数据集中的复选框 
    property UnCheckBoxValue: string read FUnCheckBoxValue write FUnCheckBoxValue; 
    property CheckBoxValue: string read FCheckBoxValue write FCheckBoxValue; 
    property CheckBoxFields: string read FCheckBoxFields write SetCheckBoxFields; 

    怎么把一个字段的值设置成“复选框” 

    给这个属性这么赋值就可以了,'spbh,spmch,shpgg' 

    复选框的用法: 
    SKBILLgrid1.UnCheckBoxValue := 'N'; 
    SKBILLgrid1.CheckBoxValue := 'Y'; 
    SKBILLgrid1.CheckBoxFields := dssub1.Fields[i].FieldName; 
    必须注意的是,上面三句不可颠倒。 
    类似地 
    (* 
    SKBILLgrid1.UnCheckBoxValue := '否'; 
    SKBILLgrid1.CheckBoxValue := '是'; 
    SKBILLgrid1.CheckBoxFields := 'beactive'; 
    *) 
    -----数据集选中变颜色 
    procedure uf_dclick; 
    begin 
    dssub1.Edit(); 
    if dssub1.FieldByName('is_selected').AsString = '是' then 
    begin 
    dssub1.FieldByName('is_selected').AsString := '否'; 
    end 
    else 
    begin 
    dssub1.FieldByName('is_selected').AsString := '是'; 
    end; 
    end; 

    procedure DrawDataCell; 
    begin 
    if dssub1.FieldByName('is_selected').AsString = '是' then 
    begin 
    SKBILLgrid1.Canvas.Brush.Color := $EFCBA5; 
    SKBILLgrid1.Canvas.Font.Color := $000000; 
    end; 
    end; 
    ----------------------------------------------------------------------------------------------- 
    字符串数组TStringList,该方法是用来分隔字符串的,默认的分隔符是‘,’更多方法看Delphi技巧。 
    其中:SKDBTreeView1.codemode=‘2,2,3’ 
    分割后在strings中 
    数据 序号 个数 
    2 0 1 
    2 1 2 
    3 2 3 
    function uf_add():Boolean; 
    var 
    strlst:TStringList; 
    i,l:integer; 
    tmp_qry :TQuery; 
    begin 
    l := 0; 
    strlst := TStringList.Create; 
    try 
    strlst.CommaText := SKDBTreeView1.codemode; 
    for i := 0 to strlst.Count - 2 do 
    l := l + strtoint(strlst.strings[i]); 
    finally 
    strlst.Free; 
    end; 
    ---------------------------------------------------------------------------------------------------- 
    存盘(&S) uf_save() /bill/userimage/D:/SpaceTime/KSOA_ufida90/wms图标/save.bmp 
    新增(&N) uf_add() /bill/userimage/D:/SpaceTime/KSOA_ufida90/wms图标/add.bmp 
    删除(&D) uf_del() /bill/userimage/D:/SpaceTime/KSOA_ufida90/wms图标/delete.bmp 
    ------------------------------------------------------------------------------------------ 
    当前登录的用户名与分店标识 
    username 
    myselfbdbs 
    ------------------------------------------------------ 
    取最大编号 
    SQL.Text := 'exec SOF_getmaxbh ''PLA'',1'; 
    Open; 
    ----------------------------------------------------- 
    //服务器日期 
    SQL.Text := 'select convert(char(10),getdate(),20) as kaiprq'; 
    Open; 
    //日期,时间 
    DsMain.FieldByName('rq').AsString := FormatDateTime('YYYY-MM-DD', Now); 
    DsMain.FieldByName('ontime').AsString := FormatDateTime('HH:NN:SS', Now); 
    ---------------------------------------------------- 
    下拉框 
    SKComboBox1.Style:=csOwnerDrawVariable; 
    SKComboBox4.Enabled := true; 
    SKComboBox5.ItemIndex := -1; 
    SKComboBox4.text := ''; 
    文本框内容 
    for i:=0 to SKComboBox4.items.count-1 do 
    begin 
    if SKComboBox4.items.Strings[i]=SKComboBox4.text then 
    begin 
    SKComboBox4.ItemIndex :=i; 
    right := true; 
    end; 
    end; 
    ------------------------------------------------------------- 
    事务 

    Session.FindDatabase(__dbname).StartTransaction; 
    try 
    tmp_qry := TQuery.Create(nil); 
    p := dssub1.GetBookmark;//取得当前指针 
    dssub1.DisableControls;//使当前数据集与数据源切断 
    with tmp_qry do 
    try 
    tmp_qry.DatabaseName := __dbname; 
    。。。。。。。。。。。。。。。。 
    finally 
    tmp_qry.free; 
    dssub1.GotoBookmark(p);//跳到指针处 
    dssub1.EnableControls;//恢复与数据源的联系 
    dssub1.FreeBookmark(p);//释放内存 
    end; 
    Session.FindDatabase(__dbname).Commit; 
    alert('保存成功!'); 
    uf_clear(); 
    except 
    Session.FindDatabase(__dbname).Rollback; 
    raise; 
    end; 








    --------- 
    字符串 

    for i := 0 to Fid_list.Count-1 do 
    begin 
    //alert(Fid_list[i]); 
    //alert(Fid_list.Values[i]); 
    //alert(Fid_list.Names[i]); 
    alert(Fid_list.Names[Fid_list.Values[i]]); 
    //alert(Fid_list.Values[Fid_list.Names[i]]); 
    end 

    ---------- 
    treeview 控件 
    //alert(TreeNode.level); 
    //alert(TreeNode.index); 
    //alert(TreeNode.AbsoluteIndex); 
    //alert(Fid_list.indexofobject(TreeNode)); 
    //alert(Fid_list.Names[Fid_list.indexofobject(TreeNode)]); 
    //alert(Fid_list[TreeNode.AbsoluteIndex]); 
    //alert(Fid_list.Names[TreeNode.AbsoluteIndex]); 

    var Fid_list:Tstrings; 
    //建树 
    procedure create_tree(Node: TTreeNode;level:integer); 
    var T_item: TTreeNode ; 
    i:integer; 
    begin 
    //检索level级子项 
    dssub2.Filtered:=false; 
    dssub2.Filter:='p_id='+inttostr(level); 
    dssub2.Filtered:=true; 
    //循环构建树结点 
    dssub2.First; 
    while not dssub2.eof do 
    begin 
    T_item:=SKDBTreeView1.Items.AddChild(Node,dssub2.Fields[1].AsString); 
    T_item.ImageIndex := 0; 
    T_item.SelectedIndex := 0; 
    Fid_list.AddObject(dssub2.Fields[0].AsString+'='+dssub2.Fields[2].AsString,T_item) ; 
    dssub2.next; 
    end; 
    //循环各自的子结点 
    for i := 0 to Node.Count-1 do 
    begin 
    T_item:=Node.Item[i]; 
    T_item.ImageIndex := 1; 
    T_item.SelectedIndex := 1; 
    create_tree(T_item,strtoint(Fid_list.Names[Fid_list.indexofobject(T_item)])); 
    end; 
    end; 
    //建索引 
    procedure create_index; 
    var T_root: TTreeNode ; 
    aBookmark:TBookmark; 
    begin 
    // query1.SQL.Strings[3]:='FROM '+ management_table ; 
    // query2.SQL.Strings[2]:='FROM '+ management_table ; 
    //构建树 
    Fid_list:=Tstringlist.Create; 
    if dssub2.active then dssub2.close; 
    dssub2.open; 
    if dssub2.RecordCount=0 then exit; 
    dssub2.First; 

    dssub2.Filtered:=false; 
    dssub2.Filter:='p_id=0'; 
    dssub2.Filtered:=true; 
    dssub2.first; 
    while not dssub2.eof do 
    begin 
    aBookmark:=dssub2.GetBookmark; 
    T_root:=SKDBTreeView1.Items.Add(nil,dssub2.Fields[1].AsString); 
    Fid_list.AddObject(dssub2.Fields[0].AsString+'='+dssub2.Fields[2].AsString,T_root) ; 
    create_tree(T_root,dssub2.Fields[0].AsInteger); 
    dssub2.Filtered:=false; 
    dssub2.Filter:='p_id=0'; 
    dssub2.Filtered:=true; 
    dssub2.GotoBookmark(aBookmark); 
    dssub2.next; 
    end; 
    dssub2.Filtered:=false; 
    dssub2.Close; 
    dssub2.Filter:=''; 
    end; 



    横向移动设置: 
    //添加事件 
    SetEvent(Self, SKBILLgrid1, 'OnColEnter', 'uf_huoShang', False); 



    if dssub1.RecordCount =0 then 
    begin 
    dssub1.Edit(); 
    dssub1.ClearFields(); 
    end; 






    tmp_qry := TQuery.Create(nil); 
    with tmp_qry do 
    try 
    tmp_qry.DatabaseName := __dbname; 
    // SQL.text := 'select top 3 * from spkfk '; 

    SQL.Text := 'select a.spid,spbh,b.spmch,a.dj,a.shl,b.shpgg,b.shpchd,b.dw,b.shlv,b.jlgg,b.zjm, ' 
    +' a.dj*(1+b.shlv/100) as hshjj,b.lshj, ' 
    +' b.zdshj,b.hshjj as zxdj,b.hshjj as htdj,b.shj*(1+b.shlv/100) as hshsj,b.shj*(1+b.shlv/100) as hshj, ' 
    +' b.shj,b.jj,b.hshjj,b.zgshj,b.leibie ' 
    +' from PackagesMX a(nolock),spkfk b(nolock) ' 
    +' where a.spid = b.spid and a.fangabh in (select fangabh from PackagesMX(nolock) where spid ='''+ mx_spid+''')'; 

    //alert(SQL.Text); 
    Open; 
    DjForm.djmxtable.Edit; 
    copydataset(tmp_qry,DjForm.djmxtable,false); 
    //DjForm.djmxtable.FieldByName('spbh').AsString := '234'; 
    //DjForm.djmxtable.append; 

    finally 
    free; 
    end; 





    最主要的还是要有思路,其他的一切都是方法

  • 相关阅读:
    MySQL的用户名不记得了怎么办?
    辨析:机器字长、存储字长、指令字长和操作系统位数
    基于Flask框架搭建视频网站的学习日志(六)之数据库
    基于Flask框架搭建视频网站的学习日志(三)之原始web表单
    基于Flask框架搭建视频网站的学习日志(二)
    Docker 容器的网络连接 & 容器互联
    Docker DockerFile文件指令 & 构建
    linux :没有找到 ifconfig netstat
    ubuntu : 无法安全地用该源进行更新,所以默认禁用该源。
    Docker 守护进程的配置和操作 & 远程访问
  • 原文地址:https://www.cnblogs.com/jijm123/p/10348315.html
Copyright © 2011-2022 走看看