Форум: "Потрепаться";
Текущий архив: 2004.10.17;
Скачать: [xml.tar.bz2];
ВнизКак более грамотно решить задачу?? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.046 c