Wednesday, December 28, 2016

Dynamics NAV - LS Retail - Wrong Login on POS causes transactions to overwrite at head office due to re-used transaction number

To resolve this

  • Identify all transactions on terminal that are not in head office
    • SELECT * FROM [CRONUS$Transaction Header] where [POS Terminal No_] in ('REG01','REG02')
  • Identify all transactions on Terminal
    • SELECT * FROM [CRONUS$Transaction Header] 
  • Compare the Transaction No_ and Receipt no_ fields to confirm which transactions were overwritten
  • Renumber the Transaction No_ fields on the POS for all the missing transactions using new transaction numbers
  • Set the next transaction number on the POS to the new last number
  • Delete all of the old incorrect transactions
    • delete FROM [CRONUS$Transaction Header] where [POS Terminal No_] = 'S001' and [Transaction No_] <= 170
    • delete FROM [CRONUS$Trans_ Discount Entry] where [POS Terminal No_] = 'S001' and [Transaction No_] <= 170
    • delete FROM [CRONUS$Trans_ Infocode Entry] where [POS Terminal No_] = 'S001' and [Transaction No_] <= 170
    • delete FROM [CRONUS$Trans_ Payment Entry] where [POS Terminal No_] = 'S001' and [Transaction No_] <= 170
    • delete FROM [CRONUS$Trans_ Sales Entry] where [POS Terminal No_] = 'S001' and [Transaction No_] <= 170
    • delete FROM [CRONUS$Trans_ Tender Declar_ Entry] where [POS Terminal No_] = 'S001' and [Transaction No_] <= 170
  • Run the replication to pull the transactions

This codeunit has been written to perform the changes.
This should only be used on the POS having the issue
Before you to run this codeunit, you must change the values for the following fields:

      OldStoreNo
      OldPOSTerminal
      NewStoreNo
      NewPOSTerminal
      NewTransNo
      OldTransNo
-------------------------------------------------------------------------------------------------------------
OBJECT Codeunit 50080 Fix Transaction
{
  OBJECT-PROPERTIES
  {
    Date=06/01/16;
    Time=12:04:53 PM;
    Modified=Yes;
    Version List=DAV;
  }
  PROPERTIES
  {
    OnRun=BEGIN
            OldStoreNo := 'S0002';
            OldPOSTerminal := 'P0003';

            NewStoreNo := 'S0012';
            NewPOSTerminal := 'P0028';

            NewTransNo := 1755;  //First New Transaction No.

            FOR OldTransNo := 20000161 TO 20000162 DO BEGIN
              TransactionHeader.GET(OldStoreNo,OldPOSTerminal,OldTransNo);
              TransactionHeaderNew := TransactionHeader;
              TransactionHeaderNew."Store No." := NewStoreNo;
              TransactionHeaderNew."POS Terminal No." := NewPOSTerminal;
              TransactionHeaderNew."Transaction No." := NewTransNo;
              TransactionHeaderNew.INSERT(TRUE);  //This updates the Replication Counter field

              TransSalesEntry.RESET;
              TransSalesEntry.SETRANGE("Store No.",TransactionHeader."Store No.");
              TransSalesEntry.SETRANGE("POS Terminal No.",TransactionHeader."POS Terminal No.");
              TransSalesEntry.SETRANGE("Transaction No.",TransactionHeader."Transaction No.");
              IF TransSalesEntry.FINDSET THEN REPEAT
                TransSalesEntryNew := TransSalesEntry;
                TransSalesEntryNew."Store No." := TransactionHeaderNew."Store No.";
                TransSalesEntryNew."POS Terminal No." := TransactionHeaderNew."POS Terminal No.";
                TransSalesEntryNew."Transaction No." := TransactionHeaderNew."Transaction No.";
                TransSalesEntryNew.VALIDATE("Replication Counter");
                TransSalesEntryNew.INSERT(FALSE);
                TransSalesEntry.DELETE;
              UNTIL TransSalesEntry.NEXT = 0;

              TransPaymentEntry.RESET;
              TransPaymentEntry.SETRANGE("Store No.",TransactionHeader."Store No.");
              TransPaymentEntry.SETRANGE("POS Terminal No.",TransactionHeader."POS Terminal No.");
              TransPaymentEntry.SETRANGE("Transaction No.",TransactionHeader."Transaction No.");
              IF TransPaymentEntry.FINDSET THEN REPEAT
                TransPaymentEntryNew := TransPaymentEntry;
                TransPaymentEntryNew."Store No." := TransactionHeaderNew."Store No.";
                TransPaymentEntryNew."POS Terminal No." := TransactionHeaderNew."POS Terminal No.";
                TransPaymentEntryNew."Transaction No." := TransactionHeaderNew."Transaction No.";
                TransPaymentEntryNew.VALIDATE("Replication Counter");
                TransPaymentEntryNew.INSERT(FALSE);
                TransPaymentEntry.DELETE;
              UNTIL TransPaymentEntry.NEXT = 0;

              TransIncomeExpenseEntry.RESET;
              TransIncomeExpenseEntry.SETRANGE("Store No.",TransactionHeader."Store No.");
              TransIncomeExpenseEntry.SETRANGE("POS Terminal No.",TransactionHeader."POS Terminal No.");
              TransIncomeExpenseEntry.SETRANGE("Transaction No.",TransactionHeader."Transaction No.");
              IF TransIncomeExpenseEntry.FINDSET THEN REPEAT
                TransIncomeExpenseEntryNew := TransIncomeExpenseEntry;
                TransIncomeExpenseEntryNew."Store No." := TransactionHeaderNew."Store No.";
                TransIncomeExpenseEntryNew."POS Terminal No." := TransactionHeaderNew."POS Terminal No.";
                TransIncomeExpenseEntryNew."Transaction No." := TransactionHeaderNew."Transaction No.";
                TransIncomeExpenseEntryNew.VALIDATE("Replication Counter");
                TransIncomeExpenseEntryNew.INSERT(FALSE);
                TransIncomeExpenseEntry.DELETE;
              UNTIL TransIncomeExpenseEntry.NEXT = 0;

              TransCouponEntry.RESET;
              TransCouponEntry.SETRANGE("Store No.",TransactionHeader."Store No.");
              TransCouponEntry.SETRANGE("POS Terminal No.",TransactionHeader."POS Terminal No.");
              TransCouponEntry.SETRANGE("Transaction No.",TransactionHeader."Transaction No.");
              IF TransCouponEntry.FINDSET THEN REPEAT
                TransCouponEntryNew := TransCouponEntry;
                TransCouponEntryNew."Store No." := TransactionHeaderNew."Store No.";
                TransCouponEntryNew."POS Terminal No." := TransactionHeaderNew."POS Terminal No.";
                TransCouponEntryNew."Transaction No." := TransactionHeaderNew."Transaction No.";
                TransCouponEntryNew.VALIDATE("Replication Counter");
                TransCouponEntryNew.INSERT(FALSE);
                TransCouponEntry.DELETE;
              UNTIL TransCouponEntry.NEXT = 0;

              TransInfocodeEntry.RESET;
              TransInfocodeEntry.SETRANGE("Store No.",TransactionHeader."Store No.");
              TransInfocodeEntry.SETRANGE("POS Terminal No.",TransactionHeader."POS Terminal No.");
              TransInfocodeEntry.SETRANGE("Transaction No.",TransactionHeader."Transaction No.");
              IF TransInfocodeEntry.FINDSET THEN REPEAT
                TransInfocodeEntryNew := TransInfocodeEntry;
                TransInfocodeEntryNew."Store No." := TransactionHeaderNew."Store No.";
                TransInfocodeEntryNew."POS Terminal No." := TransactionHeaderNew."POS Terminal No.";
                TransInfocodeEntryNew."Transaction No." := TransactionHeaderNew."Transaction No.";
                TransInfocodeEntryNew.VALIDATE("Replication Counter");
                TransInfocodeEntryNew.INSERT(FALSE);
                TransInfocodeEntry.DELETE;
              UNTIL TransInfocodeEntry.NEXT = 0;

              TransInventoryEntry.RESET;
              TransInventoryEntry.SETRANGE("Store No.",TransactionHeader."Store No.");
              TransInventoryEntry.SETRANGE("POS Terminal No.",TransactionHeader."POS Terminal No.");
              TransInventoryEntry.SETRANGE("Transaction No.",TransactionHeader."Transaction No.");
              IF TransInventoryEntry.FINDSET THEN REPEAT
                TransInventoryEntryNew := TransInventoryEntry;
                TransInventoryEntryNew."Store No." := TransactionHeaderNew."Store No.";
                TransInventoryEntryNew."POS Terminal No." := TransactionHeaderNew."POS Terminal No.";
                TransInventoryEntryNew."Transaction No." := TransactionHeaderNew."Transaction No.";
                TransInventoryEntryNew.VALIDATE("Replication Counter");
                TransInventoryEntryNew.INSERT(FALSE);
                TransInventoryEntry.DELETE;
              UNTIL TransInventoryEntry.NEXT = 0;

              TransMixMatchEntry.RESET;
              TransMixMatchEntry.SETRANGE("Store No.",TransactionHeader."Store No.");
              TransMixMatchEntry.SETRANGE("POS Terminal No.",TransactionHeader."POS Terminal No.");
              TransMixMatchEntry.SETRANGE("Transaction No.",TransactionHeader."Transaction No.");
              IF TransMixMatchEntry.FINDSET THEN REPEAT
                TransMixMatchEntryNew := TransMixMatchEntry;
                TransMixMatchEntryNew."Store No." := TransactionHeaderNew."Store No.";
                TransMixMatchEntryNew."POS Terminal No." := TransactionHeaderNew."POS Terminal No.";
                TransMixMatchEntryNew."Transaction No." := TransactionHeaderNew."Transaction No.";
                TransMixMatchEntryNew.VALIDATE("Replication Counter");
                TransMixMatchEntryNew.INSERT(FALSE);
                TransMixMatchEntry.DELETE;
              UNTIL TransMixMatchEntry.NEXT = 0;

              TransDiscountEntry.RESET;
              TransDiscountEntry.SETRANGE("Store No.",TransactionHeader."Store No.");
              TransDiscountEntry.SETRANGE("POS Terminal No.",TransactionHeader."POS Terminal No.");
              TransDiscountEntry.SETRANGE("Transaction No.",TransactionHeader."Transaction No.");
              IF TransDiscountEntry.FINDSET THEN REPEAT
                TransDiscountEntryNew := TransDiscountEntry;
                TransDiscountEntryNew."Store No." := TransactionHeaderNew."Store No.";
                TransDiscountEntryNew."POS Terminal No." := TransactionHeaderNew."POS Terminal No.";
                TransDiscountEntryNew."Transaction No." := TransactionHeaderNew."Transaction No.";
                TransDiscountEntryNew.VALIDATE("Replication Counter");
                TransDiscountEntryNew.INSERT(FALSE);
                TransDiscountEntry.DELETE;
              UNTIL TransDiscountEntry.NEXT = 0;

              TransDiscBenefitEntry.RESET;
              TransDiscBenefitEntry.SETRANGE("Store No.",TransactionHeader."Store No.");
              TransDiscBenefitEntry.SETRANGE("POS Terminal No.",TransactionHeader."POS Terminal No.");
              TransDiscBenefitEntry.SETRANGE("Transaction No.",TransactionHeader."Transaction No.");
              IF TransDiscBenefitEntry.FINDSET THEN REPEAT
                TransDiscBenefitEntryNew := TransDiscBenefitEntry;
                TransDiscBenefitEntryNew."Store No." := TransactionHeaderNew."Store No.";
                TransDiscBenefitEntryNew."POS Terminal No." := TransactionHeaderNew."POS Terminal No.";
                TransDiscBenefitEntryNew."Transaction No." := TransactionHeaderNew."Transaction No.";
                TransDiscBenefitEntryNew.VALIDATE("Replication Counter");
                TransDiscBenefitEntryNew.INSERT(FALSE);
                TransDiscBenefitEntry.DELETE;
              UNTIL TransDiscBenefitEntry.NEXT = 0;

              MemberProcessOrderEntry.RESET;
              MemberProcessOrderEntry.SETRANGE("Store No.",TransactionHeader."Store No.");
              MemberProcessOrderEntry.SETRANGE("POS Terminal No.",TransactionHeader."POS Terminal No.");
              MemberProcessOrderEntry.SETRANGE("Transaction No.",TransactionHeader."Transaction No.");
              IF MemberProcessOrderEntry.FINDSET THEN REPEAT
                MemberProcessOrderEntryNew := MemberProcessOrderEntry;
                MemberProcessOrderEntryNew."Store No." := TransactionHeaderNew."Store No.";
                MemberProcessOrderEntryNew."POS Terminal No." := TransactionHeaderNew."POS Terminal No.";
                MemberProcessOrderEntryNew."Transaction No." := TransactionHeaderNew."Transaction No.";
                MemberProcessOrderEntryNew.VALIDATE("Replication Counter");
                MemberProcessOrderEntryNew.INSERT(FALSE);
                MemberProcessOrderEntry.DELETE;
              UNTIL MemberProcessOrderEntry.NEXT = 0;

              TransTenderDeclarEntry.RESET;
              TransTenderDeclarEntry.SETRANGE("Store No.",TransactionHeader."Store No.");
              TransTenderDeclarEntry.SETRANGE("POS Terminal No.",TransactionHeader."POS Terminal No.");
              TransTenderDeclarEntry.SETRANGE("Transaction No.",TransactionHeader."Transaction No.");
              IF TransTenderDeclarEntry.FINDSET THEN REPEAT
                TransTenderDeclarEntryNew := TransTenderDeclarEntry;
                TransTenderDeclarEntryNew."Store No." := TransactionHeaderNew."Store No.";
                TransTenderDeclarEntryNew."POS Terminal No." := TransactionHeaderNew."POS Terminal No.";
                TransTenderDeclarEntryNew."Transaction No." := TransactionHeaderNew."Transaction No.";
                TransTenderDeclarEntryNew.VALIDATE("Replication Counter");
                TransTenderDeclarEntryNew.INSERT(FALSE);
                TransTenderDeclarEntry.DELETE;
              UNTIL TransTenderDeclarEntry.NEXT = 0;

              TransSafeEntry.RESET;
              TransSafeEntry.SETRANGE("Store No.",TransactionHeader."Store No.");
              TransSafeEntry.SETRANGE("POS Terminal No.",TransactionHeader."POS Terminal No.");
              TransSafeEntry.SETRANGE("Transaction No.",TransactionHeader."Transaction No.");
              IF TransSafeEntry.FINDSET THEN REPEAT
                TransSafeEntryNew := TransSafeEntry;
                TransSafeEntryNew."Store No." := TransactionHeaderNew."Store No.";
                TransSafeEntryNew."POS Terminal No." := TransactionHeaderNew."POS Terminal No.";
                TransSafeEntryNew."Transaction No." := TransactionHeaderNew."Transaction No.";
                TransSafeEntryNew.VALIDATE("Replication Counter");
                TransSafeEntryNew.INSERT(FALSE);
                TransSafeEntry.DELETE;
              UNTIL TransSafeEntry.NEXT = 0;

              TransCashDeclaration.RESET;
              TransCashDeclaration.SETRANGE("Store No.",TransactionHeader."Store No.");
              TransCashDeclaration.SETRANGE("POS Terminal No.",TransactionHeader."POS Terminal No.");
              TransCashDeclaration.SETRANGE("Transaction No.",TransactionHeader."Transaction No.");
              IF TransCashDeclaration.FINDSET THEN REPEAT
                TransCashDeclarationNew := TransCashDeclaration;
                TransCashDeclarationNew."Store No." := TransactionHeaderNew."Store No.";
                TransCashDeclarationNew."POS Terminal No." := TransactionHeaderNew."POS Terminal No.";
                TransCashDeclarationNew."Transaction No." := TransactionHeaderNew."Transaction No.";
                TransCashDeclarationNew.VALIDATE("Replication Counter");
                TransCashDeclarationNew.INSERT(FALSE);
                TransCashDeclaration.DELETE;
              UNTIL TransCashDeclaration.NEXT = 0;

              TransactionHeader.DELETE;
              NewTransNo := NewTransNo + 1;
            END;
          END;

  }
  CODE
  {
    VAR
      OldStoreNo@1200070011 : Code[10];
      NewStoreNo@1200070012 : Code[10];
      OldPOSTerminal@1200070013 : Code[10];
      NewPOSTerminal@1200070014 : Code[10];
      OldTransNo@1200070015 : Integer;
      NewTransNo@1200070016 : Integer;
      TransactionHeader@1200070000 : Record 99001472;
      TransactionHeaderNew@1200070017 : Record 99001472;
      TransSalesEntry@1200070001 : Record 99001473;
      TransSalesEntryNew@1200070018 : Record 99001473;
      TransPaymentEntry@1200070002 : Record 99001474;
      TransPaymentEntryNew@1200070019 : Record 99001474;
      TransIncomeExpenseEntry@1200070003 : Record 99001475;
      TransIncomeExpenseEntryNew@1200070020 : Record 99001475;
      TransCouponEntry@1200070004 : Record 99001477;
      TransCouponEntryNew@1200070021 : Record 99001477;
      TransInfocodeEntry@1200070005 : Record 99001478;
      TransInfocodeEntryNew@1200070022 : Record 99001478;
      TransInventoryEntry@1200070006 : Record 99001490;
      TransInventoryEntryNew@1200070023 : Record 99001490;
      TransMixMatchEntry@1200070007 : Record 99001496;
      TransMixMatchEntryNew@1200070024 : Record 99001496;
      TransDiscountEntry@1200070008 : Record 99001642;
      TransDiscountEntryNew@1200070025 : Record 99001642;
      TransDiscBenefitEntry@1200070009 : Record 99001674;
      TransDiscBenefitEntryNew@1200070026 : Record 99001674;
      MemberProcessOrderEntry@1200070010 : Record 99009038;
      MemberProcessOrderEntryNew@1200070027 : Record 99009038;
      TransTenderDeclarEntry@1200070028 : Record 99001465;
      TransTenderDeclarEntryNew@1200070029 : Record 99001465;
      TransSafeEntry@1200070030 : Record 99001630;
      TransSafeEntryNew@1200070032 : Record 99001630;
      TransCashDeclaration@1200070031 : Record 99001626;
      TransCashDeclarationNew@1200070033 : Record 99001626;

    BEGIN
    {
      This codeunit is used to renumber POS transactions.
      This should only be used on POS machines to create new transactions with the correct store and terminal to be re-sent to HO.
      Before you to run this codeunit, you must change the values for the following fields:

      OldStoreNo
      OldPOSTerminal
      NewStoreNo
      NewPOSTerminal
      NewTransNo
      OldTransNo
    }
    END.
  }
}
-----------------------------------------------------------------------------------------------------------

No comments:

Post a Comment