VB и Базы данных

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Наглец
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 05.02.2009 (Чт) 12:30

VB и Базы данных

Сообщение Наглец » 06.02.2009 (Пт) 11:04

Что имеется:
А имеется у нас - база данных, дорогостоящий заказ и огромное желание его выполнить))

База:
http://www.sharemania.ru/files/manage?f ... DZtScAkCJV
(Сжатый вариант базы, в оригинале она весит ~300мб и содержит огромную, неразгребаемую кучу записей)

Заказ:
Нужно написать программу которая будет работать с этой базой данных, в базе хранится информация о входящем и исходящем трафике пользователей данной сети. Суть программы - это группировка этого трафика по пользователям, т.е.:

Январь
Иванов - 174мб
Пертров - 230мб
Сидоров - 2.1гб (Ага, попался :twisted: )

Имена пользователей находитсяв столбце USERNAME, количество исходящего от пользователя трафика в столбце BYTESIN, входящего в столбце BYTESOUT.
С базами данных я работаю первый раз, по этому сейчас буду задавать глупые вопросы :roll:

Как мне реализовать в программе отчет сгруппированый по пользователям? Писать свою функцию группировки или воспользоваться уже какой-либо готовой функцией VB или SQL? Если готовой то какой?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: VB и Базы данных

Сообщение alibek » 06.02.2009 (Пт) 12:53

Какой отчет собираешься использовать?
Lasciate ogni speranza, voi ch'entrate.

Наглец
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 05.02.2009 (Чт) 12:30

Re: VB и Базы данных

Сообщение Наглец » 06.02.2009 (Пт) 13:03

DataReport

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: VB и Базы данных

Сообщение alibek » 06.02.2009 (Пт) 15:05

Если нужен только сводный отчет, то в этом случае я бы советовал делать группировку при запросе (указав group by user_id, user_name), а в отчет выводить полученные сгруппированные результаты.
Lasciate ogni speranza, voi ch'entrate.

Наглец
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 05.02.2009 (Чт) 12:30

Re: VB и Базы данных

Сообщение Наглец » 07.02.2009 (Сб) 0:28

Можно поподробней пожалуйста? :roll:

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: VB и Базы данных

Сообщение iGrok » 07.02.2009 (Сб) 2:02

Наглец писал(а):Можно поподробней пожалуйста? :roll:

Допустим, у тебя в БД строки:
Код: Выделить всё
username, bytesin
----------------------
mark, 100
andrew, 20
mark, 16
andrew, 55
andrew, 11

Тогда запрос вида SELECT USERNAME, SUM(BYTESIN) AS SUM, COUNT(BYTESIN) AS COUNT FROM [table] GROUP BY USERNAME даст результат:
Код: Выделить всё
USERNAME, SUM, COUNT
----------------------
mark, 116, 2
andrew, 86, 3


FIX:
Поправил пост, по замечанию Тёмыча.
Последний раз редактировалось iGrok 07.02.2009 (Сб) 20:24, всего редактировалось 2 раз(а).
label:
cli
jmp label

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: VB и Базы данных

Сообщение tyomitch » 07.02.2009 (Сб) 20:08

s/COUNT/SUM/
Изображение

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: VB и Базы данных

Сообщение iGrok » 07.02.2009 (Сб) 20:18

tyomitch писал(а):s/COUNT/SUM/

Тьфу. Точно. Спасибо.

Чё ж меня так глючит-то..

То, что я писал даст SUM.
А COUNT выдаст кол-во строк..
label:
cli
jmp label

Наглец
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 05.02.2009 (Чт) 12:30

Re: VB и Базы данных

Сообщение Наглец » 09.02.2009 (Пн) 22:51

Спасибо!
Еще один вопрос: как добавить переменную в SQL запрос?
При таком методе выдает ошибку: "Отсутствует значение для одного или нескольких параметров"

Dim StrTime As Integer
StrTime = 3454579442
Set rs = cn.Execute("Select * from HISTORY Where [STARTTIME] > StrTime")

Наглец
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 05.02.2009 (Чт) 12:30

Re: VB и Базы данных

Сообщение Наглец » 09.02.2009 (Пн) 23:05

Сам додумался :)
Пусть останется, вдруг кому-то пригодится.

Dim StrTime As Integer
StrTime = "3482964533"
sql = "Select * from HISTORY Where [STARTTIME] > " & StrTime
Set rs = cn.Execute(sql)

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Re: VB и Базы данных

Сообщение dr.MIG » 10.02.2009 (Вт) 13:15

Но обычно для избежания потенциально возможных неприятностей всё-таки лучше использовать параметрический запрос, нежели сборку строки запроса из фрагментов.
Salus populi suprema lex

Наглец
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 05.02.2009 (Чт) 12:30

Re: VB и Базы данных

Сообщение Наглец » 18.02.2009 (Ср) 16:45

При таком запросе:
Set rs = cn.Execute("SELECT USERNAME, SUM(BYTESOUT) AS SUM, COUNT(BYTESOUT) AS COUNT FROM [HISTORY] GROUP BY USERNAME")

Программа ругается на "Ошибочное или пропущенное зарезервированное слово или аргумент в инструкции SELECT или неверная пунктуация"

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: VB и Базы данных

Сообщение alibek » 19.02.2009 (Чт) 9:19

Попробуй выбрать альяс, который не совпадает с зарезервированным словом. USUM и UCNT например.
И кстати, COUNT(*) наверное было бы правильнее.
Lasciate ogni speranza, voi ch'entrate.

Наглец
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 05.02.2009 (Чт) 12:30

Re: VB и Базы данных

Сообщение Наглец » 19.02.2009 (Чт) 11:53

Большущее спасибо :!: Работает :drunken:

Наглец
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 05.02.2009 (Чт) 12:30

Re: VB и Базы данных

Сообщение Наглец » 19.02.2009 (Чт) 12:32

Возникла новая проблемка:

Private Declare Function OemToCharBuff Lib "user32.dll" Alias "OemToCharBuffA" (ByVal lpszSrc As String, ByVal lpszDst As_ String, ByVal cchDstLength As Long) As Long

Private Sub Command3_Click()
Dim a As String
Dim Name As String
a = "абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"

Call ConnectDB
Set rs = cn.Execute("SELECT USERNAME, SUM(BYTESOUT) AS USUM, COUNT(BYTESOUT) AS UCNT FROM [HISTORY] GROUP BY USERNAME")
While Not rs.EOF
Name = OemToCharBuff(a, rs.Fields("USERNAME"), Len(rs.Fields("USERNAME")))
List1.AddItem Name & vbTab & rs.Fields("USUM")
rs.MoveNext
Wend
cn.Close
End Sub

При таком коде ругается при коневертации из Dos кодировки в Win, а именно на строчке
"Name = OemToCharBuff(a, rs.Fields("USERNAME"), Len(rs.Fields("USERNAME")))" - "Неправильное использование Null"

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: VB и Базы данных

Сообщение iGrok » 19.02.2009 (Чт) 14:25

Проверяй строку в БД на NULL
Is Not rs.Fields(..) is Null Then ...
label:
cli
jmp label

Наглец
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 05.02.2009 (Чт) 12:30

Re: VB и Базы данных

Сообщение Наглец » 19.02.2009 (Чт) 15:46

При таком способе:
If Not rs.Fields("USERNAME") Is Null Then
Name = OemToCharBuff(a, rs.Fields("USERNAME"), Len(rs.Fields("USERNAME")))
End If
Пишет: "Необходим обьект"

При таком способе:
If rs.Fields("USERNAME") <> 0 Then
После обработки этой строчки:
Name = OemToCharBuff(a, rs.Fields("USERNAME"), Len(rs.Fields("USERNAME")))
Переменная Name = "1"

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: VB и Базы данных

Сообщение iGrok » 19.02.2009 (Чт) 19:03

Блин. Сорри. Давно с БД не работал.
If Not IsNull(rs.Fields(...)) Then
label:
cli
jmp label

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: VB и Базы данных

Сообщение Andrey Fedorov » 20.02.2009 (Пт) 14:20

alibek писал(а):Попробуй выбрать альяс, который не совпадает с зарезервированным словом. USUM и UCNT например.


Ну, можно просто писать поле в квадратных скобках, например так: SUM(BYTESOUT) AS [SUM]
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: VB и Базы данных

Сообщение Andrey Fedorov » 20.02.2009 (Пт) 14:34

Более правильный вариант:

Код: Выделить всё
Public Declare Function "OemToCharA" (ByVal lpszSrc As String, ByVal lpszDst As String) As Long
....
Dim rs As New ADODB.Recordset, s As string, ss As String
....
Set rs As New ADODB.Recordset
rs.Open"SELECT USERNAME, SUM(BYTESOUT) AS [SUM], COUNT(BYTESOUT) AS UCNT FROM [HISTORY] GROUP BY USERNAME", cn, adOpenStatic, adLockReadOnly
DO Until rs.EOF
    If Not IsNull(rs(0)) Then
        s = rs!USERNAME: ss = s
        OemToCharA  s, ss
        List1.AddItem ss & vbTab & rs(1)
        rs.MoveNext
    End If
Loop
...


А вообще для DBF-ки достаточно правильно установить 29-ый байтик и все данные в ней сразу будут в нужной кодировке...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Наглец
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 05.02.2009 (Чт) 12:30

Re: VB и Базы данных

Сообщение Наглец » 24.02.2009 (Вт) 14:38

Спасибо! Но ничего не работает :roll:
Name все еще возвращает единицы, а в "Более правильном варианте" куча ошибок. :wink:

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: VB и Базы данных

Сообщение Andrey Fedorov » 24.02.2009 (Вт) 21:42

Наглец писал(а):Спасибо! Но ничего не работает :roll:
Name все еще возвращает единицы, а в "Более правильном варианте" куча ошибок. :wink:


Пришлось таки смотреть твою DBF-ку...

Значит так - идешь и скачиваешь провайдер по ссылке: http://www.microsoft.com/downloads/deta ... layLang=en
После чего устанавливаешь его. Ну а далее все примитивно:

Код: Выделить всё
Public Sub Test()
    Dim cn As New ADODB.Connection, r As New ADODB.Recordset
    Dim s As String, ss As String
   
    Debug.Print
    Debug.Print
   
    cn.CursorLocation = adUseClient
    cn.Open "Provider=VFPOLEDB.1;Data Source=""" & CurrentProject.Path & """;Password="""";Collating Sequence=RUSSIAN"

    r.Open "SELECT * FROM History", cn, adOpenStatic, adLockReadOnly
    Do Until r.EOF
        Debug.Print r!id, r!compname, r!username
        r.MoveNext
    Loop
End Sub
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: VB и Базы данных

Сообщение Andrey Fedorov » 24.02.2009 (Вт) 21:43

Andrey Fedorov писал(а):
Наглец писал(а):Спасибо! Но ничего не работает :roll:
Name все еще возвращает единицы, а в "Более правильном варианте" куча ошибок. :wink:


Пришлось таки смотреть твою DBF-ку...

Значит так - идешь и скачиваешь провайдер по ссылке: http://www.microsoft.com/downloads/deta ... layLang=en
После чего устанавливаешь его. Ну а далее все примитивно:

Код: Выделить всё
Public Sub Test()
    Dim cn As New ADODB.Connection, r As New ADODB.Recordset
    Dim s As String, ss As String
   
    Debug.Print
    Debug.Print
   
    cn.CursorLocation = adUseClient
    cn.Open "Provider=VFPOLEDB.1;Data Source=""" & CurrentProject.Path & """;Password="""";Collating Sequence=RUSSIAN"

    r.Open "SELECT * FROM History", cn, adOpenStatic, adLockReadOnly
    Do Until r.EOF
        Debug.Print r!id, r!compname, r!username
        r.MoveNext
    Loop
End Sub


P.S Если заказ серъезный, то тебе его не потянуть...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Наглец
Начинающий
Начинающий
 
Сообщения: 21
Зарегистрирован: 05.02.2009 (Чт) 12:30

Re: VB и Базы данных

Сообщение Наглец » 26.02.2009 (Чт) 10:14

Я с ним уже заканчиваю, остался последний штрих - кодировка из доса в вин и дизайн. Могу выложить проект с открытым кодом, может кто-то что-то подскажет по поводу оптимизации.

Скачать файл ITC.rar

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: VB и Базы данных

Сообщение Andrey Fedorov » 26.02.2009 (Чт) 12:25

Наглец писал(а):Я с ним уже заканчиваю,


Ну тогда у нас просто разное понятие о дорогостоящих проектах... :lol:

Наглец писал(а):остался последний штрих - кодировка из доса в вин...


Вообще-то у тебя таблица не в OEM кодировке, а самой настоящей ANSII (1251).
Табличка создана в Visual FoxPro и чтобы с ней нормально работать нужно всего лишь установить провайдер об котором я писал выше. Больше ничего ине нужно...

И для начала - вставь в начало своеего кода Option Explicit. И отформатируй его так чтобы он был читабельным...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: VB и Базы данных

Сообщение Andrey Fedorov » 26.02.2009 (Чт) 12:56

Наглец писал(а):может кто-то что-то подскажет по поводу оптимизации.


Изучить Help по функциям DateAdd и DateDiff - они резко сократят твой код.

Ну и обзывай контролы понятней - тебе же удобней...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 51

    TopList