以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  ★华海仓管之庖丁解牛篇★←菜鸟学习帮手(1月3日2楼更新gdlgh老师倾心讲解)  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=1532)

--  作者:菜鸟foxtable
--  发布时间:2009/1/1 11:28:00
--  ★华海仓管之庖丁解牛篇★←菜鸟学习帮手(1月3日2楼更新gdlgh老师倾心讲解)

为了方便广大菜鸟朋友学习华海仓管实例,本人在研究的同时逐步为各位献上代码解说,错误之处请多多包涵.



把gdlgh老师的登陆代码分离出来搞了个自定义登陆实例,大家慢慢学习.
学习重点:
全局变量/sql命令及select ; update ; insert into语句/动态控件生成/字符串加密解密/各权限功能实现方法

相关知识:
状态栏设置/MessageBox对话框/项目属性各事件的运用

 下载信息  [文件大小:   下载次数: ]
点击浏览该文件:登陆测试.rar

只下不顶不是好同志哦...

动态控件代码:
Dim cmd As New SQLCommand  设置SQL命令
cmd.C 设置连接数据库ckgl
dim x,y,i1,i2 as integer 设置整数变量x,y,i1,i2
Dim dt As DataTable
cmd.CommandText = "select 名称 From [权限]" 
获取权限表名称列的值
dt = cmd.ExecuteReader()
i2 = dt.datarows.count

\'生成用户列表
Dim rad As WinForm.RadioButton 定义rad为单选框控件
for y  = 0 to Math.Ceiling(i2/5)-1  y=0至用户列表数除于5再减1的最小整数
    for x = 0 to iif(y = Math.Ceiling(i2/5)-1 and (i2 mod 5)<>0,(i2 Mod 5)-1,4) x=0至用户列表数除于5再减1的最小整数并且 (这里我无法用语言表达...)
        rad = Forms("管理").CreateControl("rad" & i1,ControlTypeEnum.RadioButton) 在管理窗口建立单选框控件
        rad.Text = dt.datarows(i1)("名称") 设置控件名称
        rad.Left = 2+x*80
        rad.Top = y*70
        rad.Width = 80
        rad.Height = 70  
设置控件位置及长宽
        rad.TextAlign = ContentAlignment.BottomCenter  设置控件文本位置
        rad.ImageFile = ProjectPath & "Images\\ne.ico" 设置控件图标
        rad.ImageAlign = ContentAlignment.TopCenter 设置图标位置
        rad.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText 设置图标文本相对位置
        rad.Appearance = System.Windows.Forms.Appearance.Button
        Forms("管理").Controls("Panel1").AddControl(rad) 设置新增控件所处位置
        i1 += 1
    next
next
e.Form.Controls("rad0").Select()


权限设置窗口确定按钮:

Dim lst As WinForm.CheckedListBox
lst = e.form.Controls("CheckListBox1")   设置lst为"CheckListBox1"字串
if Vars("用户").split(",")(0) = "rad0" and len(lst.value)<>158 then 如果是第一个用户并且字串长度不等于158则
    msgbox("管理员必须拥有所有权限!",64,"提示") 弹出提示窗口
    Return 返回
end if 结束
dim str1,str2,str3 as string   设置字符串str1.2.3
str1 = e.Form.Controls("TextBox1").value 
str2 = e.Form.Controls("TextBox2").value
str3 = e.Form.Controls("TextBox3").value 
   设置相对应的TextBox
if str1 is nothing then   如果str1为空则
    msgbox("用户名不能为空!",64,"提示")   弹出提示窗口
else if str2 is nothing then   如果str2为空则
    msgbox("密码不能为空!",64,"提示")   弹出提示窗口
else if str3 <> str2 then  如果str3为空则
    msgbox("两次输入的密码不一致,请重新输入!",64,"提示")  
弹出提示窗口
    e.Form.Controls("TextBox2").value = nothing
    e.Form.Controls("TextBox3").value = nothing   
相应的TextBox清空
else
    str2 = EncryptText(str2,"lgh","1qaz2wsx3edc")   str2=加密后的str2
    str3 = EncryptText(lst.Value & "","gdlgh","4rfv5tgb6yhn")   str3=加密后复选列表框(lst)的值
    Dim cmd As New SQLCommand    设置一个SQL命令
    cmd.Con nection Name = "ckgl"   连接数据ckgl
    if Vars("用户")<>"" then  如果全局变量(用户)不为空则
        cmd.CommandText = "UPDATE [权限] SET 名称 = \'" & str1 & "\',密码 = \'" & str2 & "\',权限 = \'" & str3 & "\' WHERE 名称 = \'" & Vars("用户").split(",")(1) & "\'"  向权限表写入数据
        cmd.ExecuteNonQuery()  执行SQL命令
        Forms("管理").Controls(Vars("用户").split(",")(0)).text = str1  管理窗口相对应的动态控件文本更改为str1的值
    else
        cmd.CommandText = "select count(*) from [权限] where 名称 = \'" & str1 & "\'" 查询权限表里名称=str1的值
        if cmd.ExecuteScalar() > 0 then 如果找到则
            msgbox("用户名已存在!",64,"提示") 弹出提示窗口
            e.Form.Controls("TextBox1").value = ""  当前窗口textBox1里的值清空
            Return 返回
        end if
        cmd.CommandText = "Insert Into [权限] (名称,密码,权限) values(\'" & str1 & "\',\'" & str2 & "\',\'" & str3 & "\')"  权限表新增一行并写入相应数据
        cmd.ExecuteNonQuery() 执行SQL命令
        with Forms("管理").Controls("CheckBox1")
            .Checked = not .Checked
        end with  
返回管理窗口CheckBox1控件,并使它呈非选中状态
    end if
    Forms("管理").Controls("rad0").Select() 将焦点转到管理窗口第一个动态控件上
    e.form.close  当前窗口关闭
end if

登陆窗口AfterLoad代码:

if Vars("用户")<>"gdlgh" then   如果全局变量(用户)不是gdlgh则
    For Each tb As Table In Tables
        tb.Visible = false
    Next        
           隐藏所有表
    QAT.Visible = False 隐藏快速访问栏
    ConfigBar.Visible = False 隐藏配置栏
end if
Dim cmd As New SQLCommand 
cmd.C
Dim dt As DataTable
cmd.CommandText = "select 名称 From [权限]" 获取权限表名称列的值
dt = cmd.ExecuteReader() 变量dt=获取的值
Dim cbox As WinForm.ComboBox = e.Form.Controls("ComboBox1") 设置cbox=ComboBox1
For Each dr As Datarow In dt.Datarows
    cbox.Items.Add(dr("名称"))
Next

把获取的值加入到cbox中



------------------------------------分割线2009年1月2日更新-------------------------------------


登陆窗口确定按钮:

Dim cmd As New SQLCommand \'定义一个SQL命令
cm d.Con nection Name = "c k g l" \'指定数据源ckgl
cmd.CommandText = "select 密码 From [权限] where 名称 = \'" & e.Form.Controls("ComboBox1").value & "\'" \'设置SQL命令=从权限表的密码列寻找名称等于ComboBox1的字符串
dim str as string = cmd.ExecuteScalar() \'定义STR为找到的这个字符串
str = DecryptText(str,"lgh","1qaz2wsx3edc") \'str=解密后的字符串,其中密钥1密钥2分别为"lgh"和"1qaz2wsx3edc"
cmd.CommandText = "select 权限 From [权限] where 名称 = \'" & e.Form.Controls("ComboBox1").value & "\'" \'设置SQL命令=从权限表的权限列寻找名称等于ComboBox1的字符串
Vars("权限") = DecryptText(cmd.ExecuteScalar(),"gdlgh","4rfv5tgb6yhn") \'全局变量(权限)=解密后的找到的字符串,其中密钥1密钥2分别为"gdlgh","4rfv5tgb6yhn"
if str = e.Form.Controls("TextBox1").value and str <> "" then \'如果解密后的str=当前窗口TextBox1里面的字符串并且不为空则
    Vars("用户") = e.Form.Controls("ComboBox1").value \'全局变量(用户)=当前窗口ComboBox1里的字符串
    QAT.Visible = True \'快速访问栏可见
    ConfigBar.Visible = True \'配置栏可见
    Tables("查询表").Visible = True \'查询表可见
    StatusBar.Reset() \'重设状态栏
    StatusBar.Message1= "  单机版[试用] V1.0                             ||  操作员:  " & Vars("用户")     \'设置左边状态栏
    StatusBar.Message2= ""      \'中间状态栏
    StatusBar.Message3= "                       广州华海软件工作室"     \'设置右边状态栏
    e.form.close  \'当前窗口关闭
else \'否则
    msgbox("密码不正确!",64,"提示") \'弹出提示窗口
end if


\'登陆窗口取消按钮:


if Vars("用户")<>"gdlgh" then \'如果全局变量(用户)不等于gdlgh则
    e.form.close 当前窗口关闭
    system.diagnostics.process.GetProcessesByName("foxtable")(0).kill  \'foxtable进程关闭
else \'否则
    e.form.close 当前窗口关闭
end if



[此贴子已经被作者于2009-1-3 9:59:00编辑过]

--  作者:菜鸟foxtable
--  发布时间:2009/1/1 11:35:00
--  

此代码解说转自gdlgh老师置顶贴,听老师一言,胜读十遍帮助...图片点击可在新窗口打开查看
先看看这行超级代码...是不是有点晕?..图片点击可在新窗口打开查看
s1 = "SELECT \'0\' AS 序号, 库名, (SELECT COUNT(*) FROM (SELECT DISTINCT 库名,货品编码 FROM CKKC,仓库信息 WHERE 仓库 = 库名) WHERE 库名 = M.库名) AS 商品种类, (SELECT COUNT(*) FROM CYMX WHERE 方向=\'入库\' AND 仓库 = M.库名 @#$) AS 本期入库_笔数,  Round((SELECT SUM(金额) FROM CYMX WHERE 方向=\'入库\' AND 仓库 = M.库名 @#$),2) AS 本期入库_金额, (SELECT COUNT(*) FROM CYMX WHERE 方向=\'出库\' AND 仓库 = M.库名 @#$) AS 本期出库_笔数,  Round((SELECT SUM(金额) FROM CYMX WHERE 方向=\'出库\' AND 仓库 = M.库名 @#$),2) AS 本期出库_金额, (SELECT COUNT(*) FROM CYMX WHERE 仓库 = M.库名 AND (类型=\'调拨入库\' OR 类型=\'调拨出库\') @#$) AS 本期调拨_笔数, (SELECT COUNT(*) FROM CYMX WHERE 仓库 = M.库名 AND 类型=\'调拨入库\' @#$) AS 本期调拨_调入笔数, (SELECT COUNT(*) FROM CYMX WHERE 仓库 = M.库名 AND 类型=\'调拨出库\' @#$) AS 本期调拨_调出笔数, Round((SELECT SUM(金额) FROM CYMX WHERE 仓库 = M.库名 AND (类型=\'调拨入库\' OR 类型=\'调拨出库\') @#$),2) AS 本期调拨_金额, (SELECT COUNT(*) FROM CYMX WHERE 仓库 = M.库名 AND (类型=\'盘盈\' OR 类型=\'盘亏\') @#$) AS 本期盘点_笔数, (SELECT COUNT(*) FROM CYMX WHERE 仓库 = M.库名 AND 类型=\'盘盈\' @#$) AS 本期盘点_盘盈笔数, (SELECT COUNT(*) FROM CYMX WHERE 仓库 = M.库名 AND 类型=\'盘亏\' @#$) AS 本期盘点_盘亏笔数, Round((SELECT SUM(金额) FROM CYMX WHERE 仓库 = M.库名 AND (类型=\'盘盈\' OR 类型=\'盘亏\') @#$),2) AS 本期盘点_金额, \'\' AS 备注 FROM 仓库信息 AS M"

@#$符号的解释:

之所以用@#$,系用来简化代码!

===找到TreeView4控件查看代码=====

\'生产明细表

s 13 = "SELECT M.序号, M.日期, M.部门, M.货品编码, N.货品名称, N.规格型号, N.计量单位, VAL(M.入库数量) AS 数量, M.单价, M.金额, N.备注 FROM CYMX AS M LEFT JOIN 库存商品 AS N ON M.货品编码=N.货品编码 WHERE 类型=\'生产入库\' @#$ ORDER BY 日期, 部门, M.货品编码"     \'这里有个\'@#$\'

略..........

            select case value2  \'判断选定节点内容,赋值全局变量

  略.........

               case "生产明细表"   \'把SQL字符串赋值给全局变量Vars("str2") 
                    Vars("str2") = s13
               case "部门领用汇总表"
                    Vars("str2") = s14
               case "物品领用汇总表"
                    Vars("str2") = s15
               case "领用明细表"
                    Vars("str2") = s16
            end select


========报表查询窗口查询按钮代码=============

with e.form
    dim sql,str1,str2,str3,kz as string
    kz = "TextBox4,ComboBox4,ComboBox3,ComboBox5,ComboBox6,TextBox1,TextBox3,DateTimePicker1,DateTimePicker2"   \'查询条件的控件数组
    str1 = "单号=\'@$0\',类型= \'@$1\',仓库= \'@$2\',供应单位= \'@$3\',经办人= \'@$4\',货品编码 = \'@$5\',部门= \'@$6\',日期 >= #@$7#,日期 <= #@$8#"    \'对应查询条件的条件数组(@$为替换符,作用是可简化代码!)
    dim i as integer
    For Each k as string In kz.split(",")    \'分解控件数组,循环组合查询条件串sql
        if .Controls(k).Value isnot nothing then    \'若条件控件内容为空,跳过,否则组合查询条件串
            if i=0 and .Controls("CheckBox1").Checked then    \'判断使用模糊单号还是精确单号查询
                sql = sql & " AND " & str1.split(",")(i).Replace("=\'@$" & i," like \'%" & .Controls(k).Value & "%")    \'组合条件串,条件值替换@$i。(模糊查询)
            else
                sql = sql & " AND " & str1.split(",")(i).Replace("@$" & i,.Controls(k).Value)    \'组合条件串,条件值替换@$i。(精确查询)
            end if
        end if
    i += 1
    Next
    Dim cmd As New SQLCommand
    cmd.C
    Dim dst As WinForm.DataList = Forms("窗口1").Controls("DataList7")  
    cmd.CommandText = Vars("str2").Replace("@#$",sql)   \'把 Vars("str2")=s13 中的\'@#$\'替换为条件串sql,组成一个完整的SQL查询语句!!
    msgbox(Vars("str2").Replace("@#$",sql))    \'要查看完整的SQL查询语句串,加入这条代码就明白了!!!!!!
    \'生成序列号
    dst.DataTable = cmd.ExecuteReader()
    dst.Build()
    For i=1 to dst.count
        Dim dr as DataRow = dst.GetDataRow(i-1)
        dr("序号") = "" & i
    Next
end with

[此贴子已经被作者于2009-1-3 10:13:27编辑过]

--  作者:菜鸟foxtable
--  发布时间:2009/1/1 11:35:00
--  
图片点击可在新窗口打开查看留位置更新
--  作者:菜鸟foxtable
--  发布时间:2009/1/1 11:36:00
--  
图片点击可在新窗口打开查看留位置更新
--  作者:舜风
--  发布时间:2009/1/1 12:18:00
--  
请问:为何时而可用CTRL+SHIRT+F12调出系统菜单
时而又不能调出呢
--  作者:菜鸟foxtable
--  发布时间:2009/1/1 12:58:00
--  
以下是引用舜风在2009-1-1 12:18:00的发言:
请问:为何时而可用CTRL+SHIRT+F12调出系统菜单
时而又不能调出呢

以开发者用户登陆系统即可以调出菜单,否则不能.


--  作者:gaoqr
--  发布时间:2009/1/1 14:01:00
--  
感谢楼主的讲解!


--  作者:julia
--  发布时间:2009/1/1 14:12:00
--  
为何在华海软件里看不到表?比如说员工信息,商品入库表等这些表是做在哪里的?
--  作者:菜鸟foxtable
--  发布时间:2009/1/1 14:16:00
--  

不是看不到,是隐藏了,你可以把项目属性AfterOpenProject里的代码删除,看看有什么不同.
并且,许多数据是通过SQL语句提取的....


图片点击可在新窗口打开查看此主题相关图片如下:001.jpg
图片点击可在新窗口打开查看
[此贴子已经被作者于2009-1-1 14:20:43编辑过]

--  作者:julia
--  发布时间:2009/1/1 14:47:00
--  

我已经删除掉项目属性AfterOpenProject里的代码,但是还是看不到表格呀,是怎么回事?