cancel
Showing results for 
Search instead for 
Did you mean: 

Evitar duplicidad de facturas por Transaction Notification

Former Member
0 Kudos

Hola, espero me puedan orientar en lo que estoy mal.

Resulta que necesito controlar de que no se ingrese una misma factura dos veces, la forma de controlar es verificando de que la factura que se está creando, el socio de negocio en ella no exista con el mismo foliopref y folionum en la base de datos.

Mi idea fue crear tres variables en donde guardo el foliopref, folionum y cardcode de la factura que se encuentra en ventana y luego en otras variables dos cuento cuantas veces existe el foliopref en conjunto con el cardcode, lo mismo para el folionum, luego pregunto que si ambas variables contienen un número distinto a cero no deje crear la factura, porque eso quiere decir que ya existe, sin embargo si alguno es cero si deje crear la factura.

Bueno aquí está el código:

If @object_type = 18 AND @transaction_type IN ('A')

     Begin

     declare @NFolioBD as int --Cuenta cuantas veces existe el n°folio en la bd

     declare @NFolioFC as int --Nº Folio Factura en Ventana

     declare @IndicadorBD as int --Cuenta cuantas veces existe el indicador en la bd

     declare @IndicadorFC as nvarchar (2) --Indicador Factura en Ventana

     declare @SNegocioFC as nvarchar (15) --Socio de Negocio Factura en Ventana

     Set @IndicadorFC= (select FolioPref From OPCH where @list_of_cols_val_tab_del = DocEntry)-- asigno el foliopref de la factura en ventana.

     Set @NFolioFC= (Select FolioNum From OPCH Where @list_of_cols_val_tab_del = DocEntry)-- asigno el folionum de la factura en ventana.

     Set @SNegocioFC= (select CardCode From OPCH where @list_of_cols_val_tab_del = DocEntry)-- asigno el cardcode de la factura en ventana.

     -- Cuento cuantas veces existe el foliopref en la bd, en donde sea igual al foliopref de la factura abierta e igual al socio de negocios

     Set @IndicadorBD= (Select count (FolioPref) From OPCH where FolioPref = @IndicadorFC and CardCode = @SNegocioFC)

     --Cuento cuantas veces existe el folionum en la bd, en donde sea igual al folionum de la factura abierta e al igual socio de negocios

     Set @NFolioBD= (Select count (FolioNum) From OPCH where FolioNum = @NFolioFC and CardCode = @SNegocioFC)

     -- si alguno de los dos es 0, debe dejar de crear la factura, de lo contrario no debe permitirlo

     IF (@IndicadorBD !=0 and @NFolioBD != 0 )

          Begin

          Set @error = 05

          Set @error_message= 'Nº de Folio ya ingresado'

          End

     End

Desde ya muchas gracias y saludos.

Accepted Solutions (1)

Accepted Solutions (1)

former_member227744
Active Participant
0 Kudos

Juan:

Acá te envío uno probado, tanto para las facturas como notas de crédito de proveedor

Espero sea de ayuda.

Saludos,

Manuel Díaz G.

/*FOLIO DUPLICADO en Facturas y Notas Crédito Proveedores*/

--Inicio query que impide que se duplique el registro de facturas de proveedores y notas de credito

Declare @CardCode nVarchar(20)

Declare @Folio int

Declare @Prefijo varchar(2)

/*******************************************************************************

NOTA:Si la variable @Prefijo es texto por ejemplo: FP, NC el tipo es varchar(2),

en caso contrario,si la variable es numerica el tipo es int

********************************************************************************/

Declare @Duplicado nVarchar

If @object_type in ('18', '19')

   and @transaction_type in ('A', 'U', 'L', 'C')

begin 

   Select @CardCode = Case @object_type

          When 18 Then (SELECT T0.CardCode FROM OPCH T0 Where T0.DocEntry = @list_of_cols_val_tab_del)

          When 19 Then (SELECT T0.CardCode FROM ORPC T0 Where T0.DocEntry = @list_of_cols_val_tab_del)

          End

   Select @Folio = Case @object_type

          When 18 Then (SELECT T0.FolioNum FROM OPCH T0 Where T0.DocEntry = @list_of_cols_val_tab_del)

          When 19 Then (SELECT T0.FolioNum FROM ORPC T0 Where T0.DocEntry = @list_of_cols_val_tab_del)

          End

   Select @Prefijo = Case @object_type

          When 18 Then (SELECT T0.FolioPref FROM OPCH T0 Where T0.DocEntry = @list_of_cols_val_tab_del)

          When 19 Then (SELECT T0.FolioPref FROM ORPC T0 Where T0.DocEntry = @list_of_cols_val_tab_del)

          End

   Select @Duplicado = Case @object_type

          When 18 Then (SELECT Count(*) FROM OPCH T0 Where T0.CardCode = @CardCode and T0.FolioPref = @Prefijo and T0.FolioNum = @Folio and T0.DocEntry <> @list_of_cols_val_tab_del)

          When 19 Then (SELECT Count(*) FROM ORPC T0 Where T0.CardCode = @CardCode and T0.FolioPref = @Prefijo and T0.FolioNum = @Folio and T0.DocEntry <> @list_of_cols_val_tab_del)

          End

   if @Duplicado > 0

   begin

          set @error = 11

          set @error_message = 'El folio de este documento ya existe'

  /*+(case @object_type

  when 18 then (select min(convert(varchar,docnum)) from opch where folionum=@folio)

  when 19 then (select min(convert(varchar,docnum)) from orpc where folionum=@folio)

  else ''

  end)*/

   end

end

--Fin query que impide que se duplique el registro de facturas de proveedores y notas de credito

Former Member
0 Kudos

Manuel,

Gracias por responder, a funcionado perfecto.

Muchas gracias.

Saludos.

former_member227744
Active Participant
0 Kudos

Juan:

Genial !!

Saludos,

Manuel Díaz G.

Answers (1)

Answers (1)

former_member188471
Active Contributor
0 Kudos

En el IF usa OR y prueba.

IF (@IndicadorBD !=0 or @NFolioBD != 0 )

          Begin

          Set @error = 05

          Set @error_message= 'Nº de Folio ya ingresado'

          End

     End

Former Member
0 Kudos

Muchas gracias por responder, probé cambiando el and por el or, pero sin embargo sigue sin funcionar ya que arroja el error de que ya existe.

Estoy probando con un socio de negocio, en donde el foliopref ya existe y el folionum también, al momento de intentar duplicarlo arroja el mensaje de error y al cambiar el folionum también arroja el mensaje de error.

Tal ves tendré algo mal en la consulta?