cancel
Showing results for 
Search instead for 
Did you mean: 

Error al intentar crear un archivo desde el transaction notification

former_member325322
Participant
0 Kudos

Hola a todos

Necesito crear un archivo  txt cada vez que se genere una boleta en SAP, para ello he incorporado el código que incorporo al final creándome los siguientes problemas:

Problema 1: Al ejecutar el código se genera el error

Descripción:

  Este programa dejó de interactuar con Windows por un problema.

Firma con problemas:

  Nombre del evento de problema:    AppHangB1

  Nombre de aplicación: SAP Business One.exe

  Versión de la aplicación: 8.82.71.0

  Marca de tiempo de la aplicación: 50409837

  Firma de bloqueo: a0cd

  Tipo de bloqueo: 256

  Versión del sistema operativo: 6.1.7601.2.1.0.16.7

  Id. de configuración regional:          13322

  Firma adicional de bloqueo 1: a0cdb1025cb65ce120a8e6f5d31426cd

  Firma adicional de bloqueo 2:          c1f3

  Firma adicional de bloqueo 3: c1f3a1a632ff4c321e678e6a85bc2ac9

  Firma adicional de bloqueo 4:          a0cd

  Firma adicional de bloqueo 5: a0cdb1025cb65ce120a8e6f5d31426cd

  Firma adicional de bloqueo 6:          c1f3

  Firma adicional de bloqueo 7: c1f3a1a632ff4c321e678e6a85bc2ac9

2) no me ha sido posible aislar la Boleta de Venta de la factura de venta, ambas se almacenan en OINV pero se diferencian a partir del campo docsubtype, que para la boleta de venta es IB.

Ojalá pudieran ayudarme.

Saludos

IF @transaction_type = 'A'

      BEGIN

DECLARE @QUERY1 VARCHAR(2000)

DECLARE @NUMERO_BOLETA VARCHAR(100)

DECLARE @QUERY VARCHAR(2000)

SET @NUMERO_BOLETA = (SELECT DocNum FROM OINV WHERE DocEntry = @list_of_cols_val_tab_del)

DECLARE @FileName varchar(200) = 'c:\clopez\'+CAST(@NUMERO_BOLETA AS VARCHAR)+'.txt'

SET @QUERY1 ='SELECT '

SELECT @QUERY1 = @QUERY1 + 'T0.[DocNum] as Boleta,T0.[DocDate] as Fecha,T1.[WhsCode] as Centro, T0.[CardCode] as CodCliente, T2.slpname as Operaria, T1.[ItemCode] as CodProducto, T1.[Quantity] as Cantidad, T1.U_BELPLAN AS TipoPlan FROM BELENUS_PRUEBA..OINV T0 INNER JOIN BELENUS_PRUEBA..INV1 T1 ON (T0.DocEntry = T1.DocEntry) LEFT JOIN BELENUS_PRUEBA..OSLP T2 ON (T0.slpcode = T2.slpcode)  WHERE T0.[DocNum] = '+@NUMERO_BOLETA+'" queryout '+@FileName+' -U sa -P Quintec.2009 -c -t "|" -r ";"'

SELECT @QUERY1

SELECT @Query= 'master.dbo.xp_cmdshell

''bcp.exe "'+@QUERY1+' '''

EXECUTE(@Query)

      END

END

Accepted Solutions (1)

Accepted Solutions (1)

felipe_loyolarodriguez
Active Contributor
0 Kudos

Buenos días

Utiliza la funcion BCP, así exporto los txt o xml en SAP


SET @sSQL='BCP "SELECT * FROM [##TXT]" QUERYOUT "C:\ISICAT\In\'+@Nom+'.txt" -S '+ @@SERVERNAME +' -T -c -t'


EXEC xp_cmdshell @sSQL

Saludos

Felipe

Former Member
0 Kudos

Estimado, buenas tardes

favor estimado, como haria para que pueda exportar desde un rpte SAP un archivo txt?

felipe_loyolarodriguez
Active Contributor
0 Kudos

Prueba algo simple:


DECLARE @sSQL NVARCHAR(4000)

SET @sSQL='BCP "SELECT AcctCode,AcctName FROM SBODemoCL..OACT" QUERYOUT "C:\PruebaForo.txt" -S '+ @@SERVERNAME +' -T -c -t'

EXEC xp_cmdshell @sSQL

Eso lo guardas en un procedimiento almacenado y lo llamas.

PD: Recuerda cambiar el nombre de la base de datos en el FROM y tener ativada la funcion xp_cmdshell (por defecto viene desactivada).

Saludos

Felipe

Former Member
0 Kudos

Estimado, buen dia

Ante Todo muchas gracias por la atencion prestada, se realizaron las pruebas con lo enviado pero estimado con ello algunas dudas.

1.-como podria hacer para desde aqui llamar a mi procedimiento que contiene parametros?

2.- este archivo txt se aloja en el servidor, como podria cambiar para que el usuario cuando ejecute este Rpte. este se aloje en alguna ubicacion de su PC local?

Favor estimado, tus recomendaciones..

Saludos

Carlos

felipe_loyolarodriguez
Active Contributor
0 Kudos

Estimado, prueba esto.

1- El SP obtiene el hostname desde donde se llama.

2- Debe existir una carpeta compartida con los permisos correspondientes para que el BCP cree el archivo.

3- La variable @FileName es la que almacena el nombre de la carpeta y el nombre del archivo.

4- La variable @FullFileName es la que almacena toda la ruta, ejemplo "\\PC2\CarpetaCompartida\Archivo.txt"

CREATE PROC [dbo].[CONSULTA_FORO] (@Param1 NVARCHAR(20))

AS

BEGIN

          DECLARE

                     @sSQL NVARCHAR(4000)

                    ,@Host NVARCHAR(255)

                    ,@FileName NVARCHAR(255)

                    ,@FullFileName NVARCHAR(255)

 

          IF OBJECT_ID('tempdb..##who') IS NOT NULL

          DROP TABLE ##Who

 

          CREATE TABLE ##Who

          (spid SMALLINT,ecid SMALLINT, status NCHAR(30), loginname NCHAR(128), hostname NCHAR(128), blk CHAR(5), dbname NCHAR(128), cmd NCHAR(16), request_id INT)

          INSERT INTO ##Who

          EXEC sp_who

 

          SET @Host=(SELECT hostname FROM ##Who WHERE spid=@@SPID)

          SET @FileName='\B1_SHR\PruebaForo.txt' -- Carpeta Compartida y nombre del archivo.

          SET @FullFileName='\\'+LTRIM(RTRIM(@Host))+LTRIM(RTRIM(@FileName))

          SET @sSQL='BCP "SELECT CardCode,CardName,FolioNum,DocDate,DocTotal FROM SBODemoCL..OINV WHERE CardCode='''+@Param1+'''" QUERYOUT "'+@FullFileName+'" -S '+ @@SERVERNAME +' -T -c -t'

          

          EXEC xp_cmdshell @sSQL

 

          DROP TABLE ##Who

END

Una vez creado este SP en la base, desde SAP lo debes llamar de esta manera:

DECLARE @P1 NVARCHAR(20)

SET @P1=(SELECT TOP 1 T0.CardCode FROM OCRD T0 WHERE T0.CardCode='[%0]')

EXEC CONSULTA_FORO @P1

Ese es el ejemplo más simple de lo que estas tratando de realizar...y funciona

PD: Si los permisos no son correctos te dará error.

PD2: Me saco más de una cana obtener el hostname del cliente.

PD3: Recuerda cambiar el nombre de la base de datos en el FROM y tener activada la funcion xp_cmdshell

Saludos

former_member325322
Participant
0 Kudos

Hola Felipe

Muchas Gracias.por tu ayuda.

Te cuento lo que necesito:

Cada vez que alguien emite una boleta de venta , algunos datos de esta deben ser enviados a un archivo de texto y copiados a un FTP, esto para que otra aplicación lo importe en su base de datos.

La idea de hacerlo en el transaction notification es para que esto ocurra al momento en que la boleta es creada (on line).

Si pongo en el query que genera el archivo de texto (where)  la referencia de un número docentry que ya existe en la base de datos, el archivo es creado sin ningún problema. Pero si uso como referencia el docentry de la variable list:of_cols_val_tab_del, la base de datos se cuelga.

Adjunto los códigos

Desde ya agradezco tu ayuda

ESTE CODIGO ESTA EN EL TRANSACTION NOTIFICATION

IF @object_type = '13' --Factura o Boleta de Cliente

BEGIN

      IF @transaction_type = 'A'

      BEGIN

            EXEC dbo.Crear_TXT @list_of_cols_val_tab_del

      end

end

ESTE ES EL PROCEDIMIENTO ALMACENADO  dbo.Crear_TXT

USE [BELENUS_PRUEBA]

GO

/****** Object:  StoredProcedure [dbo].[CREAR_TXT]    Script Date: 03/12/2013 16:37:22 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

ALTER PROC [dbo].[CREAR_TXT] (@Entry_Boleta INT)

AS

BEGIN

          DECLARE

                     @sSQL NVARCHAR(4000)

                    ,@Host NVARCHAR(255)

                    ,@FileName NVARCHAR(255)

                    ,@FullFileName NVARCHAR(255)

 

          IF OBJECT_ID('tempdb..##who') IS NOT NULL

          DROP TABLE ##Who

 

          CREATE TABLE ##Who

          (spid SMALLINT,ecid SMALLINT, status NCHAR(30), loginname NCHAR(128), hostname NCHAR(128), blk CHAR(5), dbname NCHAR(128), cmd NCHAR(16), request_id INT)

          INSERT INTO ##Who

          EXEC sp_who

                     

                      DECLARE @NUMERO_BOLETA INT = (SELECT DocNum FROM OINV WHERE DocEntry = @Entry_Boleta)

                     

          SET @Host=(SELECT hostname FROM ##Who WHERE spid=@@SPID)

          SET @FileName='c:\clopez\'+CAST(@NUMERO_BOLETA AS VARCHAR)+'.txt'

          SET @FullFileName=LTRIM(RTRIM(@FileName))

          SET @sSQL='BCP "SELECT T0.[DocNum],T0.[DocDate],T1.[WhsCode],T0.[CardCode],T2.slpname,T1.[ItemCode],T1.[Quantity],T1.U_BELPLAN FROM BELENUS_PRUEBA..OINV T0 INNER JOIN BELENUS_PRUEBA..INV1 T1 ON (T0.DocEntry = T1.DocEntry) LEFT JOIN BELENUS_PRUEBA..OSLP T2 ON (T0.slpcode = T2.slpcode) WHERE T0.[DocNum] = '+CAST(@NUMERO_BOLETA AS VARCHAR)+'" QUERYOUT "'+@FullFileName+'"  -T -U sa -P Quintec.2009 -c -t "|" -r ";"'

          

          EXEC xp_cmdshell @sSQL

 

          DROP TABLE ##Who

END


felipe_loyolarodriguez
Active Contributor
0 Kudos

OK, todo es mucho más fácil si postean los códigos que están usando .

Pruebalo de esta manera.

TRANSACTION


IF @object_type='13' AND @transaction_type='A' AND (SELECT T0.DocSubType FROM OINV T0 WHERE T0.DocEntry=@list_of_cols_val_tab_del)='IB'

          BEGIN

                    EXEC dbo.Crear_TXT @list_of_cols_val_tab_del

          END

END

PROCEDIMIENTO ALMACENADO

ALTER PROC [dbo].[CREAR_TXT] (@Entry_Boleta INT)

AS

BEGIN

          DECLARE

   @sSQL NVARCHAR(4000)

                    ,@FileName NVARCHAR(255)

                    ,@NroBoleta INT

        

          SET @NroBoleta=(SELECT DocNum FROM OINV WHERE DocEntry = @Entry_Boleta)

                  

          SET @FileName='C:\clopez\'+LTRIM(RTRIM(CAST(@NroBoleta AS NVARCHAR(255))))+'.txt'

          SET @sSQL='BCP "SELECT T0.[DocNum],T0.[DocDate],T1.[WhsCode],T0.[CardCode],T2.slpname,T1.[ItemCode],T1.[Quantity],T1.U_BELPLAN FROM BELENUS_PRUEBA..OINV T0 INNER JOIN BELENUS_PRUEBA..INV1 T1 ON (T0.DocEntry = T1.DocEntry) LEFT JOIN BELENUS_PRUEBA..OSLP T2 ON (T0.slpcode = T2.slpcode) WHERE T0.[DocEntry] = '+@Entry_Boleta+'" QUERYOUT "'+@FileName+'"  -T -U sa -P Quintec.2009 -c -t "|" -r ";"'

          EXEC xp_cmdshell @sSQL

END

Saludos


former_member325322
Participant
0 Kudos

Muchas gracias por la respuesta, sin embargo, aùn tengo problemas para generar el archivo desde SAP.

El problema es que la base de datos se cuelga, si bien el archivo es generado éste no contiene datos, y es imposible eliminarlo debido a que hay un proceso trabajando en el.

De antemano agradezco la ayuda brindada.

Saludos Cordiales.

felipe_loyolarodriguez
Active Contributor
0 Kudos

Intenta lo siguiente:

Ejecuta desde SQL el CREAR_TXT y dale tú un DocEntry de una boleta.

Ejemplo

EXEC CREAR_TXT 2456

Y revisa si crear el txt.

Saludos

Former Member
0 Kudos

Gracias estimado..

realizare las pruebas, te comento como me va..

former_member325322
Participant
0 Kudos

Esta prueba ya la hice antes, y el archivo si se crea.

Hice pruebas levantando desde el transaction notification la información a una tabla no SAP, los datos se cargaron de acuerdo a lo esperado. A la tabla creada se le asoció un triger que se dispara de acuerdo a lo que adjunto. El tema es que esta solución también cuelga la base de datos. No se me ocurre cómo poder resolverlo.

ALTER TRIGGER CREAR_TXT2

ON BELENUS_PRUEBA..PRUEBA3

AFTER INSERT

AS

BEGIN

DECLARE @FileName VARCHAR(100),

@NUMERO_BOLETA INT,

@sSQL VARCHAR(1000)

SET @NUMERO_BOLETA = (SELECT MAX(DocNum) FROM BELENUS_PRUEBA..PRUEBA3)

SET @FileName = 'C:\clopez\'+LTRIM(RTRIM(CAST(@NUMERO_BOLETA AS NVARCHAR(255))))+'.txt'

SET @sSQL='BCP "SELECT DocNum,DocDate,WhsCode,CardCode,slpname,ItemCode,Quantity,U_BELPLAN FROM BELENUS_PRUEBA..PRUEBA3" QUERYOUT "'+@FileName+'" -T -U sa -P Quintec.2009 -c -t "|" -r ";"'

EXEC xp_cmdshell @sSQL

END

GO   

felipe_loyolarodriguez
Active Contributor
0 Kudos

Y si creas un scenario B1if que llame el SP CREA TXT y le das por xpath el DocEntry de la boleta?

former_member325322
Participant
0 Kudos

Discúlpame. Pero no entiendo a que te refieres

felipe_loyolarodriguez
Active Contributor
0 Kudos

En el integration framework, creas un scenario nuevo que lo desencadene el objeto 13 de facturas.

Usas un atom de Call SQL y llamas al procedimiento CREAR_TXT, y vía xpath (xml) le entregas el DocEntry de la boleta.

Agregas una validación antes al SP CREA TXT para que compruebe que el DocEntry sea de una boleta y no usas el transaction

Quedaría así.

ALTER PROC [dbo].[CREAR_TXT] (@Entry_Boleta INT)

AS

BEGIN

          IF (SELECT T0.DocSubType FROM OINV T0 WHERE T0.DocEntry=@Entry_Boleta)='IB'

          BEGIN

                    DECLARE

                               @sSQL NVARCHAR(4000)

                              ,@FileName NVARCHAR(255)

                              ,@NroBoleta INT

                    SET @NroBoleta=(SELECT DocNum FROM OINV WHERE DocEntry = @Entry_Boleta)

                    SET @FileName='C:\clopez\'+LTRIM(RTRIM(CAST(@NroBoleta AS NVARCHAR(255))))+'.txt'

                    SET @sSQL='BCP "SELECT T0.[DocNum],T0.[DocDate],T1.[WhsCode],T0.[CardCode],T2.slpname,T1.[ItemCode],T1.[Quantity],T1.U_BELPLAN FROM BELENUS_PRUEBA..OINV T0 INNER JOIN BELENUS_PRUEBA..INV1 T1 ON (T0.DocEntry = T1.DocEntry) LEFT JOIN BELENUS_PRUEBA..OSLP T2 ON (T0.slpcode = T2.slpcode) WHERE T0.[DocEntry] = '+@Entry_Boleta+'" QUERYOUT "'+@FileName+'"  -T -U sa -P Quintec.2009 -c -t "|" -r ";"'

                    EXEC xp_cmdshell @sSQL          

          END

END

Saludos

former_member204202
Active Participant
0 Kudos

Hola necesito ayuda con esta consulta:

SELECT T0.WhsCode, T2.ItmsGrpNam, SUBSTRING(T0.ItemCode, CHARINDEX('-', T0.ItemCode)+1,2)CodColor,

SUBSTRING(T0.ItemCode, CHARINDEX('-', T0.ItemCode)+4,2)Talla, (T5.Name)Color, T0.ItemCode, T0.Dscription, SUM(T0.OpenQty)as Vta_Prs,

T3.OnHand, (T3.OnOrder)Solicitado, (T6.Price)Costo, (T0.PriceAfVAT)PrecioBruto

FROM INV1 T0 LEFT JOIN OITM T1 ON T0.ItemCode=T1.ItemCode RIGHT JOIN OITB T2 ON T1.ItmsGrpCod=T2.ItmsGrpCod RIGHT JOIN

OITW T3 ON T1.ItemCode=T3.ItemCode INNER JOIN OINV T4 ON T0.DocEntry=T4.DocEntry INNER JOIN DBO.[@COLORES]T5

ON T5.Code=SUBSTRING(T0.ItemCode, CHARINDEX('-', T0.ItemCode)+1,2) LEFT JOIN ITM1 T6 ON T0.ItemCode=T6.ItemCode

WHERE  ISNULL(T4.Indicator,0)<>'03' AND T0.WhsCode=T3.WhsCode AND T0.DocDate>='2013-02-01' AND T0.DocDate<='2013-02-15'

AND T6.PriceList=1 AND T0.WhsCode ='09'

GROUP BY T0.WhsCode, T2.ItmsGrpNam, SUBSTRING(T0.ItemCode, CHARINDEX('-', T0.ItemCode)+1,2), T0.ItemCode,

T0.Dscription, T3.OnHand, T3.OnOrder, T5.Name, T6.Price, T0.PriceAfVAT

ORDER BY T2.ItmsGrpNam

Los datos que duvuelve son correctos, pero solo devuelve los itemcode que tienen venta y yo necesito que me siga mostrando todos para ver siempre el STOCK TOTAL!!

Me pueden ayudar x favor . LO PEGUE ACA YA QUE NO ME DEJA CREAR UNA PREGUNTA.

felipe_loyolarodriguez
Active Contributor
0 Kudos

Eso es porque el FROM es desde la INV1 y estas haciendo un LEFT JOIN a la OITM

Debería ser lo contrario, un FROM desde la OITM y un LEFT a la INV1

O trata cambiando el LEFT JOIN OITM por un RIGHT JOIN OITM.

Saludos

former_member204202
Active Participant
0 Kudos

Disculpa, intente hacer lo que tu dices, primero lo de cambiar LEFT JOIN x RIGHT JOIN pero nada depues le di la vuelta para jalar de oitm pero nada igual. Ahora estoy haciendo pruebas con una TEMP pero me da el mismo problema, te dejo mi consulta:

SELECT a.ItemCode, a.OnHand INTO #TEMP FROM OITW a

WHERE WhsCode='09'

SELECT c.ItemCode, c.OnHand, SUM(b.Quantity)VtaPrs FROM INV1 b RIGHT JOIN #TEMP c ON b.ItemCode=c.ItemCode

WHERE b.WhsCode='09' AND b.DocDate>='2013-02-01' AND b.DocDate<='2013-02-15'

GROUP BY c.ItemCode, c.OnHand

DROP TABLE #TEMP

Dime que tiene una solucion jejeeje x fa ya no se me ocurre nada

former_member204202
Active Participant
0 Kudos

Hola te cuento que ya logre lo que queria, ya solo me queda agregarle que otras cosas quiero ver asi quedo mi consulta:

SELECT b.WhsCode, b.ItemCode, SUM(b.Quantity)VtaPrs INTO #TEMP FROM INV1 b

WHERE b.WhsCode='09' AND b.DocDate>='2013-02-01' AND b.DocDate<='2013-02-15'

GROUP BY b.ItemCode, b.WhsCode

SELECT a.ItemCode, a.OnHand, c.VtaPrs FROM OITW a LEFT JOIN #TEMP c ON a.ItemCode=c.ItemCode AND a.WhsCode=c.WhsCode

WHERE a.WhsCode='09' ORDER BY c.VtaPrs desc

DROP TABLE #TEMP

gracias.

Former Member
0 Kudos

Felipe, buen día.

Estimado, ante todo gracias por la atención a mis consultas, he realizado las pruebas y estas están generando correctamente los TXT, pero tengo problemas para cuando que en vez de generar desde una consulta este lo haga desde un SP, favor estimado si tuvieras algún consejo para poder cargar un procedimiento desde el BCP.

Como sería el código para en vez de llamar una consulta simple llame un SP con 1 o mas parámetros?

Ejemplo de mi caso expuesto

ALTER PROC [dbo].[CONSULTA_CREA_TXT_LIBRO] (@Param1 NVARCHAR(20)) 

AS 

BEGIN 

       DECLARE  

@sSQL NVARCHAR(4000) 

                 ,@Host NVARCHAR(255) 

                 ,@FileName NVARCHAR(255) 

                 ,@FullFileName NVARCHAR(255) 

         

        IF OBJECT_ID('tempdb..##who') IS NOT NULL 

        DROP TABLE ##Who 

        CREATE TABLE ##Who 

         (spid SMALLINT,ecid SMALLINT, status NCHAR(30), loginname NCHAR(128), hostname NCHAR(128), blk CHAR(5), dbname NCHAR(128), cmd NCHAR(16), request_id INT)  

       

                INSERT INTO ##Who

                EXEC sp_who 

         

                SET @Host=(SELECT hostname FROM ##Who WHERE spid=@@SPID) 

                SET @FileName='\B1_SHR\LE2010020030020130200080100001111.txt' -- Carpeta Compartida y nombre del archivo. 

SET @FullFileName='\\'+LTRIM(RTRIM(@Host))+LTRIM(RTRIM(@FileName)) 

               -- SET @sSQL='BCP "SELECT CardCode,CardName,FolioNum,DocDate,DocTotal FROM SBO_PRUEBA..OINV WHERE CardCode='''+@Param1+'''" QUERYOUT "'+@FullFileName+'" -S '+ @@SERVERNAME +' -T -c -t' 

                    SET @sSQL='BCP "PROCEDIMIENTO @PARAMETRO" QUERYOUT "'+@FullFileName+'" -S '+ @@SERVERNAME +' -T -c -t' 

                EXEC xp_cmdshell @sSQL

         

                DROP TABLE ##Who 

      END 

Former Member
0 Kudos

Patricio, has arreglado este problema, veras a mi se me presenta el mismo problema, y no he podido darle solución, te agradecería ayuda en esto.

saludos

Former Member
0 Kudos

Estimados.

Tengo exactamente los mismos problemas que han comentado.

en mi caso lo que genero es un archivo XML

si ejecuto el script directo en un qry analizer crea el archivo y todo ok.

si ejecuto el postransaction desde SQL SERVER con el QRY dentro se ejecuta sin problemas... pero si lo ejecuto desde SAP se inhibe y se queda sin responder, me toca matar el proceso reiniciar el equipo ya que queda SAP sin poder iniciar de nuevo.

He puesto el script q genera el xml, como PROCEDIMIENTO ALMACENADO, como TRIGGER  y ocurre algo similar. se ejecuta desde SQL funciona... pero si SAP es el que invoca el posTransacion se ihnibe.

este es parte del codigo y todas las formas en las que he intentado ejecutarlo al final.

DECLARE @FileName VARCHAR(100),@RUTA VARCHAR(50), @sql VARCHAR(5000), @result int

DECLARE @DOCENTRY INT,@DOCNUM INT,@CARCODE NVARCHAR(30),@estab as char(3),@ptoEmi as char(3),@USR as smallint,@dirSuc as varchar(200),@dirMat as varchar(200)

SELECT @DOCENTRY=T0.DocEntry,@DOCNUM=T0.DocNum,@CARCODE=T0.CardCode,@estab=T1.BeginStr,@ptoEmi=T1.EndStr,@USR=T0.UserSign

FROM SBODEMO..OINV T0 LEFT JOIN  SBODEMO..NNM1 T1 ON T0.Series=T1.Series

WHERE T0.Docentry=10287

SELECT @dirSuc=T1.Remarks FROM SBODEMO..OUSR T0 left join SBODEMO..OUBR T1 ON T0.Branch=T1.Code

where USERID=@USR

SELECT @dirMat=T0.Street FROM SBODEMO..ADM1 T0

select @DOCENTRY,@DOCNUM,@CARCODE,@estab,@ptoEmi,@USR,@dirSuc

SET  @FileName='FA'+ISNULL(@estab,'001')+ISNULL(@ptoEmi,'001')+REPLICATE('0', (9 - LEN(@DOCNUM))) +CAST(@DOCNUM AS NVARCHAR(9))+'.xml'

SET  @RUTA='C:\Documentos\'

--SELECT @FileName

IF OBJECT_ID('tempdb..##T_TmpFact1') IS NOT NULL  drop table ##T_TmpFact1;

Create Table ##T_TmpFact1(Linea VarChar(800))

INSERT INTO ##T_TmpFact1 VALUES ('<?xml version="1.0" encoding="UTF-8"?>')

INSERT INTO ##T_TmpFact1 VALUES ('<factura id="comprobante" version="1.0.0">')

INSERT INTO ##T_TmpFact1

select '<razonSocial>'+cast(T0.CompnyName as varchar(100))+'</razonSocial><nombreComercial>'+cast(T0.AliasName as varchar(100))+'</nombreComercial><ruc>'+T0.TaxIdNum+'</ruc>'

from SBODEMO..OADM T0

INSERT INTO ##T_TmpFact1

SELECT '<estab>'+ISNULL(@estab,'001')+'</estab><ptoEmi>'+ISNULL(@ptoEmi,'001')+'</ptoEmi><secuencial>'+REPLICATE('0', (9 - LEN(T0.DocNum))) +CAST(T0.DocNum AS NVARCHAR(9))+'</secuencial>'

FROM SBODEMO..OINV T0-- LEFT JOIN  NNM1 T1 ON T0.Series=T1.Series

WHERE DocNum=@DOCNUM

INSERT INTO ##T_TmpFact1 VALUES ('<dirMatriz>'+@dirMat+'</dirMatriz>')

INSERT INTO ##T_TmpFact1 VALUES ('</infoTributaria>')

INSERT INTO ##T_TmpFact1 VALUES ('<infoFactura>')

INSERT INTO ##T_TmpFact1

SELECT

'<detalle> <codigoPrincipal>'+T1.ItemCode+'</codigoPrincipal><descripcion>'+T1.Dscription+'</descripcion><cantidad>'+cast(T1.Quantity as varchar(50))+'</cantidad><precioUnitario>'+cast(T1.PriceBefDi as varchar(50))+'</precioUnitario><descuento>'+cast(round(PriceBefDi-T1.Price,2) as varchar(50))+'</descuento><precioTotalSinImpuesto>'+cast(t1.LineTotal as varchar(50))+'</precioTotalSinImpuesto> <impuestos><impuesto><codigo>2</codigo><codigoPorcentaje>'+case  when t1.VatPrcnt=12 then '2' else '0' end +'</codigoPorcentaje><tarifa>'+cast(t1.VatPrcnt as varchar(50))+'</tarifa>  <baseImponible>'+cast(t1.LineTotal as varchar(50))+'</baseImponible><valor>'+cast(t1.LineVat as varchar(50))+'</valor> </impuesto> </impuestos> </detalle>'

FROM SBODEMO..INV1 T1

WHERE T1.DocEntry=@DOCENTRY

INSERT INTO ##T_TmpFact1 VALUES ('</detalles>')

INSERT INTO ##T_TmpFact1 VALUES ('<infoAdicional>')

INSERT INTO ##T_TmpFact1 VALUES ('</infoAdicional>')

INSERT INTO ##T_TmpFact1 VALUES ('</factura>')

--SET @sSQL='BCP "SELECT AcctCode,AcctName FROM SBODEMO..OACT" QUERYOUT "C:\Documentos\PruebaForo.txt" -S '+ @@SERVERNAME +' -T -c -t'

--Set @sql = 'BCP "Select * From ##T_TmpFact1 as p" QueryOUT "' + Ltrim(Rtrim(@Ruta)) + Ltrim(Rtrim(@FileName)) +'" -T -t -c -S ' + @@SERVERNAME

Set @sql = 'BCP "Select * From ##T_TmpFact1 as p" QueryOUT "' + Ltrim(Rtrim(@Ruta)) + Ltrim(Rtrim(@FileName)) +'"  -S '+ @@SERVERNAME +' -T -c -t'

---SELECT @sql

--Exec  @result =  xp_CmdShell @sql

--EXEC master.dbo.xp_cmdshell @sql

EXEC xp_cmdshell @s

---------------------------------------------------------------

Quería solicitarles que por favor me colaboren con este tema ya que ha resultado todo un dolor de cabeza.

y al leer es haberlo vivido de nuevo ya que me ocurrió todo lo q ustedes comentan..

ya he hecho de todo.

x cierto no se como ejecutarlo con el integration framework, lo ideal seria ejecutarlo desde el posTransacion.

de antemano gracias por su gentil ayuda.

felipe_loyolarodriguez
Active Contributor
0 Kudos

Estimado

Buen día, le recomiendo usar el post_transaction para realizar cualquier creación de archivo que requiera, no es conveniente dejarlo en el transaction notificacion.

Yo utilizó el post_transaction para todas las generaciones de archivos y hasta ahora nunca ha fallado.

Saludos

Answers (2)

Answers (2)

0 Kudos

Hola amigos habrá algún ejemplo de como detectar mediante el transaction notification, cuando un artículo es creado o actualizado y generar un archivo .csv de inmediato digamos cada 8 horas o cada X tiempo?

Por otro lado el archivo debe tener un orden especifico ejemplo:

itemcode,barcode,descripción,preciodeventa,grupo

saludos.

Former Member
0 Kudos

Hola patricio!

Estoy  con el mismo problema que estas mencionando en tu post. Solo que yo utilizo el objeto 22.

Me podrías indicar si pudiste resolver el hecho de que  se colgara el proceso ?

Como fue que le diste solución?

De antemano te agradezco la ayuda que pudieras brindarme.

saludos.

felipe_loyolarodriguez
Active Contributor
0 Kudos

Buenos días

Después de bastante tiempo he aprendido 2 cosas sobre este tema que no aplicaba en los post de arriba.

Primero, colocar el procedimiento para exportar en el Post_TransactionNotification.

Segundo, no usar tablas temporales o globales (##Tabla , #Tabla) ya que a veces se quedan pegadas no se porque motivo.

Saludos

Former Member
0 Kudos

Hola,

Realmente agradezco tu pronta respuesta. He estado ya varias semanas con este problema sin avanzar mucho. Seguí tu sugerencia con respecto a colocar el  el código de exportación  dentro del SBO_SP_PostTransactionNotice y  bueno ya  genera el TXT con la información que requiero. Ya que antes solo me creaba el archivo  sin datos .

Pero aun se queda pegado  , al grado de que tengo que ir a buscar el proceso BCP en el Task Manager y terminarlo manualmente.

Detecte también que solo pasa esto cuando el documento ya fue creado y que quiere generar el txt con la propiedad de actualizarlo. En ese momento es cuando se cuelga.

Este es el código que estoy utilizando. No utilizo tablas temporales. Pero no se si hay algo mas dentro de este que me este ocasionando este problema.

Te antemano te agradezco la ayuda que pudieras brindarme.

Saludos!

felipe_loyolarodriguez
Active Contributor
0 Kudos

Hola Juana

Estoy viendo que el BCP ejecuta un procedimiento almacenado.

Puedes compartir el código ya que ahí debe estar el problema.

Saludos

Former Member
0 Kudos

Mil gracias Felipe!

ya quedo resuelto el tema.

saludos!