Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > BCB6 + FireBird 1.5


Автор: Oberon83 13.11.2006, 10:07
Мне необходимо забирать данные с Excel формы, с которой я работаю из окна своего приложения через контайнер OLE. При сохранении данных проблем нет - данные в базу садятся корректно, но при редактировании этих данных - запрос UPDATE не проходит - данные остаются теми же. Для записи и редактирования данных используется несколько запросов, т.е. сначала выбирается 2 параметра (2 разных запроса) для результирующей записи, а потом вместе с этими данными запись садится в базу. 
Может быть проблема в том что используется несколько запросов?
Запрос на UPDATE таблицы правильный, поскольку проверял его в самой БД, а вот из приложения он работает некорректно.
В чем может быть дело?
Заранее благодарен.

Автор: Coala 13.11.2006, 13:02
Трудно что-либо советовать не видя твоего кода

Автор: Oberon83 13.11.2006, 15:24
Coala, вот код:
Код


//Значение ячейки
AnsiString table_themes;
AnsiString table_category;
AnsiString table_write;
AnsiString table_id;
AnsiString id;
AnsiString x;
AnsiString y;
AnsiString page;

//Число проходов для выполнения операции сохранения в БД
int kol_zap = 0;
//Счетчик проходов
int i = 0;
//Временная переменная для округления результата до целого
int temp = 0;

AnsiString sql1;
AnsiString sql2;
AnsiString sql4;

//Инициализация статусбара
Form1->sStatusBar1->SimpleText = "Сохранение";
//Сбрасываем прогрессбар
Form1->sGauge1->Progress = 0;

if(Form1->sListBox1->ItemIndex != -1){
 //Выбираем таблицы с которыми будем работать
if(exist_form_search[Form1->sListBox1->ItemIndex].company == 1) {

                table_themes = "THEMES_1";
                table_category = "CATEGORY_1";
                table_write = "WRITE_1";
                table_id = "GEN_WRITE_1";
                } else
                        {

                        table_themes = "THEMES_2";
                        table_category = "CATEGORY_2";
                        table_write = "WRITE_2";
                        table_id = "GEN_WRITE_2";
                        }
                        }
                        else {
                                if(company[Form1->sComboBox1->ItemIndex] == 1) {
                                //ТУ
                                table_themes = "THEMES_1";
                                table_category = "CATEGORY_1";
                                table_write = "WRITE_1";
                                table_id = "GEN_WRITE_1";
                                } else
                                        {
                                        //ФГУЗ
                                        table_themes = "THEMES_2";
                                        table_category = "CATEGORY_2";
                                        table_write = "WRITE_2";
                                        table_id = "GEN_WRITE_2";
                                        }
                        }


        //Выбока категорий (столбцы таблицы)
        sql1 = "SELECT * FROM " + table_category + " WHERE CELL > 0";
        Form1->IBQuery1->SQL->Clear();
        Form1->IBQuery1->SQL->Add(sql1);
        Form1->IBQuery1->Open();

        //Выборка тем (строки таблицы)
        sql2 = "SELECT * FROM " + table_themes + " ORDER BY \"PAGE\"";
        Form1->IBQuery2->SQL->Clear();
        Form1->IBQuery2->SQL->Add(sql2);
        Form1->IBQuery2->Open();

        Form1->IBQuery1->FetchAll();
        Form1->IBQuery2->FetchAll();

        //Считаем количество операции для завершения редактирования(для прогрессбара)
        kol_zap = Form1->IBQuery1->RecordCount * Form1->IBQuery2->RecordCount;

        while(!Form1->IBQuery2->Eof){
        Form1->IBQuery1->First();

                while(!Form1->IBQuery1->Eof){
                //Запись значений в БД
                //Выбираем лист, ячейку, страницу из которой считываем

                page = Form1->IBQuery2->operator []("PAGE");
                y = Form1->IBQuery1->operator []("CELL");
                x = Form1->IBQuery2->operator []("CELL");

                sheet = sheets.OlePropertyGet("Item",StrToInt(page));

                cells = sheet.OlePropertyGet("Cells").OlePropertyGet("Item",StrToInt(x),StrToInt(y));

                //!!!!!!!!!!  Вот этот кусок кода не хочет работать коректно !!!!!!!!!!111

                sql4 = "UPDATE " + table_write;
                sql4 += " SET VAL = ";
                if(AnsiString(cells.OlePropertyGet("Value")) == "") sql4 += "0";
                        else sql4 += AnsiString(cells.OlePropertyGet("Value"));
                sql4 += " WHERE CATEGORY = " + y;
                sql4 += " AND ";
                sql4 += "THEMES = " + x;
                sql4 += " AND ";
                sql4 += "COMPATIBILITY = " + AnsiString(exist_form_search[temp_id].id);

                Form1->IBQuery4->SQL->Clear();
                Form1->IBQuery4->SQL->Add(sql4);
                Form1->IBQuery4->ExecSQL();

                //Здесь работаем с прогрессбаром
                i += 1;
                temp = (i*100)/kol_zap;
                Form1->sGauge1->Progress = temp;

                Form1->IBQuery1->Next();
                }
        Form1->IBQuery2->Next();
        }

        Form1->IBQuery1->Close();
        Form1->IBQuery2->Close();
        Form1->IBTransaction1->Commit();
        Form1->IBQuery4->Close();

//Убираем надпись со статусбара
Form1->sStatusBar1->SimpleText = "";
MessageBox(0, "Форма успешно отредактирована", "Редактирование", MB_OK);


IBQuery1, IBQuery2, IBQuery4 не именованы потому, что выполняют несколько действий. Так что за ненаглядность кода извиняйте.

Автор: Coala 13.11.2006, 15:58
Вроде ошибок нет...НО! (наступал я на такие грабли) - у тебя в условии выборки - 3 сравнения. Попробуй такую фишку (скобки):
Код

                sql4 += " WHERE (CATEGORY = " + y + ")";
                sql4 += " AND ";
                sql4 += "(THEMES = " + x + ")";
                sql4 += " AND ";
                sql4 += "(COMPATIBILITY = " + AnsiString(exist_form_search[temp_id].id + ")");

Автор: Oberon83 13.11.2006, 15:58
Разобрался - глюки BCB, поскольку он у меня вообще упал, а после переустановки - все нормально работает. Так что извиняюсь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)