Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.17;
Скачать: CL | DM;

Вниз

Как более грамотно решить задачу??   Найти похожие ветки 

 
GH@ST   (2004-09-28 12:09) [0]

Часто (по крайней мере у меня) появляется задача..сложить количество разных наименований...хотелось бы узнать мнение специалистов...как решить проще...
Например нужно найти количество проданных наименований из разных накладных..Тоесть есть куча накладных в Ёкселе..в одной продано карандашей 10 , ручек-20 и т.д. В другой карандашей 5, ручек 7...ну и по тексту.. Нужно вывести общее количество проданных карандашей и ручек..Тоесть пробежал я по всем файлам..собрал чего-то типа

карандашей 10
ручек-20
карандашей 5
ручек 7
Вариант конечно самый примитивный может быть и цена которую нужно сложить (сумму).
А теперь сам вопрос как более быстро это все сложить?
Тоесть я делал как создавал массив...в него записывал наименования не повторяющиеся и во втором массиве складывал..количество...
тоесть
ИМЯ: array [0..100] of string;
Количество: array [0..100] of integer;
ну так примерно...может обьяснил..несовсем понятно..но как мог


 
Игорь Шевченко ©   (2004-09-28 12:11) [1]

А сгруппировать не проще ?


 
КаПиБаРа ©   (2004-09-28 12:16) [2]

GH@ST   (28.09.04 12:09)
Группировать однозначно! :)

======================================================
Если существует более сложный способ сделать что-либо,
кто-нибудь непременно его откроет.
Ралфус Рус.
======================================================


 
GH@ST   (2004-09-28 12:23) [3]

Сгруппировать в массив? Или есть еще варианты?


 
Думкин ©   (2004-09-28 12:25) [4]

> [3] GH@ST   (28.09.04 12:23)

Тип запись.


 
GH@ST   (2004-09-28 12:30) [5]

> Думкин ©
А попонятнее если можно...или ссылку на пояснение..пожалуйста, что такое тип запись..я незнаю..


 
Sergey13 ©   (2004-09-28 12:34) [6]

2GH@ST   (28.09.04 12:09)
>Тоесть есть куча накладных в Ёкселе
Так может поменять инструментарий?


 
stone ©   (2004-09-28 12:37) [7]

а почему > куча накладных в Ёкселе
Они там изначально создавались или были экспортированы из-какой либо БД? Может тогда и вопрос реализации изменится?


 
GH@ST   (2004-09-28 12:42) [8]

Нет они создавались отдельно...ну продали кому-то сделали накладную..но вопрос не Ёкселе...я данные достаю из него без проблем..да в принципе и складывать получается...я хочу..узнать есть ли более оптимальный способ...тоесть сейчас в сои массивы могу поместить (исходя из примера) 100 записей может их будет больше или меньше и иметь несколько массивов я считаю тоже неправильным если с кждым ниименование..будет несколько позиций количество цена и еще чегонибудь..


 
Думкин ©   (2004-09-28 12:43) [9]

> [8] GH@ST   (28.09.04 12:42)

Слово record - знакомо?


 
Sergey13 ©   (2004-09-28 12:50) [10]

2[8] GH@ST   (28.09.04 12:42)
Я и говорю - меняй инструментарий. Ну и мышление конечно. Иначе потом пойдут вопросы: "Как мне сложить карандаши и ручки?"
Это известная проблема, когда под "учетом" некоторые понимают красивую бимажку напечатанную на компьютере. Еще повезло с екселем. У меня жена пару дней отработала на фирме, где картотеку клиентов "вели" в Ворде, обзывая каждую карточку именем клиента. 8-)


 
GH@ST   (2004-09-28 12:53) [11]

> Думкин ©
Только не надо кидать в меня камни..в справке нашел только Record constants..в принципе похоже на..то что надо..но только это константа...может переменная как-то подругому пишется?


 
GH@ST   (2004-09-28 12:55) [12]

> Sergey13 ©
Тогда поясни..чего и как я должен поменять? И главное на, что?


 
Sergey13 ©   (2004-09-28 12:57) [13]

2[12] GH@ST   (28.09.04 12:55)
>Тогда поясни..чего и как я должен поменять? И главное на, что?
Исторически сложилось, что задачи учета обычно решаются в базах данных.


 
GH@ST   (2004-09-28 13:02) [14]

> Sergey13 ©
Ну блин это не мне решать...да и вообще... это одлго обьяснять но подругому нельзя...это разные фирмы в разных городах..даже номенклатура (тоесть карандаши и ручки по разному называются) у одних стоит 1С у других БЕСТ..вобщем все запущено дальше некуда...но такую систему за раз не поменяешь и не исправишь..людей не переучишь...сейчас  этим занимается выделенный человек который эти накладные сравнивает и пересчитыват вручную...ну тут партия скзала..надо...комсомол ответил есть..да я вобщем и решу эту задачу...но вопрос только как...вот через жо..у не хочется..вот и обратился за советом..


 
Jeer ©   (2004-09-28 13:08) [15]

Так, если выход задуман через ж., то как хочешь примеряйся - тем местом и выйдет.


 
Sergey13 ©   (2004-09-28 13:08) [16]

2[14] GH@ST   (28.09.04 13:02)
>но такую систему за раз не поменяешь и не исправишь
А кто говорил, что это - раз плюнуть? Я про мышление не зря упомянул.

Но ты что то недоговариваешь, ИМХО, или говоришь непонятно.

>ну продали кому-то сделали накладную
>это разные фирмы в разных городах..даже номенклатура (тоесть карандаши и ручки по разному называются) у одних стоит 1С у других БЕСТ

как то не вяжется одно с другим. То ли вы чем то торгуете, то ли "руководите" филиалами. Партии... комсомол... Может тоже 1С или БЕСТ поставить?


 
Думкин ©   (2004-09-28 13:10) [17]

> GH@ST  

type
a = record
  b : string
  c : integer;
end;


А как без этого и тут? :(


 
Jeer ©   (2004-09-28 13:14) [18]

На самом-то деле это вполне жизненная задача.
Как-то пришлось делать парсер xls файлов с прайсами.
У каждой фирмы свой формат.
Итого: настраиваемый парсер под условия.
Но в итоге-то все равно данные должны оказаться в СУБД.
И уже там всякие расчеты, группировки и пр.


 
GH@ST   (2004-09-28 13:27) [19]

> Jeer ©
Вкаком то случае правильно..но мне пока нужно все сложить и опять че в Ёкселе вернуть в виде отчета..


 
GH@ST   (2004-09-28 13:29) [20]

> Думкин ©
Спасибо!!! действительно удобно..


 
Skyle ©   (2004-09-28 13:32) [21]

\>А теперь сам вопрос как более быстро это все сложить?
Я бы не напрягался особо (а похоже оно и не требуется, так как даже это будет работать быстрее специально выделенного товарища)

Я бы просто положил TClientDataSet, сделал пару полей, индекс по имени и потом

procedure AddNewPosition(AName : String; ACount : Integer);
begin
 if cdsMyTotalData.FindKey(AName) then
   cdsMyTotalData.Edit
 else
 begin
   cdsMyTotalData.Append;
   cdsMyTotalDataName.Value := AName;
 end;
 cdsMyTotalDataCount.Value := cdsMyTotalDataCount.AsInteger + ACount;
 cdsMyTotalData.Post;
end;


> Думкин ©
Датасет удобно в эксель засовывать....;-)
Хотя всё, конечно, субъективно...


 
Думкин ©   (2004-09-28 13:38) [22]

> [21] Skyle ©   (28.09.04 13:32)

:)) Оно понятно. Просто с вопроса видно, что многое запущено. И моего хватит - для начала. А то писать в Паскале и не знать записи?!


 
GH@ST   (2004-09-28 13:41) [23]

> Skyle © Тоже интересно...и может быть даже и удобнее...только из справки я так и не понял ему нужен какойнить  BDE или нет?


 
GH@ST   (2004-09-28 13:43) [24]

> Думкин ©
Ну я же не профессионал..я вообще системный администратор...сам научился чего-то там программировать..вот и пишу иногда чего заставють...откуда мне все это и сразу узнать?


 
Skyle ©   (2004-09-28 14:01) [25]


> только из справки я так и не понял ему нужен какойнить  
> BDE или нет?

Хуже. Ему нужен midas.dll..


> [22] Думкин ©   (28.09.04 13:38)

Согласен. Хотя записи и не были бы наверное моей первой идеей при реализации...))))


 
GH@ST   (2004-09-28 14:08) [26]

>Хуже. Ему нужен midas.dll..
Во во, а так не хочется...муху до размеров слона накручивать...тут же тема потрепаться...в принципе и хотелось выслушать идеи по поводу решения...мне уже который раз приходится такие глупости делать...у нас все работают в базе БЕСТ (если кто незнает типа 1С естественно без конфигуратора..да еще и в досе) вот нудно им стало отправлять накладные в Ёкселе да и по электронной почте...делал конвертор...который досовские эти навладные в Ёксель переводил..да еще и в приличный вид...ну и пита всяки отчеты из этих досовских документов собирал...вот тебе и ответ...когда..спросил руководство...а может 1С поставить лучше...? Они сказали..может и лучше..только кто всех менеджеров переучивать возмется?....вот поэтому всякой ерундой и заниматься приходится..а с другой стороны мне-то какая разница...если делается почему не сделать...


 
Skyle ©   (2004-09-28 14:18) [27]

>  [26] GH@ST   (28.09.04 14:08)

Ну мне тоже доводилось БЭСТ с екселем сводить. Использовал TClientDataSet.
Но у меня несколько иной случай...

В данном же случае можно в качестве хранилища использовать много чего...


 
GH@ST   (2004-09-28 14:24) [28]

>  Skyle ©
Вот именно этого много чего я и хотел услышать, а то делаю как получится..много же должно быть прогрессивных идей


 
Digitman ©   (2004-09-28 14:30) [29]


> GH@ST


Раз уж Ёксель фигурирует и от него никак нельзя отказаться, почему ж не задействовать другую офисную "приблуду" под названием Access ? С Ёкселем Access - достаточно вась-вась и при этом могёт хранить и исполнять сиквел-запросы, а уж посредством встроенного Васика и запросного механизма реализовать унифицированный подход к решению задачи - проще постого. Данные Access будет брать из приаттаченных ёксельных документов (скрипт на всроенном Васике написать не так сложно), а далее - обычный SELECT-запрос с группировкой и агрегатными ф-циями count(), sum()


 
Skyle ©   (2004-09-28 14:31) [30]


> Вот именно этого много чего я и хотел услышать

Ну вот....:(

- 2 массива (имена - количества) <!-- это я так...
- массив записей (про записи - (c) Думкин)
- TStringList (Name=Count)
- Датасеты (уже приводил пример использования).
- можно и прямо в екселе извратиться...Запросы к нему пописать...

Как-то мне уже хватило... Чё-та придумать больше ничего не могу...))


 
GH@ST   (2004-09-28 14:38) [31]

Вот лисчно мне с записью больше всего понравилось...спасибо всем...вот уже реализовывать начал..


 
Думкин ©   (2004-09-28 15:01) [32]

> 30] Skyle ©   (28.09.04 14:31)

Про записи - не я, это 2 первых поста. Я переводчиком был.


 
Skyle ©   (2004-09-28 15:03) [33]


> [32] Думкин ©   (28.09.04 15:01)

Ну значит я был на другой волне...


 
GH@ST   (2004-09-28 17:34) [34]

Вот набрался наглости..написать снова...все я сделал загнал я все это хозяйство в динамический массив..из всех накладных..хорошо получилось...а как его теперь сгруппировать...из этого динамического массива..чего-то совсем не соображу....вот никогда с такими массивсами не работал..


 
icebeerg ©   (2004-09-28 18:59) [35]

Попробуй TStringList...
А запись можно расширить например до:
type
a = record
 b : string //наименование
 c : integer //кол-во
 d : integer; //сумма <- и т.д.
end;


 
Skyle ©   (2004-09-29 08:02) [36]


> а как его теперь сгруппировать...из этого динамического
> массива..

Если я правильно понял, сейчас в массиве ситуёвина следующая:
Ручки 5
карандаши 10
ручки 5

А нужно получить
ручки 10
карандаши 10

Для того, чтобы избежать этого я в своём примере в [21] основывался на идее группировки при добавлении, т.е перед тем как добавить запись ищется уже имеющаяся и если есть, то просто добавляется количество.
В этом случае беготня по массиву сводиться к минимуму.
Я бы сделал именно так.

Для этого нужно просто уметь находить вхождение данного наименования в массив. В данном случае можно поступить например так

procedure AddPosition(AName : String; ACount : Integer);
var I, Index : Integer;
begin
 Index := -1;
 for I := 0 to Length(FDataArray) - 1 do
   if FDataArray[I].Name = AName then //Например так, зависит от значений
   begin
     Index := I;
     Break;
   end;
 if Index < 0 then // Не было, добавляем
   AddToDataArray(AName, ACount)
 else
   AddCount(Index, ACount);
end;


Подозреваю, что написание функций AddToDataArray и AddCount трудностей не вызовет..



Страницы: 1 вся ветка

Текущий архив: 2004.10.17;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.042 c
14-1096293897
peypivo
2004-09-27 18:04
2004.10.17
:-)


8-1090082002
Ale}{(is)
2004-07-17 20:33
2004.10.17
мне привести 24-битное изображение к 8-битному...


1-1096535034
BorH
2004-09-30 13:03
2004.10.17
Конвертация String[4] в Integer


3-1095819073
Medik
2004-09-22 06:11
2004.10.17
Удаление в Stringgrid


14-1096292170
VID
2004-09-27 17:36
2004.10.17
Чем закончилась история про СМСтерроризирование Григорьева Антона