Скрипт TCL Нужна помощь для оптимизации If, а также исправление 3-го вывода - PullRequest
0 голосов
/ 26 марта 2020

У меня есть следующий код, и я хотел бы знать, как:

1) Оптимизировать «если», поэтому в будущем, если у меня будет 10 новых customer_id, мне не придется писать 10 раз оператор if-then-else, любое предложение?

2) Заметьте, что вывод № 3 неправильный, он не должен вычисляться (делить 1,5), как мне исправить это?

Исходный скрипт TCL

set VG01 0
set VT01 0
set VG02 0
set VT02 0
set VG03 0
set VT03 0
set VGtable01 150
set VTtable01 15
set VGtable02 250
set VTtable02 25
set VGtable03 350
set VTtable03 35
set sCompareCustomerID01 "0001"
set sCompareCustomerID02 "0002"
set sCompareCustomerID03 "0003"
set sCustomer01 "0001"
set sCustomer02 "0002"
set sCustomer03 "0004"

if {[string compare $sCompareCustomerID01 $sCustomer01 ] == 0 ||
    [string compare $sCompareCustomerID02 $sCustomer02 ] == 0 ||
    [string compare $sCompareCustomerID03 $sCustomer03 ] == 0 } {
    set VG01 [expr $VGtable01 / 1.5]
    set VT01 [expr $VTtable01 / 1.5]
    set VG02 [expr $VGtable02 / 1.5]
    set VT02 [expr $VTtable02 / 1.5]
    set VG03 [expr $VGtable03 / 1.5]
    set VT03 [expr $VTtable03 / 1.5]
} else {
    set VG01 $VGtable01
    set VT01 $VTtable01
    set VG02 $VGtable02
    set VT02 $VTtable02
    set VG03 $VGtable03
    set VT03 $VTtable03
}

puts  "Target Value_Group 01: $VG01"
puts  "Target Value_Transaction 01: $VT01"
puts  "Target Value_Group 02: $VG02"
puts  "Target Value_Transaction 02: $VT02"
puts  "Target Value_Group 03 : $VG03"
puts  "Target Value_Transaction 03: $VT03"

============

Вывод:

Импорт начался 26 марта 2020 г. 04: 09: 58.


Загрузка скриптовой DLL
C: \ Program Files (x86) \ Common Files \ Cubeware \ cwscript85.dll
MMM-2020


200325_test, раздел 1.5: запуск заданий 26 марта 2020 года 04: 09: 58
Выполнение сценария: 200325_test, раздел 1.5 - начало работы 26 марта 2020 года 04:09:58

Target Value_Group 01: 100.0 
Target Value_Transaction 01: 10.0 
Target Value_Group 02: 166.6666666666667 
Target Value_Transaction 02: 16.66666666666667 
Target Value_Group 03 : 233.3333333333333      < ------ this should be 350, no calculation require
Target Value_Transaction 03: 23.33333333333333 < ------ this should be 35, no calculation require

Освобождение ресурсов
Импорт завершен
Импорт завершен 26 марта 2020 г. 04: 09: 58

1 Ответ

1 голос
/ 26 марта 2020

Ну, проблема в том, что у вас есть только один if, и похоже, что у вас действительно должно быть одно отдельное if для каждого клиента. Чтобы решить проблему в одиночку, она должна быть:

if {[string compare $sCompareCustomerID01 $sCustomer01 ] == 0} {
    set VG01 [expr $VGtable01 / 1.5]
    set VT01 [expr $VTtable01 / 1.5]
} else {
    set VG01 $VGtable01
    set VT01 $VTtable01
}

if {[string compare $sCompareCustomerID02 $sCustomer02 ] == 0} {
    set VG02 [expr $VGtable02 / 1.5]
    set VT02 [expr $VTtable02 / 1.5]
} else {
    set VG02 $VGtable02
    set VT02 $VTtable02
}

if {[string compare $sCompareCustomerID03 $sCustomer03 ] == 0} {
    set VG03 [expr $VGtable03 / 1.5]
    set VT03 [expr $VTtable03 / 1.5]
} else {
    set VG03 $VGtable03
    set VT03 $VTtable03
}

Но это не совсем масштабируемо. Если у вас больше клиентов, я бы предложил использовать массивы вместо простых переменных, для которых затем можно использовать al oop с одним if:

array set VG {
    01 0
    02 0
    03 0
}

array set VT {
    01 0
    02 0
    03 0
}

array set VGtable {
    01 150
    02 250
    03 350
}

array set VTtable {
    01 15
    02 25
    03 35
}

array set sCompareCustomerID {
    01 0001
    02 0002
    03 0003
}

array set sCustomer {
    01 0001
    02 0002
    03 0004
}

foreach customer [array names sCompareCustomerID] {
    if {
        [info exists sCustomer($customer)] && 
        [string compare $sCompareCustomerID($customer) $sCustomer($customer)] == 0
    } {
        set VG($customer) [expr {$VGtable($customer) / 1.5}]
        set VT($customer) [expr {$VTtable($customer) / 1.5}]
    } else {
        set VG($customer) $VGtable($customer)
        set VT($customer) $VTtable($customer)
    }
}

puts  "Target Value_Group 01: $VG(01)"
puts  "Target Value_Transaction 01: $VT(01)"
puts  "Target Value_Group 02: $VG(02)"
puts  "Target Value_Transaction 02: $VT(02)"
puts  "Target Value_Group 03 : $VG(03)"
puts  "Target Value_Transaction 03: $VT(03)"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...