سلام دوستان
یه برنامه ی مدیریت مشتری یا (CRM) دارم مینویسم که به شرح زیره :
دو تا کمبوباکس دارم یکی کمبوباکس'وضعیت' یکی کبوباکس'نتیجه' حالا میخوام بررسی کنم :
مثال 1 : یک مشتری کمبوباکس 'وضعیتش' : مشتری 'بالقوه' انتخاب میشه و 'نتیجه ی تماس' گزینه ی 'تمایل ندارد' به همکاری انتخاب میشه (در این حالت دیگه نباید در جلسه ی جاری این گفتگو ادامه پیدا کنه و باید در یک جلسه جدید ثبت بشه) .
مثال 2 : یک مشتری کمبوباکس 'وضعیتش' : مشتری 'بالقوه' انتخاب میشه و 'نتیجه ی تماس' گزینه ی 'درخواست ارسال قیمت' انتخاب میشه (یعنی تماس با این مشتری ادامه دار خواهد بود) .
ارتباط با هر مشتری تا مرحله ی فروش قطعی میتونه تا پنج بار تماس گرفته بشه که هر ارتباط رو بهش میگیم جلسه .
- اگر در کمبوباکس'نتیجه' کاربر فلان گزینه (گزینه ممنوعه) رو انتخاب کرد امکان ثبت مجدد رکود برای این مشتری در این'جلسه' وجود نداشته باشد .
- اگر کاربر فلان گزینه را از کمبوباکس 'نتیجه' انتخاب کرد امکان ادامه به مرحله بعد را داشته باشد و این روند تا پنج مرحله یا (رکود) امکان پذیر باشد (امکان ادامه یا عدم ادامه را در هر مرحله را داشته باشد) .
- اگر با انتخاب گزینه ای خاص از کامبوباکس 'نتیجه' که در شرط گذاری آن امکان ادامه ی جلسه ی جاری نبود (گزینه ی ممنوعه) یا مراحل پنج گانه ی آن به پایان رسیده بود آنگاه اگر کاربر دوباره بخواهد همان رکورد را مجدد ثبت کند باید در یک جلسه ی جدید ثبت شود (فیلد 'جلسه' شماره گذاری جدید برای 'جلسه' ی جدید ایجاد کند) .
- هر جلسه میتواند نهایت تا پنج رکورد داشته باشد که رکورد های هر پنج جلسه با یک رنگ نمایش داده شود .
- رکورد های پنجم جلسه با رنگ قرمز نمایش داده میشود که نشان دهنده پایان جلسه می باشد .
یک table در sql به نام 'tblcrm' دارم که فیلد هایی به شریح زیر دارد :
id: شمارنده ی خودکار
idc : که id اختصاصی مشتری را از جدول مشتری ذخیره میکند
ids : شماره ی جلسه ی جاری است که تا پنج شماره تکراری میتواند ذخیره کند (پنج رکورد با یک شماره جلسه میتواند ذخیره شود بعد از آن یک شماره ی جدید برای جلسه ی جدید ثبت میشود) .
در نهایت در جدول 'tblcrm' فیلد های زیر وجود دارند :
(idc,ids,typefollow,interest,statusfollow,result,d ate1,nextdate,disc)
تقریبا همه کد ها رو هم نوشتم .
فقط مشکل اینجاست که وقتی گزینه ی ممنوعه انتخاب میکنم و ثبت میکنم اگه دوباره همان گزینه را در همان جلسه ی جاری انتخاب و ثبت کنم دوباره ثبت میشه ، در حالی که نباید دیگه اجازه ی ذخیره بده در جلسه ی جاری و باید اخطار بده و اعلام کنه که این گزینه ممنوعه هست و در یک جلسه ی جدید ذخیره کنه .
امیدوارم کامل گفته باشم و خسته کننده نباشه .
این هم کد های من ممنون میشم بررسی کنید :
Imports System.Data.SqlClient
Imports System.Data.OleDb
Imports System.Runtime.InteropServices
Imports System.Text.RegularExpressions
Public Class frmCRMProfile
Dim con As New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=" & My.Application.Info.DirectoryPath & "\dbkarkhaneh.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True")
' تابع بررسی ادامهپذیری جلسه بر اساس مقدار ComboBox
Function CanContinueSession(resultValue As String) As Boolean
Dim forbiddenResults = {"مشتری بالقوه", "شماره اشتباه / بی پاسخ"} ' گزینههایی که ادامه ندهند
Return Not forbiddenResults.Contains(resultValue)
End Function
Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click
frmCRM.Show()
Me.Close()
End Sub
Private Sub cmbStatusFollow_fill()
cmbStatusFollow.Items.Add("مشتری بالقوه")
cmbStatusFollow.Items.Add("در حال مذاکره")
cmbStatusFollow.Items.Add("آماده عقد قرار داد")
cmbStatusFollow.Items.Add("نهایی شده")
cmbStatusFollow.Items.Add("تماس دوباره / پیگیری در آینده")
End Sub
Private Sub frmCRMProfile_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'fill()
Try
Dim idc As Integer = lblIDC.Text.ToString
LoadDataGrid(idc)
cmbStatusFollow_fill()
'Search_Count_Record_Customer()
Catch ex As Exception
MessageBox.Show("مشکلی پیش آمده لطفا مجدد تلاش کنید")
End Try
End Sub
Private Sub cmbStatusFollow_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cmbStatusFollow.SelectedIndexChanged
cmbResult.Items.Clear()
Select Case cmbStatusFollow.SelectedItem.ToString()
Case "مشتری بالقوه"
cmbResult.Items.AddRange(New String() {"تماس اولیه برقرار شد", "شماره اشتباه / بی پاسخ", "علاقه مند بود", "علاقه مند نبود", "نیاز به بررسی بیشتر", "نیاز به مشورت با شریک"})
Case "در حال مذاکره"
cmbResult.Items.AddRange(New String() {"ارسال پیشفاکتور", "ارسال نمونه محصول", "مذاکره بر سر قیمت", "در انتظار پاسخ مشتری", "نیاز به جلسه حضوری", "در حال بررسی شرایط ارسال / تسویه"})
Case "آماده عقد قرار داد"
cmbResult.Items.AddRange(New String() {"تایید نهایی شد", "منتظر پرداخت", "ارسال قرار داد", "در انتظار صدور پیش فاکتور رسمی"})
Case "نهایی شده"
cmbResult.Items.AddRange(New String() {"موفق / خرید انجام شد", "موفق / همکاری شروع شد", "ناموفق / قیمت بالا بود", "نا موفق / نیاز نداشت", "مشتری کنسل کرد"})
Case "تماس دوباره / پیگیری در آینده"
cmbResult.Items.AddRange(New String() {"تماس در هفته های آینده", "تماس در ماه آینده", "منتظر بودجه / مجوز", "فعلا امکان خرید ندارد", "یاد آوری برای پیگیری"})
Case Else
' موارد دیگر یا خالی
End Select
If cmbResult.Items.Count > 0 Then
cmbResult.SelectedIndex = 0
End If
End Sub
Private Function GetLastSessionId(idc As Integer) As Integer
Dim query As String = "SELECT ISNULL(MAX(ids), 0) FROM tblcrm WHERE idc = @idc"
Using cmd As New SqlCommand(query, con)
cmd.Parameters.AddWithValue("@idc", idc)
If con.State = ConnectionState.Closed Then con.Open()
Dim sessionId = Convert.ToInt32(cmd.ExecuteScalar())
con.Close()
Return sessionId
End Using
End Function
Private Function GetSessionRecordCount(idc As Integer, sessionId As Integer) As Integer
Dim query As String = "SELECT COUNT(*) FROM tblcrm WHERE idc = @idc AND ids = @sessionId"
Using cmd As New SqlCommand(query, con)
cmd.Parameters.AddWithValue("@idc", idc)
cmd.Parameters.AddWithValue("@sessionId", sessionId)
If con.State = ConnectionState.Closed Then con.Open()
Dim count = Convert.ToInt32(cmd.ExecuteScalar())
con.Close()
Return count
End Using
End Function
Private Function HasAnyForbiddenResultAlreadySaved(idc As Integer, sessionId As Integer, forbiddenResults As List(Of String)) As Boolean
Dim query As String = "SELECT COUNT(*) FROM tblcrm WHERE idc = @idc AND ids = @sessionId AND result IN (" & String.Join(",", forbiddenResults.Select(Function(x) "'" & x & "'")) & ")"
Using cmd As New SqlCommand(query, con)
cmd.Parameters.AddWithValue("@idc", idc)
cmd.Parameters.AddWithValue("@sessionId", sessionId)
If con.State = ConnectionState.Closed Then con.Open()
Dim count = Convert.ToInt32(cmd.ExecuteScalar())
con.Close()
Return count > 0
End Using
End Function
Private Sub btnSaveCustomer_Click(sender As Object, e As EventArgs) Handles btnSaveCustomer.Click
Dim idc As Integer = Val(lblIDC.Text)
Dim resultText As String = cmbResult.Text
Dim vaziyatText As String = cmbStatusFollow.Text
Dim forbiddenResults As New List(Of String) From {
"شماره اشتباه / بی پاسخ", "علاقه مند نبود", "تایید نهایی شد",
"ناموفق / قیمت بالا بود", "نا موفق / نیاز نداشت",
"مشتری کنسل کرد", "فعلا امکان خرید ندارد"
}
Dim currentSessionId As Integer = GetLastSessionId(idc)
' اگر نتیجه ممنوعه قبلاً در جلسه ثبت شده باشد → شروع جلسه جدید
If HasAnyForbiddenResultAlreadySaved(idc, currentSessionId, forbiddenResults) Then
currentSessionId += 1
End If
' بررسی تعداد رکوردهای این جلسه
Dim recordCount As Integer = GetSessionRecordCount(idc, currentSessionId)
If recordCount >= 5 Then
currentSessionId += 1
End If
'MessageBox.Show("هیچکدام از رشتههای مورد نظر در result یافت نشد.")
' ذخیره رکورد
If con.State = ConnectionState.Closed Then con.Open()
Dim cmd As New SqlCommand("INSERT INTO tblcrm (idc,ids,typefollow,interest,statusfollow,result,d ate1,nextdate,disc) VALUES (@idc,@ids,@typefollow,@interest,@statusfollow,@re sult,@date1,@nextdate,@disc)", con)
cmd.Parameters.AddWithValue("@idc", idc)
cmd.Parameters.AddWithValue("@ids", currentSessionId)
cmd.Parameters.AddWithValue("@typefollow", cmbTypeFollow.Text)
cmd.Parameters.AddWithValue("@interest", cmbInterest.Text)
cmd.Parameters.AddWithValue("@statusfollow", vaziyatText)
cmd.Parameters.AddWithValue("@result", resultText)
cmd.Parameters.AddWithValue("@date1", txtDate.Text)
cmd.Parameters.AddWithValue("@nextdate", txtNextDate.Text)
cmd.Parameters.AddWithValue("@disc", txtDicCustomer.Text)
cmd.ExecuteNonQuery()
con.Close()
MessageBox.Show("رکورد ثبت شد.")
LoadDataGrid(idc)
End Sub
Sub LoadDataGrid(idc As Integer)
If con.State = ConnectionState.Closed Then
con.Open()
End If
Dim da As New SqlDataAdapter("SELECT * FROM tblcrm WHERE idc = @idc ORDER BY ids, id", con)
da.SelectCommand.Parameters.AddWithValue("@idc", idc)
Dim dt As New DataTable
da.Fill(dt)
DataGridView1.DataSource = dt
'DataGridView1.RowTemplate.Height = 60
' رنگ جلسهها
Dim sessionIdCounter As New Dictionary(Of Integer, Integer) ' شمارش رکوردهای هر جلسه
Dim colors As Color() = {Color.FromArgb(255, 242, 204), Color.FromArgb(198, 239, 206), Color.FromArgb(221, 235, 247), Color.FromArgb(248, 203, 173), Color.FromArgb(234, 209, 220)}
Dim sessionColorMap As New Dictionary(Of Integer, Color)
Dim colorIndex As Integer = -1
For Each row As DataGridViewRow In DataGridView1.Rows
Dim sessionId As Integer = CInt(row.Cells("ids").Value)
Dim resultText As String = row.Cells("result").Value.ToString()
' شمارش رکوردهای جلسه
If sessionIdCounter.ContainsKey(sessionId) Then
sessionIdCounter(sessionId) += 1
Else
sessionIdCounter(sessionId) = 1
colorIndex = (colorIndex + 1) Mod colors.Length
sessionColorMap(sessionId) = colors(colorIndex)
End If
'برای رنگ رکوردهای ممنوعه
If forbiddenResults.Contains(row.Cells("result").Valu e.ToString()) Then
row.DefaultCellStyle.BackColor = Color.FromArgb(255, 200, 200) ' قرمز روشن
row.DefaultCellStyle.ForeColor = Color.DarkRed
End If
' اگر این رکورد پنجمین رکورد جلسه است → قرمز کمرنگ
If sessionIdCounter(sessionId) = 5 Then
row.DefaultCellStyle.BackColor = Color.FromArgb(255, 102, 102) ' قرمز روشن
Else
row.DefaultCellStyle.BackColor = sessionColorMap(sessionId)
End If
Next
If con.State = ConnectionState.Open Then
con.Close()
End If
DataGridView1.Columns(0).Visible = False
DataGridView1.Columns(1).Visible = False
DataGridView1.Columns(4).Visible = False
'DataGridView1.Columns(6).Visible = False
DataGridView1.Columns(7).Visible = False
DataGridView1.Columns(8).Visible = False
DataGridView1.Columns(9).Visible = False
DataGridView1.Columns(2).HeaderText = "کد جلسه"
DataGridView1.Columns(2).Width = 105
DataGridView1.Columns(3).HeaderText = "نوع ارتباط"
DataGridView1.Columns(3).Width = 105
DataGridView1.Columns(5).HeaderText = "وضعیت پیگیری"
DataGridView1.Columns(5).Width = 130
DataGridView1.Columns(6).HeaderText = "نتیجه"
DataGridView1.Columns(6).Width = 160
With DataGridView1
' رنگهای کلی
.EnableHeadersVisualStyles = False
.ColumnHeadersDefaultCellStyle.BackColor = Color.DarkSeaGreen
.ColumnHeadersDefaultCellStyle.ForeColor = Color.White
.ColumnHeadersDefaultCellStyle.Font = New Font("Tahoma", 10, FontStyle.Bold)
.DefaultCellStyle.Font = New Font("Tahoma", 9)
' رنگ سطرها
'.DefaultCellStyle.BackColor = Color.White
'.AlternatingRowsDefaultCellStyle.BackColor = Color.FromArgb(240, 248, 255) ' آبی کمرنگ برای ردیفهای زوج
' کادر دور سلولها
.CellBorderStyle = DataGridViewCellBorderStyle.SingleHorizontal
.GridColor = Color.LightGray
' ظاهر انتخابشدهها
.DefaultCellStyle.SelectionBackColor = Color.SteelBlue
.DefaultCellStyle.SelectionForeColor = Color.White
' تنظیمات کلی
.RowTemplate.Height = 30
.ColumnHeadersHeight = 35
.SelectionMode = DataGridViewSelectionMode.FullRowSelect
.ReadOnly = True
.MultiSelect = False
.AllowUserToAddRows = False
.AllowUserToDeleteRows = False
.AllowUserToResizeRows = False
.AllowUserToResizeColumns = True
End With
For Each row As DataGridViewRow In DataGridView1.Rows
row.Height = 25
Next
End Sub
End Class
ممنون میشم راهنمایی کنید .
باتشکر