Показано с 1 по 7 из 7

Тема: Работа с Access в C++Builder 5

  1. #1
    Senior Member
    Регистрация
    26.08.2008
    Сообщений
    318

    Работа с Access в C++Builder 5

    Для локальной работы выбрал тип базы данных Access. Не уверен, что работаю с ней на должном уровне. Может быть существует другой способ.
    Новая запись:
    ADOCommand1->Parameters->ParamValues["Pls"]=ls;
    ADOCommand1->Parameters->ParamValues["Pkod"]=kodto;
    ADOCommand1->Parameters->ParamValues["Pkodsch"]=sch;
    ADOCommand1->Parameters->ParamValues["Pdata"]=DateTimePicker1->Date;
    ADOCommand1->Parameters->ParamValues["Pnach"]=StrToInt(Edit6->Text);
    ADOCommand1->Parameters->ParamValues["Pkon"]=StrToInt(Edit7->Text);
    ADOCommand1->Parameters->ParamValues["Pitog"]=StrToFloat(Edit9->Text);
    ADOCommand1->Parameters->ParamValues["Pkoeff"]=StrToFloat(Edit8->Text);
    ADOCommand1->Parameters->ParamValues["Pdav"]=StrToFloat(Edit1->Text);
    ADOCommand1->Parameters->ParamValues["Pbardav"]=StrToFloat(Edit2->Text);
    ADOCommand1->Parameters->ParamValues["Ptemp"]=StrToFloat(Edit3->Text);
    ADOCommand1->Parameters->ParamValues["Pco"]=StrToFloat(Edit4->Text);
    ADOCommand1->Parameters->ParamValues["Ptehpot"]=StrToFloat(Edit5->Text);
    ADOCommand1->Parameters->ParamValues["Pkodpokaz"]=kodpokazch;
    AnsiString sqlt;
    sqlt="insert into Pokaz (Ls, Kod, Kodsch, Data, Nach, Kon, Itog, Koeff, ";
    sqlt=sqlt+"Dav, Bardav, Temp, CO, Tehpot, Kodpokaz) values (:Pls, :Pkod, ";
    sqlt=sqlt+":Pkodsch, :Pdata, :Pnach, :Pkon, :Pitog, :Pkoeff, :Pdav, :Pbardav, ";
    sqlt=sqlt+":Ptemp, :Pco, :Ptehpot, :Pkodpokaz);";
    ADOCommand1->CommandText = sqlt;
    ADOCommand1->CommandType = cmdText;
    ADOCommand1->Execute();
    redschto=0;
    Form16->Close();
    Редактировать:
    AnsiString sqlt;
    sqlt="update Pokaz set Data = :Pdata, Nach = :Pnach, Kon = :Pkon, ";
    sqlt=sqlt+"Itog = :Pitog, Koeff = :Pkoeff, Dav = :Pdav, Bardav = :Pbardav";
    sqlt=sqlt+", Temp = :Ptemp, CO = :Pco, Tehpot = :Ptehpot ";
    sqlt=sqlt+"where Ls = :Pls and Kod = :Pkod and Kodsch = :Pkodsch and";
    sqlt=sqlt+" Kodpokaz = :Pkodpokaz;";
    ADOCommand1->CommandText = sqlt;
    ADOCommand1->CommandType = cmdText;
    ADOCommand1->Execute();

  2. #2
    Активный пользователь Аватар для Sandro
    Регистрация
    14.06.2008
    Сообщений
    2,811

    Re: Работа с Access в C++Builder 5

    В принципе ничего лишнего в коде нету.... Работать надо примерно в таком духе...

    Нужно, разве что, включить отлов ошибок... Потому что, если пользователь введет в Edit не число, а что-нибудь другое, программа вызовет исключение и выдаст малопонятное сообщение.

    Можно использовать также другие компоненты с палитры ADO, например, ADODataSet. Если надо, выложу описание и пример.
    Don't read the warnings, go straight and start to fly.

  3. #3
    Senior Member
    Регистрация
    26.08.2008
    Сообщений
    318

    Re: Работа с Access в C++Builder 5

    В данном случае работа разделена на три этапа:
    1. Выборка данных из базы и размещение информации на форме (текстовые поля, надписи и т.д.)
    Form16->Height=355;
    Form16->Width=696;
    sch=Form3->ADOQuery6Kodsch->Value;
    //Выбираем прибор абонента
    ADOQuery2->Parameters->ParamByName("Pls")->Value = ls;
    ADOQuery2->Parameters->ParamByName("Pkod")->Value = kodto;
    ADOQuery2->Parameters->ParamByName("Pkodsch")->Value = sch;
    ADOQuery2->Open();
    //Ищем вид прибора
    int kodspr=ADOQuery2Kodspr->Value;
    ADOQuery3->Parameters->ParamByName("Pkodspr")->Value = kodspr;
    ADOQuery3->Open();
    vidscht=ADOQuery3Vid->Value;
    Label12->Caption=vidscht;
    Label1->Caption=Form3->ADOQuery6Tip->Value;
    Label2->Caption=Form3->ADOQuery5Name->Value;
    ADOQuery4->Open();
    if(redschto==2)//если редактируем
    {
    // открываем таблицу показаний
    kodpokazch=Form3->ADOQuery7Kodpokaz->Value;
    ADOQuery1->Parameters->ParamByName("Pls")->Value = ls;
    ADOQuery1->Parameters->ParamByName("Pkod")->Value = kodto;
    ADOQuery1->Parameters->ParamByName("Pkodsch")->Value = sch;
    ADOQuery1->Parameters->ParamByName("Pkodpokaz")->Value=kodpokazch;
    ADOQuery1->Open();
    //вывести пользователю информацию
    Edit1->Text=Form3->ADOQuery7Dav->Value;
    Edit2->Text=Form3->ADOQuery7Bardav->Value;
    Edit3->Text=Form3->ADOQuery7Temp->Value;
    //и т.д. и т.п.
    }
    if(redschto==1)// если новый расчет
    {
    //Так я ищу самую последнюю по дате запись. Другого способа не нашел…
    TDate datapok;
    Form3->ADOQuery7->First();
    datapok=Form3->ADOQuery7Data->Value;
    while(!Form3->ADOQuery7->Eof)
    {
    if(datapok<Form3->ADOQuery7Data->Value)
    {
    datapok=Form3->ADOQuery7Data->Value;
    }
    Form3->ADOQuery7->Next();
    }
    Form3->ADOQuery7->Filtered=true;
    Form3->ADOQuery7->Filter="Data = '"+datapok+"'";
    if(Form3->ADOQuery7Kon->Value>0)
    {
    Edit6->Text=Form3->ADOQuery7Kon->Value;
    }
    else
    {
    //ставим начальное значение если конечного не было
    Edit6->Text=Form3->ADOQuery7Nach->Value;
    }
    DateTimePicker1->Date=Now();
    Form3->ADOQuery7->Filtered=false;
    //найти код
    Form3->ADOQuery7->First();
    kodpokazch=Form3->ADOQuery7Kodpokaz->Value;
    while(!Form3->ADOQuery7->Eof)
    {
    if(kodpokazch<Form3->ADOQuery7Kodpokaz->Value)
    {
    kodpokazch=Form3->ADOQuery7Kodpokaz->Value;
    }
    Form3->ADOQuery7->Next();
    }
    kodpokazch=kodpokazch+1; //нашел и увеличил для новой записи
    }
    2. а)Проверка на ошибки, вызов необходимых функций, обработка информации и вывод результата расчета:
    try
    {
    //расчет

    }
    catch (Exception &exception)//Наличие любой ошибки.
    {
    errorper=1;//переменная для ошибки.
    ShowMessage("Ошибка значения! Проверьте введенную информацию!");
    }
    3. Если ошибок нет – сохранение информации в базу.

  4. #4
    Senior Member
    Регистрация
    26.08.2008
    Сообщений
    318

    Re: Работа с Access в C++Builder 5

    Sandro, а как на счет способа работы с многооконным приложением, которое я тут реализовал? В частности я не выбираю данные заново в новом окне, а использую результат набора данных того, в котором уже отработан запрос. Например при необходимости использования отбора по коду.

  5. #5
    Активный пользователь Аватар для Sandro
    Регистрация
    14.06.2008
    Сообщений
    2,811

    Re: Работа с Access в C++Builder 5

    код скопировал. как время будет, посмотрю
    Don't read the warnings, go straight and start to fly.

  6. #6
    Senior Member
    Регистрация
    26.08.2008
    Сообщений
    318

    Re: Работа с Access в C++Builder 5

    Цитата Сообщение от Sandro
    код скопировал. как время будет, посмотрю
    Заранее благодарю.
    Для полноты картины приведу общую схему работы, которую я пока нашел оптимальной.
    Первая форма MDIForm на которой распологается основное меню приложения MainMenu1, ADOConnection1 отвечающий за подключение к базе данных. ADOConnection1 виден из всех дочерних форм #include "Unit1.h" для того чтоб использовать один объект подключения (это удобно). DataSource1 и ADOQuery1 овечающий за первоначальную выборку служебной информации из базы: определение открытого для редактирования периода.

    ADOConnection1->Open();
    //определить, есть ли открытый период и установить даты периода
    AnsiString sqlt;
    sqlt="select * from Period where Activ=1;";
    ADOQuery1->SQL->Clear();
    ADOQuery1->SQL->Add(sqlt);
    ADOQuery1->Open();
    openperiod=ADOQuery1Activ->Value;
    if(openperiod==1)
    {
    beginperiod=ADOQuery1Nperiod->Value;
    endperiod=ADOQuery1Kperiod->Value;
    }
    else
    {
    openperiod=0;
    }
    ADOQuery1->Close();

    beginperiod и endperiod глобальные переменные.
    Объявление:
    int openperiod=0; //переменная наличия открытого периода
    TDate beginperiod=Now(); //дата начала периода
    TDate endperiod=Now(); //дата конца периода

    Далее из MainMenu1 или кнопки ToolBar1 вызывается необходимая форма, например, Form3.
    Вот тут собственно и сомнения. База большая, из множества таблиц. Вот что я сделал. Для каждой используемой на форме таблицы я сделал связку DataSource – ADOQuery и в каждом ADOQuery ручками прописал в свойстве Parameters используемые в работе параметры, например Pls, Pkod, Pkodsch. Так же в свойство SQL каждого объекта ADOQuery ручками вписал текст SQL запроса с приминением используемых параметров, например: select * from Pokaz where (Ls = :Pls) and (Kod = :Pkod) and (Kodsch = :Pkodsch) order by Data; А вот значения параметров уже задаю программно, в зависимости от выбора пользователя, соответственно программно могу изменить текст запроса, но не переназначить параметры для запроса. При открытии Form3 получается вот что.

    void __fastcall TForm3FormShow(TObject *Sender)
    {
    Form3->Width=922;
    Form3->Height=631;
    if(sprls==1)
    {
    //передача в запрос счета
    ADOQuery1->Close();
    ADOQuery1->Parameters->ParamByName("Pkod")->Value = ls;
    ADOQuery1->Open();
    Edit1->Text=ADOQuery1Kod->Value;
    Panel1->Caption=ADOQuery1Name->Value;
    Panel2->Caption=ADOQuery1Adres->Value;
    //передача в запрос кода участка
    ADOQuery3->Close();
    ADOQuery3->Parameters->ParamByName("Pkod")->Value = ADOQuery1Uch->Value;
    ADOQuery3->Open();
    Panel3->Caption="Участок: "+ADOQuery3Name->Value;
    //передача в запрос кода станции
    ADOQuery4->Close();
    ADOQuery4->Parameters->ParamByName("Pkod")->Value = ADOQuery1Grs->Value;
    ADOQuery4->Open();
    Panel4->Caption="Станция: "+ADOQuery4Name->Value;
    //передача в запрос кода предприятия для договора
    ADOQuery2->Close();
    ADOQuery2->Parameters->ParamByName("Pkod")->Value = ls;
    ADOQuery2->Open();
    Panel5->Caption="Договор № "+ADOQuery2Dognom->Value+" от "+ADOQuery2Dataz->Value;
    //точки отбора
    ADOQuery5->Close();
    ADOQuery5->Parameters->ParamByName("Pls")->Value = ls;
    ADOQuery5->Open();
    //прибор
    kodto=ADOQuery5Kod->Value;
    ADOQuery6->Close();
    ADOQuery6->Parameters->ParamByName("Pls")->Value = ls;
    ADOQuery6->Parameters->ParamByName("Pkod")->Value = kodto;
    ADOQuery6->Open();
    //данные прибора
    schto=ADOQuery6Kodsch->Value;
    ADOQuery7->Close();
    ADOQuery7->Parameters->ParamByName("Pls")->Value = ls;
    ADOQuery7->Parameters->ParamByName("Pkod")->Value = kodto;
    ADOQuery7->Parameters->ParamByName("Pkodsch")->Value = schto;
    ADOQuery7->Open();
    //выбрать оборудование
    ADOQuery8->Close();
    ADOQuery8->Parameters->ParamByName("Pls")->Value = ls;
    ADOQuery8->Parameters->ParamByName("Pkodto")->Value = kodto;
    ADOQuery8->Parameters->ParamByName("Pschkod")->Value = schto;
    ADOQuery8->Open();
    }
    }
    В коде получается все красиво и удобочитаемо, как мне кажется.
    Вызываю из Form3 форму Form16

    void __fastcall TForm3DBGrid3DblClick(TObject *Sender)
    {
    AnsiString statussch=ADOQuery6Status->Value;
    if(statussch=="Подключен")
    {
    redschto=2;
    Application->CreateForm(__classid(TForm16), &Form16);
    Form16->Show();
    }
    else
    {
    ShowMessage("Оборудования нет или оно отключено!");
    }
    }

    И в форме 16 я уже использую наборы данных формы 3, дабы не создавать заново, ведь уже есть и формы зависимы. Для надежности текстовым полям можно программно запретить редактирование.

    if(redschto==2)
    {
    // открываем таблицу
    kodpokazch=Form3->ADOQuery7Kodpokaz->Value;
    ADOQuery1->Parameters->ParamByName("Pls")->Value = ls;
    ADOQuery1->Parameters->ParamByName("Pkod")->Value = kodto;
    ADOQuery1->Parameters->ParamByName("Pkodsch")->Value = sch;
    ADOQuery1->Parameters->ParamByName("Pkodpokaz")->Value=kodpokazch;
    ADOQuery1->Open();
    Edit1->Text=Form3->ADOQuery7Dav->Value;
    Edit2->Text=Form3->ADOQuery7Bardav->Value;
    Edit3->Text=Form3->ADOQuery7Temp->Value;
    Edit4->Text=Form3->ADOQuery7CO->Value;
    DateTimePicker1->Date=Form3->ADOQuery7Data->Value;
    Edit5->Text=Form3->ADOQuery7Tehpot->Value;
    Edit6->Text=Form3->ADOQuery7Nach->Value;
    Edit7->Text=Form3->ADOQuery7Kon->Value;
    Edit8->Text=Form3->ADOQuery7Koeff->Value;
    Edit9->Text=Form3->ADOQuery7Itog->Value;
    }
    if(redschto==1)
    {
    TDate datapok;
    Form3->ADOQuery7->First();
    datapok=Form3->ADOQuery7Data->Value;
    while(!Form3->ADOQuery7->Eof)
    {
    if(datapok<Form3->ADOQuery7Data->Value)
    {
    datapok=Form3->ADOQuery7Data->Value;
    }
    Form3->ADOQuery7->Next();
    }
    Form3->ADOQuery7->Filtered=true;
    Form3->ADOQuery7->Filter="Data = '"+datapok+"'";
    if(Form3->ADOQuery7Kon->Value>0)
    {
    Edit6->Text=Form3->ADOQuery7Kon->Value;
    }
    else
    {
    Edit6->Text=Form3->ADOQuery7Nach->Value;
    }
    DateTimePicker1->Date=Now();
    Form3->ADOQuery7->Filtered=false;
    //найти код
    Form3->ADOQuery7->First();
    kodpokazch=Form3->ADOQuery7Kodpokaz->Value;
    while(!Form3->ADOQuery7->Eof)
    {
    if(kodpokazch<Form3->ADOQuery7Kodpokaz->Value)
    {
    kodpokazch=Form3->ADOQuery7Kodpokaz->Value;
    }
    Form3->ADOQuery7->Next();
    }
    kodpokazch=kodpokazch+1;
    }

    Вот так собственно, что скажешь?

  7. #7
    Senior Member
    Регистрация
    26.08.2008
    Сообщений
    318

    Re: Работа с Access в C++Builder 5

    Ответов нет. Очень жаль. Мне говорили, что данная система отживает свое, но мне есть, что возразить. Лично являюсь свидетелем работы DOS приложений в некоторых компаниях. Не удивляйтесь, подобное действительно существует. Со множеством проблем, конечно, относительно взаимодействия с современными системами. Например: 1С, С++ и т.д. Однако, это дешево и напрягает не владельцев устаревшего ПО, а наоборот. Отстой, конечно, но, что делать, деньги любят счет. Предлогаемый локальный вариант работы переложил на работу с MS SQL server. Проблем никаких, просто переписал строку подключения. Соответственно, не вижу смысла изучать другую систему программирования. Пока, во всяком случае. Единственная заметная разница в работе с новыми и старыми СУБД это диалекты SQL, что не существенно.

Похожие темы

  1. Работа компании ЮТК
    от BolikStav в разделе Компьютерные сети и Интернет провайдеры
    Ответов: 49
    Последнее сообщение: 10.11.2009, 13:49
  2. Как сделать "терминалку" к мобильному и заставить работать с Access?
    от crazhunt в разделе Программирование баз данных
    Ответов: 0
    Последнее сообщение: 16.01.2009, 22:41
  3. -= Ох, уж эта работа.... =-
    от Magnattt в разделе Просто общение
    Ответов: 68
    Последнее сообщение: 23.09.2008, 23:37
  4. Дипломная работа
    от Lenko в разделе Разное
    Ответов: 0
    Последнее сообщение: 21.08.2008, 12:14
  5. Access
    от iroclude в разделе Просто общение
    Ответов: 6
    Последнее сообщение: 21.01.2007, 16:45

Рекомендуем

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  

SEO by vBSEO

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94