Логика программы

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Логика программы

Сообщение Summer.05 » 12.09.2007 (Ср) 11:28

Здравствуйте, все!
Прошу подсказать, как лучше выстроить логику кода.

Суть: есть база данных диссертаций (mdb), включающая 7 текстовых файлов (научный руководитель, объект, предмет, цели, задачи, структура, новизна).

При загрузке формы выводится информация о фамилии автора диссертации в TDBGrid1.

Нажав на нужную фамилию, в семи TexBox'ах отражаются соответствующие текстовые файлы.
Их загрузка идет по коду

Код: Выделить всё
Dim FN As Integer
Dim FName As String

Private Sub Text90_Change()

'___________________________Иванов Иван Иванович
If Text90.Text = "Иванов Иван Иванович" Then

FN = FreeFile
FName = App.Path & "\" & "Text\ivanov\nk.txt" 'научный консультант
Open FName For Input As #FN
Text5.Text = Input(LOF(FN), #FN)
Close #FN

FN = FreeFile
FName = App.Path & "\" & "Text\ivanov\ob.txt" 'объект
Open FName For Input As #FN
Text6.Text = Input(LOF(FN), #FN)

FN = FreeFile
FName = App.Path & "\" & "Text\ivanov\pr.txt" 'предмет
Open FName For Input As #FN
Text7.Text = Input(LOF(FN), #FN)

FN = FreeFile
FName = App.Path & "\" & "Text\ivanov\cel.txt" 'цель
Open FName For Input As #FN
Text8.Text = Input(LOF(FN), #FN)

FN = FreeFile
FName = App.Path & "\" & "Text\ivanov\zad.txt" 'задачи
Open FName For Input As #FN
Text9.Text = Input(LOF(FN), #FN)

FN = FreeFile
FName = App.Path & "\" & "Text\ivanov\ogl.txt" 'структура
Open FName For Input As #FN
Text10.Text = Input(LOF(FN), #FN)

FN = FreeFile
FName = App.Path & "\" & "Text\ivanov\nov.txt" 'новизна
Open FName For Input As #FN
Text11.Text = Input(LOF(FN), #FN)
End If


Проблема: в базе данных - 3000 диссертаций. Значит ли это, что я должен таких блоков кода вставить 3000 раз?
Или есть другая логика построения кода для решения проблемы?
Если такая логика есть, буду признателен за совет!
С уважением,

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 12.09.2007 (Ср) 12:00

Это значит, что ты сам должен придумать такую логику, чтобы не копировать этот код 3000 раз. Грубо - перебрать папки в App.Path & "\" & "Text\" и закинуть файлы куда надо из каждой. Детали зависят от структуры папок, названий файлов (могут быть разные?) и т.п.
Лучший способ понять что-то самому — объяснить это другому.

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 12.09.2007 (Ср) 12:18

Приветствую, Повелитель!
Ты прав, я должен придумать. Только вот что-то не думается)))
Как бы я не сортировал файлы в папке Text, все равно приходится их загружать по отдельной команде для каждого файла, так как все семь TexBox выводят разную информацию для каждого из 3000 человек.
Итого - 3000 раз вводить один и тот же кусок кода.
Это именно то, чего я хочу избежать.
Что может быть еще полезным?

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 12.09.2007 (Ср) 13:15

Как вариант можно создать в базе вспомогательную табличку FolderFio с полями
FIO - ФИО человека
Folder - Каталог, где находятся все файлы имеющие отношение к данному человеку

Написать небольшую ф-ию
Код: Выделить всё
Private Function GetFolderByFio(Fio as String) as String
   'Найти в базе каталог, соответствующий этому человеку
End Function

и вместо
Код: Выделить всё
If Text90.Text = "Иванов Иван Иванович" Then ...


Писать:
Код: Выделить всё
sFolder = GetFolderByFio(Text90.Text)

Ну и дальше подставлять везде в процедуре уже эту переменную, в которой содержится путь к требуемому каталогу.
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 12.09.2007 (Ср) 14:03

Спасибо, начинает проясняться!

Однако, вопросы не сняты.
Первый:
VVitafresh писал(а):Как вариант можно создать в базе вспомогательную табличку FolderFio с полями
FIO - ФИО человека
Folder - Каталог, где находятся все файлы имеющие отношение к данному человеку

Понятно, что в этой таблице будет 6000 полей. Не является этот путь лишь усложнением задачи?

Второй.
[/quote]
Писать:
Код: Выделить всё
sFolder = GetFolderByFio(Text90.Text)

Ну и дальше подставлять везде в процедуре уже эту переменную, в которой содержится путь к требуемому каталогу[/quote]

А как загрузить семь текстовых файлов в семь текстбоксов по каждому из 3000 авторов диссертации из 3000 каталогов?

Однако, весьма интеерсным является вопрос объединения в папки, спасибо еще раз!

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 12.09.2007 (Ср) 15:27

Summer.05 писал(а):Не является этот путь лишь усложнением задачи?
Думаю, нет. Уточню, что хранить можно (и нужно) не абсолютный путь, а относительный.

Summer.05 писал(а):А как загрузить семь текстовых файлов в семь текстбоксов по каждому из 3000 авторов диссертации из 3000 каталогов?

Неужели нужно загружать данные по всем 3000 авторов ОДНОВРЕМЕННО? :shock:
Если да, то считаю это совершенно неправильным. Я представлял себе так. Пользователь выбирает искомое ФИО и получает 7 текстобоксов с информацией. Выбирает другое ФИО, получает следующие 7 текстбоксов (точнее информация в текстбоксах обновляется новыми данными).
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 12.09.2007 (Ср) 16:35


Неужели нужно загружать данные по всем 3000 авторов ОДНОВРЕМЕННО? )


Нет, не нужно, ты прав!
Пользователь выбирает искомое ФИО и получает 7 текстобоксов с информацией. Выбирает другое ФИО, получает следующие 7 текстбоксов (точнее информация в текстбоксах обновляется новыми данными)


Абсолютно верно!
Но КАК сделать, чтобы загрузка всех текстбохов осуществлялась только одним маленьким блоком команд?

Может быть, циклом ввода семи текстовых файлов в текстбоксы с подстановкой переменной, содержащей директорию конкретного автора по твоему предложению?

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 12.09.2007 (Ср) 17:09

На форме: поле ввода txtFio -- для ввода ФИО, кнопка cmdSearch -- для запуска поиска и тексбоксы -- для загрузки инфы из текстовых файлов.
Код: Выделить всё
Private Sub cmdSearch_Click()
    'После ввода ФИО в txtFio нажимаем кнопку Search
    Dim sFolder As String
    sFolder = GetFolderByFio(txtFio.Text)
    If sFolder = "" Then MsgBox "По данному ФИО нет информации в базе": Exit Sub
    Call FillTextBoxes(sFolder)
End Sub

Private Function GetFolderByFio(Fio As String) As String
        'Найти в базе каталог, соответствующий этому человеку
End Function

Private Sub FillTextBoxes(sFolder As String)
    'Заполняем текстбоксы информацией
    Dim FN As Integer
    Dim FName As String

    FN = FreeFile
    FName = sFolder & "1.txt" 'Загружаем инфу в первый тестбокс (названия файлов я так предполагаю одинаковые?)
    Open FName For Input As #FN
    Text1.Text = Input(LOF(FN), #FN)
    Close #FN
   
    'Ну и в остальные тексбоксы аналогично
End Sub
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 12.09.2007 (Ср) 17:24

VVitafresh
Спасибо, класс, буду пробовать.

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

Сообщение Andrey Fedorov » 13.09.2007 (Чт) 13:32

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

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 13.09.2007 (Чт) 18:44

Andrey Fedorov
Вероятно, да.
Можно ли чуть подробнее?
Заранее признателен!

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 13.09.2007 (Чт) 20:32

Andrey Fedorov, а мне кажется, что не стоит пихать в базу файлы. Зачем они там нужны, если прекрасно так лежат в каталогах на винчестере? :)

Если файлов будет много и они будут периодически обновляться, база начнет пухнуть как на дрожжах. Придется реализовывать в программе периодическое сжатие БД. Зачем усложнять задачу?
Последний раз редактировалось VVitafresh 13.09.2007 (Чт) 20:59, всего редактировалось 2 раз(а).
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

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

Сообщение Andrey Fedorov » 13.09.2007 (Чт) 20:46

VVitafresh писал(а):Andrey Fedorov, а мне кажется, что не стоит пихать в базу файлы. Зачем они там нужны, если прекрасно так лежат в каталогах на винчестере? :)


Ну, тут выбор только твой.

VVitafresh писал(а):Если файлов будет много и они будут периодически обновляться, база начнет пухнуть как на дрожжах.


Ну, файлики ведь прекрасно архивируются перед помещением в базу.

VVitafresh писал(а):Придется реализовывать в программе периодическое сжатие БД. Зачем усложнять задачу?


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

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 13.09.2007 (Чт) 21:01

Andrey Fedorov, я так понял Summer.05 не профи в программировании, поэтому предлагаю самый простой в реализации задачи вариант.

А задачу я понял так (надеюсь правильно). Есть определенный список людей, которые написали диссертации и есть фиксированный набор текстовых файлов, который прилагается к каждой диссертации. Нужно просто реализовать быстрый поиск и вывод информации из этих файлов на экран.
Считаю, что распихать эти файлы по каталогам самый простой и гибкий вариант. Т.к., если информация обновится, достаточно будет просто заменить файлик на диске, не надо даже в базу лезть.
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

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

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

VVitafresh писал(а):поэтому предлагаю самый простой в реализации задачи вариант.


Тогда уж в дополнение к вышесказанному тобой - на папку содержащую каталоги людей поставить атрибутик "сжимать" - это вроде понятно для чего. И папки людей обзывать номером ID-шки конкретного человека, а не по фамилии/имени ибо они могут меняться.
--

Но что-то меня сильно смущают его файлики - судя по комментариям в коде они совсем маленькие - то бишь им место явно в базе (точнее их содержимому). Ну посуди сам, что он собрался хранить в файле научный консультант - ведь явно там будет лишь ФИО одного или нескольких человек. Аналогично и с другими файликами...

Собственно диссертации там у него нет, да и в txt-формате редко какую сохранишь - это может быть куча файлов разного формата, если хранить по серъезному.

Так что, для той мелочевки что он собрался хранить, это должны быть обычные поля таблицы, которые отображаются в TextBox-ах. И никаких премудростей с файлами вообще!

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

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 14.09.2007 (Пт) 7:33

VVitafresh
Спасибо тебе еще раз, ты все понял правильно и все уже заработало именно так, как я хотел.

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

Сообщение alibek » 14.09.2007 (Пт) 7:37

Andrey Fedorov писал(а):А почему бы не хранить содержимое файлов в базе?
Ну ведь проще, да и удобней...

У каждого способа есть свои плюсы и минусы.
Я обычно предпочитаю в базе хранить ссылки.
Lasciate ogni speranza, voi ch'entrate.

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 14.09.2007 (Пт) 7:41

Andrey Fedorov
Привет, Профессор!
Спасибо за внимание!
1. Диссертаций у одного человека может быть только 2: кандидатская (к) и докторская (д).
2. Увы, в поля таблицы содержимое файлов не входит (255 символов). Даже название диссертации бывает длиннее.
3. Структура диссертации иногда включает по 5 глав, в каждой из которых по 5 параграфов. Название каждого достигает по три строчки. Итого - больше, чем пара страниц А4. А новизна и теоретическая значимость? В общем, не входит в поля таблицы, увы! Иначе я бы уже решил эту проблему сам, хотя
VVitafresh прав, я и близко к программированию не стоял. Так, в силу необходимости и любопытства, а также для решения конкретных задач.
4. Вот, скажи, пожалуйста, если директории с файлами лежат на диске, то как установить на на них атрибут "сжимать"?
Еще раз, спасибо Профессору от профессора)))

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

Сообщение Andrey Fedorov » 14.09.2007 (Пт) 8:45

Summer.05 писал(а):1. Диссертаций у одного человека может быть только 2: кандидатская (к) и докторская (д).


Ну две дык две...

Summer.05 писал(а):2. Увы, в поля таблицы содержимое файлов не входит (255 символов). Даже название диссертации бывает длиннее.


Установите для поля таблички тип MEMO - его вполне хватит.

Summer.05 писал(а):4. Вот, скажи, пожалуйста, если директории с файлами лежат на диске, то как установить на на них атрибут "сжимать"?


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

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 14.09.2007 (Пт) 9:34

Andrey Fedorov
Принято, спасибо!

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 24.10.2007 (Ср) 15:06

Приветствую всех!

По совету Большого Человека переношу вопрос сюда.

Суть: имеется база данных *.mdb (VB). Скажем, есть поле Title, в котором содержатся названия тем диссертаций.
Задача: прочитать все слова, имеющиеся в теме диссертации, отсортировать по алфавиту, отсеять те, которые менее трех букв, и весь список вывести в отдельное окно (text, например).
Вопрос: какова логика решения этой задачи?
Спасибо!

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

Сообщение iGrok » 24.10.2007 (Ср) 22:43

Summer.05 писал(а):Приветствую всех!

По совету Большого Человека переношу вопрос сюда.

Суть: имеется база данных *.mdb (VB). Скажем, есть поле Title, в котором содержатся названия тем диссертаций.
Задача: прочитать все слова, имеющиеся в теме диссертации, отсортировать по алфавиту, отсеять те, которые менее трех букв, и весь список вывести в отдельное окно (text, например).
Вопрос: какова логика решения этой задачи?
Спасибо!

Кхм. Ну по моему, ты сам все расписал.
Открыть базу, считать выборку по Title по одному слову(если оно не менее трех букв) в массив. За разделители принимать пробелы/запятые/точки, и.т.п.
Отсортировать массив.

В чем сложность?
label:
cli
jmp label

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 25.10.2007 (Чт) 7:46

iGrok
Да, понятно, по логике вещей - все так.
Но поскольку эта задача для меня принципиально новая, я и спросил совета. Раньше такую задачу решать не приходилось. Пока все упирается в синтаксис. Спасибо за ответ!

shady
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 09.11.2005 (Ср) 11:03

Сообщение shady » 25.10.2007 (Чт) 13:27

Можно попробывать что-то наподобие:
Код: Выделить всё
Dim s As String
Dim i As Long
Dim ss() As String

Dim rstTEMP As ADODB.Recordset
Set rstTEMP = New ADODB.Recordset
    rstTEMP.CursorLocation = adUseClient
    rstTEMP.LockType = adLockOptimistic
    rstTEMP.Fields.Append "Autor", adChar, 100
    rstTEMP.Open
s = "привет пока спасибо хз еще что"
ss = Split(s, " ")

    Do
        If Len(ss(i)) > 3 Then
              rstTEMP.AddNew "Autor", ss(i)
              Debug.Print ss(i)
        End If
        i = i + 1
    Loop While i <= UBound(ss)

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 25.10.2007 (Чт) 17:34

shady
Класс, спасибо, обязательно буду пробовать!

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 02.03.2008 (Вс) 18:20

Приветствую всех!
Прошу помочь тех, кто сочтет нужным откликнуться!
Есть mdb, VB6. В базе данных, в поле Name встречаются записи, совпадающие по первому слову:

Иванов Иван Иванович
Иванов Иван Иванович
Иванов Иван Иванович
Иванов Иван И.
Иванов И.И.
Иванов И.Иванович и т.д.

Надо:
1. Проводить сравнение только по ОДНОМУ ПЕРВОМУ слову из поля Name (т.е. "Иванов").
2. Не удалять повторяющиеся записи, а ПЕРЕНОСИТЬ в новую таблицу и те, которые уже есть в таблице (с которыми совпадают добавляемые), и те, которые добавляются совпадающими. Но переносить не только первое поле, а все поля соответствующих записей.
Заранее благодарен!

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 03.03.2008 (Пн) 0:15

Если правильно понял задачу, в качестве решения можно предложить добавить дополнительное поле Фамилия (LastName). И затем:
1. Пройтись в цикле по таблице, разбить ФИО split'ом на составные части и заполнить поле LastName для каждой записи.
Код: Выделить всё
Dim varFio As Variant
Dim LastName as String
varFio = Split(FIO, " ")
LastName=varFio(0)

2. Создать еще одну таблицу (table2), аналогичную по структуре первой (table1) и вставить туда повторяющиеся записи запросом
Код: Выделить всё
INSERT INTO table2 ( LastName, field2, field3,... )
SELECT table1.LastName, table1.field2, table1.field3,...
FROM table1
WHERE ((table1.LastName) In (SELECT [LastName] FROM [table1] As Tmp GROUP BY [LastName] HAVING Count(*)>1 ))

3. Если нужно, то удалить из исходной таблицы повторяющиеся записи
Код: Выделить всё
DELETE FROM table1
WHERE ((table1.LastName) In (SELECT [LastName] FROM [table1] As Tmp GROUP BY [LastName] HAVING Count(*)>1 ))
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 03.03.2008 (Пн) 0:52

VVitafresh

Спасибо, признателен! Буду пробовать!
Но ты прав - "Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень" )))


Вернуться в Базы данных

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

Сейчас этот форум просматривают: Mail.ru [бот] и гости: 255

    TopList