I don't see how you can force the order without using an ordering column of some kind so it seems the easiest solution is to just add an IDENTITY column to the target table. Then we can query the data in the order it was entered. (You could probably also use a TIMESTAMP column, a DATETIME, or a NEWSEQUENTIALID for ordering as well...but you will need something that indicates the order of the rows since SQL doesn't necessarily store them in the order they are entered.)
With that addition then, this query will do what you want:
--Sample data
IF OBJECT_ID('tempdb..#Invoice_t') IS NOT NULL
DROP TABLE #Invoice_t
CREATE TABLE #Invoice_t (
[RowID] INT IDENTITY(1,1) NOT NULL,
[Cost_Center_code] [int] NOT NULL,
[Payment_code] [int] NOT NULL,
[INV_No] [int] NOT NULL,
PRIMARY KEY CLUSTERED ([RowID],[Cost_Center_code],[Payment_code],[INV_No]))
INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (1, 1, 2)
INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (1, 2, 2)
INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (1, 3, 2)
INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (1, 4, 2)
INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (1, 5, 2)
INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (1, 6, 2)
INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (1, 7, 2)
INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (1, 8, 2)
INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (1, 9, 2)
INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (1, 10, 2)
INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (1, 1, 1)
INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (1, 1, 2)
INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (1, 1, 3)
INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (2, 1, 1)
INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (2, 1, 2)
INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (2, 2, 1)
INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (2, 2, 2)
INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (1, 2, 1)
INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (3, 2, 1)
INSERT #Invoice_t ([Cost_Center_code], [Payment_code], [INV_No]) VALUES (3, 1, 1)
SET NOCOUNT ON
;WITH
cteInvoices
AS
(
SELECT
RowID
,RowID+1 AS PrevRowID
,RowID-1 AS NextRowID
,Cost_Center_code
,Payment_code
,INV_No
FROM
#Invoice_t
)
SELECT
i.Cost_Center_code
,i.Payment_code
,i.INV_No
,p.Cost_Center_code AS [prev_cost_center_code]
,p.Payment_code AS [prev_payment_code]
,p.INV_No AS [prev_Inv_no]
,n.Cost_Center_code AS [next_cost_center_code]
,n.Payment_code AS [next_payment_code]
,n.INV_No AS [next_Inv_no]
FROM
cteInvoices AS i
LEFT OUTER JOIN
cteInvoices AS p
ON i.RowID = p.PrevRowID
LEFT OUTER JOIN
cteInvoices AS n
ON i.RowID = n.NextRowID
WHERE
i.RowID > 0