Hosted by uCoz
Функция для удаления из массива повторяющихся значений (Варнавский Д.В.)
   
Автор - Варнавский Д.В.

$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