![]() |
|
|
|
|
#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. |
|
#2
|
|||
|
|||
|
Цитата:
|
|
#3
|
|||
|
|||
|
Результат заноситься в СтрингЛист, который, собственно, и возвращается функцией. Если кто то разобрался, что требуется от функции и есть предложение сделать проще - пожалуйста, говорите)))
Вот, немного изменил процедуру. Заменил массивы StringList'ами. Только толку мало. Опять, вместо того, чтобы не записывать в лист id одинаковой детали, он все правильно плюсует детали и все равно записывает... Код:
function DataBase.GetDetList(id, count: TStringList): TStringList;
var
d, k: TStringList;
i, j, l: integer;
f: boolean;
s: string;
begin
result := TStringList.Create;
d := TStringList.Create;
k := TStringList.Create;
f := false;
for i := 0 to id.count - 1 do
begin
c := GetComplectForID(strtoint(id[i]));
for j := 1 to c.length do
begin
if i = 0 then
begin
d.add(inttostr(c.detail[j]));
k.add(inttostr(strtoint(count[i]) * c.count[j]))
end else
for l := 0 to d.count - 1 do
if c.detail[j] = strtoint(d[l]) then (если в списке есть такая деталь)
k[l] := inttostr(strtoint(k[l]) + c.count[j] * strtoint(count[i])) (то прибавляем к ней кол-во)
else f := true; (если нет, то тогда пишем в листы ид и кол-во)
if f then
begin
d.add(inttostr(c.detail[j]));
k.add(inttostr(strtoint(count[i]) * c.count[j]))
end;
f := false;
end;
end;
for i := 0 to d.count - 1 do
begin
s := d[i] + '$' + k[i];
result.add(s);
end;
end;1) 1$1 2$1 3$1 4$1 2) 1$1 2$1 По идее, при их выборе программа дожна занести в лист: 1$2 2$2 3$1 4$1 (т.к. 1 и 2 деталь повторяются, их кол-во складываем) Вместо этого она пишет то же самое + 1$1 2$1 (добавляет то что не нужно, т.к. эти детали повторяются) Последний раз редактировалось win32nod32, 02.12.2011 в 15:35. |
|
#4
|
|||
|
|||
|
Неужели никто не знает, в чем проблема?? (( Второй день уже голову ломаю...
|