2012-09-20 58 views
0

我正在使用MS Access附加查詢將庫存事務附加到我的ERP數據庫(MYSQL)。
請告訴我如何修改我的查詢,以便自動將下一個順序事務ID(主鍵)插入到Inventory_transaction表中,並且可以一次附加多條記錄。使用順序主鍵插入查詢

我現有的查詢工作正常,但只有當我追加一個記錄。
我通常需要同時追加多個記錄。每個記錄需要具有唯一的順序事務ID(主鍵)。將有多個用戶同時使用這個應用程序,所以我需要極少的重複密鑰違規的機會,以防止回滾。我嘗試追加沒有使用主鍵,看看我的數據庫是否會自動分配一個交易ID,但不幸的是,這個ERP領域不是一個自動編號,我不能修改表結構...

以下是2個查詢。
這一個目前適用於生成只有一個記錄的交易ID。

SELECT Max([SYSADM_INVENTORY_TRANS].[TRANSACTION_ID])+1 AS new_inventory_transaction_ID 
FROM SYSADM_INVENTORY_TRANS; 

第二屆查詢追加查詢包含第一個查詢,我將非常感激,如果這樣的用戶有一次追加多條記錄與唯一的事務ID能力的人可以修改查詢。

INSERT INTO SYSADM_INVENTORY_TRANS (TRANSACTION_ID, WORKORDER_TYPE, 
    WORKORDER_BASE_ID, WORKORDER_LOT_ID, WORKORDER_SPLIT_ID, WORKORDER_SUB_ID, 
    OPERATION_SEQ_NO, REQ_PIECE_NO, PART_ID, TYPE, CLASS, QTY, COSTED_QTY, 
    TRANSACTION_DATE, WAREHOUSE_ID, LOCATION_ID, USER_ID, POSTING_CANDIDATE, 
    ACT_MATERIAL_COST, ACT_LABOR_COST, ACT_BURDEN_COST, ACT_SERVICE_COST, 
    CREATE_DATE, ADD_BURDEN, COUNT_SEQUENCE, DESCRIPTION) 
SELECT T.new_inventory_transaction_ID, S.WORKORDER_TYPE, D.WORKORDER_BASE_ID, 
    D.WORKORDER_LOT_ID, D.WORKORDER_SPLIT_ID, D.WORKORDER_SUB_ID, D.OPERATION_SEQ_NO, 
    D.PIECE_NO, D.auto_issue_part_ID, S.TYPE, S.CLASS, D.[total_auto_issue Qty], 
    0 AS Expr6, Date() AS Expr1, D.BACKFLUSH_WHS_ID, D.BACKFLUSH_LOC_ID, 
    "SYSADM" AS Expr3, S.POSTING_CANDIDATE, S.ACT_MATERIAL_COST, S.ACT_LABOR_COST, 
    S.ACT_BURDEN_COST, S.ACT_SERVICE_COST, Date() AS Expr2, S.ADD_BURDEN, 
    S.COUNT_SEQUENCE, "ENTERED WITH ACCESS APP" AS Expr5 
FROM tbl_static_autoissue_data AS S, 
    tbl_dynamic_autoissue_data AS D, 
    qry_transaction_ID_generator AS T; 

回答

1

以下是一些可能幫助您實現目標的注意事項,但是使用自動編號可以讓生活變得更容易,更安全。這是你提到MS Access的VBA。

Function NextTranNumber(ByRef FirstTran As Long, _ 
     ByRef LastTran As Long, Optional BlockSize = 1) 
Dim cn As New ADODB.Connection 
Dim rs As New ADODB.Recordset 
Dim strSQL As String 
Dim lngResult As Long 
Dim strCon As String 

    lngResult = 0 'assume fail 

    strCon = TestCon ''Connection to back-end 
    cn.Open strCon 

    rs.CursorType = adOpenKeyset 
    rs.LockType = adLockPessimistic 
    rs.CursorLocation = adUseServer 

    ''Where BEInfo is a single line table that holds a transaction seed 
    strSQL = "SELECT ASeqNumber FROM BEInfo" 

    rs.Open strSQL, cn, , , adCmdText 

    'Note this is ADO, so no rs.Edit 
    FirstTran = rs!ASeqNumber + 1 
    rs!ASeqNumber = rs!ASeqNumber + BlockSize 
    rs.Update 

    LastTran = rs!ASeqNumber 
    rs.Close 
    Set rs = Nothing 
End Function 

Sub TransactionProcessing() 
Dim FirstTran As Long 
Dim LastTran As Long 
Dim db As Database 
Dim sSQL As String 
Dim Block As Long 
Dim rs As DAO.Recordset 

    Set db = CurrentDb 

    'Existing temporary table 
    sSQL = "DELETE FROM FETempTrans" 
    db.Execute sSQL, dbFailOnError 
    'The records to be added to the main table 
    sSQL = "INSERT INTO FETempTrans (ID, AText) SELECT 0 AS ID, AText FROM Table1" 
    db.Execute sSQL, dbFailOnError 

    Block = db.RecordsAffected 

    'Reserve a transaction block based on the temp table count 
    NextTranNumber FirstTran, LastTran, Block 

    Set rs = db.OpenRecordset("FETempTrans") 

    Do While Not rs.EOF 
     rs.Edit 
     rs!ID = FirstTran 
     rs.Update 
     FirstTran = FirstTran + 1 
     rs.MoveNext 
    Loop 

    If FirstTran - 1 = LastTran Then 
     'compare the temp set to the main table 
     'if it passes, update the main table 
    Else 
     'fail 
    End If 
End Sub