Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Суммирование нескольких Label.Caption


Автор: Flotskiy 7.12.2005, 12:08
Всем добрый день!
Подскажите, pse, на такой примерно вопрос:
SQL- запросом получил кол-во студентов 1 курса,
Вторым- получил кол-во студентов 2 курса, и т.д.
Данные вывел в Label(1-10) , потом все данные нужно просуммировать примерно так:
Код

Label11.Caption=Label1.Caption & Label2.Caption ... и т.д.

Конечно, ничего не получается, а когда Label заменил на TextBox
то все нормально. Если я правильно сообразил, на форме нужно менять Label на TextBox, и корректировать код. Большой объем работы.
Посоветуйте.
С уважением

Автор: Exception 7.12.2005, 12:36
А что именно не выходит?

Автор: Flotskiy 7.12.2005, 13:56
Run-time error, Привет.
Запросом В Label1 выводится кол-во студентов 1 курса ( 50) чел.
В Label2 выводится кол-во студентов 2 курса (60) и т.д.
Цитата
Label11.Caption=Label1.Caption & Label2.Caption ... и т.д.

Хотел просуммировать и вывести в Label11 (50+60 =110), а данный код выводит (5060)
Примерно так
С уважением


Автор: Exception 7.12.2005, 14:19
Код

Label11.Caption = CInt(Label1.Caption) + CInt(Label2.Caption)

Автор: Akina 7.12.2005, 14:36
Label.Caption имеет тип String. Вообще-то.
Так что
Код

LabelSum.Caption = Trim(Str(Val(Label1.Caption)+Val(Label2.Caption)+...))

Можно слегка упростить себе жизнь по типу:
Код

temp=0
for each OneControl in Controls
   if OneControl.tag = "StudentsAmount" Then
      temp=tem + val(OneControl.Caption)
   end if
next
LabelSum.Caption = Trim(Str(temp))

Автор: Exception 7.12.2005, 15:17
Ну да smile
Код был состряпан на уроке из головы smile

Автор: Akina 7.12.2005, 15:33
Цитата(Flotskiy @ 7.12.2005, 13:08)
SQL- запросом получил кол-во студентов 1 курса,
Вторым- получил кол-во студентов 2 курса, и т.д.

А почему бы SQL-запросом не получить еще и общее количество студентов, а?

Автор: bankuss 7.12.2005, 16:52
Val лучше заменить Cint, а так все прально

Автор: Exception 7.12.2005, 17:42
Цитата(Akina @ 7.12.2005, 16:33)
А почему бы SQL-запросом не получить еще и общее количество студентов, а?

Это лишняя нагрузка на базу данных. Но при 100-1000 записях это не принципиально

Автор: Akina 7.12.2005, 19:02
Цитата(bankuss @ 7.12.2005, 17:52)
Val лучше заменить Cint

Ты прав, CInt в данном случае будет работать почти вдвое быстрее... впрочем кто это заметит?

Автор: cardinal 7.12.2005, 22:54
Цитата(Akina @ 7.12.2005, 17:02)
впрочем кто это заметит?

ИХМО такой подоход - неправильный.

Автор: Flotskiy 8.12.2005, 06:27
Доброе утро всем!
Благодарю за участие, в решении данного вопроса. Сию буду разбираться.
Немного поясню. В Access построил запрос на выборку:
Код

SELECT Count(StudentG.Familj) AS Count_Familj
FROM StudentG
GROUP BY StudentG.Kurs, StudentG.Fak
HAVING (((StudentG.Kurs) Like "1") AND ((StudentG.Fak)="Г"))
ORDER BY Count(StudentG.Familj);

Таких запросов очень много и связываю с формой (Label) при помощи Control Data, в итоге на форме около 30 Data. Что-то нагородил...
Второй метод запросов пробовал в самой форме:
Код

Option Explicit

    connectString = "Provider=Microsoft.Jet.OLEDB.3.51;" _
                 & "Data Source=C:\Biblioteka1\bibliot.mdb"
Dim connectString As String
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Dim adoConnection As ADODB.Connection
Dim adoRecordset As ADODB.Recordset
  Dim sSqlString As String
  Set adoConnection = New ADODB.Connection
  Set adoRecordset = New ADODB.Recordset
' XXXXXXXXXXXXXXXXXXXX 0_ЭК_Оч  XXXXXXXXXXXXXXXXXX
        sSqlString = "SELECT StudID " & _
                     " FROM StudentG " & _
                     " WHERE Kurs='1' AND Fak='" & strFak & "' AND FormaOb='" & lblVid(0).Caption & "'" 
adoConnection.Open connectString
adoRecordset.CursorLocation = adUseClient
adoRecordset.Open sSqlString, adoConnection
lblKol(0).Caption = adoRecordset.RecordCount
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Вот такой SQL-код вытаскивает данные: кол-во студентов 1 курса, факультета "Экономика", форма обучения "Очное"
Таким образом повторяется код еще 30 раз, на другие данные.
Очень тяжелая прога. Наверно есть какай-то другой способ добывание данных
Посоветуйте, pse.
С уважением


Автор: Flotskiy 8.12.2005, 08:31
Привет всем!
Взял Run-time error
Цитата

Label11.Caption = CInt(Label1.Caption) + CInt(Label2.Caption)

Получилось то что надо
Благодарю всех, наилучшие пожелания!



Автор: Akina 8.12.2005, 11:11
Цитата(Flotskiy @ 8.12.2005, 09:31)
Получилось то что надо

Предлагаю все-таки поправить - ты используешь неявное приведение типа Integer к типу String, а такая привычка опасна...

Автор: Flotskiy 8.12.2005, 13:55
Akina, исправил на
Код

Label11.Caption = Val(Label1.Caption) + Val(Label2.Caption)

Благодарю за помощь. Всего доброго

Автор: Exception 8.12.2005, 14:17
Цитата(Flotskiy @ 8.12.2005, 14:55)
Akina, исправил на

код Visual Basic
1:

Label11.Caption = Val(Label1.Caption) + Val(Label2.Caption)





Благодарю за помощь. Всего доброго

Скорее
Код

Label11.Caption = Str$(Val(Label1.Caption) + Val(Label2.Caption))


Автор: Exception 8.12.2005, 14:44
Цитата(Flotskiy @ 8.12.2005, 07:27)
Наверно есть какай-то другой способ добывание данных

Используй выражение COUNT

Автор: Akina 8.12.2005, 18:26
Правильно так:
Код

Label11.Caption = CStr(CInt(Label1.Caption) + CInt(Label2.Caption))

Почему:
CInt преобразует к Integer, а Val - к Variant(Integer)
CStr преобразует к String, а Str - к Variant(String)

Автор: Exception 8.12.2005, 18:41
Тогда вместо Str Str$. Но я этого раньше не замечал, респект

Автор: Akina 8.12.2005, 19:12
Цитата(Run @ 8.12.2005, 19:41)
Тогда вместо Str Str$. Но я этого раньше не замечал

В VB6 нет функции Str$. Однако компилятор ее нормально проглатывает - потому что в целЯх совместимости, но использует все одно Str. Это видно по времени исполнения:

Код

Dim t As Double
Dim i As Long
Dim s As String

t = Timer
For i = 1 To 100000
    s = CStr(CInt("123"))
Next
t = Timer - t
Debug.Print t
t = Timer
For i = 1 To 100000
    s = Str(CInt("123"))
Next
t = Timer - t
Debug.Print t
t = Timer
For i = 1 To 100000
    s = Str$(CInt("123"))
Next
t = Timer - t
Debug.Print t

Цитата(Debug)
0,109
0,172
0,172

Соотношение времен приблизительно 2:3, т.к. в первом случае 2 преобразования (String - Integer - String), а во втором и третьем - три (String - Integer - Variant - String).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)