powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Подгружать данные в функцию
9 сообщений из 9, страница 1 из 1
Подгружать данные в функцию
    #40001750
Фотография VistaSV30
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

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

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

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

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

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

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

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

Спасибо!


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

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

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

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


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


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