关于mshflexgrid中的列的选择计算.help

bghd 2008-04-17 11:26:09
问题描述如下:我设置的列为6列,a,b,c,d ,e,f,用一个combo 传递修改的值给mshflexgrid.cell ,其中b,c,e,f为数字列, d列可以选择combo中的数据,比如,select 学徒 ,select 员工.另有text1,text3可以输入值.u 为接收 e列的和,也就是每行的e列的累加值.text3为接收当d列选择学徒时的那一行的f 值(是一固定值,比如是20),如有多行:学徒: 行的话 ,即是多行f 列累加后的值.
要达到的目的是:当d列选择学徒时,f = text1/text2*e.当d列选择员工时,f=(text1-text3)/text2*e.指的是每行都是如此的计算.
现在的问题:其它部分没有问题,只是d列选择时,不知如何实现其计算.
另外,我的combo值有数字和文字两部分,如何控制,a列和d列只能输入文字,而其它列可以选择为数字?
我的代码如下,如有错误,敬请指教!
Private Sub Combo1_LostFocus()


'''''''''''''''''''''''''第一行除数为 0 会出现运行错误,未解决!''''''


Dim tmprow As Integer

Dim tmpcol As Integer

Dim sum As Integer

Dim t As Integer

Dim u As Integer

Dim e As Integer



tmprow = MSHFlexGrid1.Row

tmpcol = MSHFlexGrid1.Col




Combo1.SelStart = 0

Combo1.Visible = False

MSHFlexGrid1.RowSel = tmprow ''''''''''''''''''''''' rowsel=row ??????

MSHFlexGrid1.ColSel = tmpcol ''''''''''''''''''''''''colsel =col





If MSHFlexGrid1.TextMatrix(tmprow, 3) = "学徒" Then ''''''''''''设计一个循环,检测每行3列是否有”学徒“字样,如果有,累加其第5列的值''''''''''''

MSHFlexGrid1.TextMatrix(tmprow, 1) = 3 '''''''''''''''''''工资系数赋值为3

MSHFlexGrid1.TextMatrix(tmprow, 4) = 0 ''''''''工资总计赋值为0不参与分配计算

MSHFlexGrid1.TextMatrix(tmprow, 5) = (3 * Val(MSHFlexGrid1.TextMatrix(tmprow, 2)))

For t = 2 To MSHFlexGrid1.Rows

sum = sum + Val(MSHFlexGrid1.TextMatrix(t - 1, 4))

Text2.Text = sum

Next t


Else


MSHFlexGrid1.TextMatrix(tmprow, 4) = (Val(MSHFlexGrid1.TextMatrix(tmprow, 1)) * Val(MSHFlexGrid1.TextMatrix(tmprow, 2))) ''通过前两列的数值计算第三列的数值

For t = 2 To MSHFlexGrid1.Rows

sum = sum + Val(MSHFlexGrid1.TextMatrix(t - 1, 4))

Text2.Text = sum



If MSHFlexGrid1.TextMatrix(tmprow, 3) = "学徒" Then

u = u + Val(MSHFlexGrid1.TextMatrix(t - 1, 5))

Else



End If

Next t


MSHFlexGrid1.TextMatrix(tmprow, 5) = (Val(Text7.Text) - u) / Val(Text2.Text) * Val(MSHFlexGrid1.TextMatrix(tmprow, 4))



End If

我的思路是:当d选择为学徒 时,累加他的值到u.可不知道代码如何写.
...全文
365 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
meiZiNick 2008-05-01
  • 打赏
  • 举报
回复
接分是王道!
bghd 2008-04-30
  • 打赏
  • 举报
回复
多谢啦!参考您 的代码,功能 上已经搞定了。
还有一个小问题,再请教一下。偶想当每次输完工资系数和工时后,权值列能自动计算出结果来,就象即时刷新时应怎么做呢?
现在的情况是只有偶单击mshflexgrid 时才计算。偶设置的是combo1的lostfocus时计算的。
bghd 2008-04-29
  • 打赏
  • 举报
回复
楼上的,我用了你给的代码,可出现错示提示."数组未定义".totalyuangong.真搞 不懂了.
totalYuanGong=totalYuanGong(MSHFlexGrid1.TextMatrix(irow,4)) 这行的意思是:累加所有员工的工资总计吗?
西雀 2008-04-29
  • 打赏
  • 举报
回复
对,累加所有员工和学徒的工资。
真搞,我难道又贴错了?

for irow=1 to MSHFlexGrid1.Rows-1
if MSHFlexGrid1.TextMatrix(irow,3)="员工" then
totalYuanGong = totalYuanGong + val(MSHFlexGrid1.TextMatrix(irow,4))
else
totalXueTu = totalXueTu + Val(MSHFlexGrid1.TextMatrix(irow,4))
end if
next

我的代码是给你参考的,你应该根据情况适当修改。
西雀 2008-04-28
  • 打赏
  • 举报
回复
循环里的tmprow应该改成irow,算了,重贴一下:

1、学徒的工资总计=0
员工的工资总计=工资系数*工时
2、员工的权值=(总工资值-所有学徒的权值)/所有员工的工资总计之和*员工本人的工资系数
学徒的权值=学徒的工资系数*工时
-------------------------------------------------------------------------------------
首先让我们先来把公式搞搞清楚:
1、这里钱分成两部分,一部分给学徒和员工作工资,多出的部分给员工作奖金,对不对?
2、学徒和员工的工资总计=工资系数x工时,对不对?
3、奖金=(总钱数-学徒工资总和)/员工工资总和*员工的工资系数 ,对不对?

好啦,现在来把界面说说:
1、你打算在MSHFlexGrid的每一行放置一条学徒或者员工的信息,对不对?
2、b1列是工资系数,c2列是工时,这是需要手工输进去的,对不对?
3、e4列是工资总计,f5列是奖金,这是需要计算的,对不对?

问题清楚了:
1、e4列工资总计的计算:
MSHFlexGrid1.TextMatrix(tmprow,4)=Val(MSHFlexGrid1.TextMatrix(tmprow,1))*Val(MSHFlexGrid1.TextMatrix(tmprow,2))
2、f5列奖金的计算:
if MSHFlexGrid1.TextMatrix(tmprow,3)="员工" then
dim totalMoney as double '总钱数
dim totalXueTu as double '学徒的工资总和
dim totalYuanGong as double '员工的工资总和
dim xishuYuanGong as double '员工的工资系数
dim iRow as Long
totalMoney=?? '这个需要你来指定

for irow=1 to MSHFlexGrid1.Rows-1
if MSHFlexGrid1.TextMatrix(irow,3)="员工"
totalYuanGong=totalYuanGong(MSHFlexGrid1.TextMatrix(irow,4))
else
totalXueTu=totalXueTu(MSHFlexGrid1.TextMatrix(irow,4))
end if
next
xishuYuanGong=Val(MSHFlexGrid1.TextMatrix(tmprow,1))
MSHFlexGrid1.TextMatrix(tmprow,5)=(totalMoney-totalXueTu)/totalYuanGong*xishuYuanGong
end if
西雀 2008-04-28
  • 打赏
  • 举报
回复
首先让我们先来把公式搞搞清楚:
1、这里钱分成两部分,一部分给学徒和员工作工资,多出的部分给员工作奖金,对不对?
2、学徒和员工的工资总计=工资系数x工时,对不对?
3、奖金=(总钱数-学徒工资总和)/员工工资总和*这位员工的工资系数 ,对不对?

好啦,现在来把界面说说:
1、你打算在MSHFlexGrid的每一行放置一条学徒或者员工的信息,对不对?
2、b1列是工资系数,c2列是工时,这是需要手工输进去的,对不对?
3、e4列是工资总计,f5列是奖金,这是需要计算的,对不对?

问题清楚了:
1、e4列工资总计的计算:
MSHFlexGrid1.TextMatrix(tmprow,4)=Val(MSHFlexGrid1.TextMatrix(tmprow,1))*Val(MSHFlexGrid1.TextMatrix(tmprow,2))
2、f5列奖金的计算:
if MSHFlexGrid1.TextMatrix(tmprow,3)="员工" then
dim totalMoney as double '总钱数
dim totalXueTu as double '学徒的工资总和
dim totalYuanGong as double '员工的工资总和
dim xishuYuanGong as double '员工的工资系数
dim iRow as Long
totalMoney=?? '这个需要你来指定

for irow=1 to MSHFlexGrid1.Rows-1
if MSHFlexGrid1.TextMatrix(tmprow,3)="员工"
totalYuanGong=totalYuanGong(MSHFlexGrid1.TextMatrix(tmprow,4))
else
totalXueTu=totalXueTu(MSHFlexGrid1.TextMatrix(tmprow,4))
end if
next
xishuYuanGong=Val(MSHFlexGrid1.TextMatrix(tmprow,1))
MSHFlexGrid1.TextMatrix(tmprow,5)=(totalMoney-totalXueTu)/totalYuanGong*xishuYuanGong
end if
bghd 2008-04-26
  • 打赏
  • 举报
回复
many thanks to sequh:
你的关注让我重新有了继续的信心。
重新描述如下:
MSHFlexGrid有6列,第0列是a,第1列是b...第5列是f,另有一个总工资值。是根据其它计算得来的。(偶做的是一个有关于工资计算的小程序。)
假设各项列名如下:
a0=姓名,b1=工资系数,c2=工时,d3=人员类别,e4=工资总计,f5=权值,其中
1、学徒的工资总计=0
员工的工资总计=工资系数*工时
2、员工的权值=(总工资值-所有学徒的权值)/所有员工的工资总计之和*员工本人的工资系数
学徒的权值=学徒的工资系数*工时
代码中MSHFlexGrid.TextMatrix(temrow,3)中的3指的是d列第3列。

另外,确如您所说,是把问题复杂化了。但是我确实想让mshflexgrid中的数值能参与计算。因为我见到过这样类似的程序,非常适合我的工作要求。
只是偶不太会做了,还请指教!
西雀 2008-04-26
  • 打赏
  • 举报
回复
仔细看了你的描述,我的理解是:
MSHFlexGrid有6列,第0列是a,第1列是b...第5列是f
假设你的各项列名如下:
a0=姓名,b1=工资系数,c2=工时,d3=人员类别,e4=工资总计,f5=权值,其中
1、学徒的工资总计=工资系数*工时
2、员工的工资总计=员工的权值-(所有学徒的工资总计之和/所有人的工资系数之和*员工本人的工资系数)
我的理解肯定有错误,因为你的代码中MSHFlexGrid.TextMatrix(temrow,3)中的3指的是第3列吗?第3列是d列吗?还是你的描述中的第四列?有些晕。

建议楼主以后在描述功能时不要用列号来描述,而是用最原始的自然语言来描述。
你把问题搞得比较复杂,原因在于你让MSHFlexGrid作了太多的事情,如果你仅仅把MSHFlexGrid当成一个最后列出数据的控件,而把添加、修改的界面放在另外的一个窗口或者其它的一些控件,或许会使你简单一些。

重新写一下你的描述吧
dbcontrols 2008-04-24
  • 打赏
  • 举报
回复
MSFlexGrid1.Row=i 可以把光标移动到i行
MSFlexGrid1.Colume=j可以把光标移动到第j列
aaa=MSFlexGrid1.Text 可以把第i行j列的数据取出来当到变量aaa中
MSFlexGrid1.Text=zzz 可以给第i行j列的格子赋值

Val(aaa)可以把字符型的数据变成数字型的,以便于计算

知道这些就差不多了
bghd 2008-04-24
  • 打赏
  • 举报
回复
to danielinbiti:

偶主要要实现的功能: 实现员工和学徒两种状态下的计算。第三列选择:学徒:时,这一行的第五列值等于第二列值和第三列值的乘积。选择:员工:时,这行的第五列值等于另外一个固定值(比如是100)减去:学徒:行的第五列值(如果有多行:学徒:行的话,就是减去多行的总和值),除以这个表格内的所有第四列值的总和,然后乘以这行的第四列值。所有行的第五列值的总和应该与另外一个固定值相等(100)。


主要是这个问题,其它的在发贴之前都解决掉了。
真要疯了,困扰一个星期了。五一都 过不好了 5555555555
bghd 2008-04-21
  • 打赏
  • 举报
回复
帮帮我啊!
danielinbiti 2008-04-21
  • 打赏
  • 举报
回复
真好呀,还发到邮箱号召来抢分
参考一下下面代码,应该可以满足你需要的条件判断了

Private Sub MSFlexGrid1_DblClick()
Dim selCol As Integer
Dim selRow As Integer
selRow = MSFlexGrid1.RowSel
selCol = MSFlexGrid1.ColSel
If selCol > 0 Then
bFlag = True
If selCol = status_col Then
txtInput.Visible = False
cmbStatus.Visible = True
cmbStatus.Text = MSFlexGrid1.TextMatrix(selRow, selCol)
cmbStatus.Left = MSFlexGrid1.Left + MSFlexGrid1.ColPos(selCol) + 28
cmbStatus.Top = MSFlexGrid1.Top + MSFlexGrid1.RowPos(selRow) + 30
cmbStatus.Width = MSFlexGrid1.ColWidth(selCol)
'cmbStatus.Height = MSFlexGrid1.RowHeight(selRow)
Else
cmbStatus.Visible = False
txtInput.Visible = True
txtInput.Text = MSFlexGrid1.TextMatrix(selRow, selCol)
txtInput.Left = MSFlexGrid1.Left + MSFlexGrid1.ColPos(selCol) + 28
txtInput.Top = MSFlexGrid1.Top + MSFlexGrid1.RowPos(selRow) + 30
txtInput.Width = MSFlexGrid1.ColWidth(selCol)
txtInput.Height = MSFlexGrid1.RowHeight(selRow)
End If
Else
bFlag = False
End If
End Sub

Private Sub MSFlexGrid1_LeaveCell()
Dim selCol As Integer
Dim selRow As Integer
Dim sql As String
Dim fieldName As String
Dim tableName As String
Dim keyName As String
If bFlag Then
If MsgBox("是否更新内容?", vbOKCancel, "提示") = vbOK Then
selRow = MSFlexGrid1.RowSel
selCol = MSFlexGrid1.ColSel
If selCol = status_col Then
MSFlexGrid1.TextMatrix(selRow, selCol) = cmbStatus.Text
cmbStatus.SetFocus
Else
MSFlexGrid1.TextMatrix(selRow, selCol) = txtInput.Text
txtInput.SetFocus
End If
tableName = tablecontext.tableName
fieldName = tablecontext.getFieldsName(selCol)
keyName = tablecontext.getFieldsName(keyvalue_col)
If MSFlexGrid1.TextMatrix(selRow, keyvalue_col) <> "" Then
sql = "update " + tableName + " set " + fieldName + "='" + MSFlexGrid1.TextMatrix(selRow, selCol) + "'"
sql = sql + " where " + keyName + "=" + MSFlexGrid1.TextMatrix(selRow, keyvalue_col)
Call UpdateRS(sql)
Else
sql = " insert into " + tableName + "(" + tablecontext.getFieldsName(selCol) + "," + tablecontext.getFieldsName(status_col) + _
") values('"
sql = sql + MSFlexGrid1.TextMatrix(selRow, selCol) + "','未完成')"
Call UpdateRS(sql)
Call loadRsToMSFlexGrid(MSFlexGrid1)
Call addMSFlexGridOneRow(MSFlexGrid1)
Call initMSFlexGridOtherRowHeight(MSFlexGrid1)
End If
End If
txtInput.Visible = False
cmbStatus.Visible = False
End If
bFlag = False
End Sub
bghd 2008-04-19
  • 打赏
  • 举报
回复
to northmolves:
    因为是我的描述有点混乱吧。我想你还是对我的问题没有解决。单指累加到u 的值的问题,我要计算 的是:学徒:行的所有行的累加。按您的代码还是不能累加,只能显示当前行的值。
不过还是感谢您对本贴的关注!再次感谢! 
西雀 2008-04-19
  • 打赏
  • 举报
回复
楼主的思路和代码都很混乱,我觉得你首先要把思路理清楚,然后再来研究界面表现的部分:

1、要实现的功能:
看来你是想实现员工和学徒两种状态下的计算,把你的功能用汉语描述出来,不要参杂代码。

2、界面部分:
MSHFlexGrid中的编辑功能你是准备怎么实现?增强控件?
Combo放在MSHFlexGrid里面,还是外面,你的Text2是什么东东?
你对f的计算有点复杂。
row,col,rowsel,colsel,rows这几个属性你明白是什么意思吗?
row,col=当前选择区域的起始行列
rowsel,colsel=当前选择区域的终止行列,要注意rowsel,colsel有可能比row,col小
rows是行数,但rows从0开始,所以最后一行是rows-1,你的代码中有错误。

界面交互越简单越好,对f列的计算需要多考虑。
总之,我想先看到你的功能描述。
bghd 2008-04-19
  • 打赏
  • 举报
回复
谢谢各位的指正。
问题描述如下:
1、要实现的功能: 实现员工和学徒两种状态下的计算。第三列选择:学徒:时,这一行的第五列值等于第二列值和第三列值的乘积。选择:员工:时,这行的第五列值等于另外一个固定值(比如是100)减去:学徒:行的第五列值(如果有多行:学徒:行的话,就是减去多行的总和值),除以这个表格内的所有第四列值的总和,然后乘以这行的第四列值。   
最后,所有行的第五列值和总和与另外一个固定值相等(100)。
2。编辑功能,是先写到combo中,然后赋值给指定单元格的。这一部分功能已经实现。combo是在表格里面的。代码中的text2是我用来累加第四列的值的。实在不知道如何去写,只好用这笨办法了。呵呵。
3.最后一个问题就是,combo中有文字和数字两部分,如何让第一列和第二列第只能输入数字,第三列只能输入:学徒:和:员工:???

也不知道是否描述清楚了,偶是新手,让各位见笑了!
northwolves 2008-04-19
  • 打赏
  • 举报
回复
我的思路是:当d选择为学徒 时,累加他的值到u.可不知道代码如何写.
--------------------------

For t = 2 To MSHFlexGrid1.Rows
sum = sum + Val(MSHFlexGrid1.TextMatrix(t - 1, 4))
If MSHFlexGrid1.TextMatrix(tmprow, 3) = "学徒" Then u = u + Val(MSHFlexGrid1.TextMatrix(t - 1, 5))
Next t
Text2.Text = sum
CathySun118 2008-04-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sequh 的回复:]
楼主的思路和代码都很混乱,我觉得你首先要把思路理清楚,然后再来研究界面表现的部分:

1、要实现的功能:
看来你是想实现员工和学徒两种状态下的计算,把你的功能用汉语描述出来,不要参杂代码。

2、界面部分:
MSHFlexGrid中的编辑功能你是准备怎么实现?增强控件?
Combo放在MSHFlexGrid里面,还是外面,你的Text2是什么东东?
你对f的计算有点复杂。
row,col,rowsel,colsel,rows这几个属性你明白是什么意…
[/Quote]

有道理

1,453

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧