Add code to do ship_date shifting. Workbook changes not finished yet.
This commit is contained in:
parent
22c2375f44
commit
9933e66c77
@ -18,12 +18,12 @@ Function makeHttpRequest(method As String, route As String, doc As String, ByRef
|
|||||||
|
|
||||||
' Inject the user's name and the current version of this file into the request body.
|
' Inject the user's name and the current version of this file into the request body.
|
||||||
Set json = JsonConverter.ParseJson(doc)
|
Set json = JsonConverter.ParseJson(doc)
|
||||||
json("version") = shConfig.Range("version").Value
|
json("version") = shConfig.Range("version").value
|
||||||
json("username") = Application.UserName
|
json("username") = Application.UserName
|
||||||
doc = JsonConverter.ConvertToJson(json)
|
doc = JsonConverter.ConvertToJson(json)
|
||||||
|
|
||||||
Dim server As String
|
Dim server As String
|
||||||
server = shConfig.Range("server").Value
|
server = shConfig.Range("server").value
|
||||||
|
|
||||||
With req
|
With req
|
||||||
.Option(WinHttpRequestOption_SslErrorIgnoreFlags) = SslErrorFlag_Ignore_All
|
.Option(WinHttpRequestOption_SslErrorIgnoreFlags) = SslErrorFlag_Ignore_All
|
||||||
|
|||||||
@ -588,7 +588,7 @@ Private Function json_ParseString(json_String As String, ByRef json_Index As Lon
|
|||||||
' Unicode character escape (e.g. \u00a9 = Copyright)
|
' Unicode character escape (e.g. \u00a9 = Copyright)
|
||||||
json_Index = json_Index + 1
|
json_Index = json_Index + 1
|
||||||
json_Code = VBA.Mid$(json_String, json_Index, 4)
|
json_Code = VBA.Mid$(json_String, json_Index, 4)
|
||||||
json_BufferAppend json_Buffer, VBA.ChrW(VBA.val("&h" + json_Code)), json_BufferPosition, json_BufferLength
|
json_BufferAppend json_Buffer, VBA.ChrW(VBA.Val("&h" + json_Code)), json_BufferPosition, json_BufferLength
|
||||||
json_Index = json_Index + 4
|
json_Index = json_Index + 4
|
||||||
End Select
|
End Select
|
||||||
Case json_Quote
|
Case json_Quote
|
||||||
@ -628,7 +628,7 @@ Private Function json_ParseNumber(json_String As String, ByRef json_Index As Lon
|
|||||||
json_ParseNumber = json_Value
|
json_ParseNumber = json_Value
|
||||||
Else
|
Else
|
||||||
' VBA.Val does not use regional settings, so guard for comma is not needed
|
' VBA.Val does not use regional settings, so guard for comma is not needed
|
||||||
json_ParseNumber = VBA.val(json_Value)
|
json_ParseNumber = VBA.Val(json_Value)
|
||||||
End If
|
End If
|
||||||
Exit Function
|
Exit Function
|
||||||
End If
|
End If
|
||||||
@ -987,7 +987,7 @@ Public Function ParseIso(utc_IsoString As String) As Date
|
|||||||
utc_Offset = TimeSerial(VBA.CInt(utc_OffsetParts(0)), VBA.CInt(utc_OffsetParts(1)), 0)
|
utc_Offset = TimeSerial(VBA.CInt(utc_OffsetParts(0)), VBA.CInt(utc_OffsetParts(1)), 0)
|
||||||
Case 2
|
Case 2
|
||||||
' VBA.Val does not use regional settings, use for seconds to avoid decimal/comma issues
|
' VBA.Val does not use regional settings, use for seconds to avoid decimal/comma issues
|
||||||
utc_Offset = TimeSerial(VBA.CInt(utc_OffsetParts(0)), VBA.CInt(utc_OffsetParts(1)), Int(VBA.val(utc_OffsetParts(2))))
|
utc_Offset = TimeSerial(VBA.CInt(utc_OffsetParts(0)), VBA.CInt(utc_OffsetParts(1)), Int(VBA.Val(utc_OffsetParts(2))))
|
||||||
End Select
|
End Select
|
||||||
|
|
||||||
If utc_NegativeOffset Then: utc_Offset = -utc_Offset
|
If utc_NegativeOffset Then: utc_Offset = -utc_Offset
|
||||||
@ -1003,7 +1003,7 @@ Public Function ParseIso(utc_IsoString As String) As Date
|
|||||||
ParseIso = ParseIso + VBA.TimeSerial(VBA.CInt(utc_TimeParts(0)), VBA.CInt(utc_TimeParts(1)), 0)
|
ParseIso = ParseIso + VBA.TimeSerial(VBA.CInt(utc_TimeParts(0)), VBA.CInt(utc_TimeParts(1)), 0)
|
||||||
Case 2
|
Case 2
|
||||||
' VBA.Val does not use regional settings, use for seconds to avoid decimal/comma issues
|
' VBA.Val does not use regional settings, use for seconds to avoid decimal/comma issues
|
||||||
ParseIso = ParseIso + VBA.TimeSerial(VBA.CInt(utc_TimeParts(0)), VBA.CInt(utc_TimeParts(1)), Int(VBA.val(utc_TimeParts(2))))
|
ParseIso = ParseIso + VBA.TimeSerial(VBA.CInt(utc_TimeParts(0)), VBA.CInt(utc_TimeParts(1)), Int(VBA.Val(utc_TimeParts(2))))
|
||||||
End Select
|
End Select
|
||||||
|
|
||||||
ParseIso = ParseUtc(ParseIso)
|
ParseIso = ParseUtc(ParseIso)
|
||||||
|
|||||||
@ -642,3 +642,51 @@ Public Function RangeToArray(inputRange As Range) As Variant()
|
|||||||
|
|
||||||
End Function
|
End Function
|
||||||
|
|
||||||
|
Public Function piv_pos(list As Object, target_pos As Long) As Long
|
||||||
|
|
||||||
|
Dim i As Long
|
||||||
|
|
||||||
|
For i = 1 To list.Count
|
||||||
|
If list(i).Position = target_pos Then
|
||||||
|
piv_pos = i
|
||||||
|
Exit Function
|
||||||
|
End If
|
||||||
|
Next i
|
||||||
|
'should not get to this point
|
||||||
|
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function piv_fld_index(field_name As String, ByRef pt As PivotTable) As Integer
|
||||||
|
|
||||||
|
Dim i As Integer
|
||||||
|
|
||||||
|
For i = 1 To pt.PivotFields.Count
|
||||||
|
If pt.PivotFields(i).Name = field_name Then
|
||||||
|
piv_fld_index = i
|
||||||
|
Exit Function
|
||||||
|
End If
|
||||||
|
Next i
|
||||||
|
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function escape_json(ByVal text As String) As String
|
||||||
|
|
||||||
|
text = Replace(text, "'", "''")
|
||||||
|
text = Replace(text, """", "\""")
|
||||||
|
If text = "(blank)" Then text = ""
|
||||||
|
escape_json = text
|
||||||
|
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Public Function escape_sql(ByVal text As String) As String
|
||||||
|
|
||||||
|
text = Replace(text, "'", "''")
|
||||||
|
text = Replace(text, """", """""")
|
||||||
|
If text = "(blank)" Then text = ""
|
||||||
|
escape_sql = text
|
||||||
|
|
||||||
|
End Function
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -29,11 +29,11 @@ End Sub
|
|||||||
|
|
||||||
Public Sub Initialize(part As String, billTo As String, shipTo As String)
|
Public Sub Initialize(part As String, billTo As String, shipTo As String)
|
||||||
cbPart.list = RangeToArray(shSupportingData.ListObjects("ITEM").DataBodyRange)
|
cbPart.list = RangeToArray(shSupportingData.ListObjects("ITEM").DataBodyRange)
|
||||||
cbPart.Value = part
|
cbPart.value = part
|
||||||
cbBill.list = RangeToArray(shSupportingData.ListObjects("CUSTOMER").DataBodyRange)
|
cbBill.list = RangeToArray(shSupportingData.ListObjects("CUSTOMER").DataBodyRange)
|
||||||
cbBill.Value = billTo
|
cbBill.value = billTo
|
||||||
cbShip.list = RangeToArray(shSupportingData.ListObjects("CUSTOMER").DataBodyRange)
|
cbShip.list = RangeToArray(shSupportingData.ListObjects("CUSTOMER").DataBodyRange)
|
||||||
cbShip.Value = shipTo
|
cbShip.value = shipTo
|
||||||
|
|
||||||
useval = False
|
useval = False
|
||||||
End Sub
|
End Sub
|
||||||
|
|||||||
Binary file not shown.
@ -16,7 +16,7 @@ Attribute VB_Exposed = False
|
|||||||
Private X As Variant
|
Private X As Variant
|
||||||
|
|
||||||
Private Sub UserForm_Activate()
|
Private Sub UserForm_Activate()
|
||||||
tbPrint.Value = ""
|
tbPrint.value = ""
|
||||||
|
|
||||||
Dim errorMsg As String
|
Dim errorMsg As String
|
||||||
X = handler.list_changes("{""scenario"":{""quota_rep_descr"":""" & shData.Cells(2, 5) & """}}", errorMsg)
|
X = handler.list_changes("{""scenario"":{""quota_rep_descr"":""" & shData.Cells(2, 5) & """}}", errorMsg)
|
||||||
@ -42,7 +42,7 @@ Private Sub lbHist_Change()
|
|||||||
|
|
||||||
For i = 0 To Me.lbHist.ListCount - 1
|
For i = 0 To Me.lbHist.ListCount - 1
|
||||||
If Me.lbHist.Selected(i) Then
|
If Me.lbHist.Selected(i) Then
|
||||||
Me.tbPrint.Value = X(i, 7)
|
Me.tbPrint.value = X(i, 7)
|
||||||
Exit Sub
|
Exit Sub
|
||||||
End If
|
End If
|
||||||
Next i
|
Next i
|
||||||
|
|||||||
Binary file not shown.
@ -48,16 +48,16 @@ End Sub
|
|||||||
|
|
||||||
Private Sub butAdjust_Click()
|
Private Sub butAdjust_Click()
|
||||||
Dim errorMsg As String
|
Dim errorMsg As String
|
||||||
If tbAPI.text = "" Then errorMsg = "No adjustments provided."
|
If tbapi.text = "" Then errorMsg = "No adjustments provided."
|
||||||
If cbTAG.text = "" Then errorMsg = "No tag was selected."
|
If cbTAG.text = "" Then errorMsg = "No tag was selected."
|
||||||
If tbAPI.text = "" Then errorMsg = "No adjustements are ready."
|
If tbapi.text = "" Then errorMsg = "No adjustements are ready."
|
||||||
|
|
||||||
If errorMsg <> "" Then
|
If errorMsg <> "" Then
|
||||||
MsgBox errorMsg, vbOKOnly Or vbExclamation
|
MsgBox errorMsg, vbOKOnly Or vbExclamation
|
||||||
Exit Sub
|
Exit Sub
|
||||||
End If
|
End If
|
||||||
|
|
||||||
handler.request_adjust tbAPI.text, errorMsg
|
handler.request_adjust tbapi.text, errorMsg
|
||||||
If errorMsg <> "" Then
|
If errorMsg <> "" Then
|
||||||
MsgBox errorMsg, vbOKOnly Or vbExclamation, "Adjustment was not made due to error."
|
MsgBox errorMsg, vbOKOnly Or vbExclamation, "Adjustment was not made due to error."
|
||||||
Exit Sub
|
Exit Sub
|
||||||
@ -79,13 +79,13 @@ Private Sub cbGoSheet_Click()
|
|||||||
Dim tags
|
Dim tags
|
||||||
tags = RangeToArray(shConfig.ListObjects("TAGS").DataBodyRange)
|
tags = RangeToArray(shConfig.ListObjects("TAGS").DataBodyRange)
|
||||||
If UBound(tags, 1) = 1 Then
|
If UBound(tags, 1) = 1 Then
|
||||||
shMonthView.Range("MonthTag").Value = tags(1, 1)
|
shMonthView.Range("MonthTag").value = tags(1, 1)
|
||||||
Else
|
Else
|
||||||
shMonthView.Range("MonthTag").Value = ""
|
shMonthView.Range("MonthTag").value = ""
|
||||||
End If
|
End If
|
||||||
shMonthView.Range("MonthComment").Value = ""
|
shMonthView.Range("MonthComment").value = ""
|
||||||
shMonthView.Range("QtyPctChange").Value = 0
|
shMonthView.Range("QtyPctChange").value = 0
|
||||||
shMonthView.Range("PricePctChange").Value = 0
|
shMonthView.Range("PricePctChange").value = 0
|
||||||
shMonthView.Visible = xlSheetVisible
|
shMonthView.Visible = xlSheetVisible
|
||||||
shMonthView.Select
|
shMonthView.Select
|
||||||
Me.Hide
|
Me.Hide
|
||||||
@ -93,10 +93,10 @@ End Sub
|
|||||||
|
|
||||||
Private Sub cbTAG_Change()
|
Private Sub cbTAG_Change()
|
||||||
Dim j As Object
|
Dim j As Object
|
||||||
If tbAPI.text = "" Then tbAPI.text = "{}"
|
If tbapi.text = "" Then tbapi.text = "{}"
|
||||||
Set j = JsonConverter.ParseJson(tbAPI.text)
|
Set j = JsonConverter.ParseJson(tbapi.text)
|
||||||
j("tag") = cbTAG.Value
|
j("tag") = cbTAG.value
|
||||||
tbAPI.text = JsonConverter.ConvertToJson(j)
|
tbapi.text = JsonConverter.ConvertToJson(j)
|
||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
Private Sub opEditPrice_Click()
|
Private Sub opEditPrice_Click()
|
||||||
@ -148,22 +148,22 @@ Private Sub opPlugVol_Click()
|
|||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
Private Sub sbpd_Change()
|
Private Sub sbpd_Change()
|
||||||
tbpd.Value = sbpd.Value
|
tbpd.value = sbpd.value
|
||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
Private Sub sbpp_Change()
|
Private Sub sbpp_Change()
|
||||||
tbpp.Value = sbpp.Value
|
tbpp.value = sbpp.value
|
||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
Private Sub sbpv_Change()
|
Private Sub sbpv_Change()
|
||||||
tbpv.Value = sbpv.Value
|
tbpv.value = sbpv.value
|
||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
Private Sub tbCOM_Change()
|
Private Sub tbCOM_Change()
|
||||||
If tbAPI.text = "" Then tbAPI.text = "{}"
|
If tbapi.text = "" Then tbapi.text = "{}"
|
||||||
Set adjust = JsonConverter.ParseJson(tbAPI.text)
|
Set adjust = JsonConverter.ParseJson(tbapi.text)
|
||||||
adjust("message") = tbCOM.text
|
adjust("message") = tbCOM.text
|
||||||
tbAPI.text = JsonConverter.ConvertToJson(adjust)
|
tbapi.text = JsonConverter.ConvertToJson(adjust)
|
||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
Private Sub tbFcPrice_Change()
|
Private Sub tbFcPrice_Change()
|
||||||
@ -185,25 +185,25 @@ End Sub
|
|||||||
|
|
||||||
Private Sub tbpd_Change()
|
Private Sub tbpd_Change()
|
||||||
If load_tb Then Exit Sub
|
If load_tb Then Exit Sub
|
||||||
If Not VBA.IsNumeric(tbpd.Value) Then Exit Sub
|
If Not VBA.IsNumeric(tbpd.value) Then Exit Sub
|
||||||
tbFcVal = (bVal + pVal) * (1 + tbpd.Value / 100)
|
tbFcVal = (bVal + pVal) * (1 + tbpd.value / 100)
|
||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
Private Sub tbpp_Change()
|
Private Sub tbpp_Change()
|
||||||
If load_tb Then Exit Sub
|
If load_tb Then Exit Sub
|
||||||
If Not VBA.IsNumeric(tbpd.Value) Then Exit Sub
|
If Not VBA.IsNumeric(tbpd.value) Then Exit Sub
|
||||||
tbFcPrice = (bPrc + pPrc) * (1 + tbpp.Value / 100)
|
tbFcPrice = (bPrc + pPrc) * (1 + tbpp.value / 100)
|
||||||
Me.load_mbox_ann
|
Me.load_mbox_ann
|
||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
Private Sub tbpv_Change()
|
Private Sub tbpv_Change()
|
||||||
If load_tb Then Exit Sub
|
If load_tb Then Exit Sub
|
||||||
If Not VBA.IsNumeric(tbpv.Value) Then Exit Sub
|
If Not VBA.IsNumeric(tbpv.value) Then Exit Sub
|
||||||
tbFcVol = (bVol + pVol) * (1 + tbpv.Value / 100)
|
tbFcVol = (bVol + pVol) * (1 + tbpv.value / 100)
|
||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
Private Sub UserForm_Activate()
|
Private Sub UserForm_Activate()
|
||||||
Me.Caption = "Forecast Adjust " & shConfig.Range("version").Value & " Loading..."
|
Me.Caption = "Forecast Adjust " & shConfig.Range("version").value & " Loading..."
|
||||||
Me.mp.Visible = False
|
Me.mp.Visible = False
|
||||||
Me.fraExit.Visible = False
|
Me.fraExit.Visible = False
|
||||||
|
|
||||||
@ -211,7 +211,7 @@ Private Sub UserForm_Activate()
|
|||||||
Set sp = handler.scenario_package("{""scenario"":" & scenario & "}", errorMsg)
|
Set sp = handler.scenario_package("{""scenario"":" & scenario & "}", errorMsg)
|
||||||
Call Utils.frmListBoxHeader(Me.lbSHDR, Me.lbSDET, "Field", "Selection")
|
Call Utils.frmListBoxHeader(Me.lbSHDR, Me.lbSDET, "Field", "Selection")
|
||||||
|
|
||||||
Me.Caption = "Forecast Adjust " & shConfig.Range("version").Value
|
Me.Caption = "Forecast Adjust " & shConfig.Range("version").value
|
||||||
|
|
||||||
If errorMsg <> "" Then
|
If errorMsg <> "" Then
|
||||||
fpvt.Hide
|
fpvt.Hide
|
||||||
@ -232,7 +232,7 @@ Private Sub UserForm_Activate()
|
|||||||
fVal = 0
|
fVal = 0
|
||||||
fVol = 0
|
fVol = 0
|
||||||
fPrc = 0
|
fPrc = 0
|
||||||
Me.tbAPI.Value = ""
|
Me.tbapi.value = ""
|
||||||
|
|
||||||
If IsNull(sp("package")("totals")) Then
|
If IsNull(sp("package")("totals")) Then
|
||||||
MsgBox "An unexpected error has occurred when retrieving the scenario.", vbOKOnly Or vbExclamation, "Error"
|
MsgBox "An unexpected error has occurred when retrieving the scenario.", vbOKOnly Or vbExclamation, "Error"
|
||||||
@ -326,9 +326,9 @@ Private Sub UserForm_Activate()
|
|||||||
End If
|
End If
|
||||||
|
|
||||||
'----------reset spinner buttons----------------------
|
'----------reset spinner buttons----------------------
|
||||||
sbpv.Value = 0
|
sbpv.value = 0
|
||||||
sbpp.Value = 0
|
sbpp.value = 0
|
||||||
sbpd.Value = 0
|
sbpd.value = 0
|
||||||
|
|
||||||
Call handler.month_tosheet(month, basket)
|
Call handler.month_tosheet(month, basket)
|
||||||
Application.StatusBar = False
|
Application.StatusBar = False
|
||||||
@ -422,9 +422,9 @@ Sub calc_val()
|
|||||||
|
|
||||||
Dim pchange As Double
|
Dim pchange As Double
|
||||||
|
|
||||||
If IsNumeric(tbFcVal.Value) Then
|
If IsNumeric(tbFcVal.value) Then
|
||||||
'get textbox value
|
'get textbox value
|
||||||
fVal = tbFcVal.Value
|
fVal = tbFcVal.value
|
||||||
'do calculations
|
'do calculations
|
||||||
aVal = fVal - bVal - pVal
|
aVal = fVal - bVal - pVal
|
||||||
|
|
||||||
@ -486,12 +486,12 @@ Sub calc_val()
|
|||||||
End If
|
End If
|
||||||
|
|
||||||
'print json
|
'print json
|
||||||
tbAPI = JsonConverter.ConvertToJson(adjust)
|
tbapi = JsonConverter.ConvertToJson(adjust)
|
||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
Sub calc_price()
|
Sub calc_price()
|
||||||
fVol = co_num(tbFcVol.Value, 0)
|
fVol = co_num(tbFcVol.value, 0)
|
||||||
fPrc = co_num(tbFcPrice.Value, 0)
|
fPrc = co_num(tbFcPrice.value, 0)
|
||||||
'calc
|
'calc
|
||||||
fVal = fPrc * fVol
|
fVal = fPrc * fVol
|
||||||
aVal = fVal - bVal - pVal
|
aVal = fVal - bVal - pVal
|
||||||
@ -537,7 +537,7 @@ Sub calc_price()
|
|||||||
End If
|
End If
|
||||||
|
|
||||||
'print json
|
'print json
|
||||||
tbAPI = JsonConverter.ConvertToJson(adjust)
|
tbapi = JsonConverter.ConvertToJson(adjust)
|
||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
Function iter_def(ByVal iter As String) As String
|
Function iter_def(ByVal iter As String) As String
|
||||||
|
|||||||
Binary file not shown.
@ -234,7 +234,7 @@ Sub load_config()
|
|||||||
|
|
||||||
Dim i As Integer
|
Dim i As Integer
|
||||||
'----server to use---------------------------------------------------------
|
'----server to use---------------------------------------------------------
|
||||||
handler.server = shConfig.Range("server").Value
|
handler.server = shConfig.Range("server").value
|
||||||
'---basis------------------------------------------------------------------
|
'---basis------------------------------------------------------------------
|
||||||
With shConfig.ListObjects("BASIS")
|
With shConfig.ListObjects("BASIS")
|
||||||
For i = 1 To .DataBodyRange.Rows.Count
|
For i = 1 To .DataBodyRange.Rows.Count
|
||||||
@ -257,7 +257,7 @@ Sub load_config()
|
|||||||
Next
|
Next
|
||||||
End With
|
End With
|
||||||
'---plan version--------------------------------------------------------------
|
'---plan version--------------------------------------------------------------
|
||||||
handler.plan = shConfig.Range("budget").Value
|
handler.plan = shConfig.Range("budget").value
|
||||||
|
|
||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
@ -357,9 +357,9 @@ Sub month_tosheet(ByRef pkg() As Variant, ByRef basket() As Variant)
|
|||||||
.Range("U1:AC100000").ClearContents
|
.Range("U1:AC100000").ClearContents
|
||||||
Call Utils.SHTp_DumpVar(basket, .Name, 1, 21, False, False, True)
|
Call Utils.SHTp_DumpVar(basket, .Name, 1, 21, False, False, True)
|
||||||
Call Utils.SHTp_DumpVar(basket, .Name, 1, 26, False, False, True)
|
Call Utils.SHTp_DumpVar(basket, .Name, 1, 26, False, False, True)
|
||||||
shConfig.Range("rebuild").Value = 0
|
shConfig.Range("rebuild").value = 0
|
||||||
shConfig.Range("show_basket").Value = 0
|
shConfig.Range("show_basket").value = 0
|
||||||
shConfig.Range("new_part").Value = 0
|
shConfig.Range("new_part").value = 0
|
||||||
|
|
||||||
shMonthView.LoadSheet
|
shMonthView.LoadSheet
|
||||||
|
|
||||||
|
|||||||
@ -18,12 +18,12 @@ Private Sub cbCancel_Click()
|
|||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
Private Sub cbOK_Click()
|
Private Sub cbOK_Click()
|
||||||
If opDSM.Value Then
|
If opDSM.value Then
|
||||||
Call handler.pg_main_workset("quota_rep_descr", cbDSM.Value)
|
Call handler.pg_main_workset("quota_rep_descr", cbDSM.value)
|
||||||
ElseIf opDirector.Value Then
|
ElseIf opDirector.value Then
|
||||||
Call handler.pg_main_workset("director", cbDirector.Value)
|
Call handler.pg_main_workset("director", cbDirector.value)
|
||||||
ElseIf opSegment.Value Then
|
ElseIf opSegment.value Then
|
||||||
Call handler.pg_main_workset("segm", cbSegment.Value)
|
Call handler.pg_main_workset("segm", cbSegment.value)
|
||||||
End If
|
End If
|
||||||
shOrders.PivotTables("ptOrders").PivotCache.Refresh
|
shOrders.PivotTables("ptOrders").PivotCache.Refresh
|
||||||
openf.Hide
|
openf.Hide
|
||||||
@ -54,7 +54,7 @@ Private Sub opSegment_Click()
|
|||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
Private Sub UserForm_Activate()
|
Private Sub UserForm_Activate()
|
||||||
handler.server = shConfig.Range("server").Value
|
handler.server = shConfig.Range("server").value
|
||||||
cbDSM.list = RangeToArray(shSupportingData.ListObjects("DSM").DataBodyRange)
|
cbDSM.list = RangeToArray(shSupportingData.ListObjects("DSM").DataBodyRange)
|
||||||
cbDirector.list = RangeToArray(shConfig.ListObjects("DIRECTORS").DataBodyRange)
|
cbDirector.list = RangeToArray(shConfig.ListObjects("DIRECTORS").DataBodyRange)
|
||||||
cbSegment.list = RangeToArray(shConfig.ListObjects("SEGMENTS").DataBodyRange)
|
cbSegment.list = RangeToArray(shConfig.ListObjects("SEGMENTS").DataBodyRange)
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@ -12,7 +12,7 @@ Option Explicit
|
|||||||
Private Sub Worksheet_Change(ByVal Target As Range)
|
Private Sub Worksheet_Change(ByVal Target As Range)
|
||||||
If Intersect(Target, shConfig.Range("debug_mode")) Is Nothing Then Exit Sub
|
If Intersect(Target, shConfig.Range("debug_mode")) Is Nothing Then Exit Sub
|
||||||
|
|
||||||
If shConfig.Range("debug_mode").Value Then
|
If shConfig.Range("debug_mode").value Then
|
||||||
shConfig.Visible = xlSheetVisible
|
shConfig.Visible = xlSheetVisible
|
||||||
'shData.Visible = xlSheetVisible
|
'shData.Visible = xlSheetVisible
|
||||||
shMonthView.Visible = xlSheetVisible
|
shMonthView.Visible = xlSheetVisible
|
||||||
|
|||||||
@ -30,7 +30,7 @@ Public Sub MPP_Down() ' Handler for down-triangle on price percent change.
|
|||||||
If newpart Then Exit Sub
|
If newpart Then Exit Sub
|
||||||
|
|
||||||
With shMonthView.Range("PricePctChange")
|
With shMonthView.Range("PricePctChange")
|
||||||
.Value = WorksheetFunction.Max(-0.1, .Value - 0.01)
|
.value = WorksheetFunction.Max(-0.1, .value - 0.01)
|
||||||
End With
|
End With
|
||||||
MPP_Change
|
MPP_Change
|
||||||
End Sub
|
End Sub
|
||||||
@ -39,7 +39,7 @@ Public Sub MPP_Up() ' Handler for up-triangle on price percent change.
|
|||||||
If newpart Then Exit Sub
|
If newpart Then Exit Sub
|
||||||
|
|
||||||
With shMonthView.Range("PricePctChange")
|
With shMonthView.Range("PricePctChange")
|
||||||
.Value = WorksheetFunction.Min(0.1, .Value + 0.01)
|
.value = WorksheetFunction.Min(0.1, .value + 0.01)
|
||||||
End With
|
End With
|
||||||
MPP_Change
|
MPP_Change
|
||||||
End Sub
|
End Sub
|
||||||
@ -70,7 +70,7 @@ Public Sub MPV_Down() ' Handler for down-triangle on qty percent change.
|
|||||||
If newpart Then Exit Sub
|
If newpart Then Exit Sub
|
||||||
|
|
||||||
With shMonthView.Range("QtyPctChange")
|
With shMonthView.Range("QtyPctChange")
|
||||||
.Value = WorksheetFunction.Max(-0.1, .Value - 0.01)
|
.value = WorksheetFunction.Max(-0.1, .value - 0.01)
|
||||||
End With
|
End With
|
||||||
MPV_Change
|
MPV_Change
|
||||||
End Sub
|
End Sub
|
||||||
@ -79,7 +79,7 @@ Public Sub MPV_Up() ' Handler for up-triangle on qty percent change.
|
|||||||
If newpart Then Exit Sub
|
If newpart Then Exit Sub
|
||||||
|
|
||||||
With shMonthView.Range("QtyPctChange")
|
With shMonthView.Range("QtyPctChange")
|
||||||
.Value = WorksheetFunction.Min(0.1, .Value + 0.01)
|
.value = WorksheetFunction.Min(0.1, .value + 0.01)
|
||||||
End With
|
End With
|
||||||
MPV_Change
|
MPV_Change
|
||||||
End Sub
|
End Sub
|
||||||
@ -107,8 +107,8 @@ Private Sub MPV_Change()
|
|||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
Public Sub ToggleVolumePrice()
|
Public Sub ToggleVolumePrice()
|
||||||
shMonthView.Range("MonthAdjustVolume").Value = (shMonthView.Range("MonthAdjustVolume").Value <> True)
|
shMonthView.Range("MonthAdjustVolume").value = (shMonthView.Range("MonthAdjustVolume").value <> True)
|
||||||
shMonthView.Range("MonthAdjustPrice").Value = Not shMonthView.Range("MonthAdjustVolume").Value
|
shMonthView.Range("MonthAdjustPrice").value = Not shMonthView.Range("MonthAdjustVolume").value
|
||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
Private Sub Worksheet_Change(ByVal Target As Range)
|
Private Sub Worksheet_Change(ByVal Target As Range)
|
||||||
@ -139,7 +139,7 @@ Private Sub Worksheet_Change(ByVal Target As Range)
|
|||||||
If IntersectsWith(Target, Range("SalesNewAdj")) Then Call Me.ms_adj
|
If IntersectsWith(Target, Range("SalesNewAdj")) Then Call Me.ms_adj
|
||||||
If IntersectsWith(Target, Range("SalesFinal")) Then Call Me.ms_set
|
If IntersectsWith(Target, Range("SalesFinal")) Then Call Me.ms_set
|
||||||
|
|
||||||
If IntersectsWith(Target, Range("basket")) And shConfig.Range("show_basket").Value = 1 Then
|
If IntersectsWith(Target, Range("basket")) And shConfig.Range("show_basket").value = 1 Then
|
||||||
If RemoveEmptyBasketLines Then ' Lines were removed
|
If RemoveEmptyBasketLines Then ' Lines were removed
|
||||||
GetEditBasket shMonthView.Range("basket").Resize(1, 1) ' Don't "touch" the mix column, so as to rescale all rows proportionally to 100% total.
|
GetEditBasket shMonthView.Range("basket").Resize(1, 1) ' Don't "touch" the mix column, so as to rescale all rows proportionally to 100% total.
|
||||||
Else
|
Else
|
||||||
@ -149,7 +149,7 @@ Private Sub Worksheet_Change(ByVal Target As Range)
|
|||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
|
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
|
||||||
If IntersectsWith(Target, Union(Range("basket_new_item"), Range("basket"))) And shConfig.Range("show_basket").Value = 1 Then
|
If IntersectsWith(Target, Union(Range("basket_new_item"), Range("basket"))) And shConfig.Range("show_basket").value = 1 Then
|
||||||
Cancel = True
|
Cancel = True
|
||||||
Call Me.basket_pick(Target)
|
Call Me.basket_pick(Target)
|
||||||
Target.Select
|
Target.Select
|
||||||
@ -158,7 +158,7 @@ End Sub
|
|||||||
|
|
||||||
|
|
||||||
Sub picker_shortcut()
|
Sub picker_shortcut()
|
||||||
If IntersectsWith(Selection, Range("basket")) And shConfig.Range("show_basket").Value = 1 Then
|
If IntersectsWith(Selection, Range("basket")) And shConfig.Range("show_basket").value = 1 Then
|
||||||
Call Me.basket_pick(Selection)
|
Call Me.basket_pick(Selection)
|
||||||
End If
|
End If
|
||||||
|
|
||||||
@ -421,7 +421,7 @@ Private Sub BuildJson()
|
|||||||
Set np("scenario")("iter") = JsonConverter.ParseJson("[""copy"",""plan""]")
|
Set np("scenario")("iter") = JsonConverter.ParseJson("[""copy"",""plan""]")
|
||||||
np("source") = "adj"
|
np("source") = "adj"
|
||||||
np("type") = "new_basket"
|
np("type") = "new_basket"
|
||||||
np("tag") = shMonthView.Range("MonthTag").Value
|
np("tag") = shMonthView.Range("MonthTag").value
|
||||||
Set m = JsonConverter.ParseJson("{}")
|
Set m = JsonConverter.ParseJson("{}")
|
||||||
End If
|
End If
|
||||||
|
|
||||||
@ -431,7 +431,7 @@ Private Sub BuildJson()
|
|||||||
Set o = JsonConverter.ParseJson("{}")
|
Set o = JsonConverter.ParseJson("{}")
|
||||||
o("amount") = sales(pos, 5)
|
o("amount") = sales(pos, 5)
|
||||||
o("qty") = units(pos, 5)
|
o("qty") = units(pos, 5)
|
||||||
Set m(shMonthView.Range("OrderMonths").Cells(pos, 1).Value) = JsonConverter.ParseJson(JsonConverter.ConvertToJson(o))
|
Set m(shMonthView.Range("OrderMonths").Cells(pos, 1).value) = JsonConverter.ParseJson(JsonConverter.ConvertToJson(o))
|
||||||
End If
|
End If
|
||||||
Else
|
Else
|
||||||
'if something is changing
|
'if something is changing
|
||||||
@ -472,10 +472,10 @@ Private Sub BuildJson()
|
|||||||
|
|
||||||
If Me.newpart Then
|
If Me.newpart Then
|
||||||
Set np("months") = JsonConverter.ParseJson(JsonConverter.ConvertToJson(m))
|
Set np("months") = JsonConverter.ParseJson(JsonConverter.ConvertToJson(m))
|
||||||
np("newpart") = shMonthView.Range("basket").Cells(1, 1).Value
|
np("newpart") = shMonthView.Range("basket").Cells(1, 1).value
|
||||||
'get the basket from the sheet
|
'get the basket from the sheet
|
||||||
Dim basket() As Variant
|
Dim basket() As Variant
|
||||||
basket = shMonthUpdate.Range("U1").CurrentRegion.Value
|
basket = shMonthUpdate.Range("U1").CurrentRegion.value
|
||||||
Set m = JsonConverter.ParseJson(Utils.json_from_table(basket, "basket", False))
|
Set m = JsonConverter.ParseJson(Utils.json_from_table(basket, "basket", False))
|
||||||
If UBound(basket, 1) <= 2 Then
|
If UBound(basket, 1) <= 2 Then
|
||||||
Set np("basket") = JsonConverter.ParseJson("[" & Utils.json_from_table(basket, "basket", False) & "]")
|
Set np("basket") = JsonConverter.ParseJson("[" & Utils.json_from_table(basket, "basket", False) & "]")
|
||||||
@ -556,13 +556,13 @@ Sub reset()
|
|||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
Sub switch_basket()
|
Sub switch_basket()
|
||||||
shConfig.Range("show_basket").Value = 1 - shConfig.Range("show_basket").Value
|
shConfig.Range("show_basket").value = 1 - shConfig.Range("show_basket").value
|
||||||
Call Me.print_basket
|
Call Me.print_basket
|
||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
Sub print_basket()
|
Sub print_basket()
|
||||||
|
|
||||||
If shConfig.Range("show_basket").Value = 0 Then
|
If shConfig.Range("show_basket").value = 0 Then
|
||||||
busy = True
|
busy = True
|
||||||
shMonthView.Range("basket").ClearContents
|
shMonthView.Range("basket").ClearContents
|
||||||
busy = False
|
busy = False
|
||||||
@ -577,10 +577,10 @@ Sub print_basket()
|
|||||||
|
|
||||||
shMonthView.Range("basket").ClearContents
|
shMonthView.Range("basket").ClearContents
|
||||||
For i = 2 To UBound(basket, 1)
|
For i = 2 To UBound(basket, 1)
|
||||||
shMonthView.Range("basket").Resize(1, 1).Offset(i - 2, 0).Value = basket(i, 1)
|
shMonthView.Range("basket").Resize(1, 1).Offset(i - 2, 0).value = basket(i, 1)
|
||||||
shMonthView.Range("basket").Resize(1, 1).Offset(i - 2, 4).Value = basket(i, 2)
|
shMonthView.Range("basket").Resize(1, 1).Offset(i - 2, 4).value = basket(i, 2)
|
||||||
shMonthView.Range("basket").Resize(1, 1).Offset(i - 2, 10).Value = basket(i, 3)
|
shMonthView.Range("basket").Resize(1, 1).Offset(i - 2, 10).value = basket(i, 3)
|
||||||
shMonthView.Range("basket").Resize(1, 1).Offset(i - 2, 15).Value = basket(i, 4)
|
shMonthView.Range("basket").Resize(1, 1).Offset(i - 2, 15).value = basket(i, 4)
|
||||||
Next i
|
Next i
|
||||||
|
|
||||||
busy = False
|
busy = False
|
||||||
@ -597,9 +597,9 @@ Sub basket_pick(ByRef Target As Range)
|
|||||||
If build.useval Then
|
If build.useval Then
|
||||||
busy = True
|
busy = True
|
||||||
|
|
||||||
.Cells(Target.row + i, 2) = build.cbPart.Value
|
.Cells(Target.row + i, 2) = build.cbPart.value
|
||||||
.Cells(Target.row + i, 6) = rev_cust(build.cbBill.Value)
|
.Cells(Target.row + i, 6) = rev_cust(build.cbBill.value)
|
||||||
.Cells(Target.row + i, 12) = rev_cust(build.cbShip.Value)
|
.Cells(Target.row + i, 12) = rev_cust(build.cbShip.value)
|
||||||
busy = False
|
busy = False
|
||||||
GetEditBasket Selection
|
GetEditBasket Selection
|
||||||
|
|
||||||
@ -712,7 +712,7 @@ Sub post_adjust()
|
|||||||
If WorksheetFunction.CountA(shMonthUpdate.Range("P2:P13")) = 0 Then msg = "Make sure at least one month has Final values for Volume, Price, and Sales."
|
If WorksheetFunction.CountA(shMonthUpdate.Range("P2:P13")) = 0 Then msg = "Make sure at least one month has Final values for Volume, Price, and Sales."
|
||||||
End If
|
End If
|
||||||
|
|
||||||
If IsEmpty(shMonthView.Range("MonthTag").Value) Then msg = "You need to specify a tag for this update."
|
If IsEmpty(shMonthView.Range("MonthTag").value) Then msg = "You need to specify a tag for this update."
|
||||||
|
|
||||||
If msg <> "" Then
|
If msg <> "" Then
|
||||||
MsgBox msg, vbOKOnly Or vbExclamation
|
MsgBox msg, vbOKOnly Or vbExclamation
|
||||||
@ -724,8 +724,8 @@ Sub post_adjust()
|
|||||||
|
|
||||||
If Me.newpart Then
|
If Me.newpart Then
|
||||||
Set adjust = JsonConverter.ParseJson(shMonthUpdate.Cells(2, 16))
|
Set adjust = JsonConverter.ParseJson(shMonthUpdate.Cells(2, 16))
|
||||||
adjust("message") = shMonthView.Range("MonthComment").Value
|
adjust("message") = shMonthView.Range("MonthComment").value
|
||||||
adjust("tag") = shMonthView.Range("MonthTag").Value
|
adjust("tag") = shMonthView.Range("MonthTag").value
|
||||||
jdoc = JsonConverter.ConvertToJson(adjust)
|
jdoc = JsonConverter.ConvertToJson(adjust)
|
||||||
|
|
||||||
Dim errorMsg As String
|
Dim errorMsg As String
|
||||||
@ -739,8 +739,8 @@ Sub post_adjust()
|
|||||||
For i = 2 To 13
|
For i = 2 To 13
|
||||||
If shMonthUpdate.Cells(i, 16) <> "" Then
|
If shMonthUpdate.Cells(i, 16) <> "" Then
|
||||||
Set adjust = JsonConverter.ParseJson(shMonthUpdate.Cells(i, 16))
|
Set adjust = JsonConverter.ParseJson(shMonthUpdate.Cells(i, 16))
|
||||||
adjust("message") = shMonthView.Range("MonthComment").Value
|
adjust("message") = shMonthView.Range("MonthComment").value
|
||||||
adjust("tag") = shMonthView.Range("MonthTag").Value
|
adjust("tag") = shMonthView.Range("MonthTag").value
|
||||||
jdoc = JsonConverter.ConvertToJson(adjust)
|
jdoc = JsonConverter.ConvertToJson(adjust)
|
||||||
handler.request_adjust jdoc, errorMsg
|
handler.request_adjust jdoc, errorMsg
|
||||||
If errorMsg <> "" Then
|
If errorMsg <> "" Then
|
||||||
@ -760,7 +760,7 @@ End Sub
|
|||||||
|
|
||||||
Sub build_new()
|
Sub build_new()
|
||||||
|
|
||||||
shConfig.Range("rebuild").Value = 1
|
shConfig.Range("rebuild").value = 1
|
||||||
Dim i As Long
|
Dim i As Long
|
||||||
Dim j As Long
|
Dim j As Long
|
||||||
Dim basket() As Variant
|
Dim basket() As Variant
|
||||||
@ -824,14 +824,14 @@ Sub new_part()
|
|||||||
With shMonthView.Range("basket")
|
With shMonthView.Range("basket")
|
||||||
.ClearContents
|
.ClearContents
|
||||||
For i = 1 To UBound(cust, 2)
|
For i = 1 To UBound(cust, 2)
|
||||||
.Cells(i, 1) = part.cbPart.Value
|
.Cells(i, 1) = part.cbPart.value
|
||||||
.Cells(i, 5) = cust(0, i)
|
.Cells(i, 5) = cust(0, i)
|
||||||
.Cells(i, 11) = cust(1, i)
|
.Cells(i, 11) = cust(1, i)
|
||||||
.Cells(i, 16) = CDbl(cust(2, i))
|
.Cells(i, 16) = CDbl(cust(2, i))
|
||||||
Next i
|
Next i
|
||||||
End With
|
End With
|
||||||
|
|
||||||
shConfig.Range("new_part").Value = 1
|
shConfig.Range("new_part").value = 1
|
||||||
|
|
||||||
'------copy revised basket to _month storage---------------------------------------------------
|
'------copy revised basket to _month storage---------------------------------------------------
|
||||||
|
|
||||||
@ -894,16 +894,16 @@ Sub new_part()
|
|||||||
|
|
||||||
|
|
||||||
'force basket to show to demonstrate the part was changed
|
'force basket to show to demonstrate the part was changed
|
||||||
shConfig.Range("show_basket").Value = 1
|
shConfig.Range("show_basket").value = 1
|
||||||
Call Me.print_basket
|
Call Me.print_basket
|
||||||
busy = False
|
busy = False
|
||||||
|
|
||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
Function newpart() As Boolean
|
Function newpart() As Boolean
|
||||||
newpart = shConfig.Range("new_part").Value = 1
|
newpart = shConfig.Range("new_part").value = 1
|
||||||
End Function
|
End Function
|
||||||
|
|
||||||
Private Sub Worksheet_Deactivate()
|
Private Sub Worksheet_Deactivate()
|
||||||
Forecasting.shMonthView.Visible = IIf(shConfig.Range("debug_mode").Value, xlSheetVisible, xlSheetHidden)
|
Forecasting.shMonthView.Visible = IIf(shConfig.Range("debug_mode").value, xlSheetVisible, xlSheetHidden)
|
||||||
End Sub
|
End Sub
|
||||||
|
|||||||
@ -99,50 +99,3 @@ Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean
|
|||||||
Call handler.load_fpvt
|
Call handler.load_fpvt
|
||||||
|
|
||||||
End Sub
|
End Sub
|
||||||
|
|
||||||
Function piv_pos(list As Object, target_pos As Long) As Long
|
|
||||||
|
|
||||||
Dim i As Long
|
|
||||||
|
|
||||||
For i = 1 To list.Count
|
|
||||||
If list(i).Position = target_pos Then
|
|
||||||
piv_pos = i
|
|
||||||
Exit Function
|
|
||||||
End If
|
|
||||||
Next i
|
|
||||||
'should not get to this point
|
|
||||||
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Function piv_fld_index(field_name As String, ByRef pt As PivotTable) As Integer
|
|
||||||
|
|
||||||
Dim i As Integer
|
|
||||||
|
|
||||||
For i = 1 To pt.PivotFields.Count
|
|
||||||
If pt.PivotFields(i).Name = field_name Then
|
|
||||||
piv_fld_index = i
|
|
||||||
Exit Function
|
|
||||||
End If
|
|
||||||
Next i
|
|
||||||
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Function escape_json(ByVal text As String) As String
|
|
||||||
|
|
||||||
text = Replace(text, "'", "''")
|
|
||||||
text = Replace(text, """", "\""")
|
|
||||||
If text = "(blank)" Then text = ""
|
|
||||||
escape_json = text
|
|
||||||
|
|
||||||
End Function
|
|
||||||
|
|
||||||
Function escape_sql(ByVal text As String) As String
|
|
||||||
|
|
||||||
text = Replace(text, "'", "''")
|
|
||||||
text = Replace(text, """", """""")
|
|
||||||
If text = "(blank)" Then text = ""
|
|
||||||
escape_sql = text
|
|
||||||
|
|
||||||
End Function
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
144
Master Template.xlsm_EXPORTS/shShipments.cls
Normal file
144
Master Template.xlsm_EXPORTS/shShipments.cls
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
VERSION 1.0 CLASS
|
||||||
|
BEGIN
|
||||||
|
MultiUse = -1 'True
|
||||||
|
END
|
||||||
|
Attribute VB_Name = "shShipments"
|
||||||
|
Attribute VB_GlobalNameSpace = False
|
||||||
|
Attribute VB_Creatable = False
|
||||||
|
Attribute VB_PredeclaredId = True
|
||||||
|
Attribute VB_Exposed = True
|
||||||
|
Option Explicit
|
||||||
|
|
||||||
|
Dim selectedSeason As Integer
|
||||||
|
Dim selectedMonth As Integer
|
||||||
|
|
||||||
|
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
|
||||||
|
Dim pt As PivotTable
|
||||||
|
Set pt = ActiveSheet.PivotTables("ptShipments")
|
||||||
|
|
||||||
|
Dim intersec As Range
|
||||||
|
Set intersec = Intersect(Target, pt.DataBodyRange)
|
||||||
|
|
||||||
|
If intersec Is Nothing Then
|
||||||
|
Exit Sub
|
||||||
|
ElseIf intersec.address <> Target.address Then
|
||||||
|
Exit Sub
|
||||||
|
End If
|
||||||
|
|
||||||
|
Cancel = True
|
||||||
|
|
||||||
|
If Target.value = "" Then
|
||||||
|
MsgBox "You cannot shift an empty cell.", vbOKOnly + vbExclamation
|
||||||
|
Exit Sub
|
||||||
|
End If
|
||||||
|
|
||||||
|
Dim i As Long
|
||||||
|
Dim j As Long
|
||||||
|
Dim k As Long
|
||||||
|
|
||||||
|
Dim ri As PivotItemList
|
||||||
|
Dim ci As PivotItemList
|
||||||
|
Dim df As Object
|
||||||
|
Dim rd As Object
|
||||||
|
Dim cd As Object
|
||||||
|
Dim dd As Object
|
||||||
|
|
||||||
|
Dim pf As PivotField
|
||||||
|
Dim pi As PivotItem
|
||||||
|
|
||||||
|
' Serialize the report filters in SQL and JSON format.
|
||||||
|
pt.PivotCache.MissingItemsLimit = xlMissingItemsNone
|
||||||
|
pt.PivotCache.Refresh
|
||||||
|
|
||||||
|
Dim segmSql As String
|
||||||
|
Dim segmJSql As String
|
||||||
|
segmSql = "segm IN ("
|
||||||
|
segmJSql = """segm"": ["
|
||||||
|
|
||||||
|
Set pf = pt.PivotFields("Segment")
|
||||||
|
For Each pi In pf.PivotItems
|
||||||
|
If pi.Visible Then
|
||||||
|
If Right(segmSql, 1) <> "(" Then
|
||||||
|
segmSql = segmSql & ", "
|
||||||
|
segmJSql = segmJSql & ", "
|
||||||
|
End If
|
||||||
|
segmSql = segmSql & "'" & escape_sql(pi.Name) & "'"
|
||||||
|
segmJSql = segmJSql & """" & escape_json(pi.Name) & """"
|
||||||
|
End If
|
||||||
|
Next
|
||||||
|
segmSql = segmSql & ")"
|
||||||
|
segmJSql = segmJSql & "]"
|
||||||
|
|
||||||
|
' Serialize the row and column items in SQL and JSON format.
|
||||||
|
Set ri = Target.Cells.PivotCell.RowItems
|
||||||
|
Set ci = Target.Cells.PivotCell.ColumnItems
|
||||||
|
Set df = Target.Cells.PivotCell.DataField
|
||||||
|
|
||||||
|
Set rd = Target.Cells.PivotTable.RowFields
|
||||||
|
Set cd = Target.Cells.PivotTable.ColumnFields
|
||||||
|
|
||||||
|
Dim idx As Integer
|
||||||
|
idx = IIf(Right(segmSql, 2) = "()", 0, 1)
|
||||||
|
|
||||||
|
handler.sql = IIf(idx = 0, "", segmSql)
|
||||||
|
handler.jsql = IIf(idx = 0, "", segmJSql)
|
||||||
|
ReDim handler.sc(ri.Count + ci.Count + idx, 1)
|
||||||
|
|
||||||
|
If idx = 1 Then
|
||||||
|
idx = 0
|
||||||
|
handler.sc(idx, 0) = "segm"
|
||||||
|
handler.sc(idx, 1) = Mid(segmJSql, 9)
|
||||||
|
End If
|
||||||
|
|
||||||
|
Dim key As String
|
||||||
|
Dim value As Variant
|
||||||
|
|
||||||
|
For i = 1 To ri.Count
|
||||||
|
key = ri(i).Parent.Name
|
||||||
|
value = ri(i).value
|
||||||
|
|
||||||
|
If handler.sql <> "" Then handler.sql = handler.sql & vbCrLf & "AND "
|
||||||
|
If handler.sql <> "" Then handler.jsql = handler.jsql & vbCrLf & ","
|
||||||
|
handler.sql = handler.sql & key & " = '" & escape_sql(value) & "'"
|
||||||
|
handler.jsql = handler.jsql & """" & key & """:""" & escape_json(value) & """"
|
||||||
|
idx = idx + 1
|
||||||
|
handler.sc(idx, 0) = key
|
||||||
|
handler.sc(idx, 1) = value
|
||||||
|
Next i
|
||||||
|
|
||||||
|
For i = 1 To ci.Count
|
||||||
|
key = ci(i).Parent.Name
|
||||||
|
value = ci(i).value
|
||||||
|
|
||||||
|
If handler.sql <> "" Then handler.sql = handler.sql & vbCrLf & "AND "
|
||||||
|
If handler.sql <> "" Then handler.jsql = handler.jsql & vbCrLf & ","
|
||||||
|
handler.sql = handler.sql & key & " = '" & escape_sql(value) & "'"
|
||||||
|
handler.jsql = handler.jsql & """" & key & """:""" & escape_json(value) & """"
|
||||||
|
idx = idx + 1
|
||||||
|
handler.sc(idx, 0) = key
|
||||||
|
handler.sc(idx, 1) = value
|
||||||
|
|
||||||
|
If key = "ship_season" Then selectedSeason = CInt(value)
|
||||||
|
If key = "ship_month" Then selectedMonth = CInt(Left(value, 2))
|
||||||
|
Next
|
||||||
|
|
||||||
|
scenario = "{" & handler.jsql & "}"
|
||||||
|
|
||||||
|
If selectedSeason = 0 Or selectedMonth = 0 Then
|
||||||
|
MsgBox "Invalid pivot table setup. Make sure SHIP_SEASON and SHIP_MONTH are set as pivot table columns.", vbOKOnly + vbExclamation
|
||||||
|
Exit Sub
|
||||||
|
End If
|
||||||
|
|
||||||
|
Call handler.load_config
|
||||||
|
With shipDateShifter
|
||||||
|
.lbSDET.list = handler.sc
|
||||||
|
.selectedSeason = selectedSeason
|
||||||
|
.selectedMonth = selectedMonth
|
||||||
|
.currentValue = Target.value
|
||||||
|
.numberFormat = IIf(df.numberFormat Like "*$*", "$#,##0", "#,##0")
|
||||||
|
.Show
|
||||||
|
End With
|
||||||
|
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
|
||||||
424
Master Template.xlsm_EXPORTS/shipDateShifter.frm
Normal file
424
Master Template.xlsm_EXPORTS/shipDateShifter.frm
Normal file
@ -0,0 +1,424 @@
|
|||||||
|
VERSION 5.00
|
||||||
|
Begin {C62A69F0-16DC-11CE-9E98-00AA00574A4F} shipDateShifter
|
||||||
|
Caption = "Ship Date Shifting"
|
||||||
|
ClientHeight = 5205
|
||||||
|
ClientLeft = 120
|
||||||
|
ClientTop = 465
|
||||||
|
ClientWidth = 18375
|
||||||
|
OleObjectBlob = "shipDateShifter.frx":0000
|
||||||
|
StartUpPosition = 1 'CenterOwner
|
||||||
|
End
|
||||||
|
Attribute VB_Name = "shipDateShifter"
|
||||||
|
Attribute VB_GlobalNameSpace = False
|
||||||
|
Attribute VB_Creatable = False
|
||||||
|
Attribute VB_PredeclaredId = True
|
||||||
|
Attribute VB_Exposed = False
|
||||||
|
Option Explicit
|
||||||
|
|
||||||
|
Public selectedSeason As Integer
|
||||||
|
Public selectedMonth As Integer
|
||||||
|
Public currentValue As Double
|
||||||
|
Public numberFormat As String
|
||||||
|
|
||||||
|
Private Sub cmdCancel_Click()
|
||||||
|
Unload Me
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub cmdOK_Click()
|
||||||
|
'build json
|
||||||
|
Dim adjust As Object
|
||||||
|
Set adjust = JsonConverter.ParseJson("{""scenario"":" & scenario & ", ""distributions"":[]}")
|
||||||
|
adjust("scenario")("version") = handler.plan
|
||||||
|
adjust("scenario")("iter") = handler.basis
|
||||||
|
adjust("stamp") = Format(Date + time, "yyyy-mm-dd hh:mm:ss")
|
||||||
|
adjust("user") = Application.UserName
|
||||||
|
adjust("source") = "shift"
|
||||||
|
adjust("type") = "shift_ship_dates"
|
||||||
|
adjust("message") = txtComment.text
|
||||||
|
adjust("tag") = "Shift Shipping"
|
||||||
|
adjust("version") = handler.plan
|
||||||
|
|
||||||
|
Dim distribution As Object
|
||||||
|
Dim distributed As Double
|
||||||
|
Dim month As MSForms.TextBox
|
||||||
|
Dim m As Integer
|
||||||
|
For m = 1 To 12
|
||||||
|
Set month = txtMonth(selectedSeason, m)
|
||||||
|
If month.text <> "" Then
|
||||||
|
If m <> selectedMonth Then distributed = distributed + Val(RemoveFormat(month.text))
|
||||||
|
Set distribution = JsonConverter.ParseJson( _
|
||||||
|
"{""ship_season"":" & selectedSeason & "," & _
|
||||||
|
" ""ship_month"": """ & Me.Controls("lblShipMonth" & Format(m, "00")).Caption & """," & _
|
||||||
|
" ""pct"":" & Val(Replace(lblPctMonth(selectedSeason, m).Caption, "%", "")) / 100 & _
|
||||||
|
"}")
|
||||||
|
adjust("distributions").Add distribution
|
||||||
|
End If
|
||||||
|
Next
|
||||||
|
|
||||||
|
For m = 1 To 12
|
||||||
|
Set month = txtMonth(selectedSeason + 1, m)
|
||||||
|
If month.text <> "" Then
|
||||||
|
distributed = distributed + Val(RemoveFormat(month.text))
|
||||||
|
Set distribution = JsonConverter.ParseJson( _
|
||||||
|
"{""ship_season"":" & selectedSeason + 1 & "," & _
|
||||||
|
" ""ship_month"": """ & Me.Controls("lblShipMonth" & Format(m, "00")).Caption & """," & _
|
||||||
|
" ""pct"":" & Val(Replace(lblPctMonth(selectedSeason + 1, m).Caption, "%", "")) / 100 & _
|
||||||
|
"}")
|
||||||
|
adjust("distributions").Add distribution
|
||||||
|
End If
|
||||||
|
Next
|
||||||
|
|
||||||
|
If distributed = 0 Then
|
||||||
|
MsgBox "No shifts were specified.", vbOKOnly + vbInformation
|
||||||
|
Exit Sub
|
||||||
|
End If
|
||||||
|
|
||||||
|
Dim errorMsg As String
|
||||||
|
Dim json As Object
|
||||||
|
Set json = makeHttpRequest("POST", "shift_ship_dates", JsonConverter.ConvertToJson(adjust), errorMsg)
|
||||||
|
|
||||||
|
If errorMsg <> "" Then
|
||||||
|
MsgBox errorMsg, vbOKOnly + vbExclamation, "Couldn't shift the selected ship dates."
|
||||||
|
Exit Sub
|
||||||
|
End If
|
||||||
|
|
||||||
|
ReDim res(json("x").Count - 1, 34)
|
||||||
|
|
||||||
|
Dim i As Long
|
||||||
|
For i = 0 To UBound(res, 1)
|
||||||
|
res(i, 0) = json("x")(i + 1)("bill_cust_descr")
|
||||||
|
res(i, 1) = json("x")(i + 1)("billto_group")
|
||||||
|
res(i, 2) = json("x")(i + 1)("ship_cust_descr")
|
||||||
|
res(i, 3) = json("x")(i + 1)("shipto_group")
|
||||||
|
res(i, 4) = json("x")(i + 1)("quota_rep_descr")
|
||||||
|
res(i, 5) = json("x")(i + 1)("director")
|
||||||
|
res(i, 6) = json("x")(i + 1)("segm")
|
||||||
|
res(i, 7) = json("x")(i + 1)("substance")
|
||||||
|
res(i, 8) = json("x")(i + 1)("chan")
|
||||||
|
res(i, 9) = json("x")(i + 1)("chansub")
|
||||||
|
res(i, 10) = json("x")(i + 1)("part_descr")
|
||||||
|
res(i, 11) = json("x")(i + 1)("part_group")
|
||||||
|
res(i, 12) = json("x")(i + 1)("branding")
|
||||||
|
res(i, 13) = json("x")(i + 1)("majg_descr")
|
||||||
|
res(i, 14) = json("x")(i + 1)("ming_descr")
|
||||||
|
res(i, 15) = json("x")(i + 1)("majs_descr")
|
||||||
|
res(i, 16) = json("x")(i + 1)("mins_descr")
|
||||||
|
res(i, 17) = json("x")(i + 1)("order_season")
|
||||||
|
res(i, 18) = json("x")(i + 1)("order_month")
|
||||||
|
res(i, 19) = json("x")(i + 1)("ship_season")
|
||||||
|
res(i, 20) = json("x")(i + 1)("ship_month")
|
||||||
|
res(i, 21) = json("x")(i + 1)("request_season")
|
||||||
|
res(i, 22) = json("x")(i + 1)("request_month")
|
||||||
|
res(i, 23) = json("x")(i + 1)("promo")
|
||||||
|
res(i, 24) = json("x")(i + 1)("value_loc")
|
||||||
|
res(i, 25) = json("x")(i + 1)("value_usd")
|
||||||
|
res(i, 26) = json("x")(i + 1)("cost_loc")
|
||||||
|
res(i, 27) = json("x")(i + 1)("cost_usd")
|
||||||
|
res(i, 28) = json("x")(i + 1)("units")
|
||||||
|
res(i, 29) = json("x")(i + 1)("version")
|
||||||
|
res(i, 30) = json("x")(i + 1)("iter")
|
||||||
|
res(i, 31) = json("x")(i + 1)("logid")
|
||||||
|
res(i, 32) = json("x")(i + 1)("tag")
|
||||||
|
res(i, 33) = json("x")(i + 1)("comment")
|
||||||
|
res(i, 34) = json("x")(i + 1)("pounds")
|
||||||
|
Next i
|
||||||
|
|
||||||
|
errorMsg = ""
|
||||||
|
|
||||||
|
i = shData.UsedRange.Rows.Count + 1
|
||||||
|
Call Utils.SHTp_DumpVar(res, shData.Name, i, 1, False, False, True)
|
||||||
|
shShipments.PivotTables("ptShipments").PivotCache.Refresh
|
||||||
|
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub UserForm_Activate()
|
||||||
|
Me.Caption = "Ship Date Shifting " & shConfig.Range("version").value
|
||||||
|
|
||||||
|
Call Utils.frmListBoxHeader(Me.lbSHDR, Me.lbSDET, "Field", "Selection")
|
||||||
|
|
||||||
|
With txtSelectedMonth
|
||||||
|
.text = Format(currentValue, numberFormat)
|
||||||
|
.BackColor = &H80000018
|
||||||
|
.Enabled = False
|
||||||
|
End With
|
||||||
|
|
||||||
|
lblSeasonCurrent.Caption = selectedSeason
|
||||||
|
lblSeasonNext.Caption = selectedSeason + 1
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
' Control Accessors
|
||||||
|
Private Function txtSelectedMonth() As MSForms.TextBox
|
||||||
|
Set txtSelectedMonth = txtMonth(selectedSeason, selectedMonth)
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Function txtMonth(season As Integer, month As Integer) As MSForms.TextBox
|
||||||
|
Set txtMonth = Me.Controls("txt" & IIf(season = selectedSeason, "Current", "Next") & Format(month, "00"))
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Function lblPctSelectedMonth() As MSForms.Label
|
||||||
|
Set lblPctSelectedMonth = lblPctMonth(selectedSeason, selectedMonth)
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Function lblPctMonth(season As Integer, month As Integer) As MSForms.Label
|
||||||
|
Set lblPctMonth = Me.Controls("lblPct" & IIf(season = selectedSeason, "Current", "Next") & Format(month, "00"))
|
||||||
|
End Function
|
||||||
|
|
||||||
|
|
||||||
|
Private Sub RemoveFormatting(txtBx As MSForms.TextBox)
|
||||||
|
txtBx.text = RemoveFormat(txtBx.text)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Function RemoveFormat(text As String)
|
||||||
|
RemoveFormat = Replace(Replace(text, "$", ""), ",", "")
|
||||||
|
End Function
|
||||||
|
|
||||||
|
Private Sub ApplyFormatting(txtBx As MSForms.TextBox)
|
||||||
|
txtBx.text = Format(txtBx.text, numberFormat)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
|
||||||
|
Private Function Recalculate(updated As MSForms.TextBox) As Boolean
|
||||||
|
Dim month As MSForms.TextBox
|
||||||
|
Dim distributed As Double
|
||||||
|
Dim before As Double
|
||||||
|
Dim m As Integer
|
||||||
|
For m = 1 To 12
|
||||||
|
Set month = txtMonth(selectedSeason, m)
|
||||||
|
If m < selectedMonth Then before = before + Val(RemoveFormat(month.text))
|
||||||
|
If m <> selectedMonth Then distributed = distributed + Val(RemoveFormat(month.text))
|
||||||
|
|
||||||
|
distributed = distributed + Val(RemoveFormat(txtMonth(selectedSeason + 1, m).text))
|
||||||
|
Next
|
||||||
|
|
||||||
|
Dim remaining As Double
|
||||||
|
remaining = Val(RemoveFormat(txtSelectedMonth.text))
|
||||||
|
|
||||||
|
If remaining = 0 And distributed > currentValue Then
|
||||||
|
MsgBox "You cannot shift more than you started with.", vbOKOnly + vbExclamation
|
||||||
|
Recalculate = True ' Failure. Set Cancel=True to stop leaving the textbox.
|
||||||
|
Exit Function
|
||||||
|
ElseIf distributed <= currentValue Then
|
||||||
|
txtSelectedMonth.text = currentValue - distributed
|
||||||
|
Else
|
||||||
|
updated.text = txtSelectedMonth.text
|
||||||
|
txtSelectedMonth.text = 0
|
||||||
|
End If
|
||||||
|
|
||||||
|
ApplyFormatting updated
|
||||||
|
ApplyFormatting txtSelectedMonth
|
||||||
|
lblWarning.Visible = before > 0
|
||||||
|
|
||||||
|
For m = 1 To 12
|
||||||
|
If txtMonth(selectedSeason, m).text = "" Then
|
||||||
|
lblPctMonth(selectedSeason, m).Caption = ""
|
||||||
|
Else
|
||||||
|
lblPctMonth(selectedSeason, m).Caption = Format(txtMonth(selectedSeason, m).text / currentValue, "0%")
|
||||||
|
End If
|
||||||
|
If txtMonth(selectedSeason + 1, m).text = "" Then
|
||||||
|
lblPctMonth(selectedSeason + 1, m).Caption = ""
|
||||||
|
Else
|
||||||
|
lblPctMonth(selectedSeason + 1, m).Caption = Format(txtMonth(selectedSeason + 1, m).text / currentValue, "0%")
|
||||||
|
End If
|
||||||
|
Next
|
||||||
|
Recalculate = False ' Success
|
||||||
|
End Function
|
||||||
|
|
||||||
|
|
||||||
|
' Remove formatting before editing a textbox. After editing, restore formatting,
|
||||||
|
' and recalculate the selected month's value.
|
||||||
|
Private Sub txtCurrent01_Enter()
|
||||||
|
RemoveFormatting txtCurrent01
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtCurrent01_Exit(ByVal Cancel As MSForms.ReturnBoolean)
|
||||||
|
Cancel = Recalculate(txtCurrent01)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtCurrent02_Enter()
|
||||||
|
RemoveFormatting txtCurrent02
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtCurrent02_Exit(ByVal Cancel As MSForms.ReturnBoolean)
|
||||||
|
Cancel = Recalculate(txtCurrent02)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtCurrent03_Enter()
|
||||||
|
RemoveFormatting txtCurrent03
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtCurrent03_Exit(ByVal Cancel As MSForms.ReturnBoolean)
|
||||||
|
Cancel = Recalculate(txtCurrent03)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtCurrent04_Enter()
|
||||||
|
RemoveFormatting txtCurrent04
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtCurrent04_Exit(ByVal Cancel As MSForms.ReturnBoolean)
|
||||||
|
Cancel = Recalculate(txtCurrent04)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtCurrent05_Enter()
|
||||||
|
RemoveFormatting txtCurrent05
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtCurrent05_Exit(ByVal Cancel As MSForms.ReturnBoolean)
|
||||||
|
Cancel = Recalculate(txtCurrent05)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtCurrent06_Enter()
|
||||||
|
RemoveFormatting txtCurrent06
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtCurrent06_Exit(ByVal Cancel As MSForms.ReturnBoolean)
|
||||||
|
Cancel = Recalculate(txtCurrent06)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtCurrent07_Enter()
|
||||||
|
RemoveFormatting txtCurrent07
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtCurrent07_Exit(ByVal Cancel As MSForms.ReturnBoolean)
|
||||||
|
Cancel = Recalculate(txtCurrent07)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtCurrent08_Enter()
|
||||||
|
RemoveFormatting txtCurrent08
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtCurrent08_Exit(ByVal Cancel As MSForms.ReturnBoolean)
|
||||||
|
Cancel = Recalculate(txtCurrent08)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtCurrent09_Enter()
|
||||||
|
RemoveFormatting txtCurrent09
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtCurrent09_Exit(ByVal Cancel As MSForms.ReturnBoolean)
|
||||||
|
Cancel = Recalculate(txtCurrent09)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtCurrent10_Enter()
|
||||||
|
RemoveFormatting txtCurrent10
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtCurrent10_Exit(ByVal Cancel As MSForms.ReturnBoolean)
|
||||||
|
Cancel = Recalculate(txtCurrent10)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtCurrent11_Enter()
|
||||||
|
RemoveFormatting txtCurrent11
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtCurrent11_Exit(ByVal Cancel As MSForms.ReturnBoolean)
|
||||||
|
Cancel = Recalculate(txtCurrent11)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtCurrent12_Enter()
|
||||||
|
RemoveFormatting txtCurrent12
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtCurrent12_Exit(ByVal Cancel As MSForms.ReturnBoolean)
|
||||||
|
Cancel = Recalculate(txtCurrent12)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtNext01_Enter()
|
||||||
|
RemoveFormatting txtNext01
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtNext01_Exit(ByVal Cancel As MSForms.ReturnBoolean)
|
||||||
|
Cancel = Recalculate(txtNext01)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtNext02_Enter()
|
||||||
|
RemoveFormatting txtNext02
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtNext02_Exit(ByVal Cancel As MSForms.ReturnBoolean)
|
||||||
|
Cancel = Recalculate(txtNext02)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtNext03_Enter()
|
||||||
|
RemoveFormatting txtNext03
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtNext03_Exit(ByVal Cancel As MSForms.ReturnBoolean)
|
||||||
|
Cancel = Recalculate(txtNext03)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtNext04_Enter()
|
||||||
|
RemoveFormatting txtNext04
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtNext04_Exit(ByVal Cancel As MSForms.ReturnBoolean)
|
||||||
|
Cancel = Recalculate(txtNext04)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtNext05_Enter()
|
||||||
|
RemoveFormatting txtNext05
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtNext05_Exit(ByVal Cancel As MSForms.ReturnBoolean)
|
||||||
|
Cancel = Recalculate(txtNext05)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtNext06_Enter()
|
||||||
|
RemoveFormatting txtNext06
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtNext06_Exit(ByVal Cancel As MSForms.ReturnBoolean)
|
||||||
|
Cancel = Recalculate(txtNext06)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtNext07_Enter()
|
||||||
|
RemoveFormatting txtNext07
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtNext07_Exit(ByVal Cancel As MSForms.ReturnBoolean)
|
||||||
|
Cancel = Recalculate(txtNext07)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtNext08_Enter()
|
||||||
|
RemoveFormatting txtNext08
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtNext08_Exit(ByVal Cancel As MSForms.ReturnBoolean)
|
||||||
|
Cancel = Recalculate(txtNext08)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtNext09_Enter()
|
||||||
|
RemoveFormatting txtNext09
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtNext09_Exit(ByVal Cancel As MSForms.ReturnBoolean)
|
||||||
|
Cancel = Recalculate(txtNext09)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtNext10_Enter()
|
||||||
|
RemoveFormatting txtNext10
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtNext10_Exit(ByVal Cancel As MSForms.ReturnBoolean)
|
||||||
|
Cancel = Recalculate(txtNext10)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtNext11_Enter()
|
||||||
|
RemoveFormatting txtNext11
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtNext11_Exit(ByVal Cancel As MSForms.ReturnBoolean)
|
||||||
|
Cancel = Recalculate(txtNext11)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtNext12_Enter()
|
||||||
|
RemoveFormatting txtNext12
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
Private Sub txtNext12_Exit(ByVal Cancel As MSForms.ReturnBoolean)
|
||||||
|
Cancel = Recalculate(txtNext12)
|
||||||
|
End Sub
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
BIN
Master Template.xlsm_EXPORTS/shipDateShifter.frx
Normal file
BIN
Master Template.xlsm_EXPORTS/shipDateShifter.frx
Normal file
Binary file not shown.
16
index.js
16
index.js
@ -365,3 +365,19 @@ server.post('/new_basket', bodyParser.json(), function(req, res) {
|
|||||||
Postgres.FirstRow(sql, res)
|
Postgres.FirstRow(sql, res)
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
|
|
||||||
|
server.post('/shift_ship_dates', bodyParser.json(), function(req, res) {
|
||||||
|
process_route('POST /shift_ship_dates', 'Change ship dates to level out production.', './route_sql/shift_ship_date.sql', req, res,
|
||||||
|
function(sql) {
|
||||||
|
var where = build_where(req, res);
|
||||||
|
if (!where) return;
|
||||||
|
|
||||||
|
req.body.stamp = new Date().toISOString()
|
||||||
|
sql = sql.replace(new RegExp("where_clause", 'g'), where);
|
||||||
|
sql = sql.replace(new RegExp("replace_request", 'g'), JSON.stringify(req.body));
|
||||||
|
sql = sql.replace(new RegExp("replace_version", 'g'), req.body.scenario.version);
|
||||||
|
sql = sql.replace(new RegExp("replace_source", 'g'), req.body.source);
|
||||||
|
sql = sql.replace(new RegExp("replace_iterdef", 'g'), JSON.stringify(req.body));
|
||||||
|
Postgres.FirstRow(sql, res)
|
||||||
|
});
|
||||||
|
})
|
||||||
|
|||||||
477
route_sql/shift_ship_date.sql
Normal file
477
route_sql/shift_ship_date.sql
Normal file
@ -0,0 +1,477 @@
|
|||||||
|
-- Connection: usmidsap02.ubm
|
||||||
|
WITH
|
||||||
|
/*
|
||||||
|
the volume must be expressed in terms of units, since that is what it will be scaling
|
||||||
|
*/
|
||||||
|
input AS (
|
||||||
|
select $$replace_request$$::json spec
|
||||||
|
)
|
||||||
|
-- select 'input', * from input
|
||||||
|
--
|
||||||
|
,target as (
|
||||||
|
select
|
||||||
|
ship_season, ship_month, pct
|
||||||
|
from
|
||||||
|
input i,
|
||||||
|
json_to_recordset(i.spec->'distributions') AS x(ship_season int, ship_month text, pct numeric)
|
||||||
|
)
|
||||||
|
-- select 'target', * from target
|
||||||
|
--
|
||||||
|
,mseq AS (
|
||||||
|
SELECT * FROM
|
||||||
|
(
|
||||||
|
VALUES
|
||||||
|
('01 - Jun', 1, 6, -1)
|
||||||
|
,('02 - Jul', 2, 7, -1)
|
||||||
|
,('03 - Aug', 3, 8, -1)
|
||||||
|
,('04 - Sep', 4, 9, -1)
|
||||||
|
,('05 - Oct', 5, 10, -1)
|
||||||
|
,('06 - Nov', 6, 11, -1)
|
||||||
|
,('07 - Dec', 7, 12, -1)
|
||||||
|
,('08 - Jan', 8, 1, 0)
|
||||||
|
,('09 - Feb', 9, 2, 0)
|
||||||
|
,('10 - Mar', 10, 3, 0)
|
||||||
|
,('11 - Apr', 11, 4, 0)
|
||||||
|
,('12 - May', 12, 5, 0)
|
||||||
|
) x(m,s,cal,yr)
|
||||||
|
)
|
||||||
|
-- select 'mseq', * from mseq
|
||||||
|
--
|
||||||
|
,basemix AS (
|
||||||
|
SELECT
|
||||||
|
fspr
|
||||||
|
,plnt
|
||||||
|
,promo
|
||||||
|
,terms
|
||||||
|
,bill_cust_descr
|
||||||
|
,ship_cust_descr
|
||||||
|
,dsm
|
||||||
|
,quota_rep_descr
|
||||||
|
,director
|
||||||
|
,billto_group
|
||||||
|
,shipto_group
|
||||||
|
,chan
|
||||||
|
,chansub
|
||||||
|
,chan_retail
|
||||||
|
,part
|
||||||
|
,part_descr
|
||||||
|
,part_group
|
||||||
|
,branding
|
||||||
|
,majg_descr
|
||||||
|
,ming_descr
|
||||||
|
,majs_descr
|
||||||
|
,mins_descr
|
||||||
|
,segm
|
||||||
|
,substance
|
||||||
|
,fs_line
|
||||||
|
,r_currency
|
||||||
|
,coalesce(r_rate,1) as r_rate
|
||||||
|
,c_currency
|
||||||
|
,coalesce(c_rate,1) as c_rate
|
||||||
|
,sum(coalesce(units,0)) units
|
||||||
|
,sum(coalesce(value_loc,0)) value_loc
|
||||||
|
,sum(coalesce(value_usd,0)) value_usd
|
||||||
|
,sum(coalesce(cost_loc,0)) cost_loc
|
||||||
|
,sum(coalesce(cost_usd,0)) cost_usd
|
||||||
|
,sum(coalesce(pounds,0)) pounds
|
||||||
|
,calc_status
|
||||||
|
,flag
|
||||||
|
,order_date
|
||||||
|
,order_month
|
||||||
|
,order_season
|
||||||
|
,request_date
|
||||||
|
,request_month
|
||||||
|
,request_season
|
||||||
|
,ship_date
|
||||||
|
,ship_month
|
||||||
|
,ship_season
|
||||||
|
FROM
|
||||||
|
rlarp.osm_pool
|
||||||
|
WHERE
|
||||||
|
-----------------scenario----------------------------
|
||||||
|
where_clause
|
||||||
|
-----------------additional params-------------------
|
||||||
|
AND order_date <= ship_date
|
||||||
|
GROUP BY
|
||||||
|
fspr
|
||||||
|
,plnt
|
||||||
|
,promo
|
||||||
|
,terms
|
||||||
|
,bill_cust_descr
|
||||||
|
,ship_cust_descr
|
||||||
|
,dsm
|
||||||
|
,quota_rep_descr
|
||||||
|
,director
|
||||||
|
,billto_group
|
||||||
|
,shipto_group
|
||||||
|
,chan
|
||||||
|
,chansub
|
||||||
|
,chan_retail
|
||||||
|
,part
|
||||||
|
,part_descr
|
||||||
|
,part_group
|
||||||
|
,branding
|
||||||
|
,majg_descr
|
||||||
|
,ming_descr
|
||||||
|
,majs_descr
|
||||||
|
,mins_descr
|
||||||
|
,segm
|
||||||
|
,substance
|
||||||
|
,fs_line
|
||||||
|
,r_currency
|
||||||
|
,r_rate
|
||||||
|
,c_currency
|
||||||
|
,c_rate
|
||||||
|
,calc_status
|
||||||
|
,flag
|
||||||
|
,order_date
|
||||||
|
,order_month
|
||||||
|
,order_season
|
||||||
|
,request_date
|
||||||
|
,request_month
|
||||||
|
,request_season
|
||||||
|
,ship_date
|
||||||
|
,ship_month
|
||||||
|
,ship_season
|
||||||
|
)
|
||||||
|
-- select 'basemix', * from basemix
|
||||||
|
--
|
||||||
|
,subtractions AS (
|
||||||
|
SELECT
|
||||||
|
fspr
|
||||||
|
,plnt
|
||||||
|
,promo
|
||||||
|
,terms
|
||||||
|
,bill_cust_descr
|
||||||
|
,ship_cust_descr
|
||||||
|
,dsm
|
||||||
|
,quota_rep_descr
|
||||||
|
,director
|
||||||
|
,billto_group
|
||||||
|
,shipto_group
|
||||||
|
,chan
|
||||||
|
,chansub
|
||||||
|
,chan_retail
|
||||||
|
,part
|
||||||
|
,part_descr
|
||||||
|
,part_group
|
||||||
|
,branding
|
||||||
|
,majg_descr
|
||||||
|
,ming_descr
|
||||||
|
,majs_descr
|
||||||
|
,mins_descr
|
||||||
|
,segm
|
||||||
|
,substance
|
||||||
|
,fs_line
|
||||||
|
,r_currency
|
||||||
|
,r_rate
|
||||||
|
,c_currency
|
||||||
|
,c_rate
|
||||||
|
,-(1 - target.pct) * units as units
|
||||||
|
,-(1 - target.pct) * value_loc as value_loc
|
||||||
|
,-(1 - target.pct) * value_usd as value_usd
|
||||||
|
,-(1 - target.pct) * cost_loc as cost_loc
|
||||||
|
,-(1 - target.pct) * cost_usd as cost_usd
|
||||||
|
,-(1 - target.pct) * pounds as pounds
|
||||||
|
,calc_status
|
||||||
|
,flag
|
||||||
|
,order_date
|
||||||
|
,order_month
|
||||||
|
,order_season
|
||||||
|
,request_date
|
||||||
|
,request_month
|
||||||
|
,request_season
|
||||||
|
,ship_date
|
||||||
|
,basemix.ship_month
|
||||||
|
,basemix.ship_season
|
||||||
|
FROM basemix
|
||||||
|
INNER JOIN target ON
|
||||||
|
basemix.ship_season = target.ship_season AND
|
||||||
|
basemix.ship_month = target.ship_month
|
||||||
|
)
|
||||||
|
-- select 'subtraction', * from subtraction
|
||||||
|
--
|
||||||
|
,additions AS (
|
||||||
|
SELECT
|
||||||
|
fspr
|
||||||
|
,plnt
|
||||||
|
,promo
|
||||||
|
,terms
|
||||||
|
,bill_cust_descr
|
||||||
|
,ship_cust_descr
|
||||||
|
,dsm
|
||||||
|
,quota_rep_descr
|
||||||
|
,director
|
||||||
|
,billto_group
|
||||||
|
,shipto_group
|
||||||
|
,chan
|
||||||
|
,chansub
|
||||||
|
,chan_retail
|
||||||
|
,part
|
||||||
|
,part_descr
|
||||||
|
,part_group
|
||||||
|
,branding
|
||||||
|
,majg_descr
|
||||||
|
,ming_descr
|
||||||
|
,majs_descr
|
||||||
|
,mins_descr
|
||||||
|
,segm
|
||||||
|
,substance
|
||||||
|
,fs_line
|
||||||
|
,r_currency
|
||||||
|
,r_rate
|
||||||
|
,c_currency
|
||||||
|
,c_rate
|
||||||
|
,t.pct * coalesce(units) as units
|
||||||
|
,t.pct * coalesce(value_loc) as value_loc
|
||||||
|
,t.pct * coalesce(value_usd) as value_usd
|
||||||
|
,t.pct * coalesce(cost_loc) as cost_loc
|
||||||
|
,t.pct * coalesce(cost_usd) as cost_usd
|
||||||
|
,t.pct * coalesce(pounds) as pounds
|
||||||
|
,calc_status
|
||||||
|
,flag
|
||||||
|
,order_date
|
||||||
|
,order_month
|
||||||
|
,order_season
|
||||||
|
,request_date
|
||||||
|
,request_month
|
||||||
|
,request_season
|
||||||
|
-- These case statements fix the situation where a ship date was specified that is earlier than
|
||||||
|
-- the order date. If that happens, the new ship date becomes order date + 15 days. The case
|
||||||
|
-- statements also handle rolling over to the next month or season.
|
||||||
|
,case
|
||||||
|
when t.ship_season <= b.order_season AND t.ship_month < b.order_month then b.order_date + 15
|
||||||
|
else make_date(t.ship_season, tMonths.cal, 1)
|
||||||
|
end as ship_date
|
||||||
|
,case
|
||||||
|
when t.ship_season <= b.order_season AND t.ship_month < b.order_month then bMonths.m
|
||||||
|
else t.ship_month
|
||||||
|
end as ship_month
|
||||||
|
,case
|
||||||
|
when t.ship_season <= b.order_season AND t.ship_month < b.order_month then
|
||||||
|
case
|
||||||
|
when b.order_month > bMonths.m then b.order_season + 1 -- May-to-June rollover
|
||||||
|
else b.order_season
|
||||||
|
end
|
||||||
|
else t.ship_season
|
||||||
|
end as ship_season
|
||||||
|
FROM basemix b
|
||||||
|
LEFT OUTER JOIN target t ON
|
||||||
|
b.ship_season <> t.ship_season OR
|
||||||
|
b.ship_month <> t.ship_month
|
||||||
|
INNER JOIN mseq bMonths ON
|
||||||
|
EXTRACT (month FROM (b.order_date + 15)) = bMonths.cal
|
||||||
|
INNER JOIN mseq tMonths ON
|
||||||
|
t.ship_month = tMonths.m
|
||||||
|
)
|
||||||
|
-- select 'additions', * from additions
|
||||||
|
--
|
||||||
|
,log AS (
|
||||||
|
INSERT INTO rlarp.osm_log(doc) SELECT $$replace_iterdef$$::jsonb doc RETURNING *
|
||||||
|
)
|
||||||
|
-- select 'log', * from log
|
||||||
|
--
|
||||||
|
,final AS (
|
||||||
|
SELECT
|
||||||
|
fspr
|
||||||
|
,plnt
|
||||||
|
,promo
|
||||||
|
,terms
|
||||||
|
,bill_cust_descr
|
||||||
|
,ship_cust_descr
|
||||||
|
,dsm
|
||||||
|
,quota_rep_descr
|
||||||
|
,director
|
||||||
|
,billto_group
|
||||||
|
,shipto_group
|
||||||
|
,chan
|
||||||
|
,chansub
|
||||||
|
,chan_retail
|
||||||
|
,part
|
||||||
|
,part_descr
|
||||||
|
,part_group
|
||||||
|
,branding
|
||||||
|
,majg_descr
|
||||||
|
,ming_descr
|
||||||
|
,majs_descr
|
||||||
|
,mins_descr
|
||||||
|
,segm
|
||||||
|
,substance
|
||||||
|
,fs_line
|
||||||
|
,r_currency
|
||||||
|
,r_rate
|
||||||
|
,c_currency
|
||||||
|
,c_rate
|
||||||
|
,units
|
||||||
|
,value_loc
|
||||||
|
,value_usd
|
||||||
|
,cost_loc
|
||||||
|
,cost_usd
|
||||||
|
,calc_status
|
||||||
|
,flag
|
||||||
|
,order_date
|
||||||
|
,order_month
|
||||||
|
,order_season
|
||||||
|
,request_date
|
||||||
|
,request_month
|
||||||
|
,request_season
|
||||||
|
,ship_date
|
||||||
|
,ship_month
|
||||||
|
,ship_season
|
||||||
|
,'replace_version' "version"
|
||||||
|
,'replace_source' iter
|
||||||
|
,log.id
|
||||||
|
,COALESCE(log.doc->>'tag','Volume') "tag"
|
||||||
|
,log.doc->>'message' "comment"
|
||||||
|
,log.doc->>'type' module
|
||||||
|
,pounds
|
||||||
|
FROM subtractions
|
||||||
|
CROSS JOIN log
|
||||||
|
UNION ALL
|
||||||
|
SELECT
|
||||||
|
fspr
|
||||||
|
,plnt
|
||||||
|
,promo
|
||||||
|
,terms
|
||||||
|
,bill_cust_descr
|
||||||
|
,ship_cust_descr
|
||||||
|
,dsm
|
||||||
|
,quota_rep_descr
|
||||||
|
,director
|
||||||
|
,billto_group
|
||||||
|
,shipto_group
|
||||||
|
,chan
|
||||||
|
,chansub
|
||||||
|
,chan_retail
|
||||||
|
,part
|
||||||
|
,part_descr
|
||||||
|
,part_group
|
||||||
|
,branding
|
||||||
|
,majg_descr
|
||||||
|
,ming_descr
|
||||||
|
,majs_descr
|
||||||
|
,mins_descr
|
||||||
|
,segm
|
||||||
|
,substance
|
||||||
|
,fs_line
|
||||||
|
,r_currency
|
||||||
|
,r_rate
|
||||||
|
,c_currency
|
||||||
|
,c_rate
|
||||||
|
,units
|
||||||
|
,value_loc
|
||||||
|
,value_usd
|
||||||
|
,cost_loc
|
||||||
|
,cost_usd
|
||||||
|
,calc_status
|
||||||
|
,flag
|
||||||
|
,order_date
|
||||||
|
,order_month
|
||||||
|
,order_season
|
||||||
|
,request_date
|
||||||
|
,request_month
|
||||||
|
,request_season
|
||||||
|
,ship_date
|
||||||
|
,ship_month
|
||||||
|
,ship_season
|
||||||
|
,'replace_version' "version"
|
||||||
|
,'replace_source' iter
|
||||||
|
,log.id
|
||||||
|
,COALESCE(log.doc->>'tag','Volume') "tag"
|
||||||
|
,log.doc->>'message' "comment"
|
||||||
|
,log.doc->>'type' module
|
||||||
|
,pounds
|
||||||
|
FROM additions
|
||||||
|
CROSS JOIN log
|
||||||
|
)
|
||||||
|
-- select 'final', * from final
|
||||||
|
--
|
||||||
|
, ins AS (
|
||||||
|
INSERT INTO rlarp.osm_pool SELECT * FROM final RETURNING *
|
||||||
|
)
|
||||||
|
,insagg AS (
|
||||||
|
SELECT
|
||||||
|
---------customer info-----------------
|
||||||
|
bill_cust_descr
|
||||||
|
,billto_group
|
||||||
|
,ship_cust_descr
|
||||||
|
,shipto_group
|
||||||
|
,quota_rep_descr
|
||||||
|
,director
|
||||||
|
,segm
|
||||||
|
,substance
|
||||||
|
,chan
|
||||||
|
,chansub
|
||||||
|
---------product info------------------
|
||||||
|
,majg_descr
|
||||||
|
,ming_descr
|
||||||
|
,majs_descr
|
||||||
|
,mins_descr
|
||||||
|
--,brand
|
||||||
|
--,part_family
|
||||||
|
,part_group
|
||||||
|
,branding
|
||||||
|
--,color
|
||||||
|
,part_descr
|
||||||
|
---------dates-------------------------
|
||||||
|
,order_season
|
||||||
|
,order_month
|
||||||
|
,ship_season
|
||||||
|
,ship_month
|
||||||
|
,request_season
|
||||||
|
,request_month
|
||||||
|
,promo
|
||||||
|
,version
|
||||||
|
,iter
|
||||||
|
,logid
|
||||||
|
,tag
|
||||||
|
,comment
|
||||||
|
--------values-------------------------
|
||||||
|
,sum(value_loc) value_loc
|
||||||
|
,sum(value_usd) value_usd
|
||||||
|
,sum(cost_loc) cost_loc
|
||||||
|
,sum(cost_usd) cost_usd
|
||||||
|
,sum(units) units
|
||||||
|
,sum(pounds) pounds
|
||||||
|
FROM
|
||||||
|
ins
|
||||||
|
GROUP BY
|
||||||
|
---------customer info-----------------
|
||||||
|
bill_cust_descr
|
||||||
|
,billto_group
|
||||||
|
,ship_cust_descr
|
||||||
|
,shipto_group
|
||||||
|
,quota_rep_descr
|
||||||
|
,director
|
||||||
|
,segm
|
||||||
|
,substance
|
||||||
|
,chan
|
||||||
|
,chansub
|
||||||
|
---------product info------------------
|
||||||
|
,majg_descr
|
||||||
|
,ming_descr
|
||||||
|
,majs_descr
|
||||||
|
,mins_descr
|
||||||
|
--,brand
|
||||||
|
--,part_family
|
||||||
|
,part_group
|
||||||
|
,branding
|
||||||
|
--,color
|
||||||
|
,part_descr
|
||||||
|
---------dates-------------------------
|
||||||
|
,order_season
|
||||||
|
,order_month
|
||||||
|
,ship_season
|
||||||
|
,ship_month
|
||||||
|
,request_season
|
||||||
|
,request_month
|
||||||
|
,promo
|
||||||
|
,version
|
||||||
|
,iter
|
||||||
|
,logid
|
||||||
|
,tag
|
||||||
|
,comment
|
||||||
|
)
|
||||||
|
-- select 'insagg', * from insagg
|
||||||
|
--
|
||||||
|
SELECT json_agg(row_to_json(insagg)) x from insagg
|
||||||
Loading…
Reference in New Issue
Block a user