-
미니프로젝트 정리 (내파트) All_Products 폼첫번째 프로젝트(요금제 추천) 2020. 7. 14. 20:55
이번 미니 프로젝트에서 요금제 수요예측 시스템을 구현했다. 내가 맡은 파트부터 정리한 후 같은 팀원들이 했던 부분들을 정리할 예정이다.
대략적인 프로젝트 핵심은 가격, 데이터, 혜택을 기준으로 사용자에게 휴대폰 요금제를 추천해주고 구매까지 이루어질 수 있게 하는 것이다. 가격 데이터 혜택의 세가지 Standard 는 0 ~ 100까지를 기준으로 잡고 사용자가 회원가입시 선택한 요금제의 세가지 기준이 기본값으로 가지고 설문조사를 실시해서 사용자의 성향에 맞춰 세가지 기준을 조정한다. 그 이후 추천 알고리즘에 의해서 최대 5가지 추천이 뜨고, 추천창에서 구매하면 그에 맞춰서 다시 성향을 조정하는 방식이다. 추천창에서 구매를 하고싶지 않을 경우 모든 요금제가 보이는 폼 검색을 통해서, 자세히보기, 구매까지 이어지게 할 수 있는 방식이다. 관리자 창에서는 사용자의 신규, 추가, 삭제, 수정이 가능하고 제품 창에서 또한 제품에 대해 신규, 추가, 삭제, 수정이 가능하다. 통계창에서는 그래프를 보여주고, 집중관리 창에서는 사용자와 요금제의 기준이 많이 다른 순으로 사용자를 출력하는데 이 사용자들은 쓰고있는 요금제의 성향과 사용자의 성향이 맞지 않는다고 판단되어 다른 요금제로 바꿀 가능성이 크다.
가장 먼저 프로젝트 구성도는 아래와 같다. 맡은 부분은 AllProduct와 Statistics 부분이다.
All_Product Form
구현 목표로는 가격, 데이터, 혜택 갯수를 통한 검색 기능과 자세히를 통한 사용자의 성향 변화 그리고 최종으로 구매하면 구매에 맞춰 사용자의 성향을 변화시킨다.
namespace MiniProject { public static class Commons { //공용 연결문자열 public static string CONNSTRING = "Data Source=127.0.0.1;Initial Catalog=CallingPlanDB;Persist Security Info=True;User ID=sa;Password=p@ssw0rd!"; public static string LOGINUSERID = "Park"; public static string SELECTED_PLAN = ""; public static int USER_STD_1 = 0; public static int USER_STD_2 = 0; public static int USER_STD_3 = 0; //HJ 추가 [20200703 12:13] : 구조체 추가 public struct Tendency { public int iStd1; public int iStd2; public int iStd3; public string strUserCall; } } }
위는 공용변수 부분이다.
CONSTRING : MSSQL과의 연결 문자열을 선언함으로 MSSQL과의 연결시에 Commons.CONSTRING의 형태로 사용한다.
LOGINUSERID : 사용자가 로그인한 순간부터 프로그램이 종료되는 순간까지 사용자의 아이디가 저장된다.
SELECTED_PLAN : 전체 구매창에서 데이터그리드 뷰를 클릭하는 순간 저장이된다. 사용자가 선택한 요금제를 구매창으로 넘겨주기 위해서 사용한다.
USER_STD_1~3 : 사용자의 성향정보를 담는 부분이다. 그 밑의 구조체는 다른 인원이 추가한 부분이므로 위 코드와는 상관이 없다.
클래스 변수와 All_Products_Load
public partial class All_Products : Form { public int User_std1; public int User_std2; public int User_std3; public int Product_std1; public int Product_std2; public int Product_std3; public string SELECTED_MODEL = ""; public All_Products() { InitializeComponent(); } private void All_Products_Load(object sender, EventArgs e) { UpdateData(); label2.Text = Commons.LOGINUSERID; // HJ 추가(임시) [20200703 12:40]: 화면크기 조정 this.WindowState = FormWindowState.Maximized; UpdateCboPrice(); //가격 콤보박스의 초기값 가져오기 for(int i=0;i<64;i++) { try { if (priceTbl[0, i].Value == null) { cboPrice.Items.Add(""); break; } else { cboPrice.Items.Add(priceTbl[0, i].Value); } } catch (Exception) { } } //콤보박스에 값 넣기 UpdateCboData(); //데이터 콤보박스의 초기값 가져오기 for (int i = 0; i < 64; i++) { try { if (priceTbl[0, i].Value == null) { cboPrice.Items.Add(""); break; } else CboData.Items.Add(priceTbl[0, i].Value); } catch (Exception) { } }//콤보박스에 값 넣기 UpdateCboBenefit(); //혜택 콤보박스의 초기값 가져오기 for (int i = 0; i < 300; i++)//콤보박스에 값 넣기 { try { if (priceTbl[0, i].Value == null) { cboPrice.Items.Add(""); break; } else cboService.Items.Add(priceTbl[0, i].Value); } catch (Exception) { } }//콤보박스에 값 넣기 cboService.SelectedIndex = -1; cboPrice.SelectedIndex =-1; CboData.SelectedIndex = -1; priceTbl.Visible = true; UpdateUser(); RmdForm form = new RmdForm(); form.StartPosition = FormStartPosition.CenterScreen; form.ShowDialog(); }
위 부분은 클래스에서 사용자의 성향을 데이터베이스에서 불러와 저장할 User_std1~3 와 제품의 Product_std1~3를 불러와서 사용자가 제품을 자세히보기 하거나 구매할 때 변화시킬 변수이다.
27,48,66 번 줄에서는 아래의 함수를 사용해서 중복값을 제거한 데이터,가격,혜택을 각각 가져온 다음 priceTbl이라는 데이터 그리드 뷰(visible=false)에 임시적으로 저장시켜 놓고, 반복문을 사용해서 빈칸이 나올때까지 콤보박스에 하나씩 추가시킨다. 86번 줄부터는 콤보박스의 인덱스를 초기화 시키고 UpdateUser() 메소드를 호출해서 Commons.USERID를 키 값으로 해당 로그인한 사용자의 성향정보를 가져온다. 자세한 코드는 아래에 있다.
private void UpdateCboData() //data 콤보박스 값 가져오기 { using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); //DB접속 string strQuery = "SELECT DISTINCT Datas FROM productTbl ORDER BY Datas ASC"; SqlCommand cmd = new SqlCommand(strQuery, conn); SqlDataAdapter dataAdapter = new SqlDataAdapter(strQuery, conn); DataSet ds = new DataSet(); dataAdapter.Fill(ds, "datas"); priceTbl.DataSource = ds; priceTbl.DataMember = "datas"; } } private void UpdateCboBenefit() //혜택 콤보박스 값 가져오기 { using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); //DB접속 string strQuery = "SELECT DISTINCT Benefit FROM productTbl ORDER BY Benefit DESC"; SqlCommand cmd = new SqlCommand(strQuery, conn); SqlDataAdapter dataAdapter = new SqlDataAdapter(strQuery, conn); DataSet ds = new DataSet(); dataAdapter.Fill(ds, "Benefits"); priceTbl.DataSource = ds; //그리드의 데이터 소스에다가 붓는다. priceTbl.DataMember = "Benefits"; } } private void UpdateCboPrice() //가격 콤보박스 값 가져오기 { using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); //DB접속 string strQuery = "SELECT DISTINCT Price FROM productTbl ORDER BY Price ASC"; SqlCommand cmd = new SqlCommand(strQuery, conn); SqlDataAdapter dataAdapter = new SqlDataAdapter(strQuery, conn); DataSet ds = new DataSet(); dataAdapter.Fill(ds, "price"); priceTbl.DataSource = ds; priceTbl.DataMember = "price"; } }
다음으로 데이터 그리드 뷰에 모든 요금제에 대한 UpdateData 메소드이다.
string strQuery =
" SELECT CallingPlan AS [요금제], REPLACE(CONVERT(VARCHAR, CAST(Price AS MONEY), 1), '.00', '') AS Price, Company AS [회사], Datas AS [데이터], Benefit AS [혜택] FROM productTbl";
위와 같은 쿼리문을 사용했는데 Price 부분에서는 금액을 천 단위로 콤마를 넣기 위해 썼다.
SqlDataAdapter dataAdapter = new SqlDataAdapter(strQuery, conn);
어댑터를 사용해서 dataset에 데이터를 담아놨다가 그리드 뷰에 붓는 방식을 사용했다.
private void UpdateData() { using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); //DB접속 //데이터 그리드 뷰에 간단 정보 출력 string strQuery = " SELECT CallingPlan AS [요금제], REPLACE(CONVERT(VARCHAR, CAST(Price AS MONEY), 1), '.00', '') AS Price, Company AS [회사], " + " Datas AS [데이터], Benefit AS [혜택] " + " FROM productTbl"; SqlCommand cmd = new SqlCommand(strQuery, conn); SqlDataAdapter dataAdapter = new SqlDataAdapter(strQuery, conn); DataSet ds = new DataSet(); dataAdapter.Fill(ds, "General_Phone_Information"); grdPhonetbl.DataSource = ds; //그리드의 데이터 소스에다가 붓는다. grdPhonetbl.DataMember = "General_Phone_Information"; } }
아래 이벤트는 그리드뷰의 항목을 선택한 행에 대한 요금제 이름을 SELECTED_MODEL에 저장하는 부분이다. 추후에 SELECTED_MODEL에 저장된 요금제 이름을 WHERE절에 적어서 해당 요금제에 대한 정보를 자세히 보기에서 보여준다.
private void grdPhonetbl_CellClick(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex > -1) { DataGridViewRow data = grdPhonetbl.Rows[e.RowIndex]; SELECTED_MODEL = data.Cells[0].Value.ToString(); } }
아래 부분은 콤보박스에서 선택한 항목으로 검색을 해서 그리드뷰에 보여주는 부분이다. 조금 더 콤팩트하게 하는 방법이 있을텐데 노가다를 썼다. 첫번째 콤보박스의 항목을 선택하면 데이터베이스에
SelectedPrice, SelectedData, SlectedBenefit 항목으 true로 체크되서 true로 체크된 항목만 데이터 그리드 뷰에 보여주는 방식이다. 이렇게 보니까 편법아닌 편법같은 느낌이다.
private void btnSearch_Click(object sender, EventArgs e) { if (cboPrice.Text == "" && cboService.Text == "" && CboData.Text == "") { MetroMessageBox.Show(this,"빈 값은 검색할 수 없습니다.", "경고", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; //메세지 박스 빠져 나오기 뭐 안되면 리턴하자 } else { if(cboPrice.SelectedIndex!=-1&& CboData.SelectedIndex == -1&& cboService.SelectedIndex == -1) //첫번째 콤보박스만 입력했을 때 검색 { //검색어 조건에 입력한 내용에 대한 행의 Selected 를 1로 using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = " UPDATE dbo.productTbl " + " SET SelectedPrice = 1 " + " WHERE Price = @Price "; //Selected 열 만들어 놓고 이벤트 실행되는 순간 해당 열 1로 세트 SqlParameter parmPrice = new SqlParameter("@Price", SqlDbType.NVarChar, 20); parmPrice.Value = cboPrice.SelectedItem; cmd.Parameters.Add(parmPrice); cmd.ExecuteNonQuery(); } using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); //DB접속 //Selected가 1이 된 부분만 출력 string strQuery = " SELECT CallingPlan AS [요금제], Price AS [가격], Company AS [회사], " + " Datas AS [데이터], Benefit AS [혜택] " + " FROM productTbl WHERE SelectedPrice =1 "; SqlCommand cmd = new SqlCommand(strQuery, conn); SqlDataAdapter dataAdapter = new SqlDataAdapter(strQuery, conn); DataSet ds = new DataSet(); dataAdapter.Fill(ds, "Price_data"); grdPhonetbl.DataSource = ds; //그리드의 데이터 소스에다가 붓는다. grdPhonetbl.DataMember = "Price_data"; } } //첫번째 콤보박스만 입력했을 때 검색 if (cboPrice.SelectedIndex == -1 && CboData.SelectedIndex != -1 && cboService.SelectedIndex == -1) //첫번째 콤보박스만 입력했을 때 { //검색어 조건에 입력한 내용에 대한 행의 Selected 를 1로 using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = " UPDATE dbo.productTbl " + " SET SelectedDatas = 1 " + " WHERE Datas = @Datas "; //Selected 열 만들어 놓고 이벤트 실행되는 순간 해당 열 1로 세트 SqlParameter parmDatas = new SqlParameter("@Datas", SqlDbType.NChar, 10); parmDatas.Value = CboData.SelectedItem; cmd.Parameters.Add(parmDatas); cmd.ExecuteNonQuery(); } using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); //DB접속 //Selected가 1이 된 부분만 출력 string strQuery = " SELECT CallingPlan AS [요금제], Price AS [가격], Company AS [회사], " + " Datas AS [데이터], Benefit AS [혜택] " + " FROM productTbl WHERE SelectedDatas =1 "; SqlCommand cmd = new SqlCommand(strQuery, conn); SqlDataAdapter dataAdapter = new SqlDataAdapter(strQuery, conn); DataSet ds = new DataSet(); dataAdapter.Fill(ds, "Price_data"); grdPhonetbl.DataSource = ds; //그리드의 데이터 소스에다가 붓는다. grdPhonetbl.DataMember = "Price_data"; } }//두번째 콤보박스만 입력했을 때 검색 if (cboPrice.SelectedIndex == -1 && CboData.SelectedIndex == -1 && cboService.SelectedIndex != -1) //세번째 콤보박스만 입력했을 때 { //검색어 조건에 입력한 내용에 대한 행의 Selected 를 1로 using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = " UPDATE dbo.productTbl " + " SET SelectedBenefit = 1 " + " WHERE Benefit = @Benefits "; //Selected 열 만들어 놓고 이벤트 실행되는 순간 해당 열 1로 세트 SqlParameter parmBenefits = new SqlParameter("@Benefits", SqlDbType.NVarChar, 50); parmBenefits.Value = cboService.SelectedItem; cmd.Parameters.Add(parmBenefits); cmd.ExecuteNonQuery(); } using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); //DB접속 //Selected가 1이 된 부분만 출력 string strQuery = " SELECT CallingPlan AS [요금제], Price AS [가격], Company AS [회사], " + " Datas AS [데이터], Benefit AS [혜택] " + " FROM productTbl WHERE SelectedBenefit =1 "; SqlCommand cmd = new SqlCommand(strQuery, conn); SqlDataAdapter dataAdapter = new SqlDataAdapter(strQuery, conn); DataSet ds = new DataSet(); dataAdapter.Fill(ds, "Price_data"); grdPhonetbl.DataSource = ds; //그리드의 데이터 소스에다가 붓는다. grdPhonetbl.DataMember = "Price_data"; } } //세번째 콤보박스만 입력했을 때 검색 if (cboPrice.SelectedIndex != -1 && CboData.SelectedIndex != -1 && cboService.SelectedIndex == -1) //첫번째 두번째 박스만 입력했을 때 { //검색어 조건에 입력한 내용에 대한 행의 Selected 를 1로 using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = " UPDATE dbo.productTbl " + " SET SelectedPrice = 1 " + " WHERE Price = @Price "; //Selected 열 만들어 놓고 이벤트 실행되는 순간 해당 열 1로 세트 SqlParameter parmPrice = new SqlParameter("@Price", SqlDbType.NVarChar, 20); parmPrice.Value = cboPrice.SelectedItem; cmd.Parameters.Add(parmPrice); cmd.ExecuteNonQuery(); } using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = " UPDATE dbo.productTbl " + " SET SelectedDatas = 1 " + " WHERE Datas = @Datas "; //Selected 열 만들어 놓고 이벤트 실행되는 순간 해당 열 1로 세트 SqlParameter parmDatas = new SqlParameter("@Datas", SqlDbType.NChar, 10); parmDatas.Value = CboData.SelectedItem; cmd.Parameters.Add(parmDatas); cmd.ExecuteNonQuery(); } using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); //DB접속 //Selected가 1이 된 부분만 출력 string strQuery = " SELECT CallingPlan AS [요금제], Price AS [가격], Company AS [회사], " + " Datas AS [데이터], Benefit AS [혜택] " + " FROM productTbl WHERE SelectedPrice =1 AND SelectedDatas=1"; SqlCommand cmd = new SqlCommand(strQuery, conn); SqlDataAdapter dataAdapter = new SqlDataAdapter(strQuery, conn); DataSet ds = new DataSet(); dataAdapter.Fill(ds, "Price_data"); grdPhonetbl.DataSource = ds; //그리드의 데이터 소스에다가 붓는다. grdPhonetbl.DataMember = "Price_data"; } }//첫번째 두번째 콤보박스만 입력했을 때 검색 if (cboPrice.SelectedIndex != -1 && CboData.SelectedIndex == -1 && cboService.SelectedIndex != -1) //첫번째 세번째 박스만 입력했을 때 { //검색어 조건에 입력한 내용에 대한 행의 Selected 를 1로 using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = " UPDATE dbo.productTbl " + " SET SelectedPrice = 1 " + " WHERE Price = @Price "; //Selected 열 만들어 놓고 이벤트 실행되는 순간 해당 열 1로 세트 SqlParameter parmPrice = new SqlParameter("@Price", SqlDbType.NVarChar, 20); parmPrice.Value = cboPrice.SelectedItem; cmd.Parameters.Add(parmPrice); cmd.ExecuteNonQuery(); } using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = " UPDATE dbo.productTbl " + " SET SelectedBenefit = 1 " + " WHERE Benefit = @Benefits "; //Selected 열 만들어 놓고 이벤트 실행되는 순간 해당 열 1로 세트 SqlParameter parmBenefits = new SqlParameter("@Benefits", SqlDbType.NVarChar, 50); parmBenefits.Value = cboService.SelectedItem; cmd.Parameters.Add(parmBenefits); cmd.ExecuteNonQuery(); } using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); //DB접속 //Selected가 1이 된 부분만 출력 string strQuery = " SELECT CallingPlan AS [요금제], Price AS [가격], Company AS [회사], " + " Datas AS [데이터], Benefit AS [혜택] " + " FROM productTbl WHERE SelectedPrice =1 AND SelectedBenefit=1"; SqlCommand cmd = new SqlCommand(strQuery, conn); SqlDataAdapter dataAdapter = new SqlDataAdapter(strQuery, conn); DataSet ds = new DataSet(); dataAdapter.Fill(ds, "Price_data"); grdPhonetbl.DataSource = ds; //그리드의 데이터 소스에다가 붓는다. grdPhonetbl.DataMember = "Price_data"; } }//첫번째 세번째 박스만 입력했을 때 if (cboPrice.SelectedIndex == -1 && CboData.SelectedIndex != -1 && cboService.SelectedIndex != -1) //두번째 세번째 박스만 입력했을 때 { //검색어 조건에 입력한 내용에 대한 행의 Selected 를 1로 using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = " UPDATE dbo.productTbl " + " SET SelectedDatas = 1 " + " WHERE Datas = @Datas "; //Selected 열 만들어 놓고 이벤트 실행되는 순간 해당 열 1로 세트 SqlParameter parmDatas = new SqlParameter("@Datas", SqlDbType.NChar, 10); parmDatas.Value = CboData.SelectedItem; cmd.Parameters.Add(parmDatas); cmd.ExecuteNonQuery(); } using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = " UPDATE dbo.productTbl " + " SET SelectedBenefit = 1 " + " WHERE Benefit = @Benefits "; //Selected 열 만들어 놓고 이벤트 실행되는 순간 해당 열 1로 세트 SqlParameter parmBenefits = new SqlParameter("@Benefits", SqlDbType.NVarChar, 50); parmBenefits.Value = cboService.SelectedItem; cmd.Parameters.Add(parmBenefits); cmd.ExecuteNonQuery(); } using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); //DB접속 //Selected가 1이 된 부분만 출력 string strQuery = " SELECT CallingPlan AS [요금제], Price AS [가격], Company AS [회사], " + " Datas AS [데이터], Benefit AS [혜택] " + " FROM productTbl WHERE SelectedDatas =1 AND SelectedBenefit=1"; SqlCommand cmd = new SqlCommand(strQuery, conn); SqlDataAdapter dataAdapter = new SqlDataAdapter(strQuery, conn); DataSet ds = new DataSet(); dataAdapter.Fill(ds, "Price_data"); grdPhonetbl.DataSource = ds; //그리드의 데이터 소스에다가 붓는다. grdPhonetbl.DataMember = "Price_data"; } }//두번째 세번째 박스만 입력했을 때 if (cboPrice.SelectedIndex == -1 && CboData.SelectedIndex != -1 && cboService.SelectedIndex != -1) //두번째 세번째 박스만 입력했을 때 { //검색어 조건에 입력한 내용에 대한 행의 Selected 를 1로 using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = " UPDATE dbo.productTbl " + " SET SelectedPrice = 1 " + " WHERE Price = @Price "; //Selected 열 만들어 놓고 이벤트 실행되는 순간 해당 열 1로 세트 SqlParameter parmPrice = new SqlParameter("@Price", SqlDbType.NVarChar, 20); parmPrice.Value = cboPrice.SelectedItem; cmd.Parameters.Add(parmPrice); cmd.ExecuteNonQuery(); } using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = " UPDATE dbo.productTbl " + " SET SelectedDatas = 1 " + " WHERE Datas = @Datas "; //Selected 열 만들어 놓고 이벤트 실행되는 순간 해당 열 1로 세트 SqlParameter parmDatas = new SqlParameter("@Datas", SqlDbType.NChar, 10); parmDatas.Value = CboData.SelectedItem; cmd.Parameters.Add(parmDatas); cmd.ExecuteNonQuery(); } using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = " UPDATE dbo.productTbl " + " SET SelectedBenefit = 1 " + " WHERE Benefit = @Benefits "; //Selected 열 만들어 놓고 이벤트 실행되는 순간 해당 열 1로 세트 SqlParameter parmBenefits = new SqlParameter("@Benefits", SqlDbType.NVarChar, 50); parmBenefits.Value = cboService.SelectedItem; cmd.Parameters.Add(parmBenefits); cmd.ExecuteNonQuery(); } using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); //DB접속 //Selected가 1이 된 부분만 출력 string strQuery = " SELECT CallingPlan AS [요금제], Price AS [가격], Company AS [회사], " + " Datas AS [데이터], Benefit AS [혜택] " + " FROM productTbl WHERE SelectedDatas =1 AND SelectedBenefit=1 AND SelectedPrice=1"; SqlCommand cmd = new SqlCommand(strQuery, conn); SqlDataAdapter dataAdapter = new SqlDataAdapter(strQuery, conn); DataSet ds = new DataSet(); dataAdapter.Fill(ds, "Price_data"); grdPhonetbl.DataSource = ds; //그리드의 데이터 소스에다가 붓는다. grdPhonetbl.DataMember = "Price_data"; } }//모든 콤보박스만 입력했을 때 검색 using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) //화면에 띄워주고 난 후엔 Selected값을 0으로 바꿔줌 { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = " UPDATE dbo.productTbl " + " SET SelectedPrice = 0,SelectedDatas=0,SelectedBenefit=0 " + " WHERE SelectedBenefit=1 OR SelectedDatas=1 OR SelectedPrice=1"; cmd.ExecuteNonQuery(); }//Selected 값 0으로 초기화 } CboData.SelectedIndex = -1; cboPrice.SelectedIndex = -1; cboService.SelectedIndex = -1; }
다음은 모든 목록 보기에 대한 버튼 이벤트이다. 각 콤보박스의 인덱스를 초기화하고, 모든 요금제에 대한 데이터를 업데이트하는 UpdateData() 메소드를 사용해서 검색을 하기 전 상태로 돌린다.
private void btnInit_Click(object sender, EventArgs e) { CboData.SelectedIndex = -1; cboPrice.SelectedIndex = -1; cboService.SelectedIndex = -1; UpdateData(); }
아래는 자세히 버튼에 대한 이벤트이다. 자세히 버튼을 누를 경우 사용자의 세가지 성향과 제품의 세가지 성향을 비교해서 사용자의 성향을 조정한다. 자세한 조정 내용은 두 성향차가 클수록 조정값이 커지게 하기 위해서 두 성향의 차의 절대값을 구하고 사용자의 성향이 더 클 경우 빼고, 사용자의 성향이 더 작을 경우 더하는 방식을 사용했다. 자세히 보기 버튼을 누를 경우 사용자의 성향이 요금제의 성향을 쫓아가는 것이다.
아래 내용은 선택한 요금제의 성향을 불러와서 즉각적으로 조정이 이루어진다. 그리고 Update문을 통해서 조정된 사용자의 성향은 바로 데이터베이스에 저장한다. 아래에도 마찬가지로 안보이는 그리드뷰에 붓고 인덱스로 가져오는 방식을 사용했다. 더 간단한 방법인 Reader가 있지만 프로젝트를 할 당시에는 알지 못했다. 그리고 선택한 요금제의 이름이 Commons의 정적 변수인 Commons.SELECTED_MODEL에 넘어가서 구매창에서 정보를 보여줄 때 키 값으로 사용된다.
46~48번 줄에서 새로운 창을 자식폼으로 띄운다.
private void btnSpecific_Click(object sender, EventArgs e) { Commons.SELECTED_PLAN = SELECTED_MODEL; Commons.USER_STD_1 = User_std1; Commons.USER_STD_2 = User_std2; Commons.USER_STD_3 = User_std3; try { using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { DataSet ds = new DataSet(); conn.Open(); // 2개의 파라미터 정의 (항상 @로 시작) string sql = " SELECT STD1,STD2,STD3 " + " FROM dbo.productTbl WHERE CallingPlan = @CallingPlan"; SqlCommand cmd = new SqlCommand(sql, conn); // 각 파라미터 타입 및 값 입력 SqlParameter paramCity = new SqlParameter("@CallingPlan", SqlDbType.NVarChar, 50); paramCity.Value = SELECTED_MODEL; // SqlCommand 객체의 Parameters 속성에 추가 cmd.Parameters.Add(paramCity); SqlDataAdapter adapter = new SqlDataAdapter(cmd); adapter.Fill(ds, "User_Information"); conn.Close(); priceTbl.DataSource = ds; //그리드의 데이터 소스에다가 붓는다. priceTbl.DataMember = "User_Information"; } Commons.SELECTED_PLAN = SELECTED_MODEL; Product_std1 = int.Parse(priceTbl[0, 0].Value.ToString()); Product_std2 = int.Parse(priceTbl[1, 0].Value.ToString()); Product_std3 = int.Parse(priceTbl[2, 0].Value.ToString()); Specific_Form form = new Specific_Form(); InitChildForm(form, ""); SELECTED_MODEL = ""; Calculate_Favor_Specific(); } catch (Exception) { } using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = " UPDATE dbo.userTbl " + " SET STD1 = @STD1, STD2 = @STD2, STD3 = @STD3 " + " WHERE userID = @userID"; SqlParameter parmSTD1 = new SqlParameter("@STD1", SqlDbType.Int); parmSTD1.Value = User_std1; cmd.Parameters.Add(parmSTD1); SqlParameter parSTD2 = new SqlParameter("@STD2", SqlDbType.Int); parSTD2.Value = User_std2; cmd.Parameters.Add(parSTD2); SqlParameter parmSTD3 = new SqlParameter("@STD3", SqlDbType.Int); parmSTD3.Value = User_std3; cmd.Parameters.Add(parmSTD3); SqlParameter parmuserID = new SqlParameter("@userID", SqlDbType.VarChar, 50); parmuserID.Value = Commons.LOGINUSERID; cmd.Parameters.Add(parmuserID); cmd.ExecuteNonQuery();//excute는 넣을 때 쓰는건 NonQuery 그 외에건 가져올 때 } } public void Calculate_Favor_Specific() { int temp1=0,temp2=0,temp3=0; if(User_std1!=Product_std1) { //두 숫자 사이 차 절대값 구하기 temp1 = Math.Abs(User_std1 - Product_std1); temp1 = temp1 / 10; } if (User_std2 != Product_std2) { //두 숫자 사이 차 절대값 구하기 temp2 = Math.Abs(User_std2 - Product_std2); temp2 = temp2 / 10; } if (User_std3 != Product_std3) { //두 숫자 사이 차 절대값 구하기 temp3 = Math.Abs(User_std3 - Product_std3); temp3 = temp3 / 10; } if (User_std1 != Product_std1) { if (User_std1 > Product_std1) { User_std1 = User_std1 - temp1; } else if (Product_std1 > User_std1) { User_std1 = User_std1 + temp1; } } if (User_std2 != Product_std2) { if (User_std2 > Product_std2) { User_std2 = User_std2 - temp2; } else if (Product_std2 > User_std2) { User_std2 = User_std2 + temp2; } } if (User_std3 != Product_std3) { if (User_std3 > Product_std3) { User_std3 = User_std3 - temp3; } else if (Product_std3 > User_std3) { User_std3 = User_std3 + temp3; } } }
새로운 추천 창을 띄우는 이벤트와 종료하는 부분이다.
private void NewRecommend_Click(object sender, EventArgs e) { RmdForm form = new RmdForm(); form.StartPosition = FormStartPosition.CenterScreen; form.ShowDialog(); } private void All_Products_FormClosing(object sender, FormClosingEventArgs e) { if (MetroMessageBox.Show(this,"정말 종료하시겠습니까?", "종료", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK) { foreach (var item in this.MdiChildren) { item.Close(); } Environment.Exit(0); } else { e.Cancel = true; } }
전체 소스코드는 다음과 같다.
using MetroFramework; using System; using System.Data; using System.Data.SqlClient; using System.Windows.Forms; namespace MiniProject { public partial class All_Products : Form { public int User_std1; public int User_std2; public int User_std3; public int Product_std1; public int Product_std2; public int Product_std3; public string SELECTED_MODEL = ""; public All_Products() { InitializeComponent(); } private void All_Products_Load(object sender, EventArgs e) { UpdateData(); label2.Text = Commons.LOGINUSERID; // HJ 추가(임시) [20200703 12:40]: 화면크기 조정 this.WindowState = FormWindowState.Maximized; string Price_Convert = ""; UpdateCboPrice(); //가격 콤보박스의 초기값 가져오기 for(int i=0;i<64;i++) { try { if (priceTbl[0, i].Value == null) { cboPrice.Items.Add(""); break; } else { cboPrice.Items.Add(priceTbl[0, i].Value); } } catch (Exception) { } } //콤보박스에 값 넣기 UpdateCboData(); //데이터 콤보박스의 초기값 가져오기 for (int i = 0; i < 64; i++) { try { if (priceTbl[0, i].Value == null) { cboPrice.Items.Add(""); break; } else CboData.Items.Add(priceTbl[0, i].Value); } catch (Exception) { } }//콤보박스에 값 넣기 UpdateCboBenefit(); //혜택 콤보박스의 초기값 가져오기 for (int i = 0; i < 300; i++)//콤보박스에 값 넣기 { try { if (priceTbl[0, i].Value == null) { cboPrice.Items.Add(""); break; } else cboService.Items.Add(priceTbl[0, i].Value); } catch (Exception) { } }//콤보박스에 값 넣기 cboService.SelectedIndex = -1; cboPrice.SelectedIndex =-1; CboData.SelectedIndex = -1; priceTbl.Visible = true; UpdateUser(); RmdForm form = new RmdForm(); form.StartPosition = FormStartPosition.CenterScreen; form.ShowDialog(); } private void UpdateUser() { using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { DataSet ds = new DataSet(); conn.Open(); // 2개의 파라미터 정의 (항상 @로 시작) string sql = " SELECT userID ,userPassword ,userAge ,userGender " + " , userMobile, userUSCallPlan, STD1,STD2,STD3 " + " FROM dbo.userTbl WHERE userID = @userID"; SqlCommand cmd = new SqlCommand(sql, conn); // 각 파라미터 타입 및 값 입력 SqlParameter paramCity = new SqlParameter("@userID", SqlDbType.NVarChar, 15); paramCity.Value = Commons.LOGINUSERID; // SqlCommand 객체의 Parameters 속성에 추가 cmd.Parameters.Add(paramCity); SqlDataAdapter adapter = new SqlDataAdapter(cmd); adapter.Fill(ds, "User_Information"); conn.Close(); priceTbl.DataSource = ds; //그리드의 데이터 소스에다가 붓는다. priceTbl.DataMember = "User_Information"; } User_std1= int.Parse(priceTbl[6, 0].Value.ToString()); User_std2 = int.Parse(priceTbl[7, 0].Value.ToString()); User_std3 = int.Parse(priceTbl[8, 0].Value.ToString()); } private void UpdateData() { using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); //DB접속 //데이터 그리드 뷰에 간단 정보 출력 string strQuery = " SELECT CallingPlan AS [요금제], REPLACE(CONVERT(VARCHAR, CAST(Price AS MONEY), 1), '.00', '') AS Price, Company AS [회사], " + " Datas AS [데이터], Benefit AS [혜택] " + " FROM productTbl"; SqlCommand cmd = new SqlCommand(strQuery, conn); SqlDataAdapter dataAdapter = new SqlDataAdapter(strQuery, conn); DataSet ds = new DataSet(); dataAdapter.Fill(ds, "General_Phone_Information"); grdPhonetbl.DataSource = ds; //그리드의 데이터 소스에다가 붓는다. grdPhonetbl.DataMember = "General_Phone_Information"; } //for (int i = 0; i < 4; i++) //데이터 그리드 뷰 열과 행 크기 자동 조절 //{ // grdPhonetbl.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells; // int widthCol = grdPhonetbl.Columns[i].Width; // grdPhonetbl.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None; // grdPhonetbl.Columns[i].Width = widthCol; //} } private void UpdateCboData() //data 콤보박스 값 가져오기 { using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); //DB접속 string strQuery = "SELECT DISTINCT Datas FROM productTbl ORDER BY Datas ASC"; SqlCommand cmd = new SqlCommand(strQuery, conn); SqlDataAdapter dataAdapter = new SqlDataAdapter(strQuery, conn); DataSet ds = new DataSet(); dataAdapter.Fill(ds, "datas"); priceTbl.DataSource = ds; priceTbl.DataMember = "datas"; } } private void UpdateCboBenefit() //혜택 콤보박스 값 가져오기 { using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); //DB접속 string strQuery = "SELECT DISTINCT Benefit FROM productTbl ORDER BY Benefit DESC"; SqlCommand cmd = new SqlCommand(strQuery, conn); SqlDataAdapter dataAdapter = new SqlDataAdapter(strQuery, conn); DataSet ds = new DataSet(); dataAdapter.Fill(ds, "Benefits"); priceTbl.DataSource = ds; //그리드의 데이터 소스에다가 붓는다. priceTbl.DataMember = "Benefits"; } } private void UpdateCboPrice() //가격 콤보박스 값 가져오기 { using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); //DB접속 string strQuery = "SELECT DISTINCT Price FROM productTbl ORDER BY Price ASC"; SqlCommand cmd = new SqlCommand(strQuery, conn); SqlDataAdapter dataAdapter = new SqlDataAdapter(strQuery, conn); DataSet ds = new DataSet(); dataAdapter.Fill(ds, "price"); priceTbl.DataSource = ds; priceTbl.DataMember = "price"; } } private void InitChildForm(Specific_Form form, string v) { form.Show(); form.WindowState = FormWindowState.Normal; } private void grdPhonetbl_CellClick(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex > -1) { DataGridViewRow data = grdPhonetbl.Rows[e.RowIndex]; SELECTED_MODEL = data.Cells[0].Value.ToString(); } } private void btnSearch_Click(object sender, EventArgs e) { if (cboPrice.Text == "" && cboService.Text == "" && CboData.Text == "") { MetroMessageBox.Show(this,"빈 값은 검색할 수 없습니다.", "경고", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; //메세지 박스 빠져 나오기 뭐 안되면 리턴하자 } else { if(cboPrice.SelectedIndex!=-1&& CboData.SelectedIndex == -1&& cboService.SelectedIndex == -1) //첫번째 콤보박스만 입력했을 때 검색 { //검색어 조건에 입력한 내용에 대한 행의 Selected 를 1로 using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = " UPDATE dbo.productTbl " + " SET SelectedPrice = 1 " + " WHERE Price = @Price "; //Selected 열 만들어 놓고 이벤트 실행되는 순간 해당 열 1로 세트 SqlParameter parmPrice = new SqlParameter("@Price", SqlDbType.NVarChar, 20); parmPrice.Value = cboPrice.SelectedItem; cmd.Parameters.Add(parmPrice); cmd.ExecuteNonQuery(); } using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); //DB접속 //Selected가 1이 된 부분만 출력 string strQuery = " SELECT CallingPlan AS [요금제], Price AS [가격], Company AS [회사], " + " Datas AS [데이터], Benefit AS [혜택] " + " FROM productTbl WHERE SelectedPrice =1 "; SqlCommand cmd = new SqlCommand(strQuery, conn); SqlDataAdapter dataAdapter = new SqlDataAdapter(strQuery, conn); DataSet ds = new DataSet(); dataAdapter.Fill(ds, "Price_data"); grdPhonetbl.DataSource = ds; //그리드의 데이터 소스에다가 붓는다. grdPhonetbl.DataMember = "Price_data"; } } //첫번째 콤보박스만 입력했을 때 검색 if (cboPrice.SelectedIndex == -1 && CboData.SelectedIndex != -1 && cboService.SelectedIndex == -1) //첫번째 콤보박스만 입력했을 때 { //검색어 조건에 입력한 내용에 대한 행의 Selected 를 1로 using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = " UPDATE dbo.productTbl " + " SET SelectedDatas = 1 " + " WHERE Datas = @Datas "; //Selected 열 만들어 놓고 이벤트 실행되는 순간 해당 열 1로 세트 SqlParameter parmDatas = new SqlParameter("@Datas", SqlDbType.NChar, 10); parmDatas.Value = CboData.SelectedItem; cmd.Parameters.Add(parmDatas); cmd.ExecuteNonQuery(); } using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); //DB접속 //Selected가 1이 된 부분만 출력 string strQuery = " SELECT CallingPlan AS [요금제], Price AS [가격], Company AS [회사], " + " Datas AS [데이터], Benefit AS [혜택] " + " FROM productTbl WHERE SelectedDatas =1 "; SqlCommand cmd = new SqlCommand(strQuery, conn); SqlDataAdapter dataAdapter = new SqlDataAdapter(strQuery, conn); DataSet ds = new DataSet(); dataAdapter.Fill(ds, "Price_data"); grdPhonetbl.DataSource = ds; //그리드의 데이터 소스에다가 붓는다. grdPhonetbl.DataMember = "Price_data"; } }//두번째 콤보박스만 입력했을 때 검색 if (cboPrice.SelectedIndex == -1 && CboData.SelectedIndex == -1 && cboService.SelectedIndex != -1) //세번째 콤보박스만 입력했을 때 { //검색어 조건에 입력한 내용에 대한 행의 Selected 를 1로 using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = " UPDATE dbo.productTbl " + " SET SelectedBenefit = 1 " + " WHERE Benefit = @Benefits "; //Selected 열 만들어 놓고 이벤트 실행되는 순간 해당 열 1로 세트 SqlParameter parmBenefits = new SqlParameter("@Benefits", SqlDbType.NVarChar, 50); parmBenefits.Value = cboService.SelectedItem; cmd.Parameters.Add(parmBenefits); cmd.ExecuteNonQuery(); } using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); //DB접속 //Selected가 1이 된 부분만 출력 string strQuery = " SELECT CallingPlan AS [요금제], Price AS [가격], Company AS [회사], " + " Datas AS [데이터], Benefit AS [혜택] " + " FROM productTbl WHERE SelectedBenefit =1 "; SqlCommand cmd = new SqlCommand(strQuery, conn); SqlDataAdapter dataAdapter = new SqlDataAdapter(strQuery, conn); DataSet ds = new DataSet(); dataAdapter.Fill(ds, "Price_data"); grdPhonetbl.DataSource = ds; //그리드의 데이터 소스에다가 붓는다. grdPhonetbl.DataMember = "Price_data"; } } //세번째 콤보박스만 입력했을 때 검색 if (cboPrice.SelectedIndex != -1 && CboData.SelectedIndex != -1 && cboService.SelectedIndex == -1) //첫번째 두번째 박스만 입력했을 때 { //검색어 조건에 입력한 내용에 대한 행의 Selected 를 1로 using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = " UPDATE dbo.productTbl " + " SET SelectedPrice = 1 " + " WHERE Price = @Price "; //Selected 열 만들어 놓고 이벤트 실행되는 순간 해당 열 1로 세트 SqlParameter parmPrice = new SqlParameter("@Price", SqlDbType.NVarChar, 20); parmPrice.Value = cboPrice.SelectedItem; cmd.Parameters.Add(parmPrice); cmd.ExecuteNonQuery(); } using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = " UPDATE dbo.productTbl " + " SET SelectedDatas = 1 " + " WHERE Datas = @Datas "; //Selected 열 만들어 놓고 이벤트 실행되는 순간 해당 열 1로 세트 SqlParameter parmDatas = new SqlParameter("@Datas", SqlDbType.NChar, 10); parmDatas.Value = CboData.SelectedItem; cmd.Parameters.Add(parmDatas); cmd.ExecuteNonQuery(); } using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); //DB접속 //Selected가 1이 된 부분만 출력 string strQuery = " SELECT CallingPlan AS [요금제], Price AS [가격], Company AS [회사], " + " Datas AS [데이터], Benefit AS [혜택] " + " FROM productTbl WHERE SelectedPrice =1 AND SelectedDatas=1"; SqlCommand cmd = new SqlCommand(strQuery, conn); SqlDataAdapter dataAdapter = new SqlDataAdapter(strQuery, conn); DataSet ds = new DataSet(); dataAdapter.Fill(ds, "Price_data"); grdPhonetbl.DataSource = ds; //그리드의 데이터 소스에다가 붓는다. grdPhonetbl.DataMember = "Price_data"; } }//첫번째 두번째 콤보박스만 입력했을 때 검색 if (cboPrice.SelectedIndex != -1 && CboData.SelectedIndex == -1 && cboService.SelectedIndex != -1) //첫번째 세번째 박스만 입력했을 때 { //검색어 조건에 입력한 내용에 대한 행의 Selected 를 1로 using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = " UPDATE dbo.productTbl " + " SET SelectedPrice = 1 " + " WHERE Price = @Price "; //Selected 열 만들어 놓고 이벤트 실행되는 순간 해당 열 1로 세트 SqlParameter parmPrice = new SqlParameter("@Price", SqlDbType.NVarChar, 20); parmPrice.Value = cboPrice.SelectedItem; cmd.Parameters.Add(parmPrice); cmd.ExecuteNonQuery(); } using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = " UPDATE dbo.productTbl " + " SET SelectedBenefit = 1 " + " WHERE Benefit = @Benefits "; //Selected 열 만들어 놓고 이벤트 실행되는 순간 해당 열 1로 세트 SqlParameter parmBenefits = new SqlParameter("@Benefits", SqlDbType.NVarChar, 50); parmBenefits.Value = cboService.SelectedItem; cmd.Parameters.Add(parmBenefits); cmd.ExecuteNonQuery(); } using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); //DB접속 //Selected가 1이 된 부분만 출력 string strQuery = " SELECT CallingPlan AS [요금제], Price AS [가격], Company AS [회사], " + " Datas AS [데이터], Benefit AS [혜택] " + " FROM productTbl WHERE SelectedPrice =1 AND SelectedBenefit=1"; SqlCommand cmd = new SqlCommand(strQuery, conn); SqlDataAdapter dataAdapter = new SqlDataAdapter(strQuery, conn); DataSet ds = new DataSet(); dataAdapter.Fill(ds, "Price_data"); grdPhonetbl.DataSource = ds; //그리드의 데이터 소스에다가 붓는다. grdPhonetbl.DataMember = "Price_data"; } }//첫번째 세번째 박스만 입력했을 때 if (cboPrice.SelectedIndex == -1 && CboData.SelectedIndex != -1 && cboService.SelectedIndex != -1) //두번째 세번째 박스만 입력했을 때 { //검색어 조건에 입력한 내용에 대한 행의 Selected 를 1로 using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = " UPDATE dbo.productTbl " + " SET SelectedDatas = 1 " + " WHERE Datas = @Datas "; //Selected 열 만들어 놓고 이벤트 실행되는 순간 해당 열 1로 세트 SqlParameter parmDatas = new SqlParameter("@Datas", SqlDbType.NChar, 10); parmDatas.Value = CboData.SelectedItem; cmd.Parameters.Add(parmDatas); cmd.ExecuteNonQuery(); } using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = " UPDATE dbo.productTbl " + " SET SelectedBenefit = 1 " + " WHERE Benefit = @Benefits "; //Selected 열 만들어 놓고 이벤트 실행되는 순간 해당 열 1로 세트 SqlParameter parmBenefits = new SqlParameter("@Benefits", SqlDbType.NVarChar, 50); parmBenefits.Value = cboService.SelectedItem; cmd.Parameters.Add(parmBenefits); cmd.ExecuteNonQuery(); } using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); //DB접속 //Selected가 1이 된 부분만 출력 string strQuery = " SELECT CallingPlan AS [요금제], Price AS [가격], Company AS [회사], " + " Datas AS [데이터], Benefit AS [혜택] " + " FROM productTbl WHERE SelectedDatas =1 AND SelectedBenefit=1"; SqlCommand cmd = new SqlCommand(strQuery, conn); SqlDataAdapter dataAdapter = new SqlDataAdapter(strQuery, conn); DataSet ds = new DataSet(); dataAdapter.Fill(ds, "Price_data"); grdPhonetbl.DataSource = ds; //그리드의 데이터 소스에다가 붓는다. grdPhonetbl.DataMember = "Price_data"; } }//두번째 세번째 박스만 입력했을 때 if (cboPrice.SelectedIndex == -1 && CboData.SelectedIndex != -1 && cboService.SelectedIndex != -1) //두번째 세번째 박스만 입력했을 때 { //검색어 조건에 입력한 내용에 대한 행의 Selected 를 1로 using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = " UPDATE dbo.productTbl " + " SET SelectedPrice = 1 " + " WHERE Price = @Price "; //Selected 열 만들어 놓고 이벤트 실행되는 순간 해당 열 1로 세트 SqlParameter parmPrice = new SqlParameter("@Price", SqlDbType.NVarChar, 20); parmPrice.Value = cboPrice.SelectedItem; cmd.Parameters.Add(parmPrice); cmd.ExecuteNonQuery(); } using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = " UPDATE dbo.productTbl " + " SET SelectedDatas = 1 " + " WHERE Datas = @Datas "; //Selected 열 만들어 놓고 이벤트 실행되는 순간 해당 열 1로 세트 SqlParameter parmDatas = new SqlParameter("@Datas", SqlDbType.NChar, 10); parmDatas.Value = CboData.SelectedItem; cmd.Parameters.Add(parmDatas); cmd.ExecuteNonQuery(); } using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = " UPDATE dbo.productTbl " + " SET SelectedBenefit = 1 " + " WHERE Benefit = @Benefits "; //Selected 열 만들어 놓고 이벤트 실행되는 순간 해당 열 1로 세트 SqlParameter parmBenefits = new SqlParameter("@Benefits", SqlDbType.NVarChar, 50); parmBenefits.Value = cboService.SelectedItem; cmd.Parameters.Add(parmBenefits); cmd.ExecuteNonQuery(); } using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); //DB접속 //Selected가 1이 된 부분만 출력 string strQuery = " SELECT CallingPlan AS [요금제], Price AS [가격], Company AS [회사], " + " Datas AS [데이터], Benefit AS [혜택] " + " FROM productTbl WHERE SelectedDatas =1 AND SelectedBenefit=1 AND SelectedPrice=1"; SqlCommand cmd = new SqlCommand(strQuery, conn); SqlDataAdapter dataAdapter = new SqlDataAdapter(strQuery, conn); DataSet ds = new DataSet(); dataAdapter.Fill(ds, "Price_data"); grdPhonetbl.DataSource = ds; //그리드의 데이터 소스에다가 붓는다. grdPhonetbl.DataMember = "Price_data"; } }//모든 콤보박스만 입력했을 때 검색 using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) //화면에 띄워주고 난 후엔 Selected값을 0으로 바꿔줌 { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = " UPDATE dbo.productTbl " + " SET SelectedPrice = 0,SelectedDatas=0,SelectedBenefit=0 " + " WHERE SelectedBenefit=1 OR SelectedDatas=1 OR SelectedPrice=1"; cmd.ExecuteNonQuery(); }//Selected 값 0으로 초기화 } CboData.SelectedIndex = -1; cboPrice.SelectedIndex = -1; cboService.SelectedIndex = -1; } private void btnInit_Click(object sender, EventArgs e) { CboData.SelectedIndex = -1; cboPrice.SelectedIndex = -1; cboService.SelectedIndex = -1; UpdateData(); } private void btnSpecific_Click(object sender, EventArgs e) { Commons.SELECTED_PLAN = SELECTED_MODEL; Commons.USER_STD_1 = User_std1; Commons.USER_STD_2 = User_std2; Commons.USER_STD_3 = User_std3; try { using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { DataSet ds = new DataSet(); conn.Open(); // 2개의 파라미터 정의 (항상 @로 시작) string sql = " SELECT STD1,STD2,STD3 " + " FROM dbo.productTbl WHERE CallingPlan = @CallingPlan"; SqlCommand cmd = new SqlCommand(sql, conn); // 각 파라미터 타입 및 값 입력 SqlParameter paramCity = new SqlParameter("@CallingPlan", SqlDbType.NVarChar, 50); paramCity.Value = SELECTED_MODEL; // SqlCommand 객체의 Parameters 속성에 추가 cmd.Parameters.Add(paramCity); SqlDataAdapter adapter = new SqlDataAdapter(cmd); adapter.Fill(ds, "User_Information"); conn.Close(); priceTbl.DataSource = ds; //그리드의 데이터 소스에다가 붓는다. priceTbl.DataMember = "User_Information"; } Commons.SELECTED_PLAN = SELECTED_MODEL; Product_std1 = int.Parse(priceTbl[0, 0].Value.ToString()); Product_std2 = int.Parse(priceTbl[1, 0].Value.ToString()); Product_std3 = int.Parse(priceTbl[2, 0].Value.ToString()); Specific_Form form = new Specific_Form(); InitChildForm(form, ""); SELECTED_MODEL = ""; Calculate_Favor_Specific(); } catch (Exception) { } using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = " UPDATE dbo.userTbl " + " SET STD1 = @STD1, STD2 = @STD2, STD3 = @STD3 " + " WHERE userID = @userID"; SqlParameter parmSTD1 = new SqlParameter("@STD1", SqlDbType.Int); parmSTD1.Value = User_std1; cmd.Parameters.Add(parmSTD1); SqlParameter parSTD2 = new SqlParameter("@STD2", SqlDbType.Int); parSTD2.Value = User_std2; cmd.Parameters.Add(parSTD2); SqlParameter parmSTD3 = new SqlParameter("@STD3", SqlDbType.Int); parmSTD3.Value = User_std3; cmd.Parameters.Add(parmSTD3); SqlParameter parmuserID = new SqlParameter("@userID", SqlDbType.VarChar, 50); parmuserID.Value = Commons.LOGINUSERID; cmd.Parameters.Add(parmuserID); cmd.ExecuteNonQuery();//excute는 넣을 때 쓰는건 NonQuery 그 외에건 가져올 때 } } public void Calculate_Favor_Specific() { int temp1=0,temp2=0,temp3=0; if(User_std1!=Product_std1) { //두 숫자 사이 차 절대값 구하기 temp1 = Math.Abs(User_std1 - Product_std1); temp1 = temp1 / 10; } if (User_std2 != Product_std2) { //두 숫자 사이 차 절대값 구하기 temp2 = Math.Abs(User_std2 - Product_std2); temp2 = temp2 / 10; } if (User_std3 != Product_std3) { //두 숫자 사이 차 절대값 구하기 temp3 = Math.Abs(User_std3 - Product_std3); temp3 = temp3 / 10; } if (User_std1 != Product_std1) { if (User_std1 > Product_std1) { User_std1 = User_std1 - temp1; } else if (Product_std1 > User_std1) { User_std1 = User_std1 + temp1; } } if (User_std2 != Product_std2) { if (User_std2 > Product_std2) { User_std2 = User_std2 - temp2; } else if (Product_std2 > User_std2) { User_std2 = User_std2 + temp2; } } if (User_std3 != Product_std3) { if (User_std3 > Product_std3) { User_std3 = User_std3 - temp3; } else if (Product_std3 > User_std3) { User_std3 = User_std3 + temp3; } } } private void NewRecommend_Click(object sender, EventArgs e) { RmdForm form = new RmdForm(); form.StartPosition = FormStartPosition.CenterScreen; form.ShowDialog(); } private void All_Products_FormClosing(object sender, FormClosingEventArgs e) { if (MetroMessageBox.Show(this,"정말 종료하시겠습니까?", "종료", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK) { foreach (var item in this.MdiChildren) { item.Close(); } Environment.Exit(0); } else { e.Cancel = true; } } } }
'첫번째 프로젝트(요금제 추천)' 카테고리의 다른 글
미니프로젝트 정리 (내파트) Specific_Form폼, 통계 폼 (0) 2020.07.17