create new isolated module for working with price lists
This commit is contained in:
parent
3ce9b371ca
commit
eb630686aa
471
PriceLists.bas
Normal file
471
PriceLists.bas
Normal file
@ -0,0 +1,471 @@
|
||||
Attribute VB_Name = "PriceLists"
|
||||
Sub extract_price_matrix_suff()
|
||||
|
||||
'------------------------------------setup-------------------------------------------------
|
||||
|
||||
Dim wapi As New Windows_API
|
||||
Dim x As New TheBigOne
|
||||
Dim tbl() As Variant
|
||||
Dim unp() As String
|
||||
Dim unv() As Variant
|
||||
Dim unps() As String
|
||||
Dim sql As String
|
||||
Dim error As String
|
||||
Dim orig As Range
|
||||
Dim ini As Range
|
||||
Dim cms_pl() As String
|
||||
Dim pw As String
|
||||
Dim new_sh As Worksheet
|
||||
Dim ws As Worksheet
|
||||
Dim cp As CustomProperty
|
||||
|
||||
'------------------------------------selection-------------------------------------------------
|
||||
|
||||
Set ini = Application.Selection
|
||||
|
||||
Selection.CurrentRegion.Select
|
||||
|
||||
Set orig = Application.Selection
|
||||
|
||||
'--------------------------------test if valid price matrix------------------------------
|
||||
|
||||
If Selection.Cells.Count = 1 Then
|
||||
MsgBox ("selection is not a table")
|
||||
orig.Select
|
||||
Exit Sub
|
||||
End If
|
||||
|
||||
tbl = Selection
|
||||
|
||||
If UBound(tbl, 1) < 2 Then error = "selection is not a valid price matrix"
|
||||
If UBound(tbl, 2) <> 9 Then error = "selection is not a valid price matrix"
|
||||
|
||||
If Not error = "" Then
|
||||
MsgBox (error)
|
||||
Exit Sub
|
||||
End If
|
||||
|
||||
'-----------------------------unpivot price matrix into new array-----------------------------
|
||||
|
||||
Dim i As Long
|
||||
Dim j As Long
|
||||
Dim k As Long
|
||||
Dim m As Long
|
||||
k = 0
|
||||
ReDim unp(9, (UBound(tbl, 1) - 1) * 3)
|
||||
'iterate through rows
|
||||
For i = 2 To UBound(tbl, 1)
|
||||
'3 iterations per row
|
||||
For m = 0 To 2
|
||||
k = k + 1
|
||||
'part
|
||||
unp(0, k) = tbl(i, 1) 'stlye code
|
||||
unp(1, k) = tbl(i, 2) 'color tier
|
||||
unp(2, k) = tbl(i, 3) 'branding
|
||||
unp(3, k) = tbl(i, 4) 'kit
|
||||
unp(4, k) = tbl(i, 5) 'suffix
|
||||
unp(5, k) = tbl(i, 6) 'container
|
||||
unp(6, k) = m + 1 'volume break
|
||||
unp(7, k) = tbl(i, 7 + m) 'price
|
||||
unp(8, k) = i 'orig row
|
||||
unp(9, k) = 7 + m 'orig col
|
||||
Next m
|
||||
Next i
|
||||
unp(0, 0) = "stlc"
|
||||
unp(1, 0) = "coltier"
|
||||
unp(2, 0) = "branding"
|
||||
unp(3, 0) = "accs"
|
||||
unp(4, 0) = "suffix"
|
||||
unp(5, 0) = "container"
|
||||
unp(6, 0) = "volume"
|
||||
unp(7, 0) = "price"
|
||||
unp(8, 0) = "orig_row"
|
||||
unp(9, 0) = "orig_col"
|
||||
|
||||
|
||||
If Not x.TBLp_TestNumeric(unp, 7) Then
|
||||
MsgBox ("price is text")
|
||||
Exit Sub
|
||||
End If
|
||||
|
||||
unp = x.TBLp_Transpose(unp)
|
||||
unv = x.TBLp_StringToVar(unp)
|
||||
|
||||
'-------------------------prepare sql to upload---------------------------------------------------------------
|
||||
|
||||
'sql = x.SQLp_build_sql_values(unp, False, True, Db2, False)
|
||||
sql = x.json_from_table(unv, "", False)
|
||||
sql = "SELECT * FROM rlarp.build_f20_suff($$" & sql & "$$::jsonb)"
|
||||
Call wapi.ClipBoard_SetData(sql)
|
||||
|
||||
'If MsgBox(sql, vbOKCancel, "continue with build?") = vbCancel Then Exit Sub
|
||||
'Exit Sub
|
||||
login.Show
|
||||
If Not login.proceed Then Exit Sub
|
||||
|
||||
|
||||
If Not x.ADOp_OpenCon(0, PostgreSQLODBC, "usmidlnx01", False, login.tbU.text, login.tbP.text, "Port=5030;Database=ubm") Then
|
||||
MsgBox ("not able to connect to CMS" & vbCrLf & x.ADOo_errstring)
|
||||
Exit Sub
|
||||
End If
|
||||
|
||||
cms_pl = x.ADOp_SelectS(0, sql, True, 50000, True)
|
||||
|
||||
Call x.ADOp_CloseCon(0)
|
||||
|
||||
'Exit Sub
|
||||
|
||||
'--------------------------setup an output sheet if necessary-------------------------------
|
||||
|
||||
For Each ws In Application.Worksheets
|
||||
For Each cp In ws.CustomProperties
|
||||
If cp.Name = "spec_name" And cp.value = "price_list" Then
|
||||
Set new_sh = ws
|
||||
Exit For
|
||||
End If
|
||||
Next cp
|
||||
Next ws
|
||||
|
||||
If new_sh Is Nothing Then
|
||||
Set new_sh = Application.Worksheets.Add
|
||||
Call new_sh.CustomProperties.Add("spec_name", "price_list")
|
||||
new_sh.Name = "Price Build"
|
||||
End If
|
||||
|
||||
'-------------------------dump contents------------------------------------------------------
|
||||
|
||||
Call x.SHTp_Dump(cms_pl, new_sh.Name, 1, 1, True, True)
|
||||
new_sh.Select
|
||||
ActiveSheet.Cells(1, 1).CurrentRegion.Select
|
||||
Selection.Columns.AutoFit
|
||||
|
||||
Rows("1:1").Select
|
||||
With ActiveWindow
|
||||
.SplitColumn = 0
|
||||
.SplitRow = 1
|
||||
End With
|
||||
ActiveWindow.FreezePanes = True
|
||||
|
||||
|
||||
'--------------------------format source cells for any build issues--------------------------------
|
||||
|
||||
orig.Worksheet.Select
|
||||
|
||||
With orig.Interior
|
||||
.Pattern = xlNone
|
||||
.TintAndShade = 0
|
||||
.PatternTintAndShade = 0
|
||||
End With
|
||||
|
||||
'if a cell has even one valid hit, don't show an error
|
||||
'create a copy of tbl
|
||||
'the default value for cell is error, if any good values are found, they stay
|
||||
|
||||
j = 0
|
||||
For i = 1 To UBound(cms_pl, 1)
|
||||
Select Case cms_pl(i, 15)
|
||||
Case ""
|
||||
orig.Worksheet.Cells(orig.row + cms_pl(i, 13) - 1, orig.column + cms_pl(i, 14) - 1).Interior.ThemeColor = xlThemeColorAccent6
|
||||
Case "No UOM Conversion"
|
||||
If orig.Worksheet.Cells(orig.row + cms_pl(i, 13) - 1, orig.column + cms_pl(i, 14) - 1).Interior.ThemeColor <> xlThemeColorAccent6 Then
|
||||
orig.Worksheet.Cells(orig.row + cms_pl(i, 13) - 1, orig.column + cms_pl(i, 14) - 1).Interior.Color = RGB(255, 255, 161)
|
||||
End If
|
||||
Case "Inactive"
|
||||
If orig.Worksheet.Cells(orig.row + cms_pl(i, 13) - 1, orig.column + cms_pl(i, 14) - 1).Interior.ThemeColor <> xlThemeColorAccent6 Then
|
||||
orig.Worksheet.Cells(orig.row + cms_pl(i, 13) - 1, orig.column + cms_pl(i, 14) - 1).Interior.Color = RGB(255, 20, 161)
|
||||
End If
|
||||
Case "No SKU"
|
||||
If orig.Worksheet.Cells(orig.row + cms_pl(i, 13) - 1, orig.column + cms_pl(i, 14) - 1).Interior.ThemeColor <> xlThemeColorAccent6 Then
|
||||
orig.Worksheet.Cells(orig.row + cms_pl(i, 13) - 1, orig.column + cms_pl(i, 14) - 1).Interior.Color = RGB(20, 255, 161)
|
||||
End If
|
||||
End Select
|
||||
'if the current row/column is OK, advance to the next row/column
|
||||
j = 0
|
||||
Do Until cms_pl(i, 13) <> cms_pl(i + j, 13) Or cms_pl(i, 14) <> cms_pl(i + j, 14)
|
||||
j = j + 1
|
||||
If i + j >= UBound(cms_pl, 1) Then Exit Do
|
||||
Loop
|
||||
i = i + j - 1 '-1 becuase the "next i" will increment by 1 again
|
||||
Next i
|
||||
|
||||
Dim cell As Range
|
||||
|
||||
For Each cell In Application.Selection.Cells
|
||||
'if the cell fill is green, then a known good part was found, so cell to blank
|
||||
If cell.Interior.ThemeColor = xlThemeColorAccent6 Then
|
||||
cell.Interior.Pattern = xlNone
|
||||
Else
|
||||
If cell.Interior.Pattern = xlNone And cell.value <> "" Then
|
||||
cell.Interior.Color = RGB(255, 255, 161)
|
||||
End If
|
||||
End If
|
||||
'if at this point the cell has no background, then there is no part, so highlight it, but only if a price is listed
|
||||
Next cell
|
||||
|
||||
Selection.Columns(1).Interior.Pattern = xlNone
|
||||
Selection.Columns(2).Interior.Pattern = xlNone
|
||||
Selection.Columns(3).Interior.Pattern = xlNone
|
||||
Selection.Columns(4).Interior.Pattern = xlNone
|
||||
Selection.Columns(5).Interior.Pattern = xlNone
|
||||
Selection.Columns(6).Interior.Pattern = xlNone
|
||||
Selection.Rows(1).Interior.Pattern = xlNone
|
||||
|
||||
|
||||
'----------------------------cleanup-------------------------------------------------------------
|
||||
|
||||
Set x = Nothing
|
||||
|
||||
ini.Select
|
||||
|
||||
|
||||
End Sub
|
||||
|
||||
Sub price_load_plcore()
|
||||
|
||||
Dim x As New TheBigOne 'function library
|
||||
Dim sh As Worksheet 'target worksheet
|
||||
Dim big() As String 'all price lists in one array
|
||||
Dim unpivot() As String 'unwrap the columns into volume level rows
|
||||
Dim load() As String 'individual price list to be loaded
|
||||
Dim pcount As Long 'count of price list
|
||||
Dim pcol() As Long 'hold the positions of each price list
|
||||
ReDim pcol(30) 'size the array starting with 30 and trim later
|
||||
Dim dcol() As Integer 'columns to be deleted
|
||||
Dim typeflag() As String 'array of column types
|
||||
Dim i As Long 'walks through each price list
|
||||
Dim j As Long 'walks through each original row
|
||||
Dim k As Long 'creates new rows for each price break
|
||||
Dim m As Long 'row position in the new table
|
||||
Dim sql As String
|
||||
|
||||
'-------identify the active sheet and load the contents to an array-----------
|
||||
|
||||
Set sh = ActiveSheet
|
||||
big = x.SHTp_Get(sh.Name, 3, 1, True)
|
||||
|
||||
'------iterate through the column headers to identify the price lists---------
|
||||
|
||||
pcount = 0
|
||||
For i = 0 To UBound(big, 1)
|
||||
If big(i, 0) = "plist" Then
|
||||
pcount = pcount + 1
|
||||
pcol(pcount) = i
|
||||
End If
|
||||
Next i
|
||||
|
||||
'------if no columns are labeled plist then exit------------------------------
|
||||
|
||||
If pcount = 0 Then Exit Sub
|
||||
ReDim Preserve pcol(pcount)
|
||||
ReDim typeflag(9)
|
||||
|
||||
If Not x.ADOp_OpenCon(0, PostgreSQLODBC, "usmidlnx01", False, "ptrowbridge", "qqqx53!030", "Port=5030;Database=ubm") Then
|
||||
MsgBox (Err.Description)
|
||||
Exit Sub
|
||||
End If
|
||||
|
||||
'------prepare upload for each price list-------------------------------------
|
||||
|
||||
typeflag(0) = "S"
|
||||
typeflag(1) = "S"
|
||||
typeflag(2) = "S"
|
||||
typeflag(3) = "S"
|
||||
typeflag(4) = "S"
|
||||
typeflag(5) = "S"
|
||||
typeflag(6) = "S"
|
||||
typeflag(7) = "N"
|
||||
typeflag(8) = "N"
|
||||
typeflag(9) = "S"
|
||||
|
||||
For pcount = 1 To UBound(pcol)
|
||||
'----since there are 3 price columns, those will need transformed to 3 price rows per each original-----
|
||||
ReDim load(9, UBound(big, 2) * 3)
|
||||
'----set headers-----
|
||||
load(0, 0) = "stlc"
|
||||
load(1, 0) = "coltier"
|
||||
load(2, 0) = "branding"
|
||||
load(3, 0) = "accs"
|
||||
load(4, 0) = "suff"
|
||||
load(5, 0) = "uomp"
|
||||
load(6, 0) = "vol_uom"
|
||||
load(7, 0) = "vol_qty"
|
||||
load(8, 0) = "vol_price"
|
||||
load(9, 0) = "listcode"
|
||||
'-----populate------------
|
||||
m = 1
|
||||
For i = 1 To UBound(big, 2)
|
||||
'-----hard coded to number of price breaks (3)-------
|
||||
For k = 0 To 2
|
||||
load(0, m) = big(0, i)
|
||||
load(1, m) = big(1, i)
|
||||
load(2, m) = big(2, i)
|
||||
load(3, m) = big(3, i)
|
||||
load(4, m) = big(4, i)
|
||||
'----position 3 is a bulk pallet so the default UOM needs hard coded to PLT-----
|
||||
If k = 2 Then
|
||||
load(5, m) = "PLT"
|
||||
Else
|
||||
load(5, m) = big(5, i)
|
||||
End If
|
||||
'----(3-k) should work out to 1st 2nd 3rd price colum----------------------------
|
||||
'----the first column UOM is the default package, everything else is a pallet----
|
||||
If k = 0 Then
|
||||
load(6, m) = big(5, i)
|
||||
Else
|
||||
load(6, m) = "PLT"
|
||||
End If
|
||||
'----for now the volumes are always 1 of the unit of measure in colunm 6 above
|
||||
load(7, m) = "1"
|
||||
load(8, m) = Format(big(pcol(pcount) - (3 - k), i), "####0.00")
|
||||
load(9, m) = big(pcol(pcount) - 0, i)
|
||||
m = m + 1
|
||||
Next k
|
||||
Next i
|
||||
'------build insert statement for target price list-----
|
||||
sql = "BEGIN;"
|
||||
sql = sql & vbCrLf & "DELETE FROM rlarp.plcore WHERE listcode = '" & load(9, 1) & "';"
|
||||
sql = sql & vbCrLf & "INSERT INTO rlarp.plcore"
|
||||
sql = sql & vbCrLf & x.SQLp_build_sql_values(load, True, True, PostgreSQL, False, "S", "S", "S", "S", "S", "S", "S", "N", "N", "S") & ";"
|
||||
sql = sql & vbCrLf & "COMMIT;"
|
||||
'------do the insert------------------------------------
|
||||
If Not x.ADOp_Exec(0, sql) Then
|
||||
MsgBox (x.ADOo_errstring)
|
||||
Exit Sub
|
||||
End If
|
||||
Next pcount
|
||||
|
||||
Call x.ADOp_CloseCon(0)
|
||||
|
||||
|
||||
End Sub
|
||||
|
||||
|
||||
|
||||
|
||||
Sub build_price_upload_suff()
|
||||
|
||||
Dim x As New TheBigOne
|
||||
Dim pl() As String
|
||||
Dim plv() As Variant
|
||||
Dim i As Long
|
||||
Dim j As Long
|
||||
Dim ul() As String
|
||||
Dim pl_code As String
|
||||
Dim pl_action As String
|
||||
Dim dtl_action As String
|
||||
Dim pl_d1 As String
|
||||
Dim pl_d2 As String
|
||||
Dim pl_d3 As String
|
||||
Dim fd As FileDialog
|
||||
Dim ulsql As String
|
||||
Dim temp() As String
|
||||
Dim wapi As New Windows_API
|
||||
|
||||
|
||||
pl = x.SHTp_GetString(Selection)
|
||||
ReDim ul(11, UBound(pl, 2))
|
||||
|
||||
PRICELIST_SHOW:
|
||||
|
||||
Call pricelist.load_lists
|
||||
|
||||
pricelist.Show
|
||||
|
||||
If Not pricelist.proceed Then Exit Sub
|
||||
|
||||
pl_code = pricelist.cbLIST.value
|
||||
pl_d1 = pricelist.tbD1.text
|
||||
pl_d2 = pricelist.tbD2.text
|
||||
pl_d3 = pricelist.tbD3.text
|
||||
pl_action = Mid(pricelist.cbHDR.value, 1, 1)
|
||||
dtl_action = Mid(pricelist.cbDTL.value, 1, 1)
|
||||
|
||||
|
||||
If Len(pricelist.cbLIST.value) > 5 Then
|
||||
MsgBox ("price code must be 5 or less characters")
|
||||
GoTo PRICELIST_SHOW
|
||||
End If
|
||||
|
||||
'--------------remove any lines with errors-------------
|
||||
If Not pricelist.cbInactive Then
|
||||
Call x.TBLp_FilterSingle(pl, 16, "", True)
|
||||
End If
|
||||
|
||||
'--------------remove empty price lines-----------------
|
||||
Call x.TBLp_FilterSingle(pl, 13, "", False)
|
||||
|
||||
If Not pricelist.cbNonStocked Then
|
||||
Call x.TBLp_FilterSingle(pl, 8, "A", True)
|
||||
End If
|
||||
|
||||
'need to get the current list of products and if they already exist for the target price list
|
||||
'target price list
|
||||
'target part
|
||||
'target volume level
|
||||
|
||||
|
||||
'ulsql = FL.x.SQLp_build_sql_values(pl, True, True, PostgreSQL, False)
|
||||
'pl = x.TBLp_Transpose(pl)
|
||||
'plv = x.TBLp_StringToVar(pl)
|
||||
'ulsql = x.json_from_table(plv, "")
|
||||
'ulsql = "DECLARE GLOBAL TEMPORARY TABLE session.plb AS (" & ulsql & ") WITH DATA"
|
||||
' If login.tbP.Text = "" Then
|
||||
' login.Show
|
||||
' If Not login.proceed Then
|
||||
' Exit Sub
|
||||
' End If
|
||||
' End If
|
||||
'Call wapi.ClipBoard_SetData(ulsql)
|
||||
'Exit Sub
|
||||
|
||||
'If Not FL.x.ADOp_Exec(0, ulsql, 1, True, ISeries, "S7830956", False, "PTROWBRIDG", "QQQX53@041") Then
|
||||
' MsgBox (FL.x.ADOo_errstring)
|
||||
' Exit Sub
|
||||
'End If
|
||||
|
||||
'pl = FL.x.ADOp_SelectS(0, "SELECT p.*, CASE WHEN COALESCE(c.jcpart,'') = '' THEN '1' ELSE '2' END flag FROM Session.plb P LEFT OUTER JOIN lgdat.iprcc c ON c.jcpart = P.Item AND c.JCPLCD = '" & pl_code & "' AND c.JCVOLL = p.vbqty * cast(p.num as float) / cast(p.den as float)", True, 10000, True)
|
||||
'If Not FL.x.ADOp_Exec(0, "DROP TABLE SESSION.PLB", 1, True, ISeries, "S7830956", False, login.tbU.Text, login.tbP.Text) Then
|
||||
' MsgBox (FL.x.ADOo_errstring)
|
||||
' Exit Sub
|
||||
'End If
|
||||
'Call FL.x.ADOp_CloseCon(0)
|
||||
|
||||
|
||||
ul(0, 0) = "HDR"
|
||||
ul(1, 0) = pl_action
|
||||
ul(2, 0) = pl_code
|
||||
ul(3, 0) = Left(pl_d1, 30)
|
||||
ul(4, 0) = Left(pl_d2, 30)
|
||||
ul(5, 0) = Left(pl_d3, 30)
|
||||
ul(6, 0) = "Y"
|
||||
ul(7, 0) = "N"
|
||||
j = 0
|
||||
For i = LBound(pl, 2) + 1 To UBound(pl, 2)
|
||||
'if there is no [uom, part#, price], don't create a row
|
||||
If pl(11, i) <> "" And pl(7, i) <> "" And pl(6, i) <> "" And pl(13, i) <> "" Then
|
||||
j = j + 1
|
||||
ul(0, j) = "DTL" 'DTL
|
||||
ul(1, j) = pl_code 'Price list code
|
||||
ul(2, j) = pl(6, i) 'part number
|
||||
ul(3, j) = pl(12, i) 'price unit
|
||||
ul(4, j) = Format(pl(11, i), "0.00000") 'volume break in price uom
|
||||
ul(5, j) = Format(pl(13, i), "0.00000") 'price
|
||||
ul(11, j) = dtl_action 'add, update, delete
|
||||
End If
|
||||
Next i
|
||||
|
||||
ReDim Preserve ul(11, j)
|
||||
|
||||
|
||||
'--------Open file-------------
|
||||
|
||||
If Not x.FILEp_CreateCSV(pricelist.tbPATH.text & "\" & Replace(pl_code, ".", "_") & ".csv", ul) Then
|
||||
MsgBox ("error")
|
||||
End If
|
||||
|
||||
'Excel.Workbooks.Open (pricelist.tbPATH.Text & "\" & Replace(pl_code, ".", "_") & ".csv")
|
||||
|
||||
'---------------------header row---------------------------------
|
||||
|
||||
|
||||
End Sub
|
Loading…
Reference in New Issue
Block a user