2013-04-11 2 views
0

как я могу извлечь значения, хранящиеся в переменном ВСУМЕ многоканальная линии в одном MsgBox InstEd из retrive в несколько MsgBox один за одниммульти значение линии в MsgBox

Dim rSEL, rSUM, rDes As DAO.Recordset 
Dim vItem_id, vQnty, vSum As Integer 
Dim vDes As String 
If Not IsNull(itemId) And Not IsNull(qnty_in) Then 
    If qnty_in <= 0 Or qnty_in > balance Or IsNull(balance) Then 
     Cancel = True 
    End If 
    Set rSEL = CurrentDb.OpenRecordset("SELECT item_id,item_qnty 
       FROM basketQnty_tbl WHERE basket_id=" & basketId) 
    'Check to see if the recordset actually contains rows 
    If Not (rSEL.EOF And rSEL.BOF) Then 
    rSEL.MoveFirst 
    Do Until rSEL.EOF 
     'Save itemId into a variable 
     vItem_id = rSEL!item_id 
     vQnty = (rSEL!item_qnty) * qnty_in 
     Set rSUM = CurrentDb.OpenRecordset("SELECT sum(qnty_in*qnty_type) 
        as QN FROM sales_tbl WHERE itemid=" & vItem_id) 
     Set rDes = CurrentDb.OpenRecordset("SELECT itemDesc 
        FROM items_main WHERE itemId=" & vItem_id) 
     vSum = rSUM!QN 
     vDes = rDes!itemDesc 
     'Move to the next record. Don't ever forget to do this. 
     If vQnty > vSum Then 
      MsgBox "you have only (" & vSum & ") of Item (" & vDes & ") in the stock" 
      Cancel = True 
     End If 
    rSEL.MoveNext 
    Loop 
    End If 
    rSEL.Close 
End If 

как я могу решить эту проблему?!

ответ

0

Чтобы построить полученное сообщение, вы можете использовать StringBuilder. Это более эффективно, чем конкатенация строк, поскольку StringBuilder имеет эффективное управление памятью, то есть не назначает новую память после каждой операции с строкой; вместо этого он работает с внутренним буфером.

Dim sb As StringBuilder 

sb = New StringBuilder() 

... 
Do Until rSEL.EOF 
    .... 
    sb.Append("you have only (") _ 
     .Append(vSum) _ 
     .Append(") of Item (") _ 
     .Append(vDes) _ 
     .AppendLine(") in the stock") 
    rSEL.MoveNext 
Loop 
MsgBox sb.ToString() 

В качестве альтернативы, вы можете объединить строку строитель с String.Format

... 
Do Until rSEL.EOF 
    .... 
    sb.AppendLine(_ 
     String.Format("you have only ({0}) of Item ({1}) in the stock", vSum, vDes) _ 
    ) 
    rSEL.MoveNext 
Loop 
MsgBox sb.ToString() 

Это гораздо легче читать.

Или еще проще:

... 
    sb.AppendFormat("you have only ({0}) of Item ({1}) in the stock", vSum, vDes) _ 
     .AppendLine() 
    ... 
+0

StringBuilder не включают – user1364008

+0

Добавить 'Использование System.Text' –

+0

как опишите, пожалуйста, меня?! – user1364008

2

Сделать переменный массив для хранения всех строк сообщений. Сделайте это больше, чем вам нужно, затем Redim Preserve, чтобы уменьшить его до нужного размера, как только вы узнаете, сколько сообщений у вас есть. Наконец, используйте Join, чтобы показать все сообщения в одном MsgBox. Вот пример.

Dim rSEL, rSUM, rDes As DAO.Recordset 
Dim vItem_id, vQnty, vSum As Integer 
Dim vDes As String 
Dim aMsg() As String 
Dim lCnt As Long 

If Not IsNull(itemId) And Not IsNull(qnty_in) Then 

    If qnty_in <= 0 Or qnty_in > balance Or IsNull(balance) Then 
     Cancel = True 
    End If 

    Set rSEL = CurrentDb.OpenRecordset("SELECT item_id,item_qnty FROM basketQnty_tbl WHERE basket_id=" & basketId) 
    'Check to see if the recordset actually contains rows 
    If Not (rSEL.EOF And rSEL.BOF) Then 
     rSEL.MoveFirst 

     ReDim aMsg(1 To rSEL.RecordCount * 10) 'make it bigger than you'll need 

     Do Until rSEL.EOF 
      'Save itemId into a variable 
      vItem_id = rSEL!item_id 
      vQnty = (rSEL!item_qnty) * qnty_in 
      Set rSUM = CurrentDb.OpenRecordset("SELECT sum(qnty_in*qnty_type) as QN FROM sales_tbl WHERE itemid=" & vItem_id) 
      Set rDes = CurrentDb.OpenRecordset("SELECT itemDesc FROM items_main WHERE itemId=" & vItem_id) 
      vSum = rSUM!QN 
      vDes = rDes!itemDesc 
      'Move to the next record. Don't ever forget to do this. 
      If vQnty > vSum Then 
       lCnt = lCnt + 1 
       aMsg(lCnt) = "you have only (" & vSum & ") of Item (" & vDes & ") in the stock" 
      End If 
      rSEL.MoveNext 
     Loop 
     If lCnt >= 1 Then 
      ReDim Preserve aMsg(1 To lCnt) 
      MsgBox Join(aMsg, vbNewLine) 
      Cancel = True 
     End If 
    End If 
    rSEL.Close 

End If 
+0

спасибо, мистер Дик , что точно, что мне нужно – user1364008

Смежные вопросы