powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Select в ADOQuery C++ XE3
25 сообщений из 50, страница 1 из 2
Select в ADOQuery C++ XE3
    #38114800
FOGOT-BAstA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго всем дня!
Решили на работе перейти с Access на SQL! Все бы хорошо, только в билдере я практически ноль!
Только начал, а уже возникла проблема в C++ - не могу заставить запрос в ADOQuery работать! Знаю что скорее всего в что-то не дописываю, только никак понять не могу, много книг перерыл, форумов- толку нет!
Короче смысл таков: надо чтобы запрос выводил по значению в DBComboBox2 столбец со значениями из таблицы Dannie в DBComboBox1! Значения в DBComboBox2 я прописал в свойстве String.
Запрос у меня простенький и в самом SQL все работает правильно:SELECT Naimenovanie FROM Dannie WHERE Tematika = Tematika;
В свойство Parameters внес параметр Tematika.
На событые OnDropDown поля DBComboBox2 я прописал следующее:

void __fastcall TForm5::DBComboBox1DropDown(TObject *Sender)
{
ADOQuery2->Active = False;
ADOQuery2->Parameters->ParamByName("Tematika")->Value = DBComboBox2->Text;
ADOQuery2->Active = True;
}

Все подключено к базе через ADOConnection (строки из таблиц выводит=)))
Уже целую неделю пытаюсь понять - безрезультатно!
Кто чем может помочь - прошу! На все вопросы отвечу!
Заранее спасибовсем откликнуышимся!
...
Рейтинг: 0 / 0
Select в ADOQuery C++ XE3
    #38114914
Baby1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FOGOT-BAstA,

попробуй что-то в этом духе (правда в билдере не проверял, нет под рукой)
Только не понятно, тебе в ComboBox1 нужно вывести разовое значение, или накапливать их там списком при каждом выборе в ComboBox2.
Если разово, то зачем ComboBox, можно обойтись каким-нибудь TEdit или Tlabel

void __fastcall TFormMain::ComboBox1Change(TObject *Sender)
{

AnsiString SQLStr;
SQLStr = "select Naimenovanie from Dannie where Tematika = \'" + ComboBox2->Text +"\'";
if(Query->Active) Query->Close();
Query->SQL->Clear();
Query->SQL->Add(SQLStr);
try
{
Query->Open();
Query->First();
ComboBox1->Text = Query->FieldByName("Naimenovanie ")->AsString;
}
catch(...){ShowMessage("Error");}
if(Query->Active)Query->Close();

}
...
Рейтинг: 0 / 0
Select в ADOQuery C++ XE3
    #38115032
FOGOT-BAstA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Baby1,

В ComboBox2 будет выводиться список значениий всех строк из таблицы Dannie у которых Tematika равна значению из ComboBox1. В таблице Dannie уже забиты готовые значения!
Может я что-то усложняю и можно сделать проще?
...
Рейтинг: 0 / 0
Select в ADOQuery C++ XE3
    #38115157
Baby1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FOGOT-BAstA,

тогда в предыдущем примере в try будет что-то вроде
try
{
Query->Open();
Query->First();
while(!Query->Eof)
{
ComboBox1->Items->Add(Query->FieldByName("Naimenovanie ")->AsString);
Query->Next();
}
}
...
Рейтинг: 0 / 0
Select в ADOQuery C++ XE3
    #38115236
Baby1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я правильно понял задачу, то лови работающий кусок:
при нажатии на кнопку коннектимся к БД, при выборе записи в одном боксе, приходят значения во второй

#include <vcl.h>
#pragma hdrstop
#include <ADODB.hpp>


#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TADOConnection *Conn;
TADOQuery *Query;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BtnConnClick(TObject *Sender)
{
AnsiString ConnectionString;
ConnectionString = "Provider=SQLOLEDB.1;"
"Password=password;"
"Persist Security Info=True;"
"User ID=userid;"
"Initial Catalog=databasename;"
"Data Source=servername" ;

Conn = new TADOConnection(NULL);
Conn->ConnectionString = ConnectionString;
Conn->LoginPrompt = false;
Conn->Open();

}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox2Change(TObject *Sender)
{

AnsiString SQLStr;
ComboBox1->Items->Clear();
Query = new TADOQuery(NULL);
if(Query->Active) Query->Close();
Query->Connection = Conn;
SQLStr = "select field2 from TableTest where field1 = \'" + ComboBox2->Text +"\'";
if(Query->Active) Query->Close();
Query->SQL->Clear();
Query->SQL->Add(SQLStr);
try
{
Query->Open();
Query->First();
while(!Query->Eof)
{
ComboBox1->Items->Add(Query->FieldByName("field2")->AsString);
Query->Next();
}
ComboBox1->ItemIndex = 0;
}
catch(...){ShowMessage("Error");}
if(Query->Active)Query->Close();

}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
if(Query->Active) Query->Close();
delete Query;
if(Conn->Connected) Conn->Close();
delete Conn;

}

...
Рейтинг: 0 / 0
Select в ADOQuery C++ XE3
    #38115244
Baby1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот это лучше вынести в TForm1::BtnConnClick
Query = new TADOQuery(NULL);
if(Query->Active) Query->Close();
Query->Connection = Conn;

нефига при каждом выборе создавать новый Query
...
Рейтинг: 0 / 0
Select в ADOQuery C++ XE3
    #38118962
FOGOT-BAstA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Baby1, спасибо огромаенное! Заработало!
У меня не работало потому что я в AnsiString не перевел чтоли?
...
Рейтинг: 0 / 0
Select в ADOQuery C++ XE3
    #38119610
Baby1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FOGOT-BAstA,
Если честно, я вообще не разбирался в твоем коде... просто написал так, как это сделал бы я... не ручаюсь за красоту кода, наверняка можно написать гораздо лучше, но пример работающий..
...
Рейтинг: 0 / 0
Select в ADOQuery C++ XE3
    #38119612
Baby1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S.рад, что смог помочь
...
Рейтинг: 0 / 0
Select в ADOQuery C++ XE3
    #38128186
FOGOT-BAstA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Продолжаю работать над своим чудом и возникло еще пару вопросов:
1. При вставке с помощью запросов значений в некоторые поля DBEdit и DBMemo при повторном нажатии на них (допустим чтобы скопировать полученное значение) значение пропадает! Может кто сталкивался с таким!?
2. Как можно вырвать имя пользователя который последний раз работал/изменял данную запись (хочу чтобы отображался последний кто изменял данное поле).
Baby1 , жаль плюсануть не могу=)
...
Рейтинг: 0 / 0
Select в ADOQuery C++ XE3
    #38129581
BlackEric
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FOGOT-BAstA,

Код покажите? Если пропадает, то либо перескакивает курсор в датасете либо данные не сохраняются
...
Рейтинг: 0 / 0
Select в ADOQuery C++ XE3
    #38130311
FOGOT-BAstA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlackEric,

Вот код вставки св-ва FileName из OpenDialog:
void __fastcall TForm6::Button1Click(TObject *Sender)
{
if (Form6->OpenDialog1->Execute())
{
Form6->DBMemo1->Text = Form6->OpenDialog1->FileName;

Использовал АДОQuery и АDOTable, но сейчас думаю что надо DataSet и Command использовать, а то выскакивает ошибка поиска строк для обновления!
Причем у созданных далее 2-х записей такой проблемы нет. А вот 4 делаю там такая же фигня!
...
Рейтинг: 0 / 0
Select в ADOQuery C++ XE3
    #38131051
BlackEric
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FOGOT-BAstABlackEric,

Вот код вставки св-ва FileName из OpenDialog:
void __fastcall TForm6::Button1Click(TObject *Sender)
{
if (Form6->OpenDialog1->Execute())
{
Form6->DBMemo1->Text = Form6->OpenDialog1->FileName;

Использовал АДОQuery и АDOTable, но сейчас думаю что надо DataSet и Command использовать, а то выскакивает ошибка поиска строк для обновления!
Причем у созданных далее 2-х записей такой проблемы нет. А вот 4 делаю там такая же фигня!

1. Забудьте про АDOTable. Используйте датасет.
2. Присваивайте данные не компоненту, а полю датасета к которуму забинден компонент и делайте Post. Тогда все должно быть корректно.

...
Рейтинг: 0 / 0
Select в ADOQuery C++ XE3
    #38132036
FOGOT-BAstA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2. Присваивайте данные не компоненту, а полю датасета к которуму забинден компонент и делайте Post. Тогда все должно быть корректно.

Можешь показать маленький примерчик, а то в моих конспектах с института такого нет)))
Спасибо заранее!
...
Рейтинг: 0 / 0
Select в ADOQuery C++ XE3
    #38133795
Baby1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FOGOT-BAstAПродолжаю работать над своим чудом и возникло еще пару вопросов:
2. Как можно вырвать имя пользователя который последний раз работал/изменял данную запись (хочу чтобы отображался последний кто изменял данное поле).


Как вариант, вести в таблице поле, в котором хранить данные о создавшем/изменившем запись.
При вставке/изменении записи в таблице прописывать в него соответствующую информацию. Я обычно пишу SYSTEM_USER(значение текущего имени входа). Еще обычно требуется дата последнего изменения.
...
Рейтинг: 0 / 0
Select в ADOQuery C++ XE3
    #38137406
FOGOT-BAstA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Baby1,
Сделал вот такой триггер который при добавлении или изменении строки в таблице Proshivki2 заносит имя и дату изменения в таблицу UpdateProshivki1:

ALTER TRIGGER updatedby4 ON Proshivki2

FOR INSERT, UPDATE

AS

INSERT INTO UpdateProshivki1 (ID, UpdateDate, UpdatedBy)

SELECT ID, getdate(), SYSTEM_USER

FROM inserted

Дальше у меня возникла проблема как выводить ID изменений UpdateProshivki1 соответствующих ID строк таблицы Proshivki2 (чтобы в форме выводились только изменения сделанные над данной записью)??
Можно как-то в триггере прописать?или надо запрос на DBGrid писать?
Спасибо!
...
Рейтинг: 0 / 0
Select в ADOQuery C++ XE3
    #38137675
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
-- test data
declare @Proshivki2 table(ID int, name varchar(30))
insert into @Proshivki2(ID, name)
values (1, 'item1')
      ,(2, 'item2')
      
declare @UpdateProshivki1 table(ID int, UpdateDate date, UpdatedBy varchar(30))
insert into @UpdateProshivki1(ID, UpdateDate, UpdatedBy)
values (1, '20130101', 'user1')
      ,(1, '20130201', 'user3')
      ,(2, '20130102', 'user1')
      ,(2, '20130103', 'user2')
-- end of test data

select P.ID
      ,P.name
      ,U.UpdateDate
      ,U.UpdatedBy
  from @Proshivki2 as P
  outer apply (select top 1 UP.UpdateDate, UP.UpdatedBy
                 from @UpdateProshivki1 as UP
                where UP.ID = P.ID
                order by UP.UpdatedBy desc) as U

Код: sql
1.
2.
3.
4.
5.
6.
ID          name                           UpdateDate UpdatedBy
----------- ------------------------------ ---------- ------------------------------
1           item1                          2013-02-01 user3
2           item2                          2013-01-03 user2

(2 row(s) affected)
...
Рейтинг: 0 / 0
Select в ADOQuery C++ XE3
    #38139398
FOGOT-BAstA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я сделал проще:
Создал триггер на занесение в стороннюю таблицу данных по изменению:

[/SRC]ALTER TRIGGER updatedby4 ON Proshivki2

FOR INSERT, UPDATE

AS

INSERT INTO UpdateProshivki1 (ID, UpdateDate, UpdatedBy)

SELECT ID, getdate(), SYSTEM_USER

FROM inserted[/SRC]

А потом в билдере по запросу выбираю соответствующие поля!
Но спасибо за ответ, твой вариант с переменными таблицами попробую реализвать))
Кто-нибудь знает как в DBComboBox разрешить только забитые в него значения?Чтобы небыло вырианта что-то писать!
Пробовал на события ставить ReadOnly=true , но все-ровно в некоторых случаях можно оставить пустую строку или написать отсебятину!
...
Рейтинг: 0 / 0
Select в ADOQuery C++ XE3
    #38139511
Baby1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FOGOT-BAstAКто-нибудь знает как в DBComboBox разрешить только забитые в него значения?Чтобы небыло вырианта что-то писать!


ComboBox->Style = csDropDownList;
...
Рейтинг: 0 / 0
Select в ADOQuery C++ XE3
    #38139584
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FOGOT-BAstAА потом в билдере по запросу выбираю соответствующие поля!по какому запросу?
...
Рейтинг: 0 / 0
Select в ADOQuery C++ XE3
    #38141074
FOGOT-BAstA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SELECT UpdateDate, UpdatedBy FROM UpdateProshivki1 WHERE ID = " + DBEdit5->Text
Вот такой запрос сравнивает ID который в Edit и выводит соответствующие записи!
...
Рейтинг: 0 / 0
Select в ADOQuery C++ XE3
    #38141378
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а, значит я неправильно понял задачу
я думал, что FOGOT-BAstAстрок таблицы Proshivki2в Вашем диалоге несколько (грид там или типа того)
...
Рейтинг: 0 / 0
Select в ADOQuery C++ XE3
    #38143040
FOGOT-BAstA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хахаха наверное дсотал тупыми вопросами всех уже=))) Но нужна подсказочка для решения такой задачи:
Есть одна форма в С++ на которой будет работать 5-6 ОДНОТИПНЫХ таблиц (все столбцы идентичны по названию, кроме поля ID). Т.к. поля одинаковые, я хочу в зависимости от выбранного поля Тематика (опять оно=)))) выбирать конкретную такблицу! Пробовал реализовать (по-тупому) с помощью датасета и условий if-else, сравнивая из выбранного значения DBComboBox и подставляя соответствующие названия таблиц в CommandText компонента DataSet
ADODataSet1->Close();
if (DBComboBox1->Text == "Комбайн")
{
ADODataSet1->Edit();
ADODataSet1->CommandText ="Kartochka_Kombain";
ADODataSet1->Open();
}
else if (DBComboBox1->Text == "Трактор")
{
ADODataSet1->Edit();
ADODataSet1->CommandText="Kartochka_Traktor";
ADODataSet1->Open();
}
else if (DBComboBox1->Text == "АГСЭ")
{
ADODataSet1->Edit();
ADODataSet1->CommandText="Kartochka_AGS";
ADODataSet1->Open();
}
else if (DBComboBox1->Text == "АДАСЭ")
{
ADODataSet1->Edit();
ADODataSet1->CommandText="Kartochka_ADAS";
ADODataSet1->Open();
}
else if (DBComboBox1->Text == "УКЭД")
{
ADODataSet1->Edit();
ADODataSet1->CommandText="Kartochka_YKED";
ADODataSet1->Open();
}
else if (DBComboBox1->Text == "УКТУС-ТМ")
{
ADODataSet1->Edit();
ADODataSet1->CommandText="Kartochka_YKTYS";
ADODataSet1->Open();
}
else if (DBComboBox1->Text == "УКШ")
{
ADODataSet1->Edit();
ADODataSet1->CommandText="Kartochka_YKSH";
ADODataSet1->Open();
}
else
{
ShowMessage("Выберите тематику из списка! Иначе обратитесь к Администратору!");
}
но не работает, то пишет что невозможно править датасет т.к. он закрыт, то открыт, и самое главное DBComboBox не вставляет значения пока ДатаСет не активирован...короче перепробовал открывать, закрывать по созданию, вставлять принудительно название таблиц в CommandText все тщетно...
Спасибо заранее!=)))
...
Рейтинг: 0 / 0
Select в ADOQuery C++ XE3
    #38143082
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обратитесь к тому, кто проектировал Вашу БД и спросите - а зачем это он создал 6 однотипных таблиц вместо одной?
...
Рейтинг: 0 / 0
Select в ADOQuery C++ XE3
    #38143091
FOGOT-BAstA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дак это я и есть=))))Хочу унифицировать, что бы не создавать 6 форм, а использовать 1=)))
...
Рейтинг: 0 / 0
25 сообщений из 50, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Select в ADOQuery C++ XE3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]