![]() |
|
#1
|
|||
|
|||
![]() Всем привет! Возникла проблема, весь день сижу - понять не могу в чем дело. Вообщем, есть функция, задача которой возвратить список деталей.
Конкретно: есть 2 TStringList'а - один содержит id деталей, другой количества этих деталей. Необходимо среди этих деталей найти одинаковые, и если такие есть, то сложить их количества. Уверен, что никто ничего не понял ![]() Код:
function DataBase.GetDetList(id, count: TStringList): TStringList; var i, j, h, q, acont: integer; p: byte; s: string; det, cot: array[1..300] of integer; begin acont := 0; p := 0; q := 0; {обнуление переменных} result := tstringlist.Create; for i := 0 to id.Count - 1 do {от 0 до конца списка id} begin inc(p); {для проверки на обработку не первой записи} c := GetComplectForID(strtoint(id[i])); {процедура GetComplectForID возвращает тип рекорд: Complects = record id: integer; engine: integer; detail, count: array[1..100] of integer; length: integer; end;} for j := 1 to c.length do {от 1 до конца массивов detail, count} begin if p = 1 then {если обрабатывается 1 запись} begin det[j + acont] := c.detail[j]; {то сразу заполняем массивы} cot[j + acont] := c.count[j] * strtoint(count[i]); {тут начальное количество деталей умножаеться на кол-во двигателей} end else {иначе проходимся по всему массиву} for h := 1 to acont do if det[h] = c.detail[j] then {если есть одинаковая деталь} begin inc(q); cot[h] := cot[h] + (c.count[j] * strtoint(count[i])) {прибавляем кол-во текущей записи к ранее записанной} end else {иначе просто дополняем массив} begin det[j + acont] := c.detail[j]; cot[j + acont] := c.count[j] * strtoint(count[i]); end; end; acont := acont + c.length; {чтобы не перезаписать, при след. цикле начинаем с конца массива} end; for i := 1 to acont - q do {отнимаем q от общего кол-ва деталей} begin s := inttostr(det[i]) + '$' + inttostr(cot[i]); result.Add(s); {заносим в стринглист} end; end; acont почему то больше на 1 с.length. Эмм... Чтобы было понятнее - запустите прогу, в меню есть пункт Создать отчет, нажимаете, выбираете 1,2,3,4 двигатели, количество - по одному. Жмите батон3. По идее в listbox4 должен попасть список : 4$7, 5$11, 7$8,1$9, 2$5, 8$2, 10$3 Последний раз редактировалось win32nod32, 01.12.2011 в 17:22. |