Автор - Варнавский Д.В.
$PBExportHeader$gf_array_item_repet.srf
$PBExportComments$Функция удаления из массивов повторяющихся значений
global type gf_array_item_repet from function_object
end type
forward prototypes
global function any gf_array_item_repet (any a_array)
end prototypes
global function any gf_array_item_repet (any a_array);////////
// Function: gf_array_item_repet
//
// Access: public
//
// Arguments:
// a_array any, одномерный массив
// обрабатываемые, типы данных массива
// возможные значения: 'string'
// 'long'
// верхний и нижний регистры 'integer'
// для строки одинаковы 'decimal'
// 'blob'
//
// Returns: any, одномерный массив
// в случае необрабатываемых типов данных
// возвращается исходный массив
//
// Description: Функция для удаления из массива
// повторяющихся значений
//
////////////////////////////////////////////////////////////
//
// Revision History
//
// Version
// 6.5 Initial version (Варнавский Д.В.)
//
///////////////////////////////////////////////////////////
//
// ЛАНИТ, Департамент тиражируемых программных решений
//
///////////////////////////////////////////////////////////
string ls_array[], ls_array_end[], ls_etalon
long ll_array_len, ll_array[], ll_array_end[], i, j, k, ll_rtn
integer li_array[], li_array_end[]
decimal ld_array[], ld_array_end[]
blob lb_array[], lb_array_end[]
any la_array
boolean lbn_flag
i = 1
j = 1
CHOOSE CASE Lower(ClassName(a_array))
CASE 'string'
ls_array = a_array
ll_array_len = UpperBound(ls_array)
DO WHILE i <= ll_array_len
ll_rtn = Pos(ls_etalon, '|' + Upper(ls_array[i]) + '|')
IF IsNull(ll_rtn) OR ll_rtn = 0 THEN
ls_etalon = ls_etalon + '|' + Upper(ls_array[i]) + '|'
ls_array_end[j] = ls_array[i]
j = j + 1
END IF
i = i + 1
LOOP
la_array = ls_array_end
CASE 'long'
ll_array = a_array
ll_array_len = UpperBound(ll_array)
DO WHILE i <= ll_array_len
ll_rtn = Pos(ls_etalon, '|' + string(ll_array[i]) + '|')
IF IsNull(ll_rtn) OR ll_rtn = 0 THEN
ls_etalon = ls_etalon + '|' + string(ll_array[i]) + '|'
ll_array_end[j] = ll_array[i]
j = j + 1
END IF
i = i + 1
LOOP
la_array = ll_array_end
CASE 'integer'
li_array = a_array
ll_array_len = UpperBound(li_array)
DO WHILE i <= ll_array_len
ll_rtn = Pos(ls_etalon, '|' + string(li_array[i]) + '|')
IF IsNull(ll_rtn) OR ll_rtn = 0 THEN
ls_etalon = ls_etalon + '|' + string(li_array[i]) + '|'
li_array_end[j] = li_array[i]
j = j + 1
END IF
i = i + 1
LOOP
la_array = li_array_end
CASE 'decimal'
ld_array = a_array
ll_array_len = UpperBound(ld_array)
DO WHILE i <= ll_array_len
IF i = 1 THEN
ld_array_end[j] = ld_array[i]
j = j + 1
END IF
IF i > 1 THEN
k = 1
DO WHILE k < j
lbn_flag = false
IF ld_array_end[k] = ld_array[i] THEN
lbn_flag = true
EXIT
END IF
k = k + 1
LOOP
IF not lbn_flag THEN
ld_array_end[j] = ld_array[i]
j = j + 1
END IF
END IF
i = i + 1
LOOP
la_array = ld_array_end
CASE 'blob'
lb_array = a_array
ll_array_len = UpperBound(lb_array)
DO WHILE i <= ll_array_len
IF i = 1 THEN
lb_array_end[j] = lb_array[i]
j = j + 1
END IF
IF i > 1 THEN
k = 1
DO WHILE k < j
lbn_flag = false
IF lb_array_end[k] = lb_array[i] THEN
lbn_flag = true
EXIT
END IF
k = k + 1
LOOP
IF not lbn_flag THEN
lb_array_end[j] = lb_array[i]
j = j + 1
END IF
END IF
i = i + 1
LOOP
la_array = lb_array_end
CASE Else
la_array = a_array
MessageBox("Error", "Unexpected datatype.")
END CHOOSE
Return(la_array)
end function