Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual2.doc
Скачиваний:
5
Добавлен:
07.03.2016
Размер:
3.31 Mб
Скачать

Void cado6Dlg::OnZapis_Add2()

{

if(pRecordset->GetState()==0)return;

_variant_t a;

long i;

COleDateTime mytime(2000,1,1,0,0,0);

FieldPtr field;

try

{

pRecordset->AddNew();

for(i=0;i<fields->GetCount ();i++)

{

// повернення вказівки на об'єкт поля

field = fields->GetItem ((_variant_t)i);

switch(i)

{

case 0:

a= pRecordset->GetRecordCount();

break;

case 1:

a = pRecordset->GetRecordCount()+200L;

break;

case 2:

a = "Додавання2";

break;

case 3:

a = mytime;

break;

case 4:

a = 1L;

break;

}

field->Value = a;

}

pRecordset->Update();

}

catch(_com_error &ce)

{

Doc->ErrMessage(ce);

}

}

У даному фрагменті представлений доступ до об'єктів колекції полів Fields і до конкретного поля Field з використанням вказівок, відповідно FieldsPtr та FieldPtr. Після додавання порожнього запису (метод AddNew()) у циклі в об'єкт field за допомогою функції GetItem() повертається вказівка на конкретне поле. Входом у функцію GetItem() є об'єкт типу _variant_t, щоб можна було увійти як ім'ям, так і індексом поля. Так як в нашому випадку використовуються індекси полів, доцільно змінну i, що бере участь у циклі оголосити як long, а потім у функції GetItem() приводити її до типу (_variant_t).

В операторі switch() залежно від індексу поля таблиці otl_tab зміній a типу _variant_t привласнюється відповідне значення. Використовуючи властивість Value (або функцію PutValue()) об'єкта Field кожному полю привласнюється значення a типу _variant_t. Після присвоєння всім полям поточного запису відповідних значень необхідно викликати метод Update() для запису даних безпосередньо в БД.

Функції відгуку оновлення поточного запису в прикладі ADO6 також реалізовані двома способами. У першій з них, OnZapis_Update1() (кнопка <Обновление 1>) наведена робота функції Update() з параметрами. Вона є нераціональним підходом і наведена для того щоб показати роботу з динамічними масивами. Друга функція відгуку, OnZapis_Update1() (кнопка <Обновление 2>) є класичним раціональним прикладом роботи із записом, а саме просте присвоєння кожному полю конкретного значення.

Приведемо текст функції відгуку OnZapis_Update1().

// кнопка <Обновление1>

// Відновлення поточного запису з використанням функції Update

Void cado6Dlg::OnZapis_Update1()

{

if(pRecordset->GetState()==0)return;

if (!pRecordset->GetRecordCount ())

{

MessageBox("Пустая таблица!!!","Внимание!!!",

MB_ICONINFORMATION);

return;

}

SAFEARRAY * ar_f;

SAFEARRAY * ar_v;

SAFEARRAYBOUND rgsabound;

rgsabound.lLbound = 0;

rgsabound.cElements = 5;

long i;

_variant_t var1;

ar_f = SafeArrayCreate(VT_VARIANT, 1, &rgsabound);

ar_v = SafeArrayCreate(VT_VARIANT, 1, &rgsabound);

for(i = 0; i < 5; i++)

SafeArrayPutElement(ar_f, &i, &(_variant_t)i);

i = 0;

var1 = (long)(i + 100);

SafeArrayPutElement(ar_v, &i, &var1);

i = 1;

// -------------------------------------------------

time_t time1;

struct tm *tm1;

time(&time1); // time - кількість секунд із 1970 р.

tm1 = localtime(&time1);

var1= (long)tm1->tm_sec;

SafeArrayPutElement(ar_v, &i, &var1);

// -------------------------------------------------

i = 2;

var1="обновление";

SafeArrayPutElement(ar_v, &i, &var1);

i = 3;

COleDateTime mytime(2007,1,1,0,0,0);

var1 = mytime;

SafeArrayPutElement(ar_v, &i, &var1);

i = 4;

var1 = (long)0;

SafeArrayPutElement(ar_v, &i, &var1);

_variant_t fields,values;

values.vt = VT_ARRAY|VT_VARIANT;

fields.vt = VT_ARRAY|VT_VARIANT;

fields.parray = ar_f;

values.parray = ar_v;

try

{

pRecordset->Update(fields,values);

}

catch(_com_error &ce)

{

Doc->ErrMessage(ce);

}

}

Робота з динамічними масивами в даній функції аналогічна роботі у функції OnZapis_Add1() кнопки <Добавление 1>. Інтерес представляє робота із класичними функціями дати й часу. У даній функції в друге поле таблиці otl_tab записується кількість секунд поточної дати. Функція time(), входом у яку є адреса на змінну time1 типу long (або time_t) повертає кількість секунд із 1970-го року. Функція localtime() перетворить цю змінну до змінного tm1 типу структури tm, у якій буде вміщуватись поточна дата.

Приведемо нижче опис структури tm.

struct tm

{

int tm_sec; /* Секунди */

int tm_min; /* Хвилини */

int tm_hour; /* Години (0--23) */

int tm_mday; /* День місяця (1--31) */

int tm_mon; /* Місяць (0--11) */

int tm_year; /* Рік (календарний рік мінус 1900) */

int tm_wday; /* День тижня (0--6; Неділя = 0) */

int tm_yday; /* День року (0--365) */

int tm_isdst; /* відмінний від 0 при денному світлі */

};

Таким чином, використовуючи роботу із класичною датою, у друге поле (kod) записується кількість секунд поточної дати (число від 0 до 59).

Приведемо текст функції відгуку OnZapis_Update2() по кнопці <Обновление 2>.

// кнопка <Обновление2>

// Відновлення поточного запису з використанням доступу до полів об'єкта

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]