Как разделить строку, чтобы умножить каждое число на значение в MS Access 2007 - PullRequest
0 голосов
/ 05 июня 2019

Мне нужно разделить строку из 20 цифр по отдельности и умножить каждую единицу на значение.

String (this string is in a text box) example: 11604999123400002586

После разделения я должен выполнить следующую операцию:

51 x 1º digit +
73 x 2º digit +
17 x 3º digit +
89 x 4º digit +
38 x 5º digit +
62 x 6º digit +
45 x 7º digit +
53 x 8º digit +
15 x 9º digit +
50 x 10º digit +
5 x 11º digit +
49 x 12º digit +
34 x 13º digit +
81 x 14º digit +
76 x 15º digit +
27 x 16º digit +
90 x 17º digit +
9 x 18º digit +
30 x 19º digit +
3 x 20º digit

В этом примере:

Result = 51x1 + 73x1 + 17x6 + 89x0 + 38x4 + 62x9 +
45x9 + 53x9 + 15x1 + 50x2 + 5x3 + 49x4 + 34x0 + 81x0 + 76x0 + 27x0 + 90x2
+ 9x5 + 30x8 + 3x6 = 2627

Как лучше всего это сделать?

Ответы [ 3 ]

4 голосов
/ 05 июня 2019

В VBA вы можете сделать что-то вроде этого:

Dim a(20) as Integer
a(1) = 51
a(2) = 73
…
a(20) = 3

Dim Result AS Long: Result = 0
For i = 1 to 20
    Result = Result + CInt(Mid(MyString,i,1)) * a(i)
  Next i
2 голосов
/ 05 июня 2019

Вы можете сделать это с помощью SQL.
Создайте таблицу, скажем, с именем weights, с двумя столбцами:

id:     Number
weight: Number

и вставьте эти строки:

id  weight
1   51
2   73
3   17
4   89
5   38
6   62
7   45
8   53
9   15
10  50
11  5
12  49
13  34
14  81
15  76
16  27
17  90
18  9
19  30
20  3

Затем выполните этот запрос:

SELECT SUM(w.weight * val(mid('11604999123400002586', w.id, 1))) AS result 
FROM weights AS w

Результат:

2627
1 голос
/ 05 июня 2019

Согласованность структуры имеет решающее значение при манипулировании строками. Предположим, что в строке всегда будет 20 цифр, и каждая запись будет иметь значение.

Рассчитайте 20 столбцов и сложите их вместе для итога - вот 2:

SELECT Quotes.*, Mid([Data],1,1)*53 AS A, Mid([Data],2,1)*71 AS B, [A]+[B] AS Total FROM Quotes;

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

SELECT Quotes.Data, Mid([Data],1,1)* DLookup("Weight","Factors","ID=1") AS A, Mid([Data],2,1)* DLookup("Weight","Factors","ID=2") AS B, [A]+[B] AS Total FROM Quotes;

Декартово отношение с запросом агрегированных вычислений с использованием таблиц данных и весовых коэффициентов может вычислять Total - Декартово также может работать медленно с большим набором данных:

SELECT Quotes.ID, Sum(Mid([Data],[Factors].[ID],1)*[Weight]) AS Total
FROM Factors, Quotes
GROUP BY Quotes.ID;

Пользовательская функция VBA может возвращать только сумму. Вызовите эту функцию из запроса или текстового поля. Весовые коэффициенты можно извлечь из таблицы или жестко закодировать в массиве.

Function GetTotal(strD) As Long
Dim rs As DAO.Recordset, x As Integer
Set rs = CurrentDb.OpenRecordset("SELECT Weight FROM Factors ORDER BY ID")
For x = 1 To 20
    GetTotal = GetTotal + Mid(strD, x, 1) * rs!Weight
    rs.MoveNext
Next
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...