![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Есть таблица sg (StringGrid1) на форме Form1 с данными о покупателях и тд. Во втором столбце название товара, в третьем количество.
На форме Form2 таблица sg1 (StringGrid1) с данными о цене товаров. Нужно посчитать для каждого покупателя (каждой строки таблицы на форме1) стоимость покупки, т.е. если покупатель 1 купил 3 стола то в этой же строке в пятом столбце должна отобразиться стоимость его покупки ( в excel это реализуется через ВПР, как реализовать в Delphi не знаю) |
|
#2
|
||||
|
||||
|
Картинке с сайбера кроме как там, у них, в других местах не читаются
Код:
procedure TForm1.FormCreate(Sender: TObject);
var
s: string;
begin
s:= #13#10;
with StringGrid1 do
begin
ColCount:= 4;
RowCount:= 9;
Rows[0].Text:= Concat('ФИО' ,s,'Название',s,'Кол-во',s,'Всего:');
Rows[1].Text:= Concat('Иванов И.П.' ,s,'Стул' ,s,'6' );
Rows[2].Text:= Concat('Казнулевич Н.Д.' ,s,'Стол' ,s,'2' );
Rows[3].Text:= Concat('Гаскаркян И.Л.' ,s,'Патефон' ,s,'1' );
Rows[4].Text:= Concat('Самарин В.Ю.' ,s,'Гардероб',s,'3' );
Rows[5].Text:= Concat('Карменко И.Ф.' ,s,'Табурет' ,s,'12' );
Rows[6].Text:= Concat('Лазюлькина.В.В.' ,s,'Диван' ,s,'7' );
Rows[7].Text:= Concat('Пышечкина К.К.' ,s,'Этажерка',s,'1' );
Rows[8].Text:= Concat('Задунайский О.Б.',s,'Стол' ,s,'8' );
end;
with StringGrid2 do
begin
ColCount:= 2;
RowCount:= 9;
Rows[0].Text:= 'Название'+s+'Цена';
Rows[1].Text:= 'Стул' +s+'3200';
Rows[2].Text:= 'Стол' +s+'7500';
Rows[3].Text:= 'Патефон' +s+'100000';
Rows[4].Text:= 'Гардероб'+s+'22800';
Rows[5].Text:= 'Табурет' +s+'2250';
Rows[6].Text:= 'Диван' +s+'70357';
Rows[7].Text:= 'Этажерка'+s+'1000';
Rows[8].Text:= 'Тумбочка'+s+'8735';
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i,j: integer;
begin
for i := 1 to StringGrid1.RowCount-1 do
for j := 1 to StringGrid2.RowCount-1 do
if StringGrid1.Cells[1, i] = StringGrid2.Cells[0,j] then
begin
StringGrid1.Cells[3, i]:=
FloatToStr(StrToFloat(StringGrid1.Cells[2,i]) *
StrToFloat(StringGrid2.Cells[1,j]));
break;
end;
end; |
|
#3
|
|||
|
|||
|
а если "if StringGrid1.Cells[1, i] = StringGrid2.Cells[0,j] then" не равно
что писать после "else"? |
|
#4
|
||||
|
||||
|
Ничего, поскольку .Cells[1, i] <> .Cells[0,j] при конечном j = .RowCount-1
значит что данный клиент купил что-то, чего нет в списке товаров и подсчитывать нечего т.к. у этого нету цены |
|
#5
|
|||
|
|||
|
Alegun, спасибо за помощь) только у меня не работает ничего... дело в том, что данные в таблицы я загружаю из excel. это как то влияет на расчеты?
если полностью писать код как у вас, то все считает. а если я загружаю данные из excel, то ничего не происходит ![]() |
|
#6
|
||||
|
||||
|
Тогда проще сделать - покажите пжлст, экзелевскую табличку, какие там данные и бум поглядеть, мож по-другому есть решение
|
|
#7
|
|||
|
|||
|
Есть два листа в excel. в одну таблицу гружу данные с листа 1, во вторую с листа 2 (правда вторая таблица должна быть на второй форме по заданию)
Безымянный.png Безымянный1.png вот код как добавляю данные в stringgrid: Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
sg.RowCount:=2;
vex:=CreateOleObject('Excel.Application');
if OpenDialog1.Execute then
begin vex.Workbooks.Open(opendialog1.FileName);
end;
Sheet:= Vex.workbooks[1].Sheets.Item['Лист1'];
i:=1;
while (copy(sheet.cells[i+1,1],1,1)<>'') do begin
Sg.Cells[0,i]:=sheet.cells[i+1,1];
Sg.Cells[1,i]:=sheet.cells[i+1,2];
Sg.Cells[2,i]:=sheet.cells[i+1,3];
Sg.Cells[3,i]:=sheet.cells[i+1,4];
Sg.Cells[4,i]:=sheet.cells[i+1,5];
i:=i+1;
Sg.RowCount:=sg.RowCount+1;
end;
Sg.RowCount:=sg.RowCount-1;
end;и для второй таблицы Код:
procedure TForm2.Button1Click(Sender: TObject);
begin
sg1.RowCount:=2;
vex:=CreateOleObject('Excel.Application');
if OpenDialog1.Execute then begin vex.Workbooks.Open(opendialog1.FileName);
end;Sheet:= Vex.workbooks[1].Sheets.Item['Лист2'];
i:=0;
while (copy(sheet.cells[i+1,1],1,1)<>'') do begin
Sg1.Cells[0,i]:=sheet.cells[i+1,1];
Sg1.Cells[1,i]:=sheet.cells[i+1,2];
i:=i+1;
Sg1.RowCount:=sg1.RowCount+1;
end;
Sg1.RowCount:=sg1.RowCount-1;
end; |
|
#8
|
||||
|
||||
|
Пересобрал у себя, тоже не работало, а затем дошло - у вас товар с прописной буквы записан, а на листе стоимости название - с Заглавной, изменил - заработало. Или измените, либо замещяйте регистр при сравнении
З.Ы. Вот однопроходной вариант и с проверкой и с суммированием прям во время заполнения сетки Код:
...
if OpenDialog1.Execute then
begin
vex:= CreateOleObject('Excel.Application');
try
vex.Workbooks.Open(opendialog1.FileName);
Sheet:= Vex.workbooks[1].Sheets.Item['Лист2'];
i:= 0;
sg1.ColCount:= 2;
sg1.RowCount:= 0;
while (copy(Sheet.Cells[i+1,1],1,1) <> '') do
begin
sg1.Cells[0,i]:= Sheet.Cells[i+1,1];
sg1.Cells[1,i]:= Sheet.Cells[i+1,2];
inc(i);
sg1.RowCount:= sg1.RowCount+1;
end;
Sg1.RowCount:= sg1.RowCount-1;
Sheet:= Vex.workbooks[1].Sheets.Item['Лист1'];
i:= 0;
sg.ColCount:= 6;
sg.RowCount:= 0;
Sg.Cells[5,0]:= 'Сумма';
while (copy(sheet.cells[i+1,1],1,1)<>'') do
begin
Sg.Cells[0,i]:= sheet.cells[i+1,1];
Sg.Cells[1,i]:= sheet.cells[i+1,2];
Sg.Cells[2,i]:= sheet.cells[i+1,3];
Sg.Cells[3,i]:= sheet.cells[i+1,4];
Sg.Cells[4,i]:= sheet.cells[i+1,5];
if i > 0 then
for j := 1 to sg1.RowCount-1 do
if AnsiLowerCase(sg.Cells[1,i]) =
AnsiLowerCase(sg1.Cells[0,j]) then
begin
sg.Cells[5,i]:= FloatToStr(
StrToFloat(sg.Cells[2,i]) *
StrToFloat(sg1.Cells[1,j]));
break;
end;
inc(i);
sg.RowCount:= sg.RowCount+1;
end;
sg.RowCount:= sg.RowCount-1;
finally
if not VarIsEmpty(vex) then
begin
vex.Quit;
vex:= Unassigned;
Sheet:= Unassigned;
end;
end;
end;
...Последний раз редактировалось Alegun, 31.03.2017 в 22:15. |
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
nastyasrost (02.04.2017)
| ||
|
#9
|
|||
|
|||
|
спасибо большое за помощь))) все работает)))
|