2015-10-02 2 views
1

Я не могу найти какую-либо информацию о сценариях SQL для Syspro - поисковые запросы Google просто придумывают стороннее программное обеспечение, несмотря на Syspro, используя стандартно выглядящую базу данных SQL.Syspro - обновить запрос по торговым ценам

Мне просто интересно, есть ли у кого-нибудь опыт обновления Syspro через SQL-обновления. У меня есть клиент, который использует Syspro, и они уже обновили его, экспортируя все в Access, внося изменения и обновляя все оттуда - Я сказал их ИТ-консультанту, что это единственный способ обновить Syspro (который, я подозреваю, не соответствует действительности).

Просто ищите некоторые вещи и не делайте, прежде чем я начну вкручивать данные!

спасибо,

Даррен

ответ

1

Это не рекомендуется для обновления базы данных 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 за помощью, относящейся к .

Надеюсь, это поможет.

+0

Спасибо Крис - это блестяще, я знал, что будет лучшее решение для прямого обновления ..... тем более, что я увидел таблицу изменений цен (которая, очевидно, не будет обновляться). Спасибо также за ссылки - очень полезно - я в настоящее время жду одобрения форума. – dazzathedrummer

+0

Я получаю сообщение об ошибке при обновлении панели - «Объект не поддерживает это свойство или метод:« SystemVariables.CodeObject.baseSettingsFolder ». Может ли это быть потому, что Business Objects не лицензированы? Компания использует Syspro 6.0. – dazzathedrummer

+0

Я попытался посмотреть, что я могу сделать, чтобы настроить настраиваемую панель на 6.0 SP2, но, к сожалению, это невозможно. – Chris

Смежные вопросы