-- 作者:菜鸟foxtable
-- 发布时间:2009/1/1 11:28:00
-- ★华海仓管之庖丁解牛篇★←菜鸟学习帮手(1月3日2楼更新gdlgh老师倾心讲解)
为了方便广大菜鸟朋友学习华海仓管实例,本人在研究的同时逐步为各位献上代码解说,错误之处请多多包涵.
把gdlgh老师的登陆代码分离出来搞了个自定义登陆实例,大家慢慢学习. 学习重点: 全局变量/sql命令及select ; update ; insert into语句/动态控件生成/字符串加密解密/各权限功能实现方法
相关知识: 状态栏设置/MessageBox对话框/项目属性各事件的运用
只下不顶不是好同志哦...
动态控件代码: 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编辑过]
|