在程序中有自己的语法是非常有用的,但如何解析就比较难,如我做一个分析工资项目计算关系的代码。
显示名 表字段
应发合计 F_1
扣款合计 F_2
实发合计 F_3
所得税 F_4
岗位工资 F_5
加班工资 F_6
技术津贴 F_7
病假扣款 F_8
其他扣款 F_9
当用户设置公式:应发合计=岗位工资+加班工资+技术津贴
经分析得出:F_1=F_5+F_6+F_7请高手给出最快的方法!
显示名 表字段
应发合计 F_1
扣款合计 F_2
实发合计 F_3
所得税 F_4
岗位工资 F_5
加班工资 F_6
技术津贴 F_7
病假扣款 F_8
其他扣款 F_9
当用户设置公式:应发合计=岗位工资+加班工资+技术津贴
经分析得出:F_1=F_5+F_6+F_7请高手给出最快的方法!
显示名 表字段
应发合计 F_1
扣款合计 F_2
实发合计 F_3
所得税 F_4
岗位工资 F_5
加班工资 F_6
技术津贴 F_7
病假扣款 F_8
其他扣款 F_9
把
TStr="应发合计=岗位工资+加班工资+技术津贴"
解析为
TStr2="F_1=F_5+F_6+F_7"
建立个结构体
type udtNameMap
srcName as string
desName as string
end typedim namemap(xxx) as udtnamemap
namemap(0).srcname = "应发工资"
namemap(1).srcname = "F_1"
...
然后在vb中用repalce循环替换。
create table test (a varchar(20),b varchar(20))
insert test select '应发合计','F_1'
union all select '扣款合计','F_2'
union all select '实发合计','F_3'
union all select '所得税','F_4'
union all select '岗位工资','F_5'
union all select '加班工资','F_6'
union all select '技术津贴','F_7'
union all select '病假扣款','F_8'
union all select '其他扣款','F_9'
declare @s1 varchar(100)
set @s1 = '应发合计=岗位工资+加班工资+技术津贴'
declare @a varchar(20),@b varchar(20)
declare cur cursor for select a,b from test
open cur
fetch next from cur into @a,@b
while @@fetch_status = 0
begin
set @s1 = replace(@s1,@a,@b)
fetch next from cur into @a,@b
end
close cur
deallocate cur
select @s1
-- drop table test------------------
F_1=F_5+F_6+F_7(所影响的行数为 1 行)
显示名 内部名
应发合计 F_1
扣款合计 F_2
实发合计 F_3
所得税 F_4
岗位工资 F_5
加班工资 F_6
技术津贴 F_7
病假扣款 F_8
其他扣款 F_9
+ +
- -
* *
/ /如果输入了:应发合计=A + 岗位工资+加班工资+技术津贴
在分析时截掉空格:应发合计=A+岗位工资+加班工资+技术津贴
在解析时发现没有关键字“A”,就提示“无法识别A!”
Dim TFields() As String
Dim FCount As IntegerPrivate Sub Command1_Click()
Dim I As Long
Dim TStart As Long
Dim TLen As Long
Dim TStr As String
Dim TS1 As String
Dim TS2 As String
Dim TFormula As String
TStart = 1
TLen = 1
TStr = Text1.Text
For I = 1 To Len(TStr)
TS1 = Mid(TStr, TStart, TLen)
TS2 = GetFieldName(TS1)
If Len(TS2) > 0 Then
TLen = 1
TStart = I + 1
'I = I + Len(TS1) - 1
TFormula = TFormula & TS2
Else
TLen = TLen + 1
End If
Next
MsgBox TFormula
End SubFunction GetFieldName(ByVal TSS As String) As String
Dim I As Integer
For I = 0 To FCount - 1
If TSS = TFields(I, 0) Then
GetFieldName = TFields(I, 1)
Exit Function
End If
Next
End FunctionPrivate Sub Command2_Click()
MsgBox Mid("www.ufsoft.com", 0, 1)
End SubPrivate Sub Form_Load()
Init
Text1.Text = ""
Text2.Text = ""
End SubSub Init()
Dim I As Integer
FCount = 13
ReDim TFields(FCount - 1, 1)
TFields(0, 0) = "+"
TFields(1, 0) = "-"
TFields(2, 0) = "*"
TFields(3, 0) = "/"
TFields(4, 0) = "应发合计"
TFields(5, 0) = "扣款合计"
TFields(6, 0) = "实发合计"
TFields(7, 0) = "所得税"
TFields(8, 0) = "岗位工资"
TFields(9, 0) = "加班工资"
TFields(10, 0) = "技术津贴"
TFields(11, 0) = "病假扣款"
TFields(12, 0) = "其他扣款"
TFields(0, 1) = "+"
TFields(1, 1) = "-"
TFields(2, 1) = "*"
TFields(3, 1) = "/"
TFields(4, 1) = "F_1"
TFields(5, 1) = "F_2"
TFields(6, 1) = "F_3"
TFields(7, 1) = "F_4"
TFields(8, 1) = "F_5"
TFields(9, 1) = "F_6"
TFields(10, 1) = "F_7"
TFields(11, 1) = "F_8"
TFields(12, 1) = "F_9"
With List1
.Clear
For I = 0 To FCount - 1
.AddItem TFields(I, 0)
Next
End With
End SubPrivate Sub List1_DblClick()
Text1.Text = Text1.Text & List1.Text
End Sub
sql=" select 应发合计=A + 岗位工资+加班工资+技术津贴 from table name"
如果用户输入了合法的字符,就在程序号捕捉错误信息,给出提示,如果要加括号和其它,也不