Imports System.Data.SqlClient Imports System.Reflection Public Class Frm_pu_measure Dim cmd As New SqlCommand Dim da As New SqlDataAdapter Dim dt As New DataTable Dim sql As String Dim conn As New SqlConnection Dim DR As SqlDataReader Private Sub Frm_pu_measure_Load(sender As Object, e As EventArgs) Handles MyBase.Load Me.MdiParent = FrmMDI Dim type As Type = DGV1.GetType() Dim pi As PropertyInfo = type.GetProperty("DoubleBuffered", System.Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.NonPublic) pi.SetValue(DGV1, True, Nothing) conn.ConnectionString = connstring conn.Open() cmd.Connection = conn sql = "SELECT RT_PU_MEASURE1_SYS.card AS 卡号, RT_RETAN_RECORD.TECH AS 技术员, RT_RETAN_RECORD.CUST AS 客户, " & " RT_RETAN_RECORD.COLOR AS 颜色, RT_RETAN_RECORD.THICKNESS AS 厚度,RT_RETAN_RECORD.WB_WEIGHT AS 蓝皮重, SUM(RT_PU_MEASURE1_SYS.sf) AS 中检量尺, " & " ROUND(SUM(RT_PU_MEASURE1_SYS.sf) / (RT_RETAN_RECORD.WB_WEIGHT/2), 1) AS 得革率, " & " ROUND(RT_RETAN_RECORD.PRICE / RT_RETAN_RECORD.WB_WEIGHT, 1) AS '蓝皮单价(斤)', " & " ROUND(RT_RETAN_RECORD.PRICE / SUM(RT_PU_MEASURE1_SYS.sf), 1) AS 每尺蓝皮成本, RT_RETAN_RECORD.SOURCE AS 皮源 " & " FROM RT_PU_MEASURE1_SYS LEFT OUTER JOIN " & " RT_RETAN_RECORD ON RIGHT(RT_PU_MEASURE1_SYS.card, 10) = RIGHT(RT_RETAN_RECORD.CARD, 10) " & " LEFT OUTER JOIN " & " RT_RETAN_RECORD_D ON RIGHT(RT_PU_MEASURE1_SYS.card, 10) = RIGHT(RT_RETAN_RECORD_D.CARD, 10) " & " WHERE (year(RT_PU_MEASURE1_SYS.date) = 2020) " & " GROUP BY RT_PU_MEASURE1_SYS.card, RT_RETAN_RECORD_D.CLASS, RT_RETAN_RECORD_D.TYPE, " & " RT_RETAN_RECORD.TECH, RT_RETAN_RECORD.WB_WEIGHT, RT_RETAN_RECORD.PRICE, " & " RT_RETAN_RECORD.SOURCE, RT_RETAN_RECORD.COLOR, RT_RETAN_RECORD.CUST, " & " ROUND(RT_RETAN_RECORD.PRICE / RT_RETAN_RECORD.WB_WEIGHT, 1),rt_retan_record.thickness " & " ORDER BY 卡号 " cmd.CommandText = sql da.SelectCommand = cmd da.Fill(dt) dt.Columns.Add("基础") dt.Columns.Add("染料") dt.Columns.Add("油脂") dt.Columns.Add("其他") dt.Columns.Add("合计") For x As Integer = 0 To dt.Rows.Count - 1 Dim dt1 As New DataTable sql = "SELECT class2 AS 类别, CAST(SUM(percents) * 100 AS numeric(10, 1)) AS 比例, CAST(SUM(price) / AVG(wb_weight) " & " AS numeric(10, 2)) AS 单位成本 " & " FROM (SELECT NO, CARD, P, AVG(ORDER_A) AS wb_weight, SUM(WEIGHT * price) AS price, SUM(WEIGHT) " & " / AVG(ORDER_A) AS percents, " & " CASE WHEN class1 LIKE N'%油脂%' THEN '油脂' WHEN (class1 = N'染料' OR " & " class1 LIKE N'%钛%') " & " THEN '染料' WHEN class1 = N'基础化工' THEN N'基础' ELSE '其他' END AS class2 " & " FROM (SELECT RT_SYS_CHEM_OUT.DATE, RT_SYS_CHEM_OUT.CHECKED, RT_SYS_CHEM_OUT.DEP, " & " RT_SYS_CHEM_OUT.NO, RT_SYS_CHEM_OUT.WH, RT_SYS_CHEM_OUT.CODE, " & " RT_SYS_CHEM_OUT.NAME, RT_SYS_CHEM_OUT.TYPE, RT_SYS_CHEM_OUT.UNIT, " & " RT_SYS_CHEM_OUT.LOT, RT_SYS_CHEM_OUT.WEIGHT, RT_SYS_CHEM_OUT.WEIGHT1, " & " RT_SYS_CHEM_OUT.P, RT_SYS_CHEM_OUT.CARD, RT_SYS_CHEM_OUT.DRUM, " & " RT_SYS_CHEM_OUT.ORDER_A, RT_SYS_CHEM_OUT.ID, CASE WHEN new_price Is NULL THEN CAST(RT_SYS_CHEM_MAIN.price AS numeric(10, 2)) ELSE CAST(new_price AS numeric(10, 2)) END AS price, " & " RT_SYS_CHEM_MAIN.CLASS1 " & " FROM RT_SYS_CHEM_OUT LEFT OUTER JOIN " & " RT_SYS_CHEM_MAIN ON " & " RT_SYS_CHEM_OUT.NAME = RT_SYS_CHEM_MAIN.name " & " WHERE (RIGHT(RT_SYS_CHEM_OUT.CARD,10) = '" & Microsoft.VisualBasic.Right(dt.Rows(x).Item("卡号"), 10) & "')) " & " AS derivedtbl_1 GROUP BY NO, CARD, P, CLASS1) AS derivedtbl_2 " & " GROUP BY CARD, P, class2 " & " ORDER BY 类别 DESC " cmd.CommandText = sql da.SelectCommand = cmd da.Fill(dt1) For y As Integer = 0 To dt1.Rows.Count - 1 Select Case dt1.Rows(y).Item("类别") Case "基础" dt.Rows(x).Item("基础") = Math.Round(dt1.Rows(y).Item("单位成本") / dt.Rows(x).Item("得革率"), 2) Case "染料" dt.Rows(x).Item("染料") = Math.Round(dt1.Rows(y).Item("单位成本") / dt.Rows(x).Item("得革率"), 2) Case "油脂" dt.Rows(x).Item("油脂") = Math.Round(dt1.Rows(y).Item("单位成本") / dt.Rows(x).Item("得革率"), 2) Case "其他" dt.Rows(x).Item("其他") = Math.Round(dt1.Rows(y).Item("单位成本") / dt.Rows(x).Item("得革率"), 2) End Select Next If IsDBNull(dt.Rows(x).Item("基础")) Then dt.Rows(x).Item("基础") = 0 End If If IsDBNull(dt.Rows(x).Item("染料")) Then dt.Rows(x).Item("染料") = 0 End If If IsDBNull(dt.Rows(x).Item("油脂")) Then dt.Rows(x).Item("油脂") = 0 End If If IsDBNull(dt.Rows(x).Item("其他")) Then dt.Rows(x).Item("其他") = 0 End If dt.Rows(x).Item("合计") = Val(dt.Rows(x).Item("基础").ToString) + Val(dt.Rows(x).Item("油脂").ToString) + Val(dt.Rows(x).Item("染料").ToString) + Val(dt.Rows(x).Item("其他").ToString) Next x dgv1.DataSource = dt dgv1.Columns(0).Width = 150 dgv1.Columns(1).Width = 60 dgv1.Columns(2).Width = 60 dgv1.Columns(3).Width = 60 dgv1.Columns(9).Width = 80 dgv1.Columns(4).Width = 80 dgv1.Columns(5).Width = 80 dgv1.Columns(6).Width = 80 dgv1.Columns(7).Width = 80 dgv1.Columns(8).Width = 80 dgv1.Columns(10).Width = 200 sql = "SELECT card1 as 新卡号, SUM(sf) AS 尺数 FROM RT_PU_MEASURE1_SYS GROUP BY card1 ORDER BY card1 DESC" Dim dt2 As New DataTable cmd.CommandText = sql da.SelectCommand = cmd da.Fill(dt2) dgv3.DataSource = dt2 End Sub Private Sub dgv1_CellMouseUp(sender As Object, e As DataGridViewCellMouseEventArgs) Handles dgv1.CellMouseUp Dim dt As New DataTable sql = "SELECT date as 日期,sf as 尺数, card1 as 新卡号, no as [k3单号] FROM RT_PU_MEASURE1_SYS where right(card,10)= '" & Microsoft.VisualBasic.Right(dgv1.Rows(dgv1.CurrentCell.RowIndex).Cells("卡号").Value, 10) & "'" cmd.CommandText = sql da.SelectCommand = cmd da.Fill(dt) dgv2.DataSource = dt dgv2.Columns(3).Width = 120 End Sub Private Sub dgv4_CellMouseUp(sender As Object, e As DataGridViewCellMouseEventArgs) Handles dgv4.CellMouseUp End Sub Private Sub dgv3_CellMouseUp(sender As Object, e As DataGridViewCellMouseEventArgs) Handles dgv3.CellMouseUp Dim dt As New DataTable sql = "SELECT RT_PU_MEASURE1_SYS.date AS 日期, RT_PU_MEASURE1_SYS.sf AS 尺数, RT_PU_MEASURE1_SYS.card AS 卡号,RT_PU_MEASURE1_SYS.no AS k3单号, RT_RETAN_RECORD.SOURCE as 皮源, RT_RETAN_RECORD.TECH as 技术员,RT_RETAN_RECORD.THICKNESS as 厚度 FROM RT_PU_MEASURE1_SYS LEFT OUTER JOIN RT_RETAN_RECORD ON RT_PU_MEASURE1_SYS.card = RT_RETAN_RECORD.CARD where card1= '" & Microsoft.VisualBasic.Right(dgv3.Rows(dgv3.CurrentCell.RowIndex).Cells("新卡号").Value, 10) & "'" cmd.CommandText = sql da.SelectCommand = cmd da.Fill(dt) dgv4.DataSource = dt dgv4.Columns(1).Width = 80 dgv4.Columns(2).Width = 150 dgv4.Columns(3).Width = 120 End Sub End Class