Mariano has a much more detailed article here:
http://dynamicsgpblogster.blogspot.com/2011/09/getting-next-voucher-number-for.html
Ours is (typically) the minimum needed to get back to coding.
IF EXISTS (SELECT name
FROM sysobjects
WHERE name = N'taGetPMNextVoucherNumberWrapper'
AND type = 'P')
DROP PROCEDURE taGetPMNextVoucherNumberWrapper
GO
CREATE PROCEDURE taGetPMNextVoucherNumberWrapper
-- taGetPMNextVoucherNumberWrapper '0',''
@DocType INT,
--0 - Next Voucher Number
--1 - Next Payment Number
--2 - Next Alignment Number
@I_vVCHNUMWK char(17) OUT
--returns the voucher number two ways:
-- as an OUT parameter
-- in the result set
-- (sometimes one is easier to grab than the other)
AS
SET NOCOUNT ON
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
DECLARE @RC int
DECLARE @O_iErrorState int
DECLARE @oErrString varchar(255)
DECLARE @I_sCNTRLTYP SMALLINT
SELECT
@I_vVCHNUMWK = '',
@I_sCNTRLTYP = 0,
@O_iErrorState = '',
@O_iErrorState = 0,
@oErrString = ''
EXECUTE @RC = taGetPMNextVoucherNumber
@I_vVCHNUMWK OUTPUT,
@I_sCNTRLTYP,
@O_iErrorState OUTPUT
SELECT @I_vVCHNUMWK AS VCHRNMBR, @oErrString AS ErrorString
GO
GO
grant exec on taGetPMNextVoucherNumberWrapper to PUBLIC
-- sp_sps 'm'