1

(19 відповідей, залишених у C#, .NET)

Дякую Вам дуже, далі буду допилювати сама
Три дні просиділа над цим чатом і ніяк не могла зрозуміти в чому проблема, як ніби засліпило))
Дякую ще раз

2

(19 відповідей, залишених у C#, .NET)

Ось що я маю зараз:
сервер:

Прихований текст
...
static void HandleClient()
        {
            string userLogin = null;
            string userPassword = null;
            string userAddress = null;

            //TcpClient client = (TcpClient)obj;
            while (true)
            {
                TcpClient client = listener.AcceptTcpClient();
                Socket stream = client.Client;
                byte[] buffer = new byte[2048];
                stream.Receive(buffer);

                //StreamReader sReader = new StreamReader(client.GetStream(), Encoding.ASCII);
                //StreamWriter sWriter = new StreamWriter(client.GetStream(), Encoding.ASCII);

                userAddress = (client.Client.RemoteEndPoint as IPEndPoint).Address.ToString();

                string userMessage = Encoding.ASCII.GetString(buffer).TrimEnd('\0');
                //string userMessage = sReader.ReadLine();
                string request = userMessage.Substring(0, userMessage.IndexOf(':'));

                StreamWriter file = File.AppendText("log.txt");
                file.WriteLine(request);
                file.Close();

                switch (request)
                {
                    case "Login":
                        parseUserMessage(userMessage, ref userLogin, ref userPassword);

                        if (isExistUser(userLogin))
                        {
                            if (isCorrectUser(userLogin, userPassword))
                            {
                                stream.Send(Encoding.ASCII.GetBytes("Good"));
                                //sWriter.WriteLine("Good");
                                //sWriter.Flush();
                                userOnline.Add(userLogin);
                                // stream.Close();
                            }
                            else
                            {
                                stream.Send(Encoding.ASCII.GetBytes("Wrong"));
                                //sWriter.WriteLine("Wrong");
                                //sWriter.Flush();
                                //stream.Close();
                            }
                        }
                        else
                        {
                            MD5 md5Hash = MD5.Create();
                            string hashPassword = getMd5Hash(md5Hash, userPassword);
                            //sWriter.WriteLine("Good");
                            //sWriter.Flush();
                            stream.Send(Encoding.ASCII.GetBytes("Good"));
                            // stream.Close();

                            logins.Add(userLogin, hashPassword);
                            addresses.Add(userLogin, userAddress);
                            userOnline.Add(userLogin);
                        }
                        break;

                    case "Send":
                        stream.Send(Encoding.ASCII.GetBytes("Good"));
                        //sWriter.WriteLine("Wrong");
                        //sWriter.Flush();
                        break;

                    case "GetListOnline":
                        string loginsForSend = null;
                        for (int i = 0; i < userOnline.Count; ++i)
                        {
                            loginsForSend += userOnline[i];
                            loginsForSend += "/";
                        }

                        loginsForSend += userOnline[userOnline.Count - 1];

                        //StreamWriter file = File.AppendText("log.txt");
                        //file.WriteLine(111);
                        //file.Close();
                        stream.Send(Encoding.ASCII.GetBytes("List gets"));

                        //stream.Send(Encoding.ASCII.GetBytes(loginsForSend));
                        //stream.Close();
                        //sWriter.WriteLine(loginsForSend);
                        //sWriter.Flush();
                        break;

                    case "Disconnect":
                        getUserLogin(userMessage, ref userLogin);
                        userOnline.Remove(userLogin);
                        client.Close();
                        break;
                }
                //client.Close();
            }
        }

        static void Main(string[] args)
        {
            try
            {
                listener = new TcpListener(IPAddress.Any, 1024);
                listener.Start();

                while (true)
                {
                    if (listener.Pending())
                    {
                        Thread thread = new Thread(new ThreadStart(HandleClient));
                        thread.Start();
                    }
                }
            }
            catch (SocketException sockEx)
            {
                Console.WriteLine("Socket's error " + sockEx.Message);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: " + ex.Message);
            }
            finally
            {
                listener.Stop();
            }
        }

клієнт (перша форма)

Прихований текст
private void b_login_Click(object sender, EventArgs e)
        {
            try
            {
                client = new TcpClient();
                client.Connect("192.168.1.8", 1024);
                Socket stream = client.Client;

                if (tb_login.Text != "")
                {
                    userLogin = tb_login.Text;
                }

                if (tb_password.Text != "")
                {
                    userPassword = tb_password.Text;
                }

                string sendMessage = "Login:" + userLogin + "/" + userPassword;
                stream.Send(Encoding.ASCII.GetBytes(sendMessage));

                byte[] buffer = new byte[1024];
                stream.Receive(buffer);
                string serverAnswer = Encoding.ASCII.GetString(buffer).TrimEnd('\0');
                if (serverAnswer == "Good")
                {
                    //this.Visible = false;
                    //Chat chat = new Chat(this, client, userLogin);
                    //chat.ShowDialog();
                    //this.Visible = true;
                    //tb_login.Text = "";
                    //tb_password.Text = "";
                    //stream = client.Client;
                   
                    stream.Send(Encoding.ASCII.GetBytes("GetListOnline:"));
                    stream.Receive(buffer);
                    serverAnswer = Encoding.ASCII.GetString(buffer).TrimEnd('\0');
                    MessageBox.Show(serverAnswer);
                }
                else
                {
                    MessageBox.Show("Wrong! Try again");
                    tb_login.Text = "";
                    tb_password.Text = "";
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex.Message);
            }
        }

Тепер помилку не вибиває, але програма клієнта просто зависає ось тут:

 stream.Send(Encoding.ASCII.GetBytes("GetListOnline:"));
 stream.Receive(buffer);

А логування сервера показує, що сервер знову не отримав запиту:

 stream.Send(Encoding.ASCII.GetBytes("GetListOnline:"));

3

(19 відповідей, залишених у C#, .NET)

FakiNyan написав:
pika1989 написав:

Я думаю, можливо це зв'язано з передачею даних від однієї форми до іншої (можливо десь втрачаються дані клієнта)

ото я як раз хтів запропонувати спробувати відправити дані з першої форми, відразу після успішного логіну

Я щойно це зробила, і виходить, що коли намагається другий раз надіслати запит, то клієнт уже від'єднаний. Значить проблема дійсно у сервері

4

(19 відповідей, залишених у C#, .NET)

Я думаю, можливо це зв'язано з передачею даних від однієї форми до іншої (можливо десь втрачаються дані клієнта)

5

(19 відповідей, залишених у C#, .NET)

FakiNyan написав:

поставте брейк-поінт на switch, та гляньте, шо там відбувається, коли приходять дані

Коли дані приходять перший раз, все працює норм, але коли  потік( у клієнті) намагається надіслати дані на сервер, то помилка виникає на рядку

threadStream.Receive(buffer);

А на стороні серевера запит від клієнта

threadStream.Send(Encoding.ASCII.GetBytes("GetListOnline:"));

взагалі не приходить
Аналогічно із іншими запитами

6

(19 відповідей, залишених у C#, .NET)

І взагалі ситуція не змінилась від початкової, а змінилась лише помилка: an existing connection was forcibly closed by the remote host

7

(19 відповідей, залишених у C#, .NET)

FakiNyan написав:
pika1989 написав:

Поставила в Disconnect

а шо лог серверу каже?

Що надходить лише один запит на логування

8

(19 відповідей, залишених у C#, .NET)

Поставила в Disconnect

9

(19 відповідей, залишених у C#, .NET)

Може і так... Взагалі цей рядок я додала недавно
Поставила в Disconnect і тепер маю помилку: an existing connection was forcibly closed by the remote host

10

(19 відповідей, залишених у C#, .NET)

На стороні клієнта

11

(19 відповідей, залишених у C#, .NET)

У мене завдання написати чат, використовуючи класи TcpClient та TcpListener. Чат має бути мультиклієнтний.
Я маю сторону сервера та сторону клієнта у різних програмах.
Ось код програми серверної частини (програма консольна):

Прихований текст
 class Program
    {
        /*
         * This dictionary for saving all logins and password in it
         */
        static Dictionary<string, string> logins = new Dictionary<string, string>();

        /*
         *This dictionary for saving ip asddresses in it
         */
        static Dictionary<string, string> addresses = new Dictionary<string, string>();

        /*
         *This list for saving users whose online
         */
        static List<string> userOnline = new List<string>();

        static TcpListener listener;

        /*
         * This method gets from user's message user's login, password
         */
        static void parseUserMessage(string userMessage, ref string userLogin, ref string userPassword)
        {
            userMessage = userMessage.Substring(userMessage.IndexOf(':') + 1);

            string[] userInfo = userMessage.Split('/');

            userLogin = userInfo[0];
            userPassword = userInfo[1];
        }

        static void getUserLogin(string userMessage, ref string userLogin)
        {
            userMessage = userMessage.Substring(userMessage.IndexOf(':') + 1);
            string[] userInfo = userMessage.Split('/');

            userLogin = userInfo[0];
        }

        static string getMd5Hash(MD5 md5Hash, string input)
        {
            byte[] data = md5Hash.ComputeHash(Encoding.ASCII.GetBytes(input));

            StringBuilder sBuilder = new StringBuilder();

            for (int i = 0; i < data.Length; ++i)
            {
                sBuilder.Append(data[i].ToString("x2"));
            }

            return sBuilder.ToString();
        }

        static bool isCorrectUser(string login, string password)
        {
            MD5 md5Hash = MD5.Create();

            string hash = getMd5Hash(md5Hash, password);

            for (int i = 0; i < logins.Count; ++i)
            {
                if(String.Compare(logins[login],hash) == 0)
                {
                    return true;
                }
            }
            
            return false;
        }

        /*
         * This method check whether exists user with this login
         * in base
         * If user exists than method returns true, else false
         */
        static bool isExistUser(string login)
        {
            for (int i = 0; i < logins.Count; ++i)
            {
                if (logins.ContainsKey(login))
                    return true;
            }
            
            return false;
        }

        static void HandleClient()
        {
            string userLogin = null;
            string userPassword = null;
            string userAddress = null;

            TcpClient client = listener.AcceptTcpClient();
            Socket stream = client.Client;
            byte[] buffer = new byte[2048];
            stream.Receive(buffer);

            userAddress = (client.Client.RemoteEndPoint as IPEndPoint).Address.ToString();

            string userMessage = Encoding.ASCII.GetString(buffer).TrimEnd('\0');
            string request = userMessage.Substring(0, userMessage.IndexOf(':'));
    
       /*
            * This part for debugging
        */
            StreamWriter file = File.AppendText("log.txt");
            file.WriteLine(request);
            file.Close();

            switch (request)
            {
                case "Login":
                    parseUserMessage(userMessage, ref userLogin, ref userPassword);
                    
                    if (isExistUser(userLogin))
                    {
                        if (isCorrectUser(userLogin, userPassword))
                        {
                            stream.Send(Encoding.ASCII.GetBytes("Good"));
                            userOnline.Add(userLogin);
                        }
                        else
                        {
                            stream.Send(Encoding.ASCII.GetBytes("Wrong"));
                        }
                    }
                    else
                    {
                        MD5 md5Hash = MD5.Create();
                        string hashPassword = getMd5Hash(md5Hash, userPassword);
                        stream.Send(Encoding.ASCII.GetBytes("Good"));

                        logins.Add(userLogin, hashPassword);
                        addresses.Add(userLogin, userAddress);
                        userOnline.Add(userLogin);
                    }
                    break;

                /*
         * Just for testing. There is must be another code
         */
        case "Send":
                    stream.Send(Encoding.ASCII.GetBytes("Good"));
                    break;

                case "GetListOnline":
                    string loginsForSend = null;
                    for (int i = 0; i < userOnline.Count; ++i)
                    {
                        loginsForSend += userOnline[i];
                        loginsForSend += "/";
                    }

                    loginsForSend += userOnline[userOnline.Count - 1];

                    stream.Send(Encoding.ASCII.GetBytes(loginsForSend));
                    break;

                case "Disconnect":
                    getUserLogin(userMessage, ref userLogin);
                    userOnline.Remove(userLogin);
                    break;
            }
            client.Close();
        }

        static void Main(string[] args)
        {
            try
            {
                listener = new TcpListener(IPAddress.Any, 1024);
                listener.Start();

                while (true)
                {
                    if (listener.Pending())
                    {
                        Thread thread = new Thread(new ThreadStart(HandleClient));
                        thread.Start();
                    }
                }
            }
            catch (SocketException sockEx)
            {
                Console.WriteLine("Socket's error " + sockEx.Message);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: " + ex.Message);
            }
            finally
            {
                listener.Stop();
            }
        }
    }

І сторона кліента. Вона з інтерфейсом, що має дві форми: одна для логування,

Прихований текст
public partial class Form1 : Form
    {
        string userLogin;
        string userPassword;

        TcpClient client;
        public Form1()
        {
            InitializeComponent();
        }

        private void b_login_Click(object sender, EventArgs e)
        {
            try
            {
                client = new TcpClient();
                client.Connect("192.168.1.8", 1024);
                Socket stream = client.Client;

                if (tb_login.Text != "")
                {
                    userLogin = tb_login.Text;
                }

                if (tb_password.Text != "")
                {
                    userPassword = tb_password.Text;
                }

                string sendMessage = "Login:" + userLogin + "/" + userPassword;
                stream.Send(Encoding.ASCII.GetBytes(sendMessage));

                byte[] buffer = new byte[1024];
                stream.Receive(buffer);
                string serverAnswer = Encoding.ASCII.GetString(buffer).TrimEnd('\0');
                if (serverAnswer == "Good")
                {
                    this.Visible = false;
                    Chat chat = new Chat(this, client, userLogin);
                    chat.ShowDialog();
                    this.Visible = true;
                    tb_login.Text = "";
                    tb_password.Text = "";
                }
                else
                {
                    MessageBox.Show("Wrong! Try again");
                    tb_login.Text = "";
                    tb_password.Text = "";
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex.Message);
            }
        }

        private void b_cancel_Click(object sender, EventArgs e)
        {
            this.Close();
        }

    }

друга для чату.

Прихований текст
public partial class Chat : Form
    {
        Form1 parent;
        string userLogin;
        Thread thread;
        TcpClient client;

        public Chat()
        {
            InitializeComponent();
        }

        public Chat(Form1 parent, TcpClient client, string userLogin): this()
        {
            this.parent = parent;
            this.client = client;
            this.userLogin = userLogin;

            thread = new Thread(new ParameterizedThreadStart(getUserOnline));
            thread.IsBackground = true;
            thread.Start(client);
        }

        private void getUserOnline(object obj)
        {
            try
            {
                TcpClient threadClient = (TcpClient)obj;
           
                while (true)
                {
                    Socket threadStream = threadClient.Client;
                    if (lbox_Online.Items.Count > 0)
                        lbox_Online.Invoke(new Action(() => lbox_Online.Items.Clear()));

                    threadStream.Send(Encoding.ASCII.GetBytes("GetListOnline:"));
                    
                    StreamWriter file = File.AppendText("C:\\temp\\client_log.txt");
                    file.WriteLine(111);
                    file.Close();

                    byte[] buffer = new byte[2048];
                    threadStream.Receive(buffer);
                    string serverAnswer = Encoding.ASCII.GetString(buffer).TrimEnd('\0');
                    string[] usersLogins = serverAnswer.Split('/');

                    lbox_Online.Invoke(new Action(() =>
                        {
                            for (int i = 0; i < usersLogins.Length; ++i)
                            {
                                lbox_Online.Items.Add(usersLogins[i]);
                            }
                        }
                    ));
                    Thread.Sleep(2000);
                }
            }
            catch(Exception ex)
            {
                MessageBox.Show("Error: " + ex.Message);
            }
        }

        private void Chat_FormClosing(object sender, FormClosingEventArgs e)
        {
            try
            {
                Socket stream = client.Client;
                string sendMessage = "Disconnect:" + userLogin + "/";
                stream.Send(Encoding.ASCII.GetBytes(sendMessage));
                client.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex.Message);
            }
        }

        private void b_Send_Click(object sender, EventArgs e)
        {
            try
            {
                Socket stream = client.Client;
                string whom = userLogin;
                string sendMessage = "Send:" + userLogin + ":" + textBox2.Text;
                stream.Send(Encoding.ASCII.GetBytes(sendMessage));

                byte[] data = new byte[1024];
                stream.Receive(data);
                string serverAnswer = Encoding.ASCII.GetString(data);
                if (serverAnswer == "good")
                {
                    lbox_Message.Items.Add(sendMessage);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex.Message);
            }
        }
    }

І, власне, сама проблема: Коли клієнт надсилає до серевера перше повідомлення (у моєму випадку це при логуванні),
то все ніби працює. Але коли намагаюсь відправляти наступні ( наприклад отримати список корстувачів чи просто відправити повідомлення) виникає виключення:  An established connection was aborted by the software in your host machine.
З чим це може бути пов'язано?

12

(0 відповідей, залишених у C#, .NET)

Необхідно малювати label від місця, де натискається ЛКМ, і до моменту відпускання. Коли я протягую мишу в право-вниз, то все працює. Але я вирішила ускладнити задачу і додати можливість малювати у протилежному напрямку, тобто вліво-вверх, і вже при протягуванні label не зʼявляється. Виводила значення width, height (у іншу label), то вони нульові (коли протягувати вліво-вверх), але коли потім мишку знову тягнути вниз-вправо, то малюється, але координати початку зміщені до тої точки, де була мишка востаннє під час руху вверх-вліво.
В чому  може бути проблема?

Прихований текст
public partial class Form4 : Form
{
    int start_x;
    int start_y;
    int end_x;
    int end_y;
    Label label;
    bool draw = false;

    public Form4()
    {
        InitializeComponent();
        start_x = 0;
        start_y = 0;
        end_x = 0;
        end_y = 0;
    }

    private Label CreateLabel(int s_x, int s_y, int e_x, int e_y)
    {
        Label label = new Label();

        if (s_x < e_x && s_y < e_y)
        {
            label.Location = new Point(s_x, s_y);
            label.Width = e_x - s_x;
            label.Height = e_y - s_y;
        }
        else if(s_x > e_x && s_y > e_y)
        {
            label.Location = new Point(e_x, e_y);
            label.Width = s_x - e_x;
            label.Height = s_y - e_y;
        }
        
        Random rand = new Random();
        label.BackColor = Color.FromArgb(rand.Next(255), rand.Next(255), rand.Next(255));

        return label;
    }

    private void Form4_MouseDown(object sender, MouseEventArgs e)
    {
        start_x = e.X;
        start_y = e.Y;
        label = CreateLabel(start_x, start_y, start_x, start_y);
        draw = true;
        this.Controls.Add(label);
    }

    private void Form4_MouseMove(object sender, MouseEventArgs e)
    {
        if (draw)
        {
            // calculate new location and size
            int new_start_x=start_x, new_start_y=start_y;
            int width, height;
            end_x = e.X;
            end_y = e.Y;
            if (end_x < start_x)
            {
                new_start_x = end_x;
            }
            if (end_y < start_y)
            {
                new_start_y = end_y;
            }
            
            width = Math.Abs(start_x - end_x);
            height = Math.Abs(start_y - end_y);
            
            start_x = new_start_x;
            start_y = new_start_y;

            // draw resized label
            label.Location = new Point(start_x, start_y);
            label.Width = width;
            label.Height = height;
        }
    }

    private void Form4_MouseUp(object sender, MouseEventArgs e)
    {
       draw = false;
    }
}

13

(5 відповідей, залишених у C#, .NET)

Я все-таки вирішила запитати у викладача як виконати цю індексацію, і ось результат:

Прихований текст
public string this[int key]
{
    get
    {
        if (key < 0 || key >= diseases.Count)
            return String.Format("Index can't be < {0} and >{1}", 0, diseases.Count);
        else
            return diseases[key];
    }
    set
    {
        if (key < 0 || key >= diseases.Count)
            Console.WriteLine("Index can't be < {0} and >{1}", 0, diseases.Count);
        else
            diseases[key] = value;
    }
}

public Medicament this[string name]
{
    get
    {
        int i = 0;
        while (i < medicaments.Count && medicaments[i].name != name)
            ++i;
        if (i < medicaments.Count)
            return medicaments[i];
        return new Medicament();
    }
    set
    {
        int i = 0;
        while (i < medicaments.Count && medicaments[i].name != name)
            ++i;
        if (i < medicaments.Count)
            medicaments[i] = value;
    }
}

Тобто, для того щоб встановити індексацію для двох списків у класі, необхідно щоб був різний тип індексів. Якось так)

14

(5 відповідей, залишених у C#, .NET)

Маю задачу: Створити клас Пацієнт. Клас повинен містити інформацію про пацієнта лікарні:
●    ім’я
●    вік
●    відділення
●    список хвороб
●    лікар
●    список ліків (список структур типу Ліки (назва препарату, ціна, кількість))
●    загальна сума лікування
Методи класу:
●    Конструктор
●    Методи виводу інформації по пацієнту (дані про пацієнта, список ліків, список хвороб)
●    Публічні властивості на поля класу та індексатор для роботи зі списками

Ось структура та клас (без методів виведення інформації)

Прихований текст
struct Medicament
{
    public string name;
    public double price;
    public int quantity;
}

class Patient
{
    string name;
    int age;
    string ward;
    List<string> diseases;
    string doctor_name;
    List<Medicament> medicaments;
    double total_sum_treatment;

    public Patient()
    {
        name = "no name";
        age = 0;
        ward = "no ward";
        diseases = new List<string> ();
        doctor_name = "no doctor";
        medicaments = new List<Medicament> ();
        total_sum_treatment = 0;
    }

    public Patient(string _name, int _age, string _ward, string disease, string doctor, Medicament medicament)
    {
        name = _name;
        age = _age;
        ward = _ward;

        diseases = new List<string>();
        diseases.Add (disease);

        doctor_name = doctor;

        medicaments = new List<Medicament>();
        medicaments.Add (medicament);

        foreach (Medicament drug in medicaments)
            total_sum_treatment += drug.price * drug.quantity;
    }

    //public properties for fields
    public string Name
    {
        get { return name; }
        set { if (value != "") name = value; }
    }

    public int Age
    {
        get { return age; }
        set { if (value > 0) age = value; }
    }

    public string Ward
    {
        get { return ward; }
        set { if (value != "") ward = value; }
    }

    public string Doctor
    {
        get { return doctor_name; }
        set { if (value != "") doctor_name = value; }
    }

    public List<string> Diseases
    {
        get { return diseases; }
    }

    public List<Medicament> Medicaments
    {
        get { return medicaments; }
    }

    public double TotalSumTreatment
    {
        get { return total_sum_treatment; }
    }
}

І, власне, сама проблема: у завданні є пункт про створення індексації для роботи зі списками. Як можна зробити індексацію для двох списків одночасно?
Ось те, що я намагалась зробити (розумію, що це є неправильно, але уявлення не маю як правильно це реалізувати):

Прихований текст
public string this[int key]
{
    get
    {
        if (key < 0 || key >= diseases.Count)
            return String.Format("Index can't be < {0} and >{1}", 0, diseases.Count);
        else
            return diseases[key];
    }
    set
    {
        if (key < 0 || key >= diseases.Count)
            Console.WriteLine("Index can't be < {0} and >{1}", 0, diseases.Count);
        else
            diseases[key] = value;
    }
}

public Medicament this[int key]
{
    get
    {
        if (key < 0 || key >= medicaments.Count)
            return String.Format("Index can't be < {0} and >{1}", 0, medicaments.Count);
        else
            return medicaments[key];
    }
    set
    {
        if (key < 0 || key >= medicaments.Count)
            Console.WriteLine("Index can't be < {0} and >{1}", 0, medicaments.Count);
        else
            medicaments[key] = value;
    }
}

Підкажіть, будь ласка.

15

(1 відповідей, залишених у Бази даних)

Завдання: Створити запит - показати категорію, товарів якої в магазині найменше.

Маю таблиці виду:

Product:
IdProduct | Product's name | IdCategory | Price | Quantity | IdProducer
           1 | xxxxxxxxxxxxxxx |              1 | xxxx |  5          |  xxxxxxxxx
           2 | xxxxxxxxxxxxxxx |              1 | xxxx |  10         |  xxxxxxxxx
           3 | xxxxxxxxxxxxxxx |              2 | xxxx |  4          |  xxxxxxxxx
           4 | xxxxxxxxxxxxxxx |              2 | xxxx |  7          |  xxxxxxxxx

Category:
IdCategory | Category's name
1              |  category 1
2              |  category 2

Кількість товарів - Quantity
Отже, в результаті повинна отриматися category 2 (4 + 7 < 5 + 10)

Алгоритм такий:
шукаю суми товарів по категоріях, а тоді потрібно показати ту категорію, де ця сума найменша. Знайти суми вдалося, а ось вибрати рядок з найменшим значенням - ні (вилазить помилка)

Ось як намагаюсь це зробити:

SELECT  Category.[Category's name] as [Category], SUM(Product.Quantity) as [Quantity]
FROM product, category
WHERE Product.Idcategory = Category.IdCategory
GROUP BY Category.[Category's name]
HAVING [Quantity]=MIN([Quantity]);

Трохи погугливши знайшла, що так звані "alias" у Access не дозволяють робити по них ще якісь операції. Тоді спробувала ось так:

SELECT  Category.[Category's name] as [Category], SUM(Product.Quantity) as [Quantity]
FROM product, category
WHERE Product.Idcategory = Category.IdCategory
GROUP BY Category.[Category's name]
HAVING  SUM(Product.Quantity)=MIN(SUM(Product.Quantity));

Так теж помилка - не можна використовувати min(sum).
Тоді вдалася до крайнощів - думала впорядкувати ці суми по зростанню і показати лише перший рядок (TOP 1):

SELECT  TOP 1 Category.[Category's name] as [Category], SUM(Product.Quantity) as [Quantity]
FROM product, category
WHERE Product.Idcategory = Category.IdCategory
GROUP BY Category.[Category's name]
ORDER BY SUM(Product.Quantity);

Це працює, але:
1) запит негарний
2) у завданні було сказано використати group by i having

Допоможіть будь лаcка зробити "правильно".

16

(18 відповідей, залишених у C++)

Yola написав:
pika1989 написав:

У мене заповняється не поступово, а лише вкінці копіювання
Але дуже Вам дякую

І виходить, що це не зовсім динамічний прогрес бар)

Може ви все ж забули про приведення до float?

Я справді забула про це :[
Все вийшло, дуже-дуже Вам дякую

17

(18 відповідей, залишених у C++)

У мене заповняється не поступово, а лише вкінці копіювання
Але дуже Вам дякую

І виходить, що це не зовсім динамічний прогрес бар)

18

(18 відповідей, залишених у C++)

Гаразд, я зараз спробую

Yola написав:

Та, і не забудьте про цю дурню (float), бо 99/100 це 0.

За це я теж читала, що має бути так)

19

(18 відповідей, залишених у C++)

Коли я коментую цикл у мене взагалі ProgressBar не видно :(

20

(18 відповідей, залишених у C++)

Прихований текст
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by WinAPI_home_work_7_(8_05_16).rc
//
#define IDD_DIALOG1                     101
#define IDD_DIALOG2                     102
#define IDC_OPEN                        1001
#define IDC_SAVE_AS                     1002

// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        103
#define _APS_NEXT_COMMAND_VALUE         40001
#define _APS_NEXT_CONTROL_VALUE         1003
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif