• 动态DataTableVb.Net


    Partial Public Class SupplierSalesStatsControl
        Inherits System.Web.UI.UserControl

        Private m_Item As Order
        Private m_ItemUser As User
        Private m_season As Season
        Private m_ItemCustomer As Customer
        Private m_ItemDelivery As Delivery
        Private m_isHeadOfficeUser As Boolean = False
        Private m_userOfficeID As Integer
        Private m_UserID As Integer
        Private m_UserCategory As User.UserCategories
        Private m_SeasonSummary As SeasonSummary
        Private m_TotalPieces As Integer = 0I
        Private m_hashTableLotsMargin As Hashtable
        Private m_hashSupplierCustomer As Hashtable
        Private m_hashCustomerOrder As Hashtable
        Private m_arrAllDataGrids As New ArrayList
        Private m_penaltySupplier As Decimal = 0D
        Private m_claimSupplier As Decimal = 0D

        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Me.m_UserID = CType(Context.User.Identity.Name, Integer)
            Me.m_isHeadOfficeUser = Garzone.User.isHeadOfficeUser(Me.m_UserID)
            Me.m_userOfficeID = Garzone.User.getOfficeID(Me.m_UserID)


            If Me.m_ItemUser Is Nothing Then
                Me.m_ItemUser = New User(True)
            End If

            If Me.dropSeason.Items.Count = 0 Then
                Me.m_season = New Season
                Me.dropSeason.DataSource = Me.m_season.DataSetSeason.Seasons
                Me.dropSeason.DataTextField = "Name"
                Me.dropSeason.DataValueField = "SeasonID"
                Me.dropSeason.DataBind()
                Season.selectCurrentSeason(Me.dropSeason, Me.m_season.DataSetSeason.Seasons)
                BindData()
            End If
        End Sub


        Private Sub BindData()
            If Not Me.dropSeason.SelectedItem Is Nothing Then
                Try
                    Dim _vwOrderRow As OrderDataSet.vw_OrderViewRow
                    Dim _oneLotRow As OrderDataSet.OrderLotRow
                    Dim _marginCalculator As Garzone.SaleCalculation
                    Dim _hashSuppliers As New Hashtable
                    Me.m_hashSupplierCustomer = New Hashtable
                    Me.m_hashCustomerOrder = New Hashtable
                    Dim _tableSuppliers As DataTable
                    Dim _hastable As Hashtable

                    Dim _BuyingPrice As Decimal = 0D
                    Dim _SellingPrice As Decimal = 0D
                    Dim _ExchangeRatePurchase As Decimal = 1
                    Dim _ExchangeRateSelling As Decimal = 1

                    Me.m_Item = New Order
                    Me.m_Item.fillBySeasonID(CType(Me.dropSeason.SelectedItem.Value, Integer))

                    Me.m_ItemCustomer = New Customer(True)
                    Me.m_ItemCustomer.FillAll()


                    Me.m_ItemDelivery = New Delivery
                    Me.m_ItemDelivery.fillBySeasonID(CType(Me.dropSeason.SelectedItem.Value, Integer))

                    'initalize the season summary for all season
                    m_SeasonSummary = New SeasonSummary
                    m_SeasonSummary.m_Item = Me.m_Item
                    m_SeasonSummary.m_ItemDelivery = Me.m_ItemDelivery
                    m_SeasonSummary.m_OfficeID = Me.m_userOfficeID
                    Me.m_SeasonSummary.isHeaderOfficeUser = Me.m_isHeadOfficeUser
                    m_SeasonSummary.CreateSummary()


                    Me.m_hashTableLotsMargin = New Hashtable
                    For Each _vwOrderRow In Me.m_Item.DatasetOrder.vw_OrderView
                        Select Case CType(_vwOrderRow.InternalValidationStatusID, Order.InternalValidationStatus)
                            Case Order.InternalValidationStatus.Authorized, Order.InternalValidationStatus.Completed, Order.InternalValidationStatus.Inproduction, Order.InternalValidationStatus.ProductionDocumentsReceived
                                If _hashSuppliers.ContainsKey(_vwOrderRow.SupplierID) = False Then
                                    _hashSuppliers.Add(_vwOrderRow.SupplierID, New ArrayList)
                                End If
                                If Me.m_hashCustomerOrder.ContainsKey(_vwOrderRow.CustomerID) = False Then
                                    Me.m_hashCustomerOrder.Add(_vwOrderRow.CustomerID, New ArrayList)
                                End If
                                If Me.m_hashSupplierCustomer.ContainsKey(_vwOrderRow.SupplierID) = False Then
                                    Me.m_hashSupplierCustomer.Add(_vwOrderRow.SupplierID, New ArrayList)
                                End If

                                For Each _oneLotRow In Me.m_Item.DatasetOrder.Orders.FindByOrderID(_vwOrderRow.OrderID).GetOrderLotRows

                                    _marginCalculator = New Garzone.SaleCalculation

                                    If _oneLotRow.IsFinanceTotalDaysNull = False Then
                                        'Apply finance information to the calculator
                                        _marginCalculator.InterestPeriod = _oneLotRow.FinanceTotalDays
                                        _marginCalculator.InterestRate = _oneLotRow.FinanceInterestRate
                                    End If

                                    If Not _oneLotRow.IsBuyingPriceNull Then
                                        If Not _oneLotRow.IsExchangeRatePurchaseNull Then
                                            _ExchangeRatePurchase = _oneLotRow.ExchangeRatePurchase
                                        End If
                                        _BuyingPrice = _oneLotRow.BuyingPrice * _ExchangeRatePurchase
                                    End If
                                    If Not _oneLotRow.IsSellingPriceNull Then
                                        If Not _oneLotRow.IsExchangeRateSellingNull Then
                                            _ExchangeRateSelling = _oneLotRow.ExchangeRateSelling
                                        End If
                                        _SellingPrice = _oneLotRow.SellingPrice * _ExchangeRateSelling
                                    End If

                                    'Check DataValid
                                    _hastable = New Hashtable()
                                    _hastable = _marginCalculator.CheckIsNullValid(_vwOrderRow)
                                    _marginCalculator.CalculateMargin(CType(_hastable("Sale_BC"), Decimal), CType(_hastable("Sale_SC"), Decimal), CType(_hastable("Sale_SCB"), Decimal), CType(_hastable("Sale_WMC"), Decimal), CType(_hastable("Sale_SVAT"), Decimal), CType(_hastable("Sale_IP"), Decimal), CType(_hastable("Sale_LCB"), Decimal), CType(_hastable("Sale_ICB"), Decimal), CType(_hastable("Sale_OC"), Decimal), CType(_hastable("Purchase_FC"), Decimal), CType(_hastable("Purchase_LCM"), Decimal), CType(_hastable("Purchase_AC"), Decimal), CType(_hastable("Purchase_ICM"), Decimal), CType(_hastable("Purchase_BVAT"), Decimal), CType(_hastable("Purchase_ICP"), Decimal), CType(_hastable("Purchase_ICA"), Decimal), CType(_hastable("Purchase_OCP"), Decimal), CType(_hastable("Purchase_OCA"), Decimal), _BuyingPrice, _SellingPrice, _vwOrderRow.OrderSalesCategory)

                                    
                                    Me.m_hashTableLotsMargin.Add(_oneLotRow.OrderLotID, _marginCalculator)
                                Next

                                'Add the lot information to the hash table
                                CType(_hashSuppliers.Item(_vwOrderRow.SupplierID), ArrayList).Add(_vwOrderRow.OrderID)
                                CType(Me.m_hashCustomerOrder.Item(_vwOrderRow.CustomerID), ArrayList).Add(_vwOrderRow.OrderID)
                                If CType(Me.m_hashSupplierCustomer.Item(_vwOrderRow.SupplierID), ArrayList).Contains(_vwOrderRow.CustomerID) = False Then
                                    CType(Me.m_hashSupplierCustomer.Item(_vwOrderRow.SupplierID), ArrayList).Add(_vwOrderRow.CustomerID)
                                End If

                        End Select


                        'End If
                    Next
                    'Bind Suppier
                    _tableSuppliers = Me.TransmitHashSupplierTable(_hashSuppliers)

                    Dim _row As DataRow = _tableSuppliers.NewRow

                    _row.Item("SupplierID") = -1
                    _row.Item("SupplierName") = "Summary"
                    _row.Item("TotalPieces") = Me.m_TotalPieces
                    _row.Item("Orders") = Me.m_SeasonSummary.TotalOrders
                    _row.Item("PurchaseAmount") = -Me.m_SeasonSummary.TotalSalesBuy
                    _row.Item("PurchasePercentage") = 1
                    _row.Item("Claims") = -Me.m_claimSupplier
                    _row.Item("Penalty") = Me.m_penaltySupplier
                    _row.Item("InspectionFail") = Me.m_SeasonSummary.TotalInspectionFailed.ToString & "/" & Me.m_SeasonSummary.TotalInspection.ToString
                    If Me.m_SeasonSummary.TotalInspection <> 0 Then
                        _row.Item("FailedP") = Me.m_SeasonSummary.TotalInspectionFailed / Me.m_SeasonSummary.TotalInspection
                    Else
                        _row.Item("FailedP") = 0
                    End If
                    _row.Item("Delivery") = Me.m_SeasonSummary.AverageDelivery
                    _row.Item("LowMargin") = Me.m_SeasonSummary.LowMargin
                    _row.Item("AvgMargin") = Me.m_SeasonSummary.AvgMargin
                    _row.Item("HighMargin") = Me.m_SeasonSummary.HighMargin
                    _row.Item("SubTotal") = Me.m_SeasonSummary.SubTotal - Me.m_SeasonSummary.TotalClaim + Me.m_SeasonSummary.TotalPenalty
                    _row.Item("SubTotalOrdered") = Me.m_SeasonSummary.SubTotalOrdered - Me.m_SeasonSummary.TotalClaim + Me.m_SeasonSummary.TotalPenalty

                    If Me.m_SeasonSummary.SubTotalOrdered - Me.m_SeasonSummary.TotalClaim + Me.m_SeasonSummary.TotalPenalty = 0 Then
                        _row.Item("SubTotalCompare") = 0
                    Else
                        _row.Item("SubTotalCompare") = (Me.m_SeasonSummary.SubTotal - Me.m_SeasonSummary.TotalClaim + Me.m_SeasonSummary.TotalPenalty) / (Me.m_SeasonSummary.SubTotalOrdered - Me.m_SeasonSummary.TotalClaim + Me.m_SeasonSummary.TotalPenalty)
                    End If
                    'If no order detect don't add this summary
                    If m_SeasonSummary.TotalOrders <> 0 Then
                        _tableSuppliers.Rows.Add(_row)
                    End If
                    _tableSuppliers.DefaultView.Sort = "PurchaseAmount DESC"
                    Me.gvSupplier.DataSource = _tableSuppliers.DefaultView
                    Me.gvSupplier.DataBind()
                    Me.gvSupplier.Visible = Me.gvSupplier.Rows.Count > 0
                Catch ex As Exception
                    Garzone.ExceptionManager.HandleException(ex, "Error on supplier sales season stats for " & Garzone.User.getOfficeName(Me.dropSeason.SelectedItem.Value))
                    Me.gvSupplier.Visible = False
                End Try

            End If
        End Sub

        Private Function GenerateCustomerSalesBySupplierID(ByVal _supplierID As Integer) As DataTable
            Dim _dataTable As New DataTable
            Dim _row As DataRow
            Dim _customerID As Integer
            Dim _vwOrderRow As OrderDataSet.vw_OrderViewRow
            Dim _vwOrderRows As OrderDataSet.vw_OrderViewRow()
            Dim _customerRow As CustomerDataSet.CustomersRow
            Dim _oneLotRow As OrderDataSet.OrderLotRow
            Dim _oneOrderClaimRow As OrderDataSet.OrderClaimRow
            Dim _oneInternalInspection As OrderDataSet.OrdersInternalInspectionsRow

            Dim _vwDeliveryRow As DeliveryDataSet.vw_DeliveryShipmentViewRow
            Dim _oneOrderInspectionRow As OrderDataSet.OrdersInspectionsRow
            Dim _rowOrderLotShipment As DeliveryDataSet.OrderLotShipmentRow
            Dim _rowsOrderLotShipment As DeliveryDataSet.OrderLotShipmentRow()


            Dim _numOfOrders As New ArrayList
            Dim _total As Decimal = 0D
            Dim _subTotal As Decimal
            Dim _subTotalOrdered As Decimal = 0D
            Dim _totalPcs As Integer
            Dim _totalNet As Decimal = 0D
            Dim _totalBuy As Decimal = 0D
            Dim _totalClaims As Decimal = 0D
            Dim _claimSupplier As Decimal = 0D
            Dim _totalPenalty As Decimal = 0D
            Dim _penaltySupplier As Decimal = 0D
            Dim _totalInspection As Integer = 0I
            Dim _totalInspectionFailed As Integer = 0I
            Dim _InspectionFailedPercentage As Decimal
            Dim _totalDelivery As Integer = 0I
            Dim _averageDelivery As Decimal = 0D
            Dim _deliveryContainer As ArrayList
            Dim _lowMargin As Decimal = 0D
            Dim _currentMargin As Decimal = 0D
            Dim _avgMargin As Decimal = 0D
            Dim _highMargin As Decimal = 0D

            Dim _marginCalculator As Garzone.SaleCalculation

            _dataTable.Columns.Add(New DataColumn("CustomerName", GetType(String)))
            _dataTable.Columns.Add(New DataColumn("Orders", GetType(Integer)))
            _dataTable.Columns.Add(New DataColumn("TotalPieces", GetType(Integer)))
            _dataTable.Columns.Add(New DataColumn("PurchaseAmount", GetType(Decimal)))
            _dataTable.Columns.Add(New DataColumn("PurchasePercentage", GetType(Decimal)))
            _dataTable.Columns.Add(New DataColumn("Claims", GetType(Decimal)))
            _dataTable.Columns.Add(New DataColumn("Penalty", GetType(Decimal)))
            _dataTable.Columns.Add(New DataColumn("InspectionFail", GetType(String)))
            _dataTable.Columns.Add(New DataColumn("FailedP", GetType(Decimal)))
            _dataTable.Columns.Add(New DataColumn("Delivery", GetType(Integer)))
            _dataTable.Columns.Add(New DataColumn("LowMargin", GetType(Decimal)))
            _dataTable.Columns.Add(New DataColumn("AvgMargin", GetType(Decimal)))
            _dataTable.Columns.Add(New DataColumn("HighMargin", GetType(Decimal)))
            _dataTable.Columns.Add(New DataColumn("SubTotal", GetType(Decimal)))
            _dataTable.Columns.Add(New DataColumn("SubTotalOrdered", GetType(Decimal)))
            _dataTable.Columns.Add(New DataColumn("SubTotalCompare", GetType(Decimal)))

            For Each _customerID In Me.m_hashSupplierCustomer.Item(_supplierID)
                _total = 0
                _subTotal = 0D
                _subTotalOrdered = 0D
                _totalNet = 0
                _totalBuy = 0
                _totalClaims = 0
                _claimSupplier = 0D
                _totalPenalty = 0
                _penaltySupplier = 0D
                _totalPcs = 0
                _totalInspection = 0I
                _totalInspectionFailed = 0I
                _InspectionFailedPercentage = 0D
                _totalDelivery = 0I
                _averageDelivery = 0D
                _deliveryContainer = New ArrayList
                _lowMargin = 0D
                _currentMargin = 0D
                _avgMargin = 0D
                _highMargin = 0D
                _numOfOrders = New ArrayList

                Dim counter As Integer = 0
                Dim _arrMarginContainer As New ArrayList
                Dim _totalMargin As Decimal = 0D
                _customerRow = Me.m_ItemCustomer.DatasetCustomer.Customers.FindByCustomerID(_customerID)

                _vwOrderRows = Me.m_Item.DatasetOrder.vw_OrderView.Select("SupplierID=" & _supplierID.ToString & " and CustomerID=" & _customerID.ToString)
                For Each _vwOrderRow In _vwOrderRows
                    '  If Me.m_isHeadOfficeUser = True Or Me.m_userOfficeID = _vwOrderRow.BranchOfficeID Then
                    Select Case CType(_vwOrderRow.InternalValidationStatusID, Order.InternalValidationStatus)
                        Case Order.InternalValidationStatus.Authorized, Order.InternalValidationStatus.Completed, Order.InternalValidationStatus.Inproduction, Order.InternalValidationStatus.ProductionDocumentsReceived
                            For Each _oneLotRow In Me.m_Item.DatasetOrder.Orders.FindByOrderID(_vwOrderRow.OrderID).GetOrderLotRows
                                If _numOfOrders.Contains(_oneLotRow.OrderID) = False Then
                                    _numOfOrders.Add(_oneLotRow.OrderID)
                                End If

                                'Get the calculator already created
                                _marginCalculator = Me.m_hashTableLotsMargin.Item(_oneLotRow.OrderLotID)
                                _rowsOrderLotShipment = Me.m_ItemDelivery.DatasetDelivery.OrderLotShipment.Select("OrderLotID=" & _oneLotRow.OrderLotID.ToString)

                                If _oneLotRow.IsBuyingPriceNull = False Then
                                    For Each _rowOrderLotShipment In _rowsOrderLotShipment
                                        _totalBuy += (_oneLotRow.BuyingPrice * _oneLotRow.ExchangeRatePurchase * _rowOrderLotShipment.QuantityShipped)
                                    Next
                                End If

                                If _oneLotRow.IsSellingPriceNull = False Then
                                    _subTotalOrdered += (_marginCalculator.Margin * _oneLotRow.QuantityOrdered * _oneLotRow.ExchangeRateSelling * _oneLotRow.SellingPrice)

                                    For Each _rowOrderLotShipment In _rowsOrderLotShipment
                                        _total += (_rowOrderLotShipment.QuantityShipped * _oneLotRow.SellingPrice * _oneLotRow.ExchangeRateSelling)
                                        _totalNet += (_marginCalculator.GrossSalePrice * _rowOrderLotShipment.QuantityShipped)
                                        _subTotal += (_oneLotRow.SellingPrice * _oneLotRow.ExchangeRateSelling * _rowOrderLotShipment.QuantityShipped * _marginCalculator.Margin)
                                    Next

                                End If
                                For Each _rowOrderLotShipment In _rowsOrderLotShipment
                                    _totalPcs += _rowOrderLotShipment.QuantityShipped
                                Next

                                'Current margin
                                If _oneLotRow.SellingPrice <> 0 Then
                                    _currentMargin = _marginCalculator.Margin
                                Else
                                    _currentMargin = 0D
                                End If

                                _arrMarginContainer.Add(_currentMargin)

                                'Margin Low and high
                                If counter = 0 Then
                                    _lowMargin = _currentMargin
                                    _highMargin = _currentMargin
                                End If
                                _lowMargin = SeasonSummary.PopUpDecimal(_currentMargin, _lowMargin, False)
                                _highMargin = SeasonSummary.PopUpDecimal(_currentMargin, _highMargin, True)

                                'Claims calculation
                                For Each _oneOrderClaimRow In _oneLotRow.GetOrderClaimRows
                                    _totalClaims += (_oneOrderClaimRow.ClaimTotalAmount - _oneOrderClaimRow.VenderAmount)
                                    _claimSupplier += _oneOrderClaimRow.VenderAmount

                                Next

                                'Penalty calculation
                                For Each _rowOrderLotShipment In _rowsOrderLotShipment
                                    If _rowOrderLotShipment.IsMakerPenaltyValueNull = False Then
                                        _totalPenalty += ((_rowOrderLotShipment.MakerPenaltyValue / 100) * _oneLotRow.BuyingPrice * _oneLotRow.ExchangeRatePurchase * _rowOrderLotShipment.QuantityShipped)
                                        _penaltySupplier += ((_rowOrderLotShipment.MakerPenaltyValue / 100) * _oneLotRow.BuyingPrice * _oneLotRow.ExchangeRatePurchase * _rowOrderLotShipment.QuantityShipped)
                                    End If
                                    If _rowOrderLotShipment.IsCustomerPenaltyValueNull = False Then
                                        _totalPenalty -= ((_rowOrderLotShipment.CustomerPenaltyValue / 100) * _oneLotRow.SellingPrice * _oneLotRow.ExchangeRateSelling * _rowOrderLotShipment.QuantityShipped)
                                    End If
                                Next

                                'Inspection
                                'Internal Inspection calculation
                                For Each _oneInternalInspection In _oneLotRow.GetOrdersInternalInspectionsRows
                                    If _oneInternalInspection.IsInspectionResultIDNull = False Then
                                        Select Case CType(_oneInternalInspection.InspectionResultID, Inspection.InspectionsResults)
                                            Case Inspection.InspectionsResults.Failed
                                                _totalInspectionFailed += 1
                                        End Select
                                    End If
                                Next

                                _totalInspection += _oneLotRow.GetOrdersInternalInspectionsRows.Length

                                'Third party inspections calculation
                                For Each _oneOrderInspectionRow In _oneLotRow.GetOrdersInspectionsRows
                                    If _oneOrderInspectionRow.IsResultIDNull = False Then
                                        Select Case CType(_oneOrderInspectionRow.ResultID, Inspection.InspectionsResults)
                                            Case Inspection.InspectionsResults.Failed
                                                _totalInspectionFailed += 1
                                        End Select
                                    End If

                                Next
                                _totalInspection += _oneLotRow.GetOrdersInspectionsRows.Length

                                'Increase the counter
                                counter += 1
                            Next

                            'Calculate Delivery
                            For Each _vwDeliveryRow In Me.m_ItemDelivery.DatasetDelivery.vw_DeliveryShipmentView.Select("OrderID=" & _vwOrderRow.OrderID.ToString)
                                If Not _vwDeliveryRow.IsDeliveryNull Then
                                    _deliveryContainer.Add(_vwDeliveryRow.Delivery)
                                End If

                            Next
                    End Select
                    'End If

                Next

                If _total <> 0 Then
                    _avgMargin = (_totalNet - _totalBuy) / _total
                Else
                    _avgMargin = 0D
                End If

                'Inspection failed
                If _totalInspection <> 0 Then
                    _InspectionFailedPercentage = _totalInspectionFailed / _totalInspection
                Else
                    _InspectionFailedPercentage = 0
                End If

                'Delivery
                For Each _oneDelivery As Integer In _deliveryContainer
                    _totalDelivery += _oneDelivery
                Next
                If _deliveryContainer.Count = 0 Then
                    _averageDelivery = 0D
                Else
                    _averageDelivery = _totalDelivery / _deliveryContainer.Count
                End If

                'Create one row for current customer
                _row = _dataTable.NewRow

                _row.Item("CustomerName") = _customerRow.Name
                _row.Item("Orders") = _numOfOrders.Count
                _row.Item("TotalPieces") = _totalPcs
                _row.Item("PurchaseAmount") = -_totalBuy
                If Me.m_SeasonSummary.TotalSalesBuy <> 0 Then
                    _row.Item("PurchasePercentage") = (_totalBuy / Me.m_SeasonSummary.TotalSalesBuy)
                Else
                    _row.Item("PurchasePercentage") = 0
                End If

                _row.Item("Claims") = -_claimSupplier
                _row.Item("Penalty") = _penaltySupplier
                _row.Item("InspectionFail") = _totalInspectionFailed.ToString & "/" & _totalInspection.ToString
                _row.Item("FailedP") = _InspectionFailedPercentage
                _row.Item("Delivery") = _averageDelivery
                _row.Item("LowMargin") = _lowMargin
                _row.Item("AvgMargin") = _avgMargin
                _row.Item("HighMargin") = _highMargin
                _row.Item("SubTotal") = _subTotal - _totalClaims + _totalPenalty
                _row.Item("SubTotalOrdered") = _subTotalOrdered - _totalClaims + _totalPenalty
                If _subTotalOrdered - _totalClaims + _totalPenalty = 0 Then
                    _row.Item("SubTotalCompare") = 0
                Else
                    _row.Item("SubTotalCompare") = (_subTotal - _totalClaims + _totalPenalty) / (_subTotalOrdered - _totalClaims + _totalPenalty)
                End If

                If _numOfOrders.Count > 0 Then
                    _dataTable.Rows.Add(_row)
                End If
            Next

            Return _dataTable

        End Function

        Private Function TransmitHashSupplierTable(ByVal _hashTable As Hashtable) As DataTable
            Dim _dataTable As New DataTable

            Dim _item As DictionaryEntry
            Dim _row As DataRow
            Dim _supplierRow As OrderDataSet.SuppliersRow
            Dim _oneLotRow As OrderDataSet.OrderLotRow
            Dim _oneOrderClaimRow As OrderDataSet.OrderClaimRow
            Dim _oneInternalInspection As OrderDataSet.OrdersInternalInspectionsRow

            Dim _vwDeliveryRow As DeliveryDataSet.vw_DeliveryShipmentViewRow
            Dim _oneOrderInspectionRow As OrderDataSet.OrdersInspectionsRow
            Dim _rowOrderLotShipment As DeliveryDataSet.OrderLotShipmentRow
            Dim _rowsOrderLotShipment As DeliveryDataSet.OrderLotShipmentRow()


            Dim _numOfOrders As New ArrayList
            Dim _total As Decimal = 0D
            Dim _subTotal As Decimal = 0D
            Dim _subTotalOrdered As Decimal = 0D
            Dim _totalPieces As Integer = 0I
            Dim _totalNet As Decimal = 0D
            Dim _totalBuy As Decimal = 0D
            Dim _totalClaims As Decimal = 0D
            Dim _claimSupplier As Decimal = 0D
            Dim _totalPenalty As Decimal = 0D
            Dim _penaltySupplier As Decimal = 0D
            Dim _totalInspection As Integer = 0I
            Dim _totalInspectionFailed As Integer = 0I
            Dim _InspectionFailedPercentage As Decimal
            Dim _totalDelivery As Integer = 0I
            Dim _averageDelivery As Decimal = 0D
            Dim _deliveryContainer As ArrayList
            Dim _lowMargin As Decimal = 0D
            Dim _currentMargin As Decimal = 0D
            Dim _avgMargin As Decimal = 0D
            Dim _highMargin As Decimal = 0D



            Dim _marginCalculator As Garzone.SaleCalculation

            _dataTable.Columns.Add(New DataColumn("SupplierID", GetType(Integer)))
            _dataTable.Columns.Add(New DataColumn("SupplierName", GetType(String)))
            _dataTable.Columns.Add(New DataColumn("Orders", GetType(Integer)))
            _dataTable.Columns.Add(New DataColumn("TotalPieces", GetType(Integer)))
            _dataTable.Columns.Add(New DataColumn("PurchaseAmount", GetType(Decimal)))
            _dataTable.Columns.Add(New DataColumn("PurchasePercentage", GetType(Decimal)))
            _dataTable.Columns.Add(New DataColumn("Claims", GetType(Decimal)))
            _dataTable.Columns.Add(New DataColumn("Penalty", GetType(Decimal)))
            _dataTable.Columns.Add(New DataColumn("InspectionFail", GetType(String)))
            _dataTable.Columns.Add(New DataColumn("FailedP", GetType(Decimal)))
            _dataTable.Columns.Add(New DataColumn("Delivery", GetType(Integer)))
            _dataTable.Columns.Add(New DataColumn("LowMargin", GetType(Decimal)))
            _dataTable.Columns.Add(New DataColumn("AvgMargin", GetType(Decimal)))
            _dataTable.Columns.Add(New DataColumn("HighMargin", GetType(Decimal)))
            _dataTable.Columns.Add(New DataColumn("SubTotal", GetType(Decimal)))
            _dataTable.Columns.Add(New DataColumn("SubTotalOrdered", GetType(Decimal)))
            _dataTable.Columns.Add(New DataColumn("SubTotalCompare", GetType(Decimal)))


            For Each _item In _hashTable
                _total = 0
                _totalPieces = 0
                _totalNet = 0
                _subTotal = 0D
                _subTotalOrdered = 0D
                _totalBuy = 0D
                _totalClaims = 0D
                _claimSupplier = 0D
                _totalPenalty = 0D
                _penaltySupplier = 0D
                _totalInspection = 0I
                _totalInspectionFailed = 0I
                _InspectionFailedPercentage = 0D
                _totalDelivery = 0I
                _averageDelivery = 0D
                _deliveryContainer = New ArrayList
                _lowMargin = 0D
                _currentMargin = 0D
                _avgMargin = 0D
                _highMargin = 0D
                _numOfOrders = New ArrayList

                Dim counter As Integer = 0
                Dim _arrMarginContainer As New ArrayList
                Dim _totalMargin As Decimal = 0D

                _supplierRow = Me.m_Item.DatasetOrder.Suppliers.FindBySupplierID(CType(_item.Key, Integer))

                For Each _oneOrderID As Integer In CType(_item.Value, ArrayList)
                    For Each _oneLotRow In Me.m_Item.DatasetOrder.Orders.FindByOrderID(_oneOrderID).GetOrderLotRows
                        If _numOfOrders.Contains(_oneLotRow.OrderID) = False Then
                            _numOfOrders.Add(_oneLotRow.OrderID)
                        End If

                        'Get the calculator already created
                        _marginCalculator = Me.m_hashTableLotsMargin.Item(_oneLotRow.OrderLotID)
                        _rowsOrderLotShipment = Me.m_ItemDelivery.DatasetDelivery.OrderLotShipment.Select("OrderLotID=" & _oneLotRow.OrderLotID.ToString)

                        If _oneLotRow.IsSellingPriceNull = False Then
                            _subTotalOrdered += _marginCalculator.Margin * _oneLotRow.QuantityOrdered * _oneLotRow.ExchangeRateSelling * _oneLotRow.SellingPrice

                            For Each _rowOrderLotShipment In _rowsOrderLotShipment
                                _total += (_oneLotRow.SellingPrice * _oneLotRow.ExchangeRateSelling * _rowOrderLotShipment.QuantityShipped)
                                _totalNet += (_marginCalculator.GrossSalePrice * _rowOrderLotShipment.QuantityShipped)
                                _subTotal += (_oneLotRow.SellingPrice * _oneLotRow.ExchangeRateSelling * _rowOrderLotShipment.QuantityShipped * _marginCalculator.Margin)
                            Next

                        End If

                        If _oneLotRow.IsBuyingPriceNull = False Then
                            For Each _rowOrderLotShipment In _rowsOrderLotShipment
                                _totalBuy += (_oneLotRow.BuyingPrice * _oneLotRow.ExchangeRatePurchase * _rowOrderLotShipment.QuantityShipped)
                            Next
                        End If

                        For Each _rowOrderLotShipment In _rowsOrderLotShipment
                            _totalPieces += _rowOrderLotShipment.QuantityShipped
                            Me.m_TotalPieces += _rowOrderLotShipment.QuantityShipped
                        Next

                        'Current margin
                        If _oneLotRow.SellingPrice <> 0 Then
                            _currentMargin = _marginCalculator.Margin
                        Else
                            _currentMargin = 0D
                        End If

                        _arrMarginContainer.Add(_currentMargin)

                        'Margin Low and high
                        If counter = 0 Then
                            _lowMargin = _currentMargin
                            _highMargin = _currentMargin
                        End If
                        _lowMargin = SeasonSummary.PopUpDecimal(_currentMargin, _lowMargin, False)
                        _highMargin = SeasonSummary.PopUpDecimal(_currentMargin, _highMargin, True)

                        'Claims calculation
                        For Each _oneOrderClaimRow In _oneLotRow.GetOrderClaimRows
                            _totalClaims += (_oneOrderClaimRow.ClaimTotalAmount - _oneOrderClaimRow.VenderAmount)
                            _claimSupplier += _oneOrderClaimRow.VenderAmount
                            Me.m_claimSupplier += _oneOrderClaimRow.VenderAmount
                        Next

                        'Internal Inspection calculation
                        For Each _oneInternalInspection In _oneLotRow.GetOrdersInternalInspectionsRows
                            If _oneInternalInspection.IsInspectionResultIDNull = False Then
                                Select Case CType(_oneInternalInspection.InspectionResultID, Inspection.InspectionsResults)
                                    Case Inspection.InspectionsResults.Failed
                                        _totalInspectionFailed += 1
                                End Select
                            End If
                        Next
                        _totalInspection += _oneLotRow.GetOrdersInternalInspectionsRows.Length

                        'Third party inspections calculation
                        For Each _oneOrderInspectionRow In _oneLotRow.GetOrdersInspectionsRows
                            If _oneOrderInspectionRow.IsResultIDNull = False Then
                                Select Case CType(_oneOrderInspectionRow.ResultID, Inspection.InspectionsResults)
                                    Case Inspection.InspectionsResults.Failed
                                        _totalInspectionFailed += 1
                                End Select
                            End If
                        Next
                        _totalInspection += _oneLotRow.GetOrdersInspectionsRows.Length

                        'Penalty calculation
                        For Each _rowOrderLotShipment In Me.m_ItemDelivery.DatasetDelivery.OrderLotShipment.Select("OrderLotID=" & _oneLotRow.OrderLotID.ToString)
                            If _rowOrderLotShipment.IsMakerPenaltyValueNull = False Then
                                _totalPenalty += ((_rowOrderLotShipment.MakerPenaltyValue / 100) * _oneLotRow.BuyingPrice * _oneLotRow.ExchangeRatePurchase * _rowOrderLotShipment.QuantityShipped)
                                _penaltySupplier += ((_rowOrderLotShipment.MakerPenaltyValue / 100) * _oneLotRow.BuyingPrice * _oneLotRow.ExchangeRatePurchase * _rowOrderLotShipment.QuantityShipped)
                                Me.m_penaltySupplier += ((_rowOrderLotShipment.MakerPenaltyValue / 100) * _oneLotRow.BuyingPrice * _oneLotRow.ExchangeRatePurchase * _rowOrderLotShipment.QuantityShipped)
                            End If
                            If _rowOrderLotShipment.IsCustomerPenaltyValueNull = False Then
                                _totalPenalty -= ((_rowOrderLotShipment.CustomerPenaltyValue / 100) * _oneLotRow.SellingPrice * _oneLotRow.ExchangeRateSelling * _rowOrderLotShipment.QuantityShipped)
                            End If
                        Next

                        'Calculate Delivery
                        For Each _vwDeliveryRow In Me.m_ItemDelivery.DatasetDelivery.vw_DeliveryShipmentView.Select("OrderLotID=" & _oneLotRow.OrderLotID.ToString)
                            If Not _vwDeliveryRow.IsDeliveryNull Then
                                _deliveryContainer.Add(_vwDeliveryRow.Delivery)
                            End If
                        Next

                        counter += 1

                    Next
                Next


                Me.m_SeasonSummary.TotalOrders += _numOfOrders.Count

                If _total <> 0 Then
                    _avgMargin = (_totalNet - _totalBuy) / _total
                Else
                    _avgMargin = 0D
                End If

                'Inspection failed
                If _totalInspection <> 0 Then
                    _InspectionFailedPercentage = _totalInspectionFailed / _totalInspection
                Else
                    _InspectionFailedPercentage = 0
                End If

                'Delivery
                For Each _oneDelivery As Integer In _deliveryContainer
                    _totalDelivery += _oneDelivery
                Next
                If _deliveryContainer.Count = 0 Then
                    _averageDelivery = 0D
                Else
                    _averageDelivery = _totalDelivery / _deliveryContainer.Count
                End If

                'Create one row for current customer
                _row = _dataTable.NewRow

                _row.Item("SupplierID") = _supplierRow.SupplierID
                _row.Item("SupplierName") = _supplierRow.Name
                _row.Item("TotalPieces") = _totalPieces
                _row.Item("Orders") = _numOfOrders.Count
                _row.Item("PurchaseAmount") = -_totalBuy
                If Me.m_SeasonSummary.TotalSalesBuy <> 0 Then
                    _row.Item("PurchasePercentage") = (_totalBuy / Me.m_SeasonSummary.TotalSalesBuy)
                Else
                    _row.Item("PurchasePercentage") = 0
                End If
                _row.Item("Claims") = -_claimSupplier
                _row.Item("Penalty") = _penaltySupplier
                _row.Item("InspectionFail") = _totalInspectionFailed.ToString & "/" & _totalInspection.ToString
                _row.Item("FailedP") = _InspectionFailedPercentage
                _row.Item("Delivery") = _averageDelivery
                _row.Item("LowMargin") = _lowMargin
                _row.Item("AvgMargin") = _avgMargin
                _row.Item("HighMargin") = _highMargin
                _row.Item("SubTotal") = _subTotal - _totalClaims + _totalPenalty
                _row.Item("SubTotalOrdered") = _subTotalOrdered - _totalClaims + _totalPenalty
                If _subTotalOrdered - _totalClaims + _totalPenalty = 0 Then
                    _row.Item("SubTotalCompare") = 0
                Else
                    _row.Item("SubTotalCompare") = (_subTotal - _totalClaims + _totalPenalty) / (_subTotalOrdered - _totalClaims + _totalPenalty)
                End If

                _dataTable.Rows.Add(_row)

            Next
            Return _dataTable
        End Function

        Private Sub cmdRefresh_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdRefresh.Click
            BindData()
        End Sub

        Public Sub ExportAll(ByVal sender As Object, ByVal e As System.Web.UI.ImageClickEventArgs)
            Dim _fileName As String
            _fileName = "Supplier sales stats by customer[" & Me.dropSeason.SelectedItem.Value & "]" & DateTime.Now.ToShortDateString & ".xls"

            'Binding data first
            BindData()
            SeasonSummary.exportExcelFile(Me.m_arrAllDataGrids, _fileName, Me.Response)

        End Sub

        Private Sub gvSupplier_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gvSupplier.RowDataBound
            If e.Row.RowType = DataControlRowType.DataRow Then
                Dim _dataTable As New DataTable
                Dim _row As DataRow
                Dim _dtgCustomers As DataGrid = e.Row.FindControl("dtgCustomers")
                Dim _supplierID As Integer = CType(e.Row.DataItem("SupplierID"), Integer)
                Dim _lblSupplierName As Label = CType(e.Row.FindControl("lblSupplierName"), Label)
                _lblSupplierName.Text = CType(e.Row.DataItem("SupplierName"), String)
                If _supplierID <> -1 Then
                    'Normal row
                    _dataTable = Me.GenerateCustomerSalesBySupplierID(_supplierID)
                    _dtgCustomers.Attributes.Add("Name", e.Row.DataItem("SupplierName"))
                    _row = _dataTable.NewRow

                    _row.Item("CustomerName") = "Total"
                    _row.Item("Orders") = CType(e.Row.DataItem("Orders"), Integer)
                    _row.Item("TotalPieces") = CType(e.Row.DataItem("TotalPieces"), Integer)
                    _row.Item("PurchaseAmount") = CType(e.Row.DataItem("PurchaseAmount"), Decimal)
                    _row.Item("PurchasePercentage") = CType(e.Row.DataItem("PurchasePercentage"), Decimal)
                    _row.Item("Claims") = CType(e.Row.DataItem("Claims"), Decimal)
                    _row.Item("Penalty") = CType(e.Row.DataItem("Penalty"), Decimal)
                    _row.Item("InspectionFail") = CType(e.Row.DataItem("InspectionFail"), String)
                    _row.Item("FailedP") = CType(e.Row.DataItem("FailedP"), Decimal)
                    _row.Item("Delivery") = CType(e.Row.DataItem("Delivery"), Integer)
                    _row.Item("LowMargin") = CType(e.Row.DataItem("LowMargin"), Decimal)
                    _row.Item("AvgMargin") = CType(e.Row.DataItem("AvgMargin"), Decimal)
                    _row.Item("HighMargin") = CType(e.Row.DataItem("HighMargin"), Decimal)
                    _row.Item("SubTotal") = CType(e.Row.DataItem("SubTotal"), Decimal)
                    _row.Item("SubTotalOrdered") = CType(e.Row.DataItem("SubTotalOrdered"), Decimal)
                    _row.Item("SubTotalCompare") = CType(e.Row.DataItem("SubTotalCompare"), Decimal)

                    _dataTable.Rows.Add(_row)

                    _dataTable.DefaultView.Sort = "PurchaseAmount DESC"
                    _dtgCustomers.DataSource = _dataTable.DefaultView
                    _dtgCustomers.DataBind()
                Else
                    'Summary row
                    If CType(e.Row.DataItem("Orders"), Integer) <> 0 Then
                        _dataTable.Columns.Add(New DataColumn("CustomerName", GetType(String)))
                        _dataTable.Columns.Add(New DataColumn("Orders", GetType(Integer)))
                        _dataTable.Columns.Add(New DataColumn("TotalPieces", GetType(Integer)))
                        _dataTable.Columns.Add(New DataColumn("PurchaseAmount", GetType(Decimal)))
                        _dataTable.Columns.Add(New DataColumn("PurchasePercentage", GetType(Decimal)))
                        _dataTable.Columns.Add(New DataColumn("Claims", GetType(Decimal)))
                        _dataTable.Columns.Add(New DataColumn("Penalty", GetType(Decimal)))
                        _dataTable.Columns.Add(New DataColumn("InspectionFail", GetType(String)))
                        _dataTable.Columns.Add(New DataColumn("FailedP", GetType(Decimal)))
                        _dataTable.Columns.Add(New DataColumn("Delivery", GetType(Integer)))
                        _dataTable.Columns.Add(New DataColumn("LowMargin", GetType(Decimal)))
                        _dataTable.Columns.Add(New DataColumn("AvgMargin", GetType(Decimal)))
                        _dataTable.Columns.Add(New DataColumn("HighMargin", GetType(Decimal)))
                        _dataTable.Columns.Add(New DataColumn("SubTotal", GetType(Decimal)))
                        _dataTable.Columns.Add(New DataColumn("SubTotalOrdered", GetType(Decimal)))
                        _dataTable.Columns.Add(New DataColumn("SubTotalCompare", GetType(Decimal)))

                        'Create one row for current customer
                        _row = _dataTable.NewRow

                        _row.Item("CustomerName") = "Total"
                        _row.Item("Orders") = CType(e.Row.DataItem("Orders"), Integer)
                        _row.Item("TotalPieces") = CType(e.Row.DataItem("TotalPieces"), Integer)
                        _row.Item("PurchaseAmount") = CType(e.Row.DataItem("PurchaseAmount"), Decimal)
                        _row.Item("PurchasePercentage") = CType(e.Row.DataItem("PurchasePercentage"), Decimal)
                        _row.Item("Claims") = CType(e.Row.DataItem("Claims"), Decimal)
                        _row.Item("Penalty") = CType(e.Row.DataItem("Penalty"), Decimal)
                        _row.Item("InspectionFail") = CType(e.Row.DataItem("InspectionFail"), String)
                        _row.Item("FailedP") = CType(e.Row.DataItem("FailedP"), Decimal)
                        _row.Item("Delivery") = CType(e.Row.DataItem("Delivery"), Integer)
                        _row.Item("LowMargin") = CType(e.Row.DataItem("LowMargin"), Decimal)
                        _row.Item("AvgMargin") = CType(e.Row.DataItem("AvgMargin"), Decimal)
                        _row.Item("HighMargin") = CType(e.Row.DataItem("HighMargin"), Decimal)
                        _row.Item("SubTotal") = CType(e.Row.DataItem("SubTotal"), Decimal)
                        _row.Item("SubTotalOrdered") = CType(e.Row.DataItem("SubTotalOrdered"), Decimal)
                        _row.Item("SubTotalCompare") = CType(e.Row.DataItem("SubTotalCompare"), Decimal)
                        _dataTable.Rows.Add(_row)

                        _dataTable.DefaultView.Sort = "PurchaseAmount DESC"
                        _dtgCustomers.DataSource = _dataTable.DefaultView
                        _dtgCustomers.Attributes.Add("Name", "Summary")
                        _dtgCustomers.DataBind()
                    End If

                End If
                'Add to arraylist to use in future
                Me.m_arrAllDataGrids.Add(_dtgCustomers)
            End If
        End Sub


    End Class

  • 相关阅读:
    Netsharp下微信菜单以及OAuth
    权限管理
    java面向对象基础(转)
    闲来无事做了一个批处理的win10账号管理
    bat获取系统时间修改系统密码
    bat常用命令
    bat修改密码
    vbs的一些入门基础。。。
    WCF 之 DataContract
    WCF 之 OperationContract
  • 原文地址:https://www.cnblogs.com/liujuncm5/p/1557624.html
Copyright © 2020-2023  润新知