среда, 4. април 2012.

SachsenWasser - utosak po mernim mestima

Izvršena izmena programa Pregled stanja vodomjera ( IKO001v ). Dodana je opcija prikaza utrošaka fluida na mernim mestima za izabranu godinu po mesecima. Prikazani utrošak prestavlja u stvari fakturisani fluid za svaki iazabrani period. U prikazu će se pojaviti sva merna mesta kojima je obračunat utrošak fluida bez obzira na način obračuna:

  • Obračun po članu
  • Obračun po procentu
  • Pomočno merilo
  • Sekundarni paušalac
  • Paušalac po članu
  • Samostalni paušalac
  • Samostalno merilo
  • Glavno merilo
  • Uneta potrošnja po ćlanu
  • Paušal po mesecu i ćlanu

Ako vas interesuju utrošci samo onih mernih mesta koja imaju merač u tu grupu spadaju:
  • Samostalno merilo
  • Glavno merilo
  • Pomočno merilo
Program sa izmenama se nalazi na svim klijentima. Da bi ste pokrenuli program u meniju "Komunalne usluge" izaberite podmeni "Pregledi" a zatim "Pregled i analiza stanja Vodomera" 
Po pokretanju programa treba izabrati opciju “Pregled merača koji su ugrađeni u merno mesto“  (kao na slici)
Prelaskom u prozor sa izborom prikaza podataka, primećujemo da postoje dva  nova izbora:
  • Prikaz mernih mesta sa utroškom vode u izabranoj godini
  • Prikaz merača i mernih mesta sa utroškom vode u izabranoj godini


Izborom opcije „Prikaz mernih mesta sa utroškom vode u izabranoj godini“ i klikom na dugme Prikaži izabrane podatke prelazimo u sledeći izbor. U ovom prozoru je potrebno izabrati godinu za koju želimo da prikažemo podatke.


Izborom godine potrebno je da sačekamo da se podaci popune u tabelu.
Tabela ima sledeće kolone:
  • Šifra rejona
  • Šifra podrejona
  • Broj mernog mesta
  • Sledećih dvanaest kolona su meseci sa fakturisanom vodom u tim mesecima.

Negativne količine prestavljaju stornirane kubike kroz reklamaciju. U VIK ovima se prilikom reklamacije ne vezuju kubike koje storniraju za mesec u kojem su pogrešno fakturisani. 
Izborom druge opcije:
Prikaz merača i mernih mesta sa utroškom vode u izabranoj godini, postupak je indetičan samo što će mo dobti drukčiju strukturu podataka.





Žutom bojom su označene one kolone kod kojih mernih mesta je bila zamena merača u toku izabrane godine. Tako da je u prvoj koloni broj merača a sledeće kolone su parametri mernog mesta čiji se utrošci prikazuju.
Dobijene podatke možete ivesti u EXCEL ako uradite desni klik u tabelu i izaberete opciju „Izvoz“




недеља, 1. април 2012.

Zen problem

Budistički sveštenik dobija zadatak od svog učitelja da meditira tačno 45 minuta.
Nema sat, ima samo dva mirišljava štapića, od kojih svaki gori tačno jedan sat, ali različitom brzinom. 
Kako će sveštenik izmeriti tačno 45min meditacije?


Pošto budistički sveštenik zna C#, verovatno je napisao ovakav code:


using System;
using System.Threading;
namespace Puzzle
{
    class Program
    {
        public static Thread T1_l, T1_r, T2_l, T2_r;
       
        static void Main(string[] args)
        {
            ST st1 = new ST(60, 50, 1);
            ST st2 = new ST(60, 50, 2);
            T1_l = new Thread(new ThreadStart(st1.F1));
            T1_r = new Thread(new ThreadStart(st1.F2));
            T2_l = new Thread(new ThreadStart(st2.F1));
            T2_r = new Thread(new ThreadStart(st2.F2));
            st1._e1 += new EventHandler(_EH1l);
            st1._e2 += new EventHandler(_EH1r);
            st1._e0 += new EventHandler(_Fin1);
            st2._e1 += new EventHandler(_EH2l);
            st2._e2 += new EventHandler(_EH2r);
            st2._e0 += new EventHandler(_Fin2);
 
            T1_l.Start();
            T1_r.Start();
            T2_l.Start();
 
            Console.ReadLine();
        }
 
        static void _Fin1(object sender, EventArgs e)
        {
            Console.WriteLine("First finish  " + sender.ToString());
            if (!T2_r.IsAlive)
                T2_r.Start();
        }
        static void _EH1l(object sender, EventArgs e)
        {
            Console.WriteLine("Left  " + sender.ToString());
        }
        static void _EH1r(object sender, EventArgs e)
        {
            Console.WriteLine("Right " + sender.ToString());
        }
        static void _Fin2(object sender, EventArgs e)
        {
            Console.WriteLine("Finish  " + sender.ToString());
        }
        static void _EH2l(object sender, EventArgs e)
        {
            Console.WriteLine("     Left  " + sender.ToString());
        }
        static void _EH2r(object sender, EventArgs e)
        {
            Console.WriteLine("     Right " + sender.ToString());
        }
    }
    public class ST
    {
        public event EventHandler _e1, _e2, _e0;
        private decimal _d = 0;
        private int[] v_s;
        private int[] v_t;
        private int[] v_d;
        int x, y = 0;
        private DateTime dt;
        private int tt = 1000;
        private int a = 0;
        Random sl = new Random();
        public ST(int _t, int _i, int _a)
        {
            v_s = new int[_t];
            v_t = new int[_t];
            v_d = new int[_t];
            Console.Write("Stick " + _a.ToString() + " (");
            for (int i = 0; i < _t; i++)
            {
                v_s[i] = sl.Next(1, _i);
                v_t[i] = _t / 60;
                v_d[i] = v_s[i] * v_t[i];
                if (i != (_t - 1))
                    Console.Write(v_s[i].ToString() + ",");
                else
                    Console.Write(v_s[i].ToString());
 
            }
            Console.WriteLine(")");
            dt = DateTime.Now;
            //   this._d = v_s.Sum();
            foreach (int q in v_s)
                this._d += q;
            y = _t;
            this.a = _a;
 
            //    Console.WriteLine("Stick {0} Duration: {1} Time: {2}", _a, v_d.Sum(),_t);
            int e = 0;
            foreach (int q in v_d)
                e += q;
            Console.WriteLine("Stick {0} Duration: {1} Time: {2}", _a, e, _t);
            Console.WriteLine();
        }
        public void F1()
        {
            string _b = "";
            decimal _tt = 0;
            while (Duration > 0)
            {
                if (Duration <= v_d[x])
                {
                    _tt = Math.Round(((Duration / Convert.ToDecimal(v_d[x])) *
                        Convert.ToDecimal(v_t[x]) / 2), 2) * tt;
 
                    if ((Program.T2_r.IsAlive) && a == 2)
                        Program.T2_r.Abort();
                    if ((Program.T1_r.IsAlive) && a == 1)
                        Program.T1_r.Abort();
                }
                else
                    _tt = v_t[x] * tt;
                Thread.Sleep(Convert.ToInt32(_tt));
                _b = String.Format("Speed: {0:D2} Time: {1:F0} Duration: {2:D2} Remaining: {3:F0} Elapsed: {4:D2}",
                    v_s[x], _tt / tt, v_d[x], Duration - v_d[x], dt.Subtract(DateTime.Now).Duration().Seconds);
 
                _e1((object)_b, new EventArgs());
                Duration = v_d[x];
                x++;
            }
        }
        public void F2()
        {
            string _b = "";
            decimal _tt = 0;
            while (Duration > 0)
            {
                y--;
                if (Duration <= v_d[y])
                {
                    _tt = Math.Round(((Duration / Convert.ToDecimal(v_d[y])) *
                        Convert.ToDecimal(v_t[y]) / 2), 2) * tt;
                    if ((Program.T2_l.IsAlive) && a == 2)
                        Program.T2_l.Abort();
                    if ((Program.T1_l.IsAlive) && a == 1)
                        Program.T1_l.Abort();
                }
                else
                    _tt = v_t[y] * tt;
                Thread.Sleep(Convert.ToInt32(_tt));
                _b = String.Format("Speed: {0:D2} Time: {1:F0} Duration: {2:D2} Remaining: {3:F0} Elapsed: {4:D2}",
                 v_s[y], _tt / tt, v_d[y], Duration - v_d[y], dt.Subtract(DateTime.Now).Duration().Seconds);
                _e2((object)_b, new EventArgs());
                Duration = v_d[y];
            }
        }
        private decimal Duration
        {
            get { return _d; }
            set
            {
                _d = _d - value;
                if (_d < 0)
                    _d = 0;
                if (_d == 0)
                {
                   _e0((object)dt.Subtract(DateTime.Now).Duration().Seconds, new EventArgs();
 
                    if ((Program.T1_l.IsAlive) && a == 1)
                        Program.T1_l.Abort();
                    if ((Program.T1_r.IsAlive) && a == 1)
                        Program.T1_r.Abort();
                    if ((Program.T2_l.IsAlive) && a == 2)
                        Program.T2_l.Abort();
                    if ((Program.T2_r.IsAlive) && a == 2)
                        Program.T2_r.Abort();
                }
            }
        }
    }
}