轉貼文章

 

SBO中的一個極具震撼力的的流程控制功能詳細分析

在我開發的項目過程中,許多客戶和顧問向我提出了許許多多的功能需求。但我在分析研究了這些需求後發現許多的需求我們顧問均可以解決。尤其是流程控制方面的需求。我把這方面的一些粗淺看法整理出來,供大家分享。


一、各種顧問在項目實施過程中出現過的看是需要研發解決的需求


  1、如何控制不同的銷售人員只能修改自己管理的客戶的數據?
  2、如何控制不同的銷售人員只能錄入修改自己的銷售訂單?
  3、如何給sbo的任何單據(我這裡強調任何單據,包括銷售訂單,銷售發貨單、發票、採購訂單、採購收貨單、採購發票、財務憑證、庫存轉儲等等)加上自己的邏輯驗證控制(例如不填某一個字段不用許sbo添加到數據庫)
  4、如何在各種單據或主數據添加修改過程中加上自己想要的功能?
   
  以前這些需求一般都是顧問要求研發人員來參與協同工作來解決。我們現在要討論的就是這些問題統統不再研發,顧問可輕鬆搞定。當然這要求顧問要具備一些基礎知識。

 

二、顧問要解決這些問題要具備的基礎知識

 

1、sql的知識。我一直認為,一個ERP軟件顧問高手對SQL必須的基本素質。他可以讓你隨心所欲從這個充滿金礦的ERP數據海洋裡找到你想要的金子。我認為有志於成為ERP軟件顧問高手的朋友在此付出一點時間和金錢是絕對值得的!它是打開我們理解ERP軟件內核的金鑰匙,也是會讓我們終生受益的一種技能。無論我們從事的是哪一個ERP系統的顧問工作!
2、SBO對象的概念與規則。
  當然,我覺得您在讀這篇雜論前要有堅持讀下去的意志。儘管這好像是有點枯燥乏味。但這點乏味的知識會給您帶來無窮的想像力!
  SBO的DI對象,針對顧問通俗點簡單點說就像物料主數據、客戶主數據、銷售訂單、採購訂單等等這些SBO裡的東東。他們在SBO系統裡都有一個編號,就像我們都有一個名字一樣用於唯一識別。例如物料主數據的編號是:

 

4。具體清單如下:
Member        Value
oChartOfAccounts        1
oBusinessPartners        2
oBanks        3
oItems        4
oVatGroups        5
oPriceLists        6
oSpecialPrices        7
oItemProperties        8
oUsers        12
oInvoices        13
oCreditNotes        14
oDeliveryNotes        15
oReturns        16
oOrders        17
oPurchaseInvoices        18
oPurchaseCreditNotes        19
oPurchaseDeliveryNotes        20
oPurchaseReturns        21
oPurchaseOrders        22
oQuotations        23
oIncomingPayments        24
oJournalVouchers        28
oJournalEntries        30
oStockTakings        31
oContacts        33
oCreditCards        36
oCurrencyCodes        37
oPaymentTermsTypes        40
oBankPages        42
oManufacturers        43
oVendorPayments        46
oLandedCostsCodes        48
oShippingTypes        49
oLengthMeasures        50
oWeightMeasures        51
oItemGroups        52
oSalesPersons        53
oCustomsGroups        56
oChecksforPayment        57
oInventoryGenEntry        59
oInventoryGenExit        60
oWarehouses        64
oCommissionGroups        65
oProductTrees        66
oStockTransfer        67
oWorkOrders        68
oCreditPaymentMethods        70
oCreditCardPayments        71
oAlternateCatNum        73
oBudget        77
oBudgetDistribution        78
oMessages        81
oBudgetScenarios        91
oSalesOpportunities        97
oUserDefaultGroups        93
oSalesStages        101
oActivityTypes        103
oActivityLocations        104
oDrafts        112
oDeductionTaxHierarchies        116
oDeductionTaxGroups        117
oAdditionalExpenses        125
oSalesTaxAuthorities        126
oSalesTaxAuthoritiesTypes        127
oSalesTaxCodes        128
oQueryCategories        134
oFactoringIndicators        138
oPaymentsDrafts        140
oAccountSegmentations        142
oAccountSegmentationCategories        143
oWarehouseLocations        144
oForms1099        145
oInventoryCycles        146
oWizardPaymentMethods        147
oBPPriorities        150
oDunningLetters        151
oUserFields        152
oUserTables        153
oPickLists        156
oPaymentRunExport        158
oUserQueries        160
oMaterialRevaluation        162
oCorrectionPurchaseInvoice        163
oCorrectionPurchaseInvoiceReversal        164
oCorrectionInvoice        165
oCorrectionInvoiceReversal        166
oContractTemplates        170
oEmployeesInfo        171
oCustomerEquipmentCards        176
oWithholdingTaxCodes        178
oBillOfExchangeTransactions        182
oKnowledgeBaseSolutions        189
oServiceContracts        190
oServiceCalls        191
oUserKeys        193
oQueue        194
oSalesForecast        198
oTerritories        200
oIndustries        201
oProductionOrders        202
oPackagesTypes        205
oUserObjectsMD        206
oTeams        211
oRelationships        212
oUserPermissionTree        214
oActivityStatus        217
oChooseFromList        218
oFormattedSearches        219
oAttachments2        221
oUserLanguages        223
oMultiLanguageTranslations        224
oDynamicSystemStrings        229
oHouseBankAccounts        231
oBusinessPlaces        247
oLocalEra        250
oSalesTaxInvoice        280
oPurchaseTaxInvoice        281
BoRecordset        300
BoBridge        305
oNotaFiscalUsage        260
oNotaFiscalCFOP        258
oNotaFiscalCST        259
oClosingDateProcedure        261
oBusinessPartnerGroups        10
oBPFiscalRegistryID        278

 

 


 

三、關鍵的存儲過程語法:


大家打開sqlserver的查詢分析器,打開SBO的一個公司數據庫,查找一個存儲過程:SBO_SP_TransactionNotification
它就是讓我們得以控制SBO的魅力所在!
ALTER  proc SBO_SP_TransactionNotification

@object_type nvarchar(25),                                 -- SBO Object Type
@transaction_type nchar(1),                        -- [A]dd, pdate, [D]elete, [C]ancel, C[L]ose
@num_of_cols_in_key int,
@list_of_key_cols_tab_del nvarchar(255),
@list_of_cols_val_tab_del nvarchar(255)

AS

begin

-- Return values
declare @error  int                                -- Result (0 for no error)
declare @error_message nvarchar (200)                 -- Error string to be displayed
select @error = 0
select @error_message = N'Ok'

--------------------------------------------------------------------------------------------------------------------------------

--        ADD        YOUR        CODE        HERE

--------------------------------------------------------------------------------------------------------------------------------

-- Select the return values
select @error, @error_message

end

 

 

這個存儲過程的作用就是任何一個SBO對象操作完程前都會調用它一次。以便我們加入我們的邏輯控制來實現一些客戶的特殊要求。
我們來看一下他的參數:


第一個參數:@object_type

這就是我們上邊討論的SBO對象的編號。每一個對象執行Add, pdate, [D]elete, [C]ancel, C[L]ose操作時都會把操作的對象編號在這個參數中傳入,我們只要判斷該參數即可實現對不同的對象的不同的控制。我後邊會給大家提供一些練習。

第二個參數:@transaction_type nchar(1),                        -- [A]dd, pdate, [D]elete, [C]ancel, C[L]ose

當在SBO系統中執行了添加操作,例如添加了一個物料主數據,@object_type的值就等於4,@transaction_type的值就等於'A' 。

第三個參數:@num_of_cols_in_key

對象關鍵字段的數目。例如物料主數據的關鍵字段是物料編碼,他只有一個關鍵字,所以該值等於1。

第四個參數:@list_of_key_cols_tab_del 

代表該對象的關鍵字段的字段名字,例如物料主數據就是Itemcode,單據就是Docentry.

第五個參數: @list_of_cols_val_tab_del
 

代表關鍵字段的值。這時已非常重要的參數。我再次說明一點,經過我測試,SBO的對象再添加修改時會現在數據庫裡操作完成,然後調用該存儲過程。所以我們就靠這個字段來作為驗證控制我們的邏輯的入口之一了。

 

 

   在以上介紹的五個參數之中,最重要的就是  

@object_type,  

@transaction_type,    

@list_of_cols_val_tab_del

這三個參數。大家一定要明白他們的含義!

內部的兩個重要控制參數:


@error ,好了,揭示了這麼多,就數他最重要了。計算機世界的0和1就讓他體現的淋漓盡致了。當我麼給它賦值為零的時候,SBO的流程繼續運行。一旦我們給他賦值為1,好了,效果出現了,你在sbo中操作的對象就再也不能完成它的操作了!牛!就是這個牛的地方可以讓我們收拾SBO任何的對象,可以按客戶的心花讓 SBO盡情的怒放。
當然我們經過我們自己的邏輯,把 @error =1,不然SBO按自己的邏輯繼續下去了,總也得在SBO中給出個提示把,就像B1的狀態欄的提示一樣,那您就要動用@error_message這個參數了。200個字符盡情地表述您的一肚子邏輯的解釋吧,幽默也好,冷冰冰也罷!

好了我們解釋過了這個存儲過程的架構,那我接下來看看它的威力。看看SBO的牛皮吹得力量能不能把雞蛋吹成氣球!

 

 


 

四、幾個小例子

 

第一個例子:我們就測試一下物料主數據,並看一下這幾個參數。


在查詢分析器打開該存儲過程,讓其處於編輯狀態,要仔細找,SBO的存儲過程密密麻麻一大堆,看起來確實頭疼,對一個顧問來說。但研發人員也許不這樣認為。研發人員對代碼的好奇心永遠是無止境的。我就曾經把SBO的存儲過程一個接一個的讀了個遍。管他加密的不加密的。讀了會有收穫的!呵呵。也讓咱看看 SAP的牛人們使用什麼樣的代碼來操作這個世界的企業用戶的數據的!

 

ALTER  proc SBO_SP_TransactionNotification

@object_type nvarchar(25),                                 -- SBO Object Type
@transaction_type nchar(1),                        -- [A]dd, pdate, [D]elete, [C]ancel, C[L]ose
@num_of_cols_in_key int,
@list_of_key_cols_tab_del nvarchar(255),
@list_of_cols_val_tab_del nvarchar(255)

AS

begin

-- Return values
declare @error  int                                -- Result (0 for no error)
declare @error_message nvarchar (200)                 -- Error string to be displayed
declare @aaa  nvarchar(100)                     --WLJ test

select @error = 0
select @error_message = N'Ok'

--------------------------------------------------------------------------------------------------------------------------------

--        ADD        YOUR        CODE        HERE
if  @object_type='4' --items
begin
    if @transaction_type='A'   
    begin
      select @aaa =itemname from oitm where itemcode=@list_of_cols_val_tab_del
      if @aaa='Test'
      begin
      set @error=1
      set @error_message='物料主數據描述不能等於Test!'+@aaa +'--'+ @list_of_key_cols_tab_del +'--'+@list_of_cols_val_tab_del +'--'+cast(@num_of_cols_in_key as nvarchar(20))
      end
    end
    else if @transaction_type='D'
    begin
        set @error=1
        set @error_message='不允許小孩子瞎刪除!'  + @list_of_key_cols_tab_del +'--'+@list_of_cols_val_tab_del +'--'+cast(@num_of_cols_in_key as nvarchar(20))
    end
end

--------------------------------------------------------------------------------------------------------------------------------

-- Select the return values
select @error, @error_message

end

在這個例子裡,我們首先對添加的物料主數據判斷其描述是否等於「Test」如果是,那就不讓它添加,對於物料主數據則不允許刪除。大家注意分析各參數的內容。我在這個例子裡把各個參數的值也傳遞到SBO的消息提示裡邊,這樣大家學習分析方便!

 

 


 

 

第二個例子:上邊的例子我們測試驗證了主數據,我們下邊來看一下單據。

 

ALTER  proc SBO_SP_TransactionNotification

@object_type nvarchar(25),                                 -- SBO Object Type
@transaction_type nchar(1),                        -- [A]dd, pdate, [D]elete, [C]ancel, C[L]ose
@num_of_cols_in_key int,
@list_of_key_cols_tab_del nvarchar(255),
@list_of_cols_val_tab_del nvarchar(255)

AS

begin

-- Return values
declare @error  int                                -- Result (0 for no error)
declare @error_message nvarchar (200)                 -- Error string to be displayed
declare @aaa  nvarchar(100)                     --WLJ test

select @error = 0
select @error_message = N'Ok'

--------------------------------------------------------------------------------------------------------------------------------

--        ADD        YOUR        CODE        HERE

if  @object_type='17'--salseorder
begin
    if @transaction_type='A'
    begin
      set @error=1
      set @error_message='添加出錯提示!' + @list_of_key_cols_tab_del +'--'+@list_of_cols_val_tab_del +'--'+cast(@num_of_cols_in_key as nvarchar(20))
    end
    else if @transaction_type='U'
    begin
        set @error=1
        set @error_message='更新出錯提示!' + @list_of_key_cols_tab_del +'--'+@list_of_cols_val_tab_del +'--'+cast(@num_of_cols_in_key as nvarchar(20))
    end
end


--------------------------------------------------------------------------------------------------------------------------------

-- Select the return values
select @error, @error_message

end
當然這個例子我寫得簡單,只是測試在銷售訂單添加或更新的時候強不允許添加或更新。大家可以根據自己的邏輯來實際處理。我這裡只是給大家提供一個思路。

 

 

 


 

 

整合,當然我們實際工作中不可能只對一個對象操作,有可能對很對對象同時驗證,那就把上邊的合起來即可,即可以對物料主數據控制也可以對銷售訂單控制。我給大家寫了個小架構供大家參考使用。

 

ALTER   proc SBO_SP_TransactionNotification

@object_type nvarchar(25),                                 -- SBO Object Type
@transaction_type nchar(1),                        -- [A]dd, pdate, [D]elete, [C]ancel, C[L]ose
@num_of_cols_in_key int,
@list_of_key_cols_tab_del nvarchar(255),
@list_of_cols_val_tab_del nvarchar(255)

AS

begin

-- Return values
declare @error  int                                -- Result (0 for no error)
declare @error_message nvarchar (200)                 -- Error string to be displayed
select @error = 0
select @error_message = N'Ok'

declare @aaa  nvarchar(100)

if  @object_type='2' --BusinessPartners
begin
    if @transaction_type='A'
    begin
    set @error=1
    set @error_message='添加出錯提示!' + @list_of_key_cols_tab_del +'--'+@list_of_cols_val_tab_del +'--'+cast(@num_of_cols_in_key as nvarchar(20))
    end
end
else if  @object_type='4'--items
begin
    if @transaction_type='A'   
    begin
      select @aaa =itemname from oitm where itemcode=@list_of_cols_val_tab_del
      if @aaa='Test'
      begin
      set @error=1
      set @error_message='添加出錯提示!'+@aaa +'--'+ @list_of_key_cols_tab_del +'--'+@list_of_cols_val_tab_del +'--'+cast(@num_of_cols_in_key as nvarchar(20))
      end
    end
    else if @transaction_type='D'
    begin
        set @error=1
        set @error_message='更新出錯提示!'  + @list_of_key_cols_tab_del +'--'+@list_of_cols_val_tab_del +'--'+cast(@num_of_cols_in_key as nvarchar(20))
    end
end
else if  @object_type='17'--salseorder
begin
    if @transaction_type='A'
    begin
      set @error=1
      set @error_message='添加出錯提示!' + @list_of_key_cols_tab_del +'--'+@list_of_cols_val_tab_del +'--'+cast(@num_of_cols_in_key as nvarchar(20))
    end
    else if @transaction_type='U'
    begin
        set @error=1
        set @error_message='更新出錯提示!' + @list_of_key_cols_tab_del +'--'+@list_of_cols_val_tab_del +'--'+cast(@num_of_cols_in_key as nvarchar(20))
    end
--else if  @object_type='17'--salseorder
--begin
--end
--..........
--.........
end


-- Select the return values
select @error, @error_message

end
.

 


 

五、結束語。其實這個功能也是我們業界的一個資深顧問給我的提示,因為在我們這個行業中有很多善於研究的顧問高手在這個市場裡通過它淋漓盡致的在SBO裡使展著無窮無盡的創意!在他們眼力,沒有不可能的事,只有不可能的人!每當面對這句話的時候,我對自己以前顧問提出的需求做出不可能的回答而感到汗顏與慚愧!

 

 

arrow
arrow
    全站熱搜

    我只是個打雜小弟 發表在 痞客邦 留言(0) 人氣()