销售模块有很多的业务表,下图是一个简单的概括,不全面,而且没有涉及到Project,但涵盖了主要的一些表。希望对理解销售模块功能的实现逻辑和开发有帮助。由于我个人AX经验也不足,难免有什么纰漏,还请不吝指教。
Step4, 5, 6:
当对于一个或多个SO(Sales Order)做一个Confirmation单时,如果不存在汇总,每一个SO都单独拥有一个Confirmation单,那么,每一个SO都对应会生成一条CustConfirmJour,而CustConfrimJour和SO之间的关系是通过一条CustConfirSalesLink来连接的。每一条要做confirmation的SO Line会对应有一条CustConfirmTrans记录。
如果存在汇总,如:
SO | InvoiceAccount |
SO000001 | C00001 |
SO000002 | C00001 |
SO000003 | C00002 |
当我们在做confirmation时,以InvoiceAccount来对SO进行汇总,那么就会生成如下:
SO | InvoiceAccount | CustConfirmJour | CustConfirmSalesLink |
SO000001 | C00001 | A journal with salesId = SO000001 | New sales link with salesId = SO000001 and origSalesId = SO000001 |
SO000002 | C00001 | New sales link with salesId = SO000001 and origSalesId = SO000002 | |
SO000003 | C00002 | A journal with salesId = SO000002 | New sales link with salesId = SO000002 and origSalesId = SO000003 |
如果SO的Line如下:
SO | Line | CustConfirmTrans |
SO000001 | Line1 | Trans with SalesId = SO000001 and origSalesId = SO000001 |
Line2 | Trans with SalesId = SO000001 and origSalesId = SO000001 | |
SO000002 | Line1 | Trans with SalesId = SO000001 and origSalesId = SO000002 |
SO000003 | Line1 | Trans with SalesId = SO000003 and origSalesId = SO000003 |
在过账Confirmation, picking slip, packing slip, invoice时,会有一些中间表来辅助过账,这些表大多以模块+Parm开头。如在过账Invoice时,会有这样一些表:
Table Name | Description |
SalesParmUpdate | 每次过账时,会新生成一个ParmId,过账过程中用到的所有中间表都会包含这个ParmId,也就是说用ParmId可以区分同一批次过账的所有记录 |
SalesParmTable | 当多个SO汇总过账时会选其中一个SO作为头,SalesParmTable会对应这个作为头的SO。如果不存在汇总,那么SalesParmTable直接对应相应的SO |
SalesParmSubTable | 当多个SO被汇总过账时,所有被汇总的SO都会对应有一条SalesParmSubTable来映射到原始的SO |
SalesParmLine | 当多个SO汇总过账时,这些SO下的所有Line都会以SalesParmLine被映射到那个作为头的SO上,并通过origSalesId和其原始的SO关联。 |
SalesParmSubLine | 当多个SO汇总过账时,SalesParmSubLine会将所有这些SO下的Line映射到其原始的SO上,并与SalesParmLine关联 |
Step 13, 14, 15:
当过账Invoice时,每一条SalesParmTable会对应生成一条CustInvoiceJour, 每一天SalesParmLine会对应生成一条CustInvoiceTrans。CustInvoiceSalesLink将在CustInvoiceJour与其所涉及到的所有SO直接建立一个关联。
与此同时,会生成记帐凭证,记录在LedgerTrans表中。
CustInvoiceJour相当于销售日记账,同时在过账时,客户明细账会被写入到CustTrans。而与客户有关的没有被结算的交易则会被写到CustTransOpen表中,并且CustTrans和CustTransOpen直接会建立关联。
如果对应某一笔交易,我们有一个收款计划,比如六个月收完,那么根据这个收款计划,会为计划中的每一次还款建一条CustTransOpen.
所以,CustTrans与CustTransOpen之间是1:N的关系。
Step 19, 20, 21:
在结算时需要选择我们的付款时用于结算那一笔交易,这个时候我们是将我们的付款日记账与未结束交易进行关联,也即CustTransOpen和LedgerJournalTrans。
LedgerJournalTrans上有一个字段Invoice,它表示所要结算的发票号,如果一条LedgerJournalTrans同时用于结算多个发票(通过Mark要结算的记录便可)时,你会发现Invoice变为’*’号。
LedgerJournalTrans与CustTransOpen之间的结算与被结算关系是通过一个中间表SpecTrans来完成的,具体对应关系请参考图中的表关系。当Mark一条CustTransOpen到LedgerJournalTrans时,先查找SpecTrans确认该CustTransOpen没有被其他付款所结算,然后新建一条SpecTrans表示要用这笔付款结算该交易。如果同时结算多个CustTransOpen,那么就产生对应多的SpecTrans。如果取消对某条CustTransOpen的Mark,对应的SpecTrans也会被删除掉。
Step 22, 23, 24:
当过账某一笔付款日志时,那么新建记账凭证(LedgerTrans),付款交易被写入到CustTrans中,这条新的付款交易用于结算在销售过账是生成的那条CustTrans,它们之间结算与被结算的关系被保存在CustSettlement表中。结算之后,删除掉对应的CustTransOpen(应为CustTransOpen本身就是用来记录需要被结算的交易,当交易被结算后自然要删除的)。同时也删除对应的SpecTrans。