Это не рекомендуется для обновления базы данных Syspro непосредственно. Хотя относительно просто провести разбивку и отслеживать, какие данные хранятся там и т. Д., Чаще всего не более 1 места, где поле обновляется, и/или имеется дополнительный флаг, который также изменяется. Кроме того, обновление его непосредственно в базе данных также избавит вас от любого возможного аудита.
Если это необходимо сделать массовым (как кажется, кажется, ваш вопрос), это лучше всего сделать, опубликовав обновление с использованием одного из бизнес-объектов SYSPRO. Более подробную информацию о бизнес-объектах можно найти здесь: SYSPRO Business Object Library
Существует два способа использования этого: в пользовательской области в SYSPRO (тогда не требуется никаких лицензионных требований) или если ваш клиент лицензирован для соответствующего бизнес-объекта вы можете написать внешнюю программу для публикации обновлений с использованием бизнес-объекта.
Ниже представлена пользовательская панель, которую я создал когда-то ранее, которая обновляет цены предметов на основе таблицы Excel. Сохраните приведенный ниже раздел кода в txt-файле, а когда в SYSPRO щелкните стрелку вниз (в правом верхнем углу панели), вы можете выбрать Индивидуальная панель> Импортировать настраиваемую панель и указать этот файл txt, который вы сохранили. Это создаст пользовательскую панель с заголовком Прейскурант Импорт. Если вы сейчас нажмете кнопку обновления на этой настраиваемой панели, она попросит вас использовать файл excel для его обновления. По умолчанию он будет искать файл с именем Прейскурант Import.xlsx в каталоге SYSPRO \ Base \ Settings папки, на которой вы работаете. Вам нужно будет создать таблицу с 5 столбцами и в этом порядке (StockCode, PriceCode, SellingPrice, PriceBasis, CommisionCode). После того, как у вас есть электронная таблица и укажите файл в этом приглашении, он загрузит содержимое электронной таблицы в список, и по умолчанию все записи будут выбраны для импорта. Если вы сейчас нажмете Update, он будет соответствующим образом обновлять цены и, если возможно, вернет соответствующие сообщения об ошибках обратно в список.
# Customized Panes for 'IMPDH2LZ' Created: 2013/09/17
# PANE:Pricelist Import
[PANE]
CHRISVIMPDH2LZ 01000Pricelist Import 020 000000500001IMPDH2000M000Update 3362 00000 0
[VBSCRIPT]
' This script contains functions for customized pane events.
' You must not modify the name of the functions.
Option Explicit
Public Debug : Debug = "False"
Function CustomizedPane_OnRefresh()
Dim ImportFilePmt : ImportFilePmt = InputBox("Enter Location of Excel file to Import?", "Pricelist Import File", SystemVariables.CodeObject.baseSettingsFolder &"Pricelist Import.xlsx")
Dim objExcel : Set objExcel = CreateObject("Excel.Application")
On error resume next
Dim objWorkbook : Set objWorkbook = objExcel.Workbooks.Open(ImportFilePmt)
If err then
If ImportFilePmt <> "" then
msgbox "Error Importing File: " & vbcrlf & err.Description & vbCrlf & vbCrlf & "Import Cancelled!!", vbCritical, "Error Importing/Opening File"
Exit Function
Else
CustomizedPane_OnLoad
Exit Function
End If
End if
on error Goto 0
Dim objWorksheet : Set objWorksheet = objExcel.Worksheets(1)
objWorksheet.Activate
Dim intRow : intRow = 2
Dim XMLForList
Dim intLinesRow : intLinesRow = 2
XMLForList = "<ImportList>"
Do Until objExcel.Cells(intLinesRow,1).Value = "" or objExcel.Cells(intLinesRow,1).Value = " "
XMLForList = XMLForList & "<Item><StockCode>"& objExcel.Cells(intLinesRow, 1).Value &"</StockCode>"
XMLForList = XMLForList & "<PriceCode>" & objExcel.Cells(intLinesRow,2).Value & "</PriceCode>"
XMLForList = XMLForList & "<SellingPrice>" & objExcel.Cells(intLinesRow,3).Value & "</SellingPrice>"
XMLForList = XMLForList & "<PriceBasis>" & objExcel.Cells(intLinesRow,4).Value & "</PriceBasis>"
XMLForList = XMLForList & "<CommisionCode>" & objExcel.Cells(intLinesRow,5).Value & "</CommisionCode>"
XMLForList = XMLForList & "<Import>1</Import>"
XMLForList = XMLForList & "</Item>"
intLinesRow = intLinesRow + 1
Loop
XMLForList = XMLForList & "</ImportList>"
objExcel.Quit
Dim ListXML
ListXML = ListXML & "<Columns PrimaryNode='Item' Style='DataGrid' AutoSize='true' FreezeColumn='0' >"
ListXML = ListXML & "<Column Name='StockCode' Description='Stock code' />"
ListXML = ListXML & "<Column Name='PriceCode' Description='Price code' />"
ListXML = ListXML & "<Column Name='SellingPrice' Description='Selling price' Type='Numeric' Alignment='Right' HdrAlignment='Right' Decimals='2' />"
ListXML = ListXML & "<Column Name='PriceBasis' Description='Price basis' />"
ListXML = ListXML & "<Column Name='CommisionCode' Description='Commision code' />"
ListXML = ListXML & "<Column Name='Import' Description='Import' Type='checkbox' Editable='true' />"
ListXML = ListXML & "</Columns>"
CustomizedPane.CodeObject.ListviewProperties = ListXML
CustomizedPane.CodeObject.ListviewData = XMLForList
msgbox intLinesRow - 2 & " record/s read",vbInformation,"File Imported"
End Function
Function FileHandle(Action, ActVariable)
Dim Path : Path = SystemVariables.CodeObject.baseSettingsFolder & "ExcelImportPanePath.txt"
Const ForReading = 1
Const ForWriting = 2
Const ForAppending = 8
dim fso, ts
Set fso = CreateObject("Scripting.FileSystemObject")
If Action = "WritePath" then
Set ts = fso.CreateTextFile(Path,2,False)
ts.Write (ActVariable)
ts.Close
Elseif Action = "DeletePath" then
Set ts = fso.OpenTextFile(Path,1)
Dim FilePathDP : FilePathDP = ts.ReadAll
ts.Close
fso.DeleteFile FilePathDP
Elseif Action = "ReadPath" then
on error Resume Next
Set ts = fso.OpenTextFile(Path,ForReading)
Dim strLine
Do Until ts.AtEndOfStream
strLine = ts.ReadLine
Loop
ts.close
if Err then
FileHandle = "File Deleted"
Else
FileHandle = strLine
End if
On Error Goto 0
Elseif Action = "Delete" then
On Error Resume Next
fso.DeleteFile Path
If err then
Exit Function
End if
On Error Goto 0
End if
End Function
Function CustomizedPane_OnLoad()
Dim ListXML
ListXML = ListXML & "<Columns PrimaryNode='Notify' Style='DataGrid' AutoSize='true' FreezeColumn='0' >"
ListXML = ListXML & "<Column Name='Note' Description='NOTE' />"
ListXML = ListXML & "</Columns>"
CustomizedPane.CodeObject.ListviewProperties = ListXML
Dim ShowNote
ShowNote = "<Start>"
ShowNote = ShowNote & "<Notify><Note>First Load the Excel File Path...</Note></Notify>"
ShowNote = ShowNote & "</Start>"
CustomizedPane.CodeObject.ListviewData = ShowNote
End Function
Function CustomizedPane_OnToolbarButton1Clicked()
Dim MaxRows : MaxRows = Ubound(CustomizedPane.CodeObject.Array, 2)
If MaxRows = 0 OR CustomizedPane.CodeObject.Array(0,0) = "First Load the Excel File Path..." then
Exit Function
Else
Dim Counter
Dim CLineCounter : CLineCounter = 0
For Counter = 0 to MaxRows - 1
If CustomizedPane.CodeObject.Array(5, Counter) = "1" then
CLineCounter = CLineCounter + 1
End If
Next
If CLineCounter = 0 then
msgbox "There was nothing selected to import.",vbInformation,"Importing..."
Exit Function
Else
msgbox CLineCounter & " record/s to be updated.",vbInformation,"Importing..."
CallINVSPR
End If
End If
End Function
Function CallINVSPR()
dim XMLOut, XMLParam, XMLDoc
XMLParam = "<SetupInvPrice>"
XMLParam = XMLParam & " <Parameters>"
XMLParam = XMLParam & " <IgnoreWarnings>N</IgnoreWarnings>"
XMLParam = XMLParam & " <ApplyIfEntireDocumentValid>Y</ApplyIfEntireDocumentValid>"
XMLParam = XMLParam & " <ValidateOnly>N</ValidateOnly>"
XMLParam = XMLParam & " </Parameters>"
XMLParam = XMLParam & "</SetupInvPrice>"
XMLDoc = " <SetupInvPrice>"
Dim MaxRows : MaxRows = Ubound(CustomizedPane.CodeObject.Array, 2)
Dim Counter
Dim LineCounter : LineCounter = 0
Dim CLineCounter : CLineCounter = 0
For Counter = 0 to MaxRows - 1
If CustomizedPane.CodeObject.Array(5, Counter) = "1" then
XMLDoc = XMLDoc & " <Item>"
XMLDoc = XMLDoc & " <Key>"
XMLDoc = XMLDoc & " <StockCode>" & CustomizedPane.CodeObject.Array(0, Counter) & "</StockCode>"
XMLDoc = XMLDoc & " <PriceCode>" & CustomizedPane.CodeObject.Array(1, Counter) & "</PriceCode>"
XMLDoc = XMLDoc & " </Key>"
XMLDoc = XMLDoc & " <SellingPrice>" & CustomizedPane.CodeObject.Array(2, Counter) & "</SellingPrice>"
XMLDoc = XMLDoc & " <PriceBasis>" & CustomizedPane.CodeObject.Array(3, Counter) & "</PriceBasis>"
XMLDoc = XMLDoc & " <CommissionCode>" & CustomizedPane.CodeObject.Array(4, Counter) & "</CommissionCode>"
XMLDoc = XMLDoc & " </Item>"
CLineCounter = CLineCounter + 1
End If
Next
XMLDoc = XMLDoc & " </SetupInvPrice>"
on error resume next
XMLOut = CallSetup("INVSPR",XMLParam,XMLDoc,"Update","auto")
if err then
msgbox err.Description, vBCritical, "Calling Business Object"
exit function
end if
' Switch on error handling
on error goto 0
'msgbox CLineCounter & " rows updated"
If Debug = "True" then
Dim Path : Path = SystemVariables.CodeObject.baseSettingsFolder & "DEBUGExcelImportPane.txt"
'Output XML to file
dim fso, ts
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.CreateTextFile(Path,2,True)
ts.Write ("XMLIn:" & vbCrlf & XMLDoc & vbCrlf &"XMLParam:" & vbCrlf & XMLParam & vbCrlf &"XMLOut:" & vbCrlf & XMLOut)
ts.Close
msgbox "Debug Done." & vbCrLf & " Check: "& Path
End If
ResultValidate XMLOut, "Update", CLineCounter
End Function
Function ResultValidate(XMLIn, Action, CLineCounter)
Dim XMLDOM : Set XMLDOM = CreateObject("Microsoft.XMLDOM")
XMLDOM.Async = False
XMLDOM.LoadXML(XMLIn)
Dim ListXML
Dim WarningMsgs : Set WarningMsgs = XMLDOM.GetElementsByTagName("ErrorDescription")
Dim StkList
If WarningMsgs.Length > 0 then
StkList = "<List>"
StkList = StkList & "<StockList>"
StkList = StkList & "<Notes>Errors Found: " & WarningMsgs.Length & "</Notes>"
StkList = StkList & "</StockList>"
If WarningMsgs.Length > 0 then
Dim WarnItems
For Each WarnItems in WarningMsgs
StkList = StkList & "<StockList>"
StkList = StkList & "<Notes>Error in : " & WarnItems.ParentNode.NodeName & " - " & WarnItems.PreviousSibling.PreviousSibling.Text & ": " & WarnItems.Text &"</Notes>"
StkList = StkList & "</StockList>"
Next
End If
StkList = StkList & "</List>"
ListXML = "<Columns PrimaryNode='StockList' Style='DataGrid' AutoSize='true' FreezeColumn='0' >"
ListXML = ListXML & "<Column Name='Notes' Description='Notes' Link='false' />"
ListXML = ListXML & "</Columns>"
else
StkList = "<List>"
StkList = StkList & "<StockList>"
StkList = StkList & "<Notes>No Errors Found..." & CLineCounter & " record/s updated</Notes>"
StkList = StkList & "</StockList>"
StkList = StkList & "</List>"
ListXML = "<Columns PrimaryNode='StockList' Style='DataGrid' AutoSize='true' FreezeColumn='0' >"
ListXML = ListXML & "<Column Name='Notes' Description='Notes' Link='false' />"
ListXML = ListXML & "</Columns>"
End If
CustomizedPane.CodeObject.ListviewProperties = ListXML
CustomizedPane.CodeObject.ListviewData = StkList
End Function
Возможно, если у них есть испытательная компания, попробуйте сначала там, чтобы вы могли видеть, что он делает?
NB: Это было сделано для SYSPRO 6.1 и 7. Для выполнения этой работы в других версиях может потребоваться небольшое обновление.
Вы также можете узнать SYSPRO Forums за помощью, относящейся к syspro.
Надеюсь, это поможет.
Спасибо Крис - это блестяще, я знал, что будет лучшее решение для прямого обновления ..... тем более, что я увидел таблицу изменений цен (которая, очевидно, не будет обновляться). Спасибо также за ссылки - очень полезно - я в настоящее время жду одобрения форума. – dazzathedrummer
Я получаю сообщение об ошибке при обновлении панели - «Объект не поддерживает это свойство или метод:« SystemVariables.CodeObject.baseSettingsFolder ». Может ли это быть потому, что Business Objects не лицензированы? Компания использует Syspro 6.0. – dazzathedrummer
Я попытался посмотреть, что я могу сделать, чтобы настроить настраиваемую панель на 6.0 SP2, но, к сожалению, это невозможно. – Chris