cancel
Showing results for 
Search instead for 
Did you mean: 

RUT Chile

Former Member
0 Kudos

Estimados, tengo una duda desde hace mucho tiempo, existe la manera de verificar el RUT (Chile) cuando ingreso o creo un nuevo Socio de Negocios en SAP ??

gracias y espero su pronta respuesta.

nuestra versión es : SAP Business One 2007 A (8.00.234) SP: 01 PL: 10

saludos y felices fiestas.

Rodrigo H.

Accepted Solutions (0)

Answers (2)

Answers (2)

Former Member
0 Kudos

Hola...

Lo ideal sería una validación por Transaction Notification. Con eso, te aseguras de que siempre el RUT sea validado.

Saludos Cordiales,

Former Member
0 Kudos

HOla, nunca me ha resultado una query en por Transaction Notification, no se como pegarla, copiarla, generarla, ni ejecutarla..

si me pudieran orientar paso a paso por favor...

Muchas GRacias..

RHG

former_member188440
Active Contributor
0 Kudos

Pasame tu correo y te mando un manual del TransactionNotification

felipe_loyolarodriguez
Active Contributor
0 Kudos

Hola

Por si todavia necesitas el TN, aqui te lo dejo


--  VALIDA RUT EN SN
IF @object_type = '2' AND @transaction_type IN ('A','U')
BEGIN
	DECLARE @Rut_SN VARCHAR(12)
	SET @Rut_SN = (SELECT LicTradNum FROM OCRD WHERE CardCode = @list_of_cols_val_tab_del)
				
	DECLARE @Rut_Par Char(12)
	DECLARE @msgType SmallInt
		,@retorno  SmallInt
		,@msg Char(12)
		,@msgTitle Char(12)
		,@RutDV Char(12)
		,@Rut VarChar(12)
		,@DV Char(1)
		,@vRut Char(12)
		,@ValidaRut SmallInt
		,@i SmallInt
		,@suma SmallInt
		,@j SmallInt
		,@Modulo SmallInt
		,@Resta SmallInt
		,@Valid Char(1)

		Set @Rut_Par = (SELECT LicTradNum FROM OCRD WHERE CardCode = @list_of_cols_val_tab_del)
		Set @RutDV = LTrim(RTrim(@Rut_Par))
		Set @DV = Right(@RutDV,1)
		Set @Rut = Left(@RutDV,len(@RutDV)-2)
		Set @Rut = Replace(@Rut,'.', '')
    
		If @Rut <> ' '
			Begin
       				Set @vRut = @Rut
			End
			Else
			Begin
       				Set @vRut = '0'
       				Set @DV = ' '
			End 	
		Set @i = Len(@vRut)
		Set @suma = 0
		Set @j = 2
		While @i <> 0
		Begin
			If @j > 7 
			Begin 
				Set @j = 2 
			End
			Set @suma = @suma + ((SubString(@vRut, @i, 1)) * @j)        
			Set @j = @j + 1        
			Set @i = @i - 1
		End
		Set @Modulo = @suma - Round(@suma / 11, 0) * 11
		Set @Resta = 11 - @Modulo
		If @Resta = 10 
			Set @Valid = 'K'
		Else
		If @Resta = 11 
			Set @Valid = '0'
		Else 
			Set @Valid = LTrim(RTrim(Str(@Resta)))
		Set @Rut = RTrim(Left(@RutDV,len(@RutDV)-2)) + '-' + Rtrim(LTrim(@Valid))
			
	IF @RUT != @Rut_SN
	BEGIN
		SELECT @error = -1000,@error_message = 'Rut incorrecto, favor introducir un rut valido para continuar'
	END
END

Con ese codigo, para crear un SN o modificar uno existente deberan introducir un RUT valido

Atte.

Felipe Loyola

former_member326598
Participant
0 Kudos

Y esta validacion tambien valida que no se duplique un RUT ???

felipe_loyolarodriguez
Active Contributor
0 Kudos

Hola Jesus, ese TN solo valida que el RUT que se este insertando en el SN sea uno valido, para validar que el RUT no este repetido, hay que agregar otra validacion a ese codigo.

Primero hay que recordar que una misma empresa o persona natural, puede ser proveedor y cliente al mismo tiempo, por lo tanto ambos tendran el mismo RUT.


IF @object_type = '2' AND @transaction_type IN ('A','U')
BEGIN
	DECLARE @Rut_SN VARCHAR(12)
	SET @Rut_SN = (SELECT LicTradNum FROM OCRD WHERE CardCode = @list_of_cols_val_tab_del)
				
	DECLARE @Rut_Par Char(12)
	DECLARE @msgType SmallInt
		,@retorno  SmallInt
		,@msg Char(12)
		,@msgTitle Char(12)
		,@RutDV Char(12)
		,@Rut VarChar(12)
		,@DV Char(1)
		,@vRut Char(12)
		,@ValidaRut SmallInt
		,@i SmallInt
		,@suma SmallInt
		,@j SmallInt
		,@Modulo SmallInt
		,@Resta SmallInt
		,@Valid Char(1)

		Set @Rut_Par = (SELECT LicTradNum FROM OCRD WHERE CardCode = @list_of_cols_val_tab_del)
		Set @RutDV = LTrim(RTrim(@Rut_Par))
		Set @DV = Right(@RutDV,1)
		Set @Rut = Left(@RutDV,len(@RutDV)-2)
		Set @Rut = Replace(@Rut,'.', '')
    
		If @Rut != ' '
			Begin
       				Set @vRut = @Rut
			End
			Else
			Begin
       				Set @vRut = '0'
       				Set @DV = ' '
			End 	
		Set @i = Len(@vRut)
		Set @suma = 0
		Set @j = 2
		While @i != 0
		Begin
			If @j > 7 
			Begin 
				Set @j = 2 
			End
			Set @suma = @suma + ((SubString(@vRut, @i, 1)) * @j)        
			Set @j = @j + 1        
			Set @i = @i - 1
		End
		Set @Modulo = @suma - Round(@suma / 11, 0) * 11
		Set @Resta = 11 - @Modulo
		If @Resta = 10 
			Set @Valid = 'K'
		Else
		If @Resta = 11 
			Set @Valid = '0'
		Else 
			Set @Valid = LTrim(RTrim(Str(@Resta)))
		Set @Rut = RTrim(Left(@RutDV,len(@RutDV)-2)) + '-' + Rtrim(LTrim(@Valid))
			
	IF @RUT != @Rut_SN
	BEGIN
		SELECT @error = -1000,@error_message = 'Rut incorrecto, favor introducir un rut valido para continuar'
	END
ELSE
	DECLARE @RUT_CLIENTE NVARCHAR(12)
	SET @RUT_CLIENTE = (SELECT LicTradNum FROM OCRD WHERE CardCode = @list_of_cols_val_tab_del)
	
	IF EXISTS (SELECT COUNT(@RUT_CLIENTE) FROM OCRD WHERE LicTradNum = @RUT_CLIENTE AND CardType = 'C' HAVING COUNT(@RUT_CLIENTE) > 1)
 
	BEGIN
		SELECT @error = -2000,@error_message = 'Rut de cliente duplicado'
	END
ELSE
	DECLARE @RUT_PROV NVARCHAR(12)
	SET @RUT_PROV = (SELECT LicTradNum FROM OCRD WHERE CardCode = @list_of_cols_val_tab_del)
	
	IF EXISTS (SELECT COUNT(@RUT_PROV) FROM OCRD WHERE LicTradNum = @RUT_PROV AND CardType = 'S' HAVING COUNT(@RUT_PROV) > 1)
 
	BEGIN
		SELECT @error = -3000,@error_message = 'Rut de Proveedor duplicado'
	END
END

Ahora podras controlar que los RUT no sean duplicados.

Atte.

Felipe Loyola

Former Member
0 Kudos

Felipe:

Y que pasa cuando un código es Cliente - Proveedor ? Es decir el código no es el mismo, pero si el RUT?

Por ejemplio:

Codigo Cliente : C76014610 RUT :76014610-2

Codigo Proveedor : P76014610 RUT : 76014610-2

Para este caso no se podría crear uno de los 2.

Saludos,

VMC.

felipe_loyolarodriguez
Active Contributor
0 Kudos

Vivi:

Eso ya lo tome en cuenta al generar el codigo.

Cuando cree un Proveedor, el RUT solo mandara error si existe otro proveedor con el mismo RUT, con el cliente es lo mismo, solo mandara error cuando existe otro cliente con el mismo RUT

Slds

Former Member
0 Kudos

Felipe:

He vuelto a probar la consulta y si funciona para cliente - proveedor. El unico detalle es que si una persona crea un rut sin puntos y otra persona con puntos, segun esta consulta seria un rut distinto y lo crea igual.

Por ej.

RUT : 76014610-2

RUT : 76.014.610-2

Saludos,

VMC.

felipe_loyolarodriguez
Active Contributor
0 Kudos

Tienes Razon Viviana


IF @object_type = '2' AND @transaction_type IN ('A','U')
BEGIN
	DECLARE @Rut_SN VARCHAR(12)
	SET @Rut_SN = (SELECT LicTradNum FROM OCRD WHERE CardCode = @list_of_cols_val_tab_del)
				
	DECLARE @Rut_Par Char(12)
	DECLARE @msgType SmallInt
		,@retorno  SmallInt
		,@msg Char(12)
		,@msgTitle Char(12)
		,@RutDV Char(12)
		,@Rut VarChar(12)
		,@DV Char(1)
		,@vRut Char(12)
		,@ValidaRut SmallInt
		,@i SmallInt
		,@suma SmallInt
		,@j SmallInt
		,@Modulo SmallInt
		,@Resta SmallInt
		,@Valid Char(1)
 
		Set @Rut_Par = (SELECT LicTradNum FROM OCRD WHERE CardCode = @list_of_cols_val_tab_del)
		Set @RutDV = LTrim(RTrim(@Rut_Par))
		Set @DV = Right(@RutDV,1)
		Set @Rut = Left(@RutDV,len(@RutDV)-2)
		Set @Rut = Replace(@Rut,'.', '')
    
		If @Rut != ' '
			Begin
       				Set @vRut = @Rut
			End
			Else
			Begin
       				Set @vRut = '0'
       				Set @DV = ' '
			End 	
		Set @i = Len(@vRut)
		Set @suma = 0
		Set @j = 2
		While @i != 0
		Begin
			If @j > 7 
			Begin 
				Set @j = 2 
			End
			Set @suma = @suma + ((SubString(@vRut, @i, 1)) * @j)        
			Set @j = @j + 1        
			Set @i = @i - 1
		End
		Set @Modulo = @suma - Round(@suma / 11, 0) * 11
		Set @Resta = 11 - @Modulo
		If @Resta = 10 
			Set @Valid = 'K'
		Else
		If @Resta = 11 
			Set @Valid = '0'
		Else 
			Set @Valid = LTrim(RTrim(Str(@Resta)))
		Set @Rut = RTrim(Left(@RutDV,len(@RutDV)-2)) + '-' + Rtrim(LTrim(@Valid))
			
	IF @RUT != @Rut_SN
	BEGIN
		SELECT @error = -1000,@error_message = 'Rut incorrecto, favor introducir un rut valido para continuar'
	END
ELSE
	DECLARE @RUT_CLIENTE NVARCHAR(12)
	SET @RUT_CLIENTE = (SELECT REPLACE(LicTradNum,'.','') FROM OCRD WHERE CardCode = @list_of_cols_val_tab_del)
	
	IF EXISTS (SELECT COUNT(@RUT_CLIENTE) FROM OCRD WHERE REPLACE(LicTradNum,'.','') = @RUT_CLIENTE AND CardType = 'C' HAVING COUNT(@RUT_CLIENTE) > 1)
 
	BEGIN
		SELECT @error = -2000,@error_message = 'Rut de cliente duplicado'
	END
ELSE
	DECLARE @RUT_PROV NVARCHAR(12)
	SET @RUT_PROV = (SELECT REPLACE(LicTradNum,'.','') FROM OCRD WHERE CardCode = @list_of_cols_val_tab_del)
	
	IF EXISTS (SELECT COUNT(@RUT_PROV) FROM OCRD WHERE REPLACE(LicTradNum,'.','') = @RUT_PROV AND CardType = 'S' HAVING COUNT(@RUT_PROV) > 1)
 
	BEGIN
		SELECT @error = -3000,@error_message = 'Rut de Proveedor duplicado'
	END
END

Aqui esta el nuevo codigo, deberia funcionar

Slds

Former Member
0 Kudos

Felipe:

Gracias por la respuesta, pero ahora probando la consulta se me presento el siguiente problema para los proveedores- honorarios.

Como son cuentas contables distintas se debe crear con distinto codigo y mismo rut,y par estos casos, esta validacion no lo permite.

Saludos,

VMC.

felipe_loyolarodriguez
Active Contributor
0 Kudos

En ese caso requieres de un codigo mas personalizado, aunque mi ubicacion tambien es Chile, y creo que a todos los chilenos tendrian el mismo problema con los honorarios.

Para ese caso, hay que usar los grupos de proveedores.

En el Codigo de Proveedores excluyes de la validacion a los honorarios


DECLARE @RUT_PROV NVARCHAR(12)
	SET @RUT_PROV = (SELECT REPLACE(LicTradNum,'.','') FROM OCRD WHERE CardCode = @list_of_cols_val_tab_del)
	
	IF EXISTS (SELECT COUNT(@RUT_PROV) FROM OCRD WHERE REPLACE(LicTradNum,'.','') = @RUT_PROV AND CardType = 'S' AND GroupCode != /*Aqui va el Nº del grupo de los honorarios*/ HAVING COUNT(@RUT_PROV) > 1)
 
	BEGIN
		SELECT @error = -3000,@error_message = 'Rut de Proveedor duplicado'
	END
END

Y ahora debajo debes agregar otra validacion exclusiva para los honorarios


DECLARE @RUT_HON NVARCHAR(12)
	SET @RUT_HON = (SELECT REPLACE(LicTradNum,'.','') FROM OCRD WHERE CardCode = @list_of_cols_val_tab_del)
	
	IF EXISTS (SELECT COUNT(@RUT_HON) FROM OCRD WHERE REPLACE(LicTradNum,'.','') = @RUT_HON AND CardType = 'S' AND GroupCode = /*Aqui va el Nº del grupo de los honorarios*/ HAVING COUNT(@RUT_HON) > 1)
 
	BEGIN
		SELECT @error = -5000,@error_message = 'Rut de honorarios duplicado'
	END
END

Atte.

Felipe Loyola

Edited by: Floyola on Jun 17, 2011 12:39 PM

felipe_loyolarodriguez
Active Contributor
0 Kudos

Buenas tardes

con la siguiente query puedes validar el rut en el socio de negocios


Declare @Rut_Par Char(12)
DECLARE @msgType SmallInt
          ,@retorno  SmallInt
          ,@msg Char(12)
          ,@msgTitle Char(12)
          ,@RutDV Char(12)
          ,@Rut VarChar(12)
          ,@DV Char(1)
          ,@vRut Char(12)
          ,@ValidaRut SmallInt
          ,@i SmallInt, @suma SmallInt, @j SmallInt, @Modulo SmallInt
          ,@Resta SmallInt, @Valid Char(1)

Set @Rut_Par = $[$41.1.0]
Set @RutDV = LTrim(RTrim(@Rut_Par))
Set @DV = Right(@RutDV,1)
Set @Rut = Left(@RutDV,len(@RutDV)-2)
Set @Rut = Replace(@Rut,'.', '')
    
If @Rut <> ' '
Begin
       	Set @vRut = @Rut
End
Else
Begin
       	Set @vRut = '0'
       	Set @DV = ' '
End 	

Set @i = Len(@vRut)
Set @suma = 0
Set @j = 2
While @i <> 0
Begin
	If @j > 7 Begin Set @j = 2 End
	Set @suma = @suma + ((SubString(@vRut, @i, 1)) * @j)        
	Set @j = @j + 1        
	Set @i = @i - 1
End
Set @Modulo = @suma - Round(@suma / 11, 0) * 11
Set @Resta = 11 - @Modulo

If @Resta = 10 Set @Valid = 'K'
Else
If @Resta = 11 Set @Valid = '0'
Else Set @Valid = LTrim(RTrim(Str(@Resta)))
Set @Rut = RTrim(Left(@RutDV,len(@RutDV)-2)) + '-' + Rtrim(LTrim(@Valid))
Select @Rut

Lo dejas como buisqueda formateada

Saludos

FLR

Former Member
0 Kudos

gracias por su pronta respuesta, pero al hacer la consulta formateada, sólo válida si es que hay o no algún dato, que si pongo un Rut no válido igual lo guarda sin problemas.

alguna modeificación que deba hacerle ?

gracias.

RHG

felipe_loyolarodriguez
Active Contributor
0 Kudos

La consulta formateada lo que hace es corregir el RUT que tu usaste, lo que corrige es el DV, aunque tu pongas un rut erroneo, la consulta corregira el DV del rut que usaste, ya que no hay manera de decirle a la consulta cual es el RUT correcto que tiene que estar.

Le puedes dar la condicion que se actualize cuando se llene algun campo, para que no la tengan que activar a mano,

Saludos.

FLR