错误:多步操作产生错误,请检查每步的状态值
'主
Sub MatTotal()
  Dim MyCon As New ADODB.Connection
  Dim MyRs As New ADODB.Recordset
  Dim ConStr As String
  '由于本机没连到Oracle,暂用同结构的Sql Server中的表替代
  ConStr = "Provider=SQLOLEDB;Persist Security Info=False;User ID=sa;PassWord=zhangzs;DataBase=mytest"
  On Error GoTo Error:
  MyCon.ConnectionString = ConStr
  MyCon.CommandTimeout = 0
  MyCon.Open
  MyRs.CursorLocation = adUseClient
  MyRs.ActiveConnection = MyCon
  
  
  MyRs.LockType = adLockBatchOptimistic
  MyRs.CursorType = adOpenDynamic
 
  Dim MySqlStr As String
  MySqlStr = "select mo,material,weight, opn from mat"  '其中字段opn为char(1)
  MyRs.Open MySqlStr
  
  MyRs.MoveFirst
  Do While Not MyRs.EOF
   MyRs("opn") = Opn(Trim(MyRs("Opn").Value)) '报错的地方
   MyRs.MoveNext
  Loop
  
  Set DataGrid1.DataSource = MyRs
  DataGrid1.Refresh
  DataGrid1.Columns(2).Width = 700  Exit Sub
Error:
  MsgBox Err.Description, vbOKOnly, "error"
End Sub’转换函数
Function Opn(ByVal a As String) 
    Select Case a
     Case "E"
       Opn = "0020" 
       End Select
     Case "L"
       Opn = "0030"
     Case "V"
       Opn = "0040"
   End Select
End Function'如果把字段opn更改为char(4)则程序顺利执行。
是不是代码写的有毛病呢?恳请大家帮忙解决,谢谢!

解决方案 »

  1.   

    "0020" 长度为4啊
    OPN字段的长度为CHAR(1)
    当然会出错。
      

  2.   

    MyRs("opn") 是char(1)类型
    你的函数Function Opn(ByVal a As String) 返回值未指定,因此是String类型,当然是占用4位了.我不知道你想返回什么,如果是16位的话应该这样写
    MyRs("opn") = hex(val(Opn(Trim(MyRs("Opn").Value)) ))
      

  3.   

    "0020" 长度为4啊
    OPN字段的长度为CHAR(1)
    前提是OPN字段的长度由于特殊不可以更改
    直接这样肯定不对的,但是如何解决这个问题呢?
    比方说:
    如果不使用MyRs("opn") = Opn(Trim(MyRs("Opn").Value))
    取得的数据集是:
    mo     material weight  opn
    1001   Y002100   1.5     E
    1001   Y005100   0.5     L而实际应该得到的是:
    mo     material weight   opn
    1001   Y002100   1.5     0020
    1001   Y005100   0.5     0030
      

  4.   

    MyRs("opn") = Opn(Trim(MyRs("Opn").Value))
    这句是赋值语句啊是说把“0020” 赋值到 数据集中。当然会出错。但楼主的用意不是存储4个字符而是使用4个字符
    那可以在要应用的时候函数转啊
      

  5.   

    查询语句改成:select case opn
           WHEN ' E' THEN '0020'
           WHEN ' L' THEN '0030'
           ......
           END AS opn ,
    mo,material,weight from mat"查出的结果集就是你所需要的。
      

  6.   

    我不是不太明白MyRs("opn") = Opn(Trim(MyRs("Opn").Value)) 
    这一句的意思,明明OPN中存贮的是一个字符,重新存入4个字符的数据进去?
      

  7.   

    ’转换函数
    Function Opn(ByVal a As String) 
        Select Case a
         Case "E"
           Opn = "0020" 
           End Select
         Case "L"
           Opn = "0030"
         Case "V"
           Opn = "0040"
       End Select
    End Function
    这个函数应该是读取的时候用,写入的时候用’转换函数
    Function Opn(ByVal a As String) 
        Select Case a
         Case "0020"
           Opn = "E" 
           End Select
         Case "0030"
           Opn = "L"
         Case "0040"
           Opn = "V"
       End Select
    End Function
      

  8.   

    要是显示的时候也可以用sql后台实现
    select mo,material, weight ,(case opn when 'E' then '0020' when 'L' then '0030' when 'V' then '0040' end) as opn from 表
    说实话,我现在还不明白你说的什么,
      

  9.   

    多谢 zyg0(影子(如影随行) 
    可能表达有问题,呵呵。
    我不能用这个sql的,因为这里只是我的一个简化,
    实际上应该是material使用对照表对照完毕后,也要做opn的一个参数。
    我现在想用两个数据集去实现它了。
    同样希望得到你的帮助。