⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 saleoperview.cpp

📁 一个小型的医药零售管理系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// SaleOperView.cpp : implementation file
//

#include "stdafx.h"
#include "Remedy.h"
#include "SaleOperView.h"
#include "MainFrm.h"
#include "msword8.h"
#include "SetPrintDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

// 静态变量的定义
const int CSaleOperView::m_nFieldCount1 = 8;
const CString CSaleOperView::m_strFields1[m_nFieldCount1] = 
	{"品名", "规格", "剂型", "产地", "数量","单位", "零售价","备注"};
const int CSaleOperView::m_nFieldCount2 = 9;
const CString CSaleOperView::m_strFields2[m_nFieldCount2] = 
	{"品名", "规格", "剂型", "产地",  "数量", "单位", "零售价", "售价", "金额"};

// 声明全局变量
extern CRemedyApp theApp;

/////////////////////////////////////////////////////////////////////////////
// CSaleOperView

IMPLEMENT_DYNCREATE(CSaleOperView, CFormView)

CSaleOperView::CSaleOperView()
	: CFormView(CSaleOperView::IDD)
{
	//{{AFX_DATA_INIT(CSaleOperView)
	m_strCustomer = _T("");
	m_strMedName = _T("");
	m_strQuantity = _T("");
	m_strPrice = _T("");
	m_strTotal = _T("");
	m_strPerson = _T("");
	//}}AFX_DATA_INIT
}

CSaleOperView::~CSaleOperView()
{
}

void CSaleOperView::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSaleOperView)
	DDX_Control(pDX, IDC_LIST2, m_ctlList2);
	DDX_Control(pDX, IDC_LIST1, m_ctlList1);
	DDX_Text(pDX, IDC_BUYER, m_strCustomer);
	DDX_Text(pDX, IDC_NAME, m_strMedName);
	DDX_Text(pDX, IDC_QUANTITY, m_strQuantity);
	DDX_Text(pDX, IDC_PRICE, m_strPrice);
	DDX_Text(pDX, IDC_TOTAL, m_strTotal);
	DDX_Text(pDX, IDC_PERSON, m_strPerson);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CSaleOperView, CFormView)
	//{{AFX_MSG_MAP(CSaleOperView)
	ON_WM_DESTROY()
	ON_BN_CLICKED(IDC_QUERY, OnQuery)
	ON_BN_CLICKED(IDC_SALE, OnSale)
	ON_BN_CLICKED(IDC_UNDO, OnUndo)
	ON_BN_CLICKED(IDC_PRINTDATA, OnPrintdata)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSaleOperView diagnostics

#ifdef _DEBUG
void CSaleOperView::AssertValid() const
{
	CFormView::AssertValid();
}

void CSaleOperView::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CSaleOperView message handlers

void CSaleOperView::OnDestroy() 
{
	CFormView::OnDestroy();
	
	((CMainFrame*)AfxGetMainWnd())->m_pSaleOper = NULL;	// 清空窗口指针				
}

void CSaleOperView::OnInitialUpdate() 
{
	CFormView::OnInitialUpdate();
	
	GetParentFrame()->SetWindowText("药品销售操作");
	
	AddListHeader();

	GetDlgItem(IDC_UNDO)->EnableWindow(FALSE);	

	// 实例化纪录集组件对象
	HRESULT hr = m_pRecordset.CreateInstance("ADODB.Recordset");
	if (!SUCCEEDED(hr))
	{
		MessageBox("创建Recordset对象失败!");
	}
}

//-----------------------------------------------------------------------------
// 功能: 为List1和List2控件增加表头
// 作者: 刘文澜
// 日期: 2004/5/1
//-----------------------------------------------------------------------------
void CSaleOperView::AddListHeader()
{
	int width1[m_nFieldCount1] =    {145, 140, 80, 140, 90, 90, 90, 153};
	m_ctlList1.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FLATSB|LVS_EX_FULLROWSELECT);
	for (int i = 0; i < m_nFieldCount1; i++)
		m_ctlList1.InsertColumn(i, m_strFields1[i], LVCFMT_CENTER, width1[i]);

	int width2[m_nFieldCount2] =    {145, 140, 80, 140, 70, 60, 80, 100, 113};
	m_ctlList2.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FLATSB|LVS_EX_FULLROWSELECT);
	for (i = 0; i < m_nFieldCount2; i++)
		m_ctlList2.InsertColumn(i, m_strFields2[i], LVCFMT_CENTER, width2[i]);
}

//-----------------------------------------------------------------------------
// 功能: 把当前用户输入名字的全部药品显示到List1控件中,以便选择
// 备注: 因为品名不是主键,所以对应一个名字有多条记录
// 作者: 刘文澜
// 日期: 2004/5/1
//-----------------------------------------------------------------------------
void CSaleOperView::OnQuery() 
{
	UpdateData();

	// 药品名称为空时提示用户
	if (m_strMedName.IsEmpty())									
	{
		MessageBox("请输入要查询的品名!", "提示", MB_ICONINFORMATION);
		GetDlgItem(IDC_NAME)->SetFocus();
		return;
	}

	// 记下用户输入的名称,保存至下一次查询前
	m_strUserInput = m_strMedName;			

	m_ctlList1.DeleteAllItems();
	m_ListInPrice.RemoveAll();	// 清空进价链表

	// 打开纪录集
	char buf[100];
	sprintf(buf,"select * from 库存 where 品名 like \'%s\'",m_strUserInput + "%");
	m_pRecordset->Open( _variant_t(buf),
					    _variant_t((IDispatch*)theApp.m_pConnection,true),
						adOpenStatic, adLockOptimistic, adCmdText);	
	if (m_pRecordset->adoEOF)	// 说明纪录集为空
	{
		m_pRecordset->Close();
		return;
	}

	// 把查询的结果显示到List1中
	int index = 0;
	while(!m_pRecordset->adoEOF)
	{
		CString strValues[m_nFieldCount1];
		_variant_t field, values[m_nFieldCount1];

		for (int i = 0; i < m_nFieldCount1; i++)	// 依次读取每个字段的值
		{
			field.SetString(LPCTSTR(m_strFields1[i]));	
			values[i] = m_pRecordset->GetCollect(field);
			field.Clear();
			strValues[i] = GetString(values[i]);
		}

		m_ctlList1.InsertItem(index,strValues[0]);
		for (int j = 1; j < m_nFieldCount1; j++)
			m_ctlList1.SetItemText(index, j, strValues[j]);

		CString strPrice = ::GetString(m_pRecordset->GetCollect("进价"));
		m_ListInPrice.AddTail(strPrice);

		index++;	// 行号增加一个

		m_pRecordset->MoveNext();
	}
	m_pRecordset->Close();	
}

//-----------------------------------------------------------------------------
// 功能: 进行一次销售操作
// 备注: 修改库存表,然后添加到销售表中
// 作者: 刘文澜
// 日期: 2004/5/1
//-----------------------------------------------------------------------------
void CSaleOperView::OnSale() 
{
	UpdateData();

	// 判断用户是否选择了一个品种
	POSITION pos = m_ctlList1.GetFirstSelectedItemPosition();
	if (pos == NULL) 
	{
		MessageBox("请选择一个品种!","提示",MB_ICONINFORMATION);
		return;
	}

	m_nCurQuantity = atoi(LPCTSTR(m_strQuantity));	// 用户输入的数量

	double fltPrice = atof(LPCTSTR(m_strPrice));	// 用户输入的售价
	if (fltPrice == 0.0f)
	{
		MessageBox("请输入售价!", "提示", MB_ICONINFORMATION);
		GetDlgItem(IDC_PRICE)->SetFocus();
		return;
	}

	// 得到当前选中的纪录,局部变量不行,必须是类成员变量
	m_nItem = m_ctlList1.GetNextSelectedItem(pos);	

	// 字符串数组,把List1中选中的一条记录复制下来(除备注之外)
	CString strValues[m_nFieldCount1 - 1];
	for (int i = 0; i < m_nFieldCount1 - 1; i++)
		strValues[i] = m_ctlList1.GetItemText(m_nItem, i);

	CString strMoney;	// 金额
	strMoney.Format("%.2f", fltPrice * m_nCurQuantity);	// 金额 = 售价 * 数量

	CTime t = CTime::GetCurrentTime();
	CString strDate;	// 日期
	strDate.Format("%d-%d-%d", t.GetYear(), t.GetMonth(), t.GetDay());// 日期

	m_nOldQuantity = atoi(LPCTSTR(strValues[4]));			// 该品种原有数量,便于撤销用
	int nRemainQuantity = m_nOldQuantity - m_nCurQuantity;	// 减去销售数量后为剩余数量
	if (nRemainQuantity < 0)
	{
		MessageBox("当前库中数量不足!", "提示", MB_ICONINFORMATION);
		return;
	}

	// 首先要修改List1中药品的数量
	CString strRemainQuantity;
	strRemainQuantity.Format("%d", nRemainQuantity);
	m_ctlList1.SetItemText(m_nItem, 4, strRemainQuantity);

	// 在List2中显示当前销售的商品, 总是显示到最后一行
	int nIndex = m_ctlList2.GetItemCount();
	m_ctlList2.InsertItem(nIndex, strValues[0]);
	for (i = 1; i < m_nFieldCount2; i++)
	{
		switch (i)
		{
		case 4:	// 数量要显示销售掉的数量
			m_ctlList2.SetItemText(nIndex, i, m_strQuantity);
			break;
		case 7:	// 售价
			m_ctlList2.SetItemText(nIndex, i, m_strPrice);
			break;
		case 8:	// 金额
			m_ctlList2.SetItemText(nIndex, i, strMoney);
			break;
		default:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -