Страница 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.обратное тоже справедливо
спасибо прочитано понято