Transaction log Sap B1 Tabla Opch

hola buenas noches estaba realizando el siguiente transaction log de sap solo que no me da el error que genere, lo que trato de hacer es que el numero de referencia me lo haga como un campo obligatorio en la tabla OPCH

TENGO DOS TRANSACTION PERO NO ME FUNCIONAN LAS DOS JUNTAS TODO ESTO ESTA EN UNA BASE DE PRUEBAS

--If @object_type = '60' AND @transaction_type IN ('A','U')
--BEGIN
--    IF (SELECT OcrCode FROM IGE1 WHERE DocEntry = @list_of_cols_val_tab_del) IS NULL
--	BEGIN
--	    SET @error = 99	
--		SET @error_message = 'No Haz Capturado Centro de Costo'
--	END

--If @object_type = '18' and @transaction_type IN ('A','U')
--BEGIN 
--    IF (SELECT NumAtCard From OPCH WHERE DocEntry = @list_of_cols_val_tab_del) IS NULL
--  BEGIN 
--      SET @error = -5002
--      SET @error_message = 'El campo Numero de Referencia no puede estar vacio'
--  END

--END

Hola estimado.
En el caso de tu segunda consulta:

Yo lo haría de la siguiente forma:

If @object_type = '18' and @transaction_type IN ('A','U')
BEGIN 
	declare @referencia as nvarchar(20)
	select @referencia = '-1000'
	
	SELECT @referencia=isnull(NumAtCard,'-1000')
	From OPCH WHERE DocEntry = @list_of_cols_val_tab_del
	
    IF @referencia = '-1000'
	  BEGIN 
		SET @error = -5002
		SET @error_message = 'El campo Numero de Referencia no puede estar vacio'
	  END
END

Aunque pareciera codigo redundante, pero me ha funcionado pues por alguna razon que desconozco SQL muchas veces no retorna el valor NULL en la parte:

Probá lo que te coloqué y nos comentás.
Saludos.

1 me gusta

De hecho debes reorganizar el query en ambos casos de esa manera.

A veces el sistema no guarda un NULL en los campos, sino que lo guarda como un ’ ’ o ‘’ (sin espacio) pero no NULL por lo que no te llega a funcionar.

Otra cosa, En el primer query:

estas tomando valores de una tabla detalle, ese para un if directo no te sirve porque puede traer más de 1 resultado y por ende arroja error ya desde el mismo SQL. Por eso deberás de dar la vuelta a la tabla en cada uno de sus registros, y si en alguno de ellos se cumple la condición, entonces activas la variable (como en el otro caso) y es ahí donde haces la validación.

Ahorita ando un tanto ocupado, espero te ayudara la explicación de porqué el primer query te arroja error, sino, avisa y con algo mas de tiempo se puede armar el query, pero ando un poco atorado en otras cosas para ayudar con eso ahorita.

1 me gusta

Espero y te sirva el codigo amigo.

If @object_type = '18' and @transaction_type IN ('A','U')
BEGIN 
    set @docvalid= 0
	set @docvalid= (SELECT COUNT(*) FROM OPCH T0 WHERE (T0.NumAtCard IS NULL OR T0.NumAtCard = '') AND T0.DocEntry = @list_of_cols_val_tab_del)
if @docvalid > 0
  BEGIN 
      SET @error_message = 'El campo Numero de Referencia no puede estar vacio'
      SET @error = 1       
  END
END


IF @object_type = '60' and (@transaction_type = 'A' or @transaction_type = 'U')
BEGIN
	set @docvalid= 0
	set @docvalid= (SELECT COUNT(*) FROM OIGE T0 INNER JOIN IGE1 T1 ON T0.DocEntry = T1.DocEntry  
					WHERE (T1.OcrCode IS NULL OR T1.OcrCode = '') 
					AND convert(char(10),T1.DocEntry) = @list_of_cols_val_tab_del)
if @docvalid > 0
Begin
	set @error_message ='El campo Numero de Referencia no puede estar vacio' 
	set @error = 1
end
3 Me gusta

revisando el query no me funciono :s no se que le pasa a mi transaction

revisando el query no me funciono :s no se que le pasa a mi transaction

al parecer si funciono la log de transaction

solo que tengo un detalle

cuando quiero funcionen las dos al mismo tiempo no me deja solo me funciona una y no las dos al mismo tiempo tengo que ponerle algun otro codigo

hola buen dia

les envio el codigo que me dio la solucion para si gustan implementarlo en su sap es para que no den salidas de mercancia sin capturar el centro de costo y el otro es para que no te deje capturar sin poner el numero de referencia muchas gracias por su ayuda a todos los que me ayudaron.

If @object_type = '18' and @transaction_type IN ('A','U')
BEGIN 
	declare @referencia as nvarchar(20)
	select @referencia = '-1000'
	
	SELECT @referencia=isnull(NumAtCard,'-1000')
	From OPCH WHERE DocEntry = @list_of_cols_val_tab_del
	
    IF @referencia = '-1000'
	  BEGIN 
		SET @error = -5002
		SET @error_message = 'El Campo de Referencia no puede estar Vacio'
	END
	END
	
If @object_type = '60' AND @transaction_type IN ('A','U')
BEGIN
    IF (SELECT OcrCode FROM IGE1 WHERE DocEntry = @list_of_cols_val_tab_del) IS NULL
	BEGIN
	    SET @error = 99	
		SET @error_message = 'No Haz Capturado Centro de Costo'
	END
	END
2 Me gusta

gracias por tu apoyo me funciono el query de la consulta

ares buen dia

me genero un error este query de transacion lo que pasa es que solamente me valida un articulo para salida y cuando capturo dos no me deja avanzar tengas alguna solucion al respeco

saludos

ME ESTA PASANDO EL SIGUIENTE ERROR

[Microsoft][SQL Server Native Client 11.0][SQL Server]Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. (CINF)

Contestando las dos ultimas…

Recomendación o solución al respecto de que solo valida 1 línea: Crea una especia de bandera, te pongo un ejemplo de seudocódigo y ya lo acomodas a tu necesidad.


@variablebandera1 as integer
set @variablebandera1 = "0"

Set @variablebandera1 = (SELECT top 1 "1" FROM IGE1 WHERE DocEntry = @list_of_cols_val_tab_del and OrcCode Is Null)

If @setvariablebandera1 = "1" 
Begin
Set @error = ##   
Set @error_mesage = 'No se ha capturado el costo'
End

ojo, este no es un código definitivo, es seudocódigo con la idea de lo que debes de realizar.

Del siguiente mensaje de error es relativo al mismo punto anterior, si vas a hacer una validación en un IF no lo puedes hacer directo al “SELECT CAMPOS FROM TABLA” si el resultado te puede traer mas de un resultado. También te arroja ese error en tu código si tienes por ejemplo:

Set @variable = (Select ITEMCODE from INV1) porque ahí te va a traer mas de 1 resultado y no peudes guardarlo en una variable.

Una consulta ¿Sabes algo de programación o de lógica de programación? ya que estos errores son básicos. (ojo no es por nada malo, es solo para saber si necesitas que se te explique con más detalles la razón o con ejemplos de los resultados.)

apenas estoy comenzando con programacion en sap. necesito saber un poco mas de programacion en realidad no es por nada pero no estudie para sistemas estudie para contabilidad pero por necesidad de la empresa me seleccionaron a mi para programar sap

saludos

Ok. eso es lo que necesitaba saber, porque el error que estas teniendo es de programación básica.

Con lo que te dí deberías de poder hacer el select de mejor manera, y ahora te voy a explicar un poquito rápido y básico porqué te ocurre ese error:

Una variable es un objeto que colocas en la programación y que solo puede tener 1 valor a la vez, en el momento que le das un segundo valor el anterior se elimina, ejemplo:

@variable1 = Casa
Mostrar @variable1
Mensaje 1

@variable 1 = Carro
Mostrar @variable1
Mensaje 2

Mensaje 1: En este mini ejemplo si se hiciera en un código de programación la línea de Mostrar @variable1 arriba de mensaje 1, debe de mostrarte en pantalla “casa”

Mensaje 2: En este momento se le cambió el valor a la variable por la palabra “Carro”. en donde aparece mostrar @variable1 arriba de mensaje 2, mostrará en pantalla “Carro”. Esto quiere decir que lo que tenía antes (“Casa”) ya no está en su memoria.

Entonces bien, una variable puede tener 1 solo valor, pero entonces no entiendo ¿porque me arroja error con mi Select?

Bien, vamos a la segunda parte, cuando le haces un “Select * From tabla Where A=B” a una tabla este te trae todos los registros de la “tabla” donde “A = B”. ¿Que está ocurriendo aquí? que por ejemplo si existe mas de 1 línea que coincida con ese resultado te traerá una lista de todo lo que coincide.

Hagamos el ejemplo más visual. Tienes una lista de alimentos a buscar en el supermercado:
Arroz
Galletas
Cereal
Sal
Pollo
Res
Cochino
Pescado.

Ok, y los tienes en una tabla llamada “lista” y ahora bién hagamos varios ejemplos.

Select * From Lista Where Alimento = "dulce "
Resultado = Cereal.

Select * From Lista Where Alimento = "Carne"
Resultado = Pollo
Res
Cochino
Pescado

Aunque en realidad es un poco más complejo que esto, esta es la base. Y como puedes ver al primer “select” solo teníamos 1 coincidencia. Mientras que el segundo teníamos varias distintas.

Si esto lo quieres llevar a una variable, con la primera no existirá ningún inconveniente. Puesto que solo trae 1 resultado. Sin embargo el segundo Query te traerá más de 1 resultado, y no puedes meter una lista de resultados en una variable simple.

(existen otros tipos de variables para manejar estos casos pero no vamos a hablar de programación más avanzada y de otras actividades que SAP directamente por Query Manager no aceptaría.)

Por ahora solo quier ver si te queda entendible o claro el ejemplo de porqué te arrojaba error. y avísanos si lo que te comenté de como arreglar el código te ayuda un poco a entender donde tienes el error y corregirlo.

Hola está muy bueno tu código, también les sugiero usar el B1UP de Boyum
Saludos.

cual es el b1up de boyum

saludos

Buen día Wlberth90 es un addon de SAP

http://www.boyum-it.es/

Este tema se cerró automáticamente 7 días después del último post. No se permiten nuevas respuestas.