Вход | Регистрация
 
Информационные технологии :: Математика и алгоритмы

Реализация "ТаблицаЗначений" в виде класса c#, java и т.д.

Реализация
Я
   Garykom
 
28.05.10 - 14:01
Для разработки системы на java требуется такой очень удобный компонент как в 1С "ТаблицаЗначений", а точнеее ее функция Свернуть(КолонкиГруппировка, КолонкиСуммирование).

Без этого учень неудобно делать универсальные настраиваемые отчеты.

Может кто уже делал подобное? И может поделиться исходниками или где/куда копать.
   НафНаф
 
1 - 31.05.10 - 11:16
на шарпе:

namespace ConsoleApplication1
{
   class Program
   {
       static void Main(string[] args)
       {
           List<MyData> list = new List<MyData>()
           {
               new MyData(){Name="A",Value=10},
               new MyData(){Name="B",Value=20},
               new MyData(){Name="A",Value=30}
           };
           var query =
               from l in list
               group l by l.Name into g
               select new {Name=g.Key,Value=g.Sum(l=>l.Value) };
           foreach (var s in query)
           {
               Console.WriteLine("{0} {1}",s.Name,s.Value
                   );
           }
           Console.ReadKey();
       }
   }

   struct MyData
   {
       public string Name;
       public decimal Value;
   }

}
   Garykom
 
2 - 31.05.10 - 13:45
(1) Спасибо конечно, но если колонок в таблице не две штуки (одна текстовая и одна числовая) а больше?

ЗЫ Уже реализовал на java что нужно, пришлось повозится
   ЗлобнийМальчик
 
3 - 31.05.10 - 13:49
(1) DataTable - не катит, не?
(2) наверное что то похожее есть и на java
   ЗлобнийМальчик
 
4 - 31.05.10 - 13:51
(2) покаж велсипед
   DEVIce
 
5 - 31.05.10 - 13:56
На Java копай в сторону коллекций.
   Masquerade
 
6 - 31.05.10 - 13:56
(0)
Так надо еще?
   Masquerade
 
7 - 31.05.10 - 13:57
Ай, у меня без суммирования.
   Garykom
 
8 - 31.05.10 - 14:05
(4)

private String КлючСтрокиГруппировки(ArrayList<КолонкаТаблицыЗначений> КолонкиГрупп, СтрокаТаблицыЗначений Строка) {
       String Результат = "";
       Iterator i = КолонкиГрупп.iterator();
       while (i.hasNext()) {
           КолонкаТаблицыЗначений Колонка = (КолонкаТаблицыЗначений) i.next();
           Object Значение = Строка.Получить(Колонка);
           Результат = Результат + ";" + Значение;
       }
       return Результат;
   }

   private void СкопироватьДанные(ArrayList<КолонкаТаблицыЗначений> КолонкиГрупп, СтрокаТаблицыЗначений СтрокаИсточник, СтрокаТаблицыЗначений СтрокаПолучатель) {
       Iterator i = КолонкиГрупп.iterator();
       while (i.hasNext()) {
           КолонкаТаблицыЗначений Колонка = (КолонкаТаблицыЗначений) i.next();
           Object Значение = СтрокаИсточник.Получить(Колонка);
           СтрокаПолучатель.Установить(Колонка, Значение);
       }
   }

   private Object СложитьЧисла(Object Число1, Object Число2) {
       Object Результат = null;

       Number ч1 = 0;
       Number ч2 = 0;
       if (Число1 != null) {
           ч1 = (Number) Число1;
       }
       if (Число2 != null) {
           ч2 = (Number) Число2;
       }
       Double Сумма = ч1.doubleValue() + ч2.doubleValue();

       if (Сумма.doubleValue() == Сумма.intValue()) {
           Результат = Сумма.intValue();
       } else {
           Результат = Сумма;
       }

       return Результат;
   }

   private void СложитьДанные(ArrayList<КолонкаТаблицыЗначений> КолонкиСумм, СтрокаТаблицыЗначений СтрокаИсточник, СтрокаТаблицыЗначений СтрокаПолучатель) {
       Iterator i = КолонкиСумм.iterator();
       while (i.hasNext()) {
           КолонкаТаблицыЗначений Колонка = (КолонкаТаблицыЗначений) i.next();
           Object Значение = СтрокаИсточник.Получить(Колонка);
           Object Сумма = СтрокаПолучатель.Получить(Колонка);
           Сумма = СложитьЧисла(Сумма, Значение);
           СтрокаПолучатель.Установить(Колонка, Сумма);
       }
   }

   public void Свернуть(String КолонкиГруппировка, String КолонкиСуммирование) {
       ArrayList<КолонкаТаблицыЗначений> КолонкиГрупп = НайтиКолонки(КолонкиГруппировка);
       ArrayList<КолонкаТаблицыЗначений> КолонкиСумм = НайтиКолонки(КолонкиСуммирование);

       Hashtable НовыеДанные = new Hashtable();

       Iterator i = Данные.iterator();
       while (i.hasNext()) {
           СтрокаТаблицыЗначений Строка = (СтрокаТаблицыЗначений) i.next();
           String Ключ = КлючСтрокиГруппировки(КолонкиГрупп, Строка);
           СтрокаТаблицыЗначений НовСтрока = (СтрокаТаблицыЗначений) НовыеДанные.get(Ключ);
           if (НовСтрока == null) {
               НовСтрока = new СтрокаТаблицыЗначений(this);
               НовыеДанные.put(Ключ, НовСтрока);
           }
           СкопироватьДанные(КолонкиГрупп, Строка, НовСтрока);
           СложитьДанные(КолонкиСумм, Строка, НовСтрока);
       }
       Очистить();
       Колонки.Очистить();

       i = КолонкиГрупп.iterator();
       while (i.hasNext()) {
           КолонкаТаблицыЗначений Колонка = (КолонкаТаблицыЗначений) i.next();
           Колонки.Добавить(Колонка);
       }
       i = КолонкиСумм.iterator();
       while (i.hasNext()) {
           КолонкаТаблицыЗначений Колонка = (КолонкаТаблицыЗначений) i.next();
           Колонки.Добавить(Колонка);
       }
       Enumeration e = НовыеДанные.elements();
       while (e.hasMoreElements()) {
           СтрокаТаблицыЗначений Строка = (СтрокаТаблицыЗначений) e.nextElement();
           Данные.add(Строка);
       }

       Сортировать(КолонкиГруппировка);
   }
   Denyk
 
9 - 31.05.10 - 14:10
(0) Тестовое задание от 1С? ;-)

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.