轉貼文章
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裡使展著無窮無盡的創意!在他們眼力,沒有不可能的事,只有不可能的人!每當面對這句話的時候,我對自己以前顧問提出的需求做出不可能的回答而感到汗顏與慚愧!
留言列表