Имя: Пароль:
IT
 
Реализация "ТаблицаЗначений" в виде класса c#, java и т.д.
,
0 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;
   }

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

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

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