Страница 1 из 1

Поиск одинаковых строк

Добавлено: 21 июн 2013, 16:31
Espada
Всем Доброго времени суток!!!перейду, непосредственно, к делу: есть код который выгружает данные из экселевского файла в прайс. Всё работает нормально, однако столкнулся с проблемой, что если есть совпадения по загруженным материалам, то неправильно считает конечную цену на товар. Попросили сделать так: после формирования отчета выводить сообщение о повторяющихся элементах. например:"В списке присутствуют Эмаль белая 3 раза, Эмаль зелёная -7 раз". пробовал вывести сообщение после алгоритма расчета и записи, он переберает все пункты. Может кто подскажет как написать функцию такую функцию сравнения или счета? заменять одинаковые не нужно просто посчитать сколько раз встречаются. заранее спасибо

Re: Поиск одинаковых строк

Добавлено: 21 июн 2013, 17:43
m0p3e
Мутно описано, но если правильно понял, то необходимо массив строк проверить на дубликаты.
Нагляднее сделать через временную табличку

Код: Выделить всё

table struct dubl
(name : string
,kol : Integer
) with index
(dubl0=name,dubl1=kol);
При обработке строки вызываем процедуру

Код: Выделить всё

Procedure PushDubl (n:string);
{
 If GetFirst Dubl Where ((n == name)) <> tsOk
   Insert Dubl set Name:=n,Kol:=1;
  else
   Update Current dubl set kol:=kol+1;
};
В конце обработки

Код: Выделить всё

Delete dubl Where (( 1 << kol));
If RecordsInTable(tnDubl)>0
  //Тут уже формируем отчет или чего там душе угодно
Есть более изящные решения, но это универсальное и несложное.
Таблицу не забываем очищать вначале.

Re: Поиск одинаковых строк

Добавлено: 21 июн 2013, 19:33
Espada
m0p3e писал(а):Мутно описано, но если правильно понял, то необходимо массив строк проверить на дубликаты.
Нагляднее сделать через временную табличку

Код: Выделить всё

table struct dubl
(name : string
,kol : Integer
) with index
(dubl0=name,dubl1=kol);
При обработке строки вызываем процедуру

Код: Выделить всё

Procedure PushDubl (n:string);
{
 If GetFirst Dubl Where ((n == name)) <> tsOk
   Insert Dubl set Name:=n,Kol:=1;
  else
   Update Current dubl set kol:=kol+1;
};
В конце обработки

Код: Выделить всё

Delete dubl Where (( 1 << kol));
If RecordsInTable(tnDubl)>0
  //Тут уже формируем отчет или чего там душе угодно
Есть более изящные решения, но это универсальное и несложное.
Таблицу не забываем очищать вначале.
Спасибо вроде бы пака всё понятно. Вот только при вызове процедуры ошибка пробовал по разному изменять синтаксис/местоположение, всё равно
Часть кода при вызове проц-ы

Код: Выделить всё

if (priceP_tek = Double(replace(priceP,',','.')) )
{} else if
 (priceP_tek <> Double(replace(priceP,',','.')) )
{
...
  cv_price.update current prices;
};
Procedure PushDubl (n:string);
{
if GetFirst Dubl Where ((n == name)) <> tsOk
   Insert Dubl set Name:=n,Kol:=1;
  else
   Update Current dubl set kol:=kol+1;
};
а вот какую ошибку при компиляции выдаёт

Код: Выделить всё

...\FORMS\11_ПРАЙС_ТОЛЬКО ПРОГНОЗ_ARD_С_ПРОТОКОЛОМ.FRM(129)
 Ошибка: Ожидалась константа, поле, функция, "IF" или "CASE" (стр.129, поз.1 в D
:\GAL810_VIP\FORMS_MAV_2013_01\FORMS\11_ПРАЙС_ТОЛЬКО ПРОГНОЗ_ARD_С_ПРОТОКОЛОМ.FR
M)
Procedure PushDubl (n:string);
^ [ Enter-продолжить ] :

Re: Поиск одинаковых строк

Добавлено: 22 июн 2013, 10:58
edward_K
Вы задавали вопрос что нужно сделать для переноса из fcom в VIP.обратное тоже справедливо

Re: Поиск одинаковых строк

Добавлено: 26 июн 2013, 17:13
Espada
edward_K писал(а):Вы задавали вопрос что нужно сделать для переноса из fcom в VIP.обратное тоже справедливо
спасибо прочитано понято