|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Посчитать произведение в StringGrid
Есть таблица 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
|
|||
|
|||
спасибо большое за помощь))) все работает)))
|