Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Подгружать данные в функцию / 9 сообщений из 9, страница 1 из 1
23.09.2020, 16:37
    #40001750
VistaSV30
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подгружать данные в функцию
Добрый день!

Подскажите как правильно делать?

У меня создана функция, которая использует данные из файла. Получается, что каждый раз когда я вызываю функцию, идет обращение к файлу.
Правильно ли это?
Может быть как-то можно предварительно перед первым вызовом функции загрузить данные в переменную и потом обращаться только к этой переменной?

Можно было бы хранить данные внутри функции, но это список из почти 1000 строк и иногда приходится их корректировать.

Спасибо!
...
Рейтинг: 0 / 0
23.09.2020, 16:46
    #40001753
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подгружать данные в функцию
VistaSV30
Добрый день!

Подскажите как правильно делать?

У меня создана функция, которая использует данные из файла. Получается, что каждый раз когда я вызываю функцию, идет обращение к файлу.
Правильно ли это?
Может быть как-то можно предварительно перед первым вызовом функции загрузить данные в переменную и потом обращаться только к этой переменной?

Можно было бы хранить данные внутри функции, но это список из почти 1000 строк и иногда приходится их корректировать.

Спасибо!


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

единственно вопрос к вам , выгрузка идет из Excel ведь?
...
Рейтинг: 0 / 0
23.09.2020, 17:13
    #40001763
VistaSV30
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подгружать данные в функцию
Сергей Лалов, спасибо за ответ!

Выгрузка делается из простого текстового файла
...
Рейтинг: 0 / 0
23.09.2020, 17:41
    #40001773
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подгружать данные в функцию
VistaSV30
Сергей Лалов, спасибо за ответ!

Выгрузка делается из простого текстового файла


Покажите функцию, что она дает на выходе?
...
Рейтинг: 0 / 0
23.09.2020, 17:52
    #40001783
VistaSV30
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подгружать данные в функцию
Сергей Лалов, функция определяет склонение слова в зависимости от введенного числового значения
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
Function Склонение(Wr As String, vl As Long, Optional prn As String) As String 'Если prn=1 показатель выводится
' исправлено - 25.07.19: учитывается числа 11 - 19
'Wr - слово
On Error GoTo ErrorHandler

Dim vl1 As Long, vl2 As Integer, vl3 As Integer, i As Integer, vls As String
Dim iTempPath$, a
Dim NameDir As String

NameDir = ActiveWorkbook.Path

iTempPath = NameDir & "\declension.txt" 'адрес словаря
  'считываем словарь в переменную "а"
  a = Split(CreateObject("Scripting.FileSystemObject").Getfile(iTempPath).OpenasTextStream(1).ReadAll, vbNewLine)

  vl1 = vl - Fix(vl / 10) * 10
   Select Case vl1
     Case 1: vl1 = 1
     Case 2 To 4: vl1 = 2
     Case 0, 5 To 9: vl1 = 3
   End Select

  If vl > 10 Then ' проверка - последние 2 цифры >10 And <20
     vl3 = vl - Fix(vl / 100) * 100
     If vl3 > 10 And vl3 < 20 Then vl1 = 3
  End If


' Исключения
   If LCase(Wr) = "пожары" Then Wr = "пожар"
   If LCase(Wr) = "гибель" Then Wr = "погибло"
   If LCase(Wr) = "травмы" Then Wr = "травмировано"
   If LCase(Wr) = "ребёнка" And vl > 10 Then Wr = "детей"
      
   vl2 = 0
   For i = 1 To UBound(a) + 1
     vl2 = vl2 + 1
     If a(i - 1) = LCase(Wr) Then GoTo wS
     If vl2 = 3 Then vl2 = 0
   Next
wS:
   vl2 = vl2 - vl1
   Склонение = a(i - 1 - vl2): a = "" ' Очистить переменную
   
   ' Провека регистра символов
       ' Если только первая буква прописная
       If (Mid(Wr, 1, 1) Like "[A-Z,А-Я]") Then Склонение = StrConv(Mid(Склонение, 1, 1), vbUpperCase) & Right(Склонение, Len(Склонение) - 1)
       ' Если первая и последняя буквы слова прописные, то все слово переводится в верхний регистр
       If (Mid(Wr, 1, 1) Like "[A-Z,А-Я]") And (Mid(Wr, Len(Wr), 1) Like "[A-Z,А-Я]") Then Склонение = StrConv(Склонение, vbUpperCase)
   ' Форматирование показателя - добавление пробела между разрядами
       vls = vl
       If vl > 999 Then vls = Left(vls, Len(vls) - 3) & Chr(160) & Right(vls, 3)
       If vl > 999999 Then vls = Left(vls, Len(vls) - 7) & Chr(160) & Right(vls, 7)
   ' Выводит показатель
       If prn = "0" Then prn = ""
       If Len(prn) > 0 Then Склонение = vls & Chr(160) & Склонение

Exit Function
ErrorHandler:
  On Error Resume Next
  Склонение = "[Ошибка! Проверьте введенное слово!]"
End Function
...
Рейтинг: 0 / 0
23.09.2020, 18:02
    #40001795
istrebitel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подгружать данные в функцию
Как вариант проверять дату модификации файла, читаем файл в глобальную переменную, запоминаем дату модификации, при последующих обращениях проверяем, если дата не совпадает с запомненной - перечитываем файл.
...
Рейтинг: 0 / 0
23.09.2020, 18:56
    #40001847
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подгружать данные в функцию
VistaSV30,
Да, тут особо переделывать то ничего и не надо, просто добавить одну глобальную переменную вверху модуля листа/формы/просто модуля и немного переписать код.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
Public globalTextString as String ' выносим текстовую переменную на уровень полей модуля






Function Склонение(Wr As String, vl As Long, Optional prn As String) As String 'Если prn=1 показатель выводится
' исправлено - 25.07.19: учитывается числа 11 - 19
'Wr - слово
On Error GoTo ErrorHandler

Dim vl1 As Long, vl2 As Integer, vl3 As Integer, i As Integer, vls As String
Dim iTempPath$, a
Dim NameDir As String
Dim a 
NameDir = ActiveWorkbook.Path
iTempPath = NameDir & "\declension.txt" 'адрес словаря

' -> ВОТ ЭТО ДОБАВЛЕНО 
If Len(globalTextString)>0 Then
   a = globalTextString 
Else
  'считываем словарь в переменную "а"
  a = Split(CreateObject("Scripting.FileSystemObject").Getfile(iTempPath).OpenasTextStream(1).ReadAll, vbNewLine)
End If
' <- КОНЕЦ ДОБАВЛЕННОГО БЛОКА

  vl1 = vl - Fix(vl / 10) * 10
   Select Case vl1
     Case 1: vl1 = 1
     Case 2 To 4: vl1 = 2
     Case 0, 5 To 9: vl1 = 3
   End Select

  If vl > 10 Then ' проверка - последние 2 цифры >10 And <20
     vl3 = vl - Fix(vl / 100) * 100
     If vl3 > 10 And vl3 < 20 Then vl1 = 3
  End If


' Исключения
   If LCase(Wr) = "пожары" Then Wr = "пожар"
   If LCase(Wr) = "гибель" Then Wr = "погибло"
   If LCase(Wr) = "травмы" Then Wr = "травмировано"
   If LCase(Wr) = "ребёнка" And vl > 10 Then Wr = "детей"
      
   vl2 = 0
   For i = 1 To UBound(a) + 1
     vl2 = vl2 + 1
     If a(i - 1) = LCase(Wr) Then GoTo wS
     If vl2 = 3 Then vl2 = 0
   Next
wS:
   vl2 = vl2 - vl1
   Склонение = a(i - 1 - vl2): a = "" ' Очистить переменную
   
   ' Провека регистра символов
       ' Если только первая буква прописная
       If (Mid(Wr, 1, 1) Like "[A-Z,А-Я]") Then Склонение = StrConv(Mid(Склонение, 1, 1), vbUpperCase) & Right(Склонение, Len(Склонение) - 1)
       ' Если первая и последняя буквы слова прописные, то все слово переводится в верхний регистр
       If (Mid(Wr, 1, 1) Like "[A-Z,А-Я]") And (Mid(Wr, Len(Wr), 1) Like "[A-Z,А-Я]") Then Склонение = StrConv(Склонение, vbUpperCase)
   ' Форматирование показателя - добавление пробела между разрядами
       vls = vl
       If vl > 999 Then vls = Left(vls, Len(vls) - 3) & Chr(160) & Right(vls, 3)
       If vl > 999999 Then vls = Left(vls, Len(vls) - 7) & Chr(160) & Right(vls, 7)
   ' Выводит показатель
       If prn = "0" Then prn = ""
       If Len(prn) > 0 Then Склонение = vls & Chr(160) & Склонение

Exit Function
ErrorHandler:
  On Error Resume Next
  Склонение = "[Ошибка! Проверьте введенное слово!]"
End Function



Обрати внимание, в какой то момент тебе захочется все таки прочитать файл заново, для этого на какую нить отдельную кнопку повесь обнуление глобальной переменной

Код: vbnet
1.
2.
3.
...
globalTextString = ""
...



и после нее обратись к своей функции еще раз
...
Рейтинг: 0 / 0
23.09.2020, 19:04
    #40001853
alecko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подгружать данные в функцию
сохранять в пол(е)-(ях) временной локальной таблицы и считывать оттуда-мне кажется так лучше.
...
Рейтинг: 0 / 0
23.09.2020, 19:12
    #40001856
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подгружать данные в функцию
Ну как варик да, сделать таблицу где хранить какие то важные показатели функции со значениями, чтобы наглядно можно было их менять.
Можно вообще извернуться и сделать без всяких переменных глобальных внутри функции переменную типа Static, или саму функцию типа Static. Но боюсь, что ТС просто не вкурит как это работает, когда он захочет все таки в какой то момент перезагрузить источник.
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Подгружать данные в функцию / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]