Доброго времени суток) У меня есть проблема. Создаю с помощью визарда класс-потребитель OLE DB, провайдер -SQL Server. Создаю объект, открываю соединение,з атем получаю данные, вобщем всё отлично. Но после того, как пытаюсь обновить значение происходит беда. Вобщем суть такова, что я в диалоговом окне создал 3 комбобокса и один эдит. Первый комбобокс - это имя проектаи, если выбрать какойто элемент в нём, то в остальных двух(этап разработки и заказчик) установятся соответствующие записи значения, тут одна загвоздка, в таблице где хранится имя проекта, нет имени заказчика и названия этапа есть только их айдишники и поэтому мы лезем в 2 другие таблицы, чтобы узнать строковые значения. Когда нажимается кнопка сохранить,запускается SetData, сохраняются в базе только числовые айди этапа и заказчика, а если попытаться изменить имя проекта, то оно не сохраняется. Вопрос почему? Ах да, если пытаюсь вызвать метод Update - он возвращает, E_NONINTERFACE. И может ктонибудь объяснить подробно как работает SetData? Код заголовка диалога: Код | #pragma once #include "afxwin.h" #include "orders.h" #include "stages.h" #include "users.h"
// диалоговое окно CTabDlg1
class CTabDlg1 : public CDialog { DECLARE_DYNAMIC(CTabDlg1)
public: CTabDlg1(CWnd* pParent = NULL); // стандартный конструктор virtual ~CTabDlg1();
// Данные диалогового окна enum { IDD = MY_TAB_DLG1 };
protected: virtual void DoDataExchange(CDataExchange* pDX); // поддержка DDX/DDV virtual BOOL OnInitDialog(); DECLARE_MESSAGE_MAP() public: Corders table; Cstages stats; Cusers clients; CComboBox order_name; afx_msg void OnCbnSelchangeCombo1(); CString order_comments; CString order_name_val; afx_msg void OnEnChangeEdit1(); afx_msg void OnCbnSelchangeCombo2(); afx_msg void save_all(); CComboBox order_status; CComboBox order_client; long order_status_id; long order_client_id; void init_orders(); afx_msg void OnChangeStage(); afx_msg void OnClientChange(); afx_msg void OnCbnEditchangeCombo1(); };
|
Код реализаций: Код | // TabDlg1.cpp: файл реализации //
#include "stdafx.h" #include "TRPO.h" #include "TabDlg1.h" #include <string>
// диалоговое окно CTabDlg1
IMPLEMENT_DYNAMIC(CTabDlg1, CDialog)
CTabDlg1::CTabDlg1(CWnd* pParent /*=NULL*/) : CDialog(CTabDlg1::IDD, pParent) , order_name_val(_T("")) { CoInitialize(NULL); table.OpenAll(); stats.OpenAll(); clients.OpenAll(); }
CTabDlg1::~CTabDlg1() { table.CloseAll(); }
void CTabDlg1::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_COMBO1, order_name); DDX_Text(pDX, IDC_EDIT1,order_comments); DDX_Control(pDX, IDC_COMBO2, order_status); DDX_Control(pDX, IDC_COMBO3, order_client); } BOOL CTabDlg1::OnInitDialog() { CDialog::OnInitDialog(); init_orders(); return true; }
BEGIN_MESSAGE_MAP(CTabDlg1, CDialog) ON_CBN_SELCHANGE(IDC_COMBO1, &CTabDlg1::OnCbnSelchangeCombo1) ON_BN_CLICKED(IDC_BUTTON1, &CTabDlg1::save_all) ON_CBN_SELCHANGE(IDC_COMBO2, &CTabDlg1::OnChangeStage) ON_CBN_SELCHANGE(IDC_COMBO3, &CTabDlg1::OnClientChange) ON_CBN_EDITCHANGE(IDC_COMBO1, &CTabDlg1::OnCbnEditchangeCombo1) END_MESSAGE_MAP()
// обработчики сообщений CTabDlg1
void CTabDlg1::OnCbnSelchangeCombo1() { int j=0; table.MoveFirst(); do { if(order_name.GetCurSel()==j) break; j++; } while(table.MoveNext()==S_OK); stats.MoveFirst(); do { if(table.m_stage_id==stats.m_stage_id) { order_status.SelectString(-1,_T(stats.m_stage_name)); order_status_id=table.m_stage_id; break; } } while(stats.MoveNext()==S_OK); clients.MoveFirst(); do { if(table.m_client_id==clients.m_user_id) { order_client.SelectString(-1,_T(clients.m_FIO)); order_client_id=table.m_client_id; break; } }while(clients.MoveNext()==S_OK); order_comments=(CString)table.m_comments; UpdateData(0); }
void CTabDlg1::save_all() { CString tmp; UpdateData(); order_name.GetWindowTextA(tmp); _tcscpy(table.m_order_name,_T(tmp)); _tcscpy(table.m_comments,_T(order_comments)); table.m_client_id=order_client_id; table.m_stage_id=order_status_id; table.SetData(); HRESULT hr=table.Update(); order_name.ResetContent(); order_status.ResetContent(); order_client.ResetContent(); init_orders();
} void CTabDlg1::init_orders() { table.MoveFirst(); stats.MoveFirst(); clients.MoveFirst(); do { order_name.AddString(_T(table.m_order_name)); }while(table.MoveNext()==S_OK); do { order_status.AddString(_T(stats.m_stage_name)); }while(stats.MoveNext()==S_OK); do { order_client.AddString(_T(clients.m_FIO)); }while(clients.MoveNext()==S_OK); order_comments=""; UpdateData(0); } void CTabDlg1::OnChangeStage() { stats.MoveFirst(); CString tmp; order_status.GetWindowTextA(tmp); do { if(stats.m_stage_name==tmp) { order_status_id=stats.m_stage_id; break; } }while(stats.MoveNext()==S_OK); }
void CTabDlg1::OnClientChange() { clients.MoveFirst(); CString tmp; order_client.GetWindowTextA(tmp); do { if(clients.m_FIO==tmp) { order_client_id=clients.m_user_id; break; } }while(clients.MoveNext()==S_OK); }
void CTabDlg1::OnCbnEditchangeCombo1() { }
|
Это сообщение отредактировал(а) TerminalSoul - 19.12.2009, 22:13
|