Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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.041 c
1-1097017647
ДЫМ
2004-10-06 03:07
2004.10.17
Как обработать исключения при чтении/записи на дискету?


1-1096898621
Pentium133
2004-10-04 18:03
2004.10.17
DUnit


4-1095284915
Wind
2004-09-16 01:48
2004.10.17
Буфер обмена


3-1095317759
Slonco
2004-09-16 10:55
2004.10.17
Ошибка при IBTransaction.Commit - "List index out of bounds (8)"


1-1096717506
UserUserov
2004-10-02 15:45
2004.10.17
Копирование файла





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский