Автоматическая генерация имен и объявление переменных посредством цикла?

Автор Dr_Lecter, 8 октября 2015, 21:53

0 Пользователи и 1 гость просматривают эту тему.

Dr_Lecter

Никак не пойму как автоматически сгенерировать имена переменных, объявить их и после присвоить им значение.

For i% = 1 to UBound(aVarWorkArray(),1)
For j% = 1 to UBound(aVarWorkArray(),2)
Dim Cstr(aVarWorkArray(i%,0) & "_" & aVarWorkArray(0,j%)) as String
Msg$ = Msg$ & aVarWorkArray(i%,0) & "_" & aVarWorkArray(0,j%) & Chr(10)
Next j%
Next i%


Судя по данными Msg$ имена переменных генерируются успешно (результат Msg$), но не объявляются.

BPD_RussianShortName
BPD_RussianFullName
BPD_AccuvixA30
OFD_RussianShortName
OFD_RussianFullName
OFD_AccuvixA30
HC_RussianShortName
HC_RussianFullName
HC_AccuvixA30
AC_RussianShortName
AC_RussianFullName
AC_AccuvixA30
FL_RussianShortName
FL_RussianFullName
FL_AccuvixA30
TibiaDex_RussianShortName
TibiaDex_RussianFullName
TibiaDex_AccuvixA30
TibiaSin_RussianShortName
TibiaSin_RussianFullName
TibiaSin_AccuvixA30
HumerusDex_RussianShortName
HumerusDex_RussianFullName
HumerusDex_AccuvixA30
HumerusSin_RussianShortName
HumerusSin_RussianFullName
HumerusSin_AccuvixA30
UlnaDex_RussianShortName
UlnaDex_RussianFullName
UlnaDex_AccuvixA30
UlnaSin_RussianShortName
UlnaSin_RussianFullName
UlnaSin_AccuvixA30
NasalBone_RussianShortName
NasalBone_RussianFullName
NasalBone_AccuvixA30
Cerebellum_RussianShortName
Cerebellum_RussianFullName
Cerebellum_AccuvixA30
CisternaMagna_RussianShortName
CisternaMagna_RussianFullName
CisternaMagna_AccuvixA30


Загрузка их строкой тоже не помогает:

Dim Cstr(Msg$) as String

bormant

#1
Не надо их объявлять.


Const n=3
Dim aShortNames(n) as String, aFullName(n) as String, aValue(n) as Double

Function GetIndex(sn as String) as Integer
Dim i as Integer
  GetIndex = -1
  For i = 0 to n
    If aShortNames(i) = sn Then
      GetIndex() = i
      Exit Function
    End If
  Next
End Function

Либо объявить индексы константами
Const iBPD=0, iOFD=1, iHC=3
...
  If s1 = aShortNames(iBPD) Then
    aValue(iBPD) = Val(s2)
  Else If s1 = aShortNames(iOFD) Then
    aValue(iOFD) = Val(s2)
  ...
  End If
Автору на яд. Поддержать форум.

calc4fem

Помню тут решал задачу сгенерировать функцию которая генерирует функцию и выполняет ее возвращая результат.
Это для задания выражения строковой переменной (функция строила график по тексту вида "x^2+2*x+3"
Но имена переменных если их много и количество разное хранят просто в динамическом массиве. В том числе массивы массивов поддерживаются.
Интересный вопрос в данном случае.

rami

Цитата: Dr_Lecter от  8 октября 2015, 19:53Судя по данными Msg$ имена переменных генерируются успешно (результат Msg$), но не объявляются.
Если имена переменных генерируются, то объявить их просто, нужно вне процедуры записать:

DefStr s    'для строк
DefDbl d    'для чисел с запятой
DefInt i    'для целых
DefDate t   'для даты

Sub Main

End Sub

Например, если нужно, чтобы все переменные начинающиеся с буквы a были строковыми, пишем DefStr а, если первые буквы переменных от a до f и s пишем DefStr а-f, s. Это срабатывает в момент использования переменной. Разумеется не назначать одну букву разным типам.

Dr_Lecter

Вся проблема в том, что переменных я тут привел буквально 2% от общего количества, всего их более 200 - 300.
Поэтому я хотел объявление и самое главное присвоение значений сделать путем перебора массивов.
А так мне придется присваивать каждую переменную отдельной строкой.

Т.е. есть массив в первом столбце основание переменной - например "MCA" из него должны получиться:

MCA_RussianShortName As String
MCA_RussianShortNameField As Variant
MCA_RussianFullName As String
MCA_RussianFullNameField As Variant
MCA_EnglishShortName As String
MCA_EnglishShortNameField As Variant
MCA_EnglishFullName As String
MCA_EnglishFullNameField As Variant

Плюс на каждую модель УЗ-сканера добавятся еще две переменных. Это получились базовые переменные, дальше идут измерения:

MCA_PSV As Double
MCA_PSVField As Variant
MCA_EDV As Double
MCA_EDVField As Variant
MCA_RI As Double
MCA_RIField As Variant
MCA_PI As Double
MCA_PIField As Variant
MCA_GA As Integer
MCA_GAField As Variant
MCA_Percentile As Double
MCA_PercentileField As Variant


Эти нужно на два умножить потому что две стороны Правая и Левая и в идеале - желательно иметь каждой из правой и левой по 3 штуки чтобы забирать по 3 последовательных измерения (но это не так критично, можно на аппарате делать усреднение и брать по одной)

И это только одна артерия в головном мозге!!! А их у нас там 10 основных... Выше я привел только базовые для одной секции оценки анатомии.

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

Т.к. правила синтаксиса, парсинга и формирования этих полей общие, то после автоматизации объявления имен переменных к ним можно было-бы обращаться в цикле и циклом же считывать из файла отчета.

Если это средствами BASIC не решается то тогда буду смотреть в сторону Phyton хотя и времени нет на него.

Еще вариант - а можно из макроса по условию сгенерировать во временный файл текст нового макроса, запустить его и получить данные? Или сложно очень? Просто все что касается UNO - темный лес для меня, никак не могу понять.

Dr_Lecter

Цитата: rami от  8 октября 2015, 22:50Это срабатывает в момент использования переменной. Разумеется не назначать одну букву разным типам.

Вы видимо не поняли идею, объявление пол беды:

Есть массив VarArray(i%), в нем базовая часть от имен переменных (допустим всего их 100 шт)

Я из отчета извлекаю массив данных  DataArray(i%, j%)

С извлечением кстати проблем совсем нет. Все на ура работает в тесте.

Мне нужно выполнить код:

For i% = 1 to UBound(VarArray())
    Cstr(VarArray(i%) & «_PSV») = DataArray(i%,1)
  Cstr(VarArray(i%) & «_EDV») = DataArray(i%,2)
  Cstr(VarArray(i%) & «_PI») = DataArray(i%,3)
  Cstr(VarArray(i%) & «_RI») = DataArray(i%,4)
Next i%


Это возможно?
Ведь несколько строк и мы 400 переменных присвоили, и в документ так же вставим.

bormant

Если у вас данные уже есть в массиве, зачем их дублировать отдельными переменными?
Решительно не понимаю.
Автору на яд. Поддержать форум.

Dr_Lecter

Чтобы не писать на каждую переменную отдельное условие Case и чтобы совершать групповые операции над переменными.
Уже не суть т.к. переписал код с отдельными условиями (спасибо Calc - в ячейках сгенерировал и переменные и участки кода и вставил в модуль BASIC).

Кроме того на буржуйском форуме нашел схожую тему - ответ "Нет", взять для исполнения имя переменной из строки данных в OOo BASIC не возможно.