Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Hola Estimados Amigos,
Tengo mas de 50 sucursales (y creciendo) a las cuales necesito extraer el dato de las ventas, a cada una de ellas hago un script con su cadena de conexion, usuario y password.
Mi consulta es si existe la manera de poder hacer esto en un solo LOOP.
De atemano gracias por la ayuda.
Saludos
Juan
Hola Juan,
Intenta manejar las conexiones ODBC a través de un Excel, qvs o Inline, lo que tu prefieras y utiliza el siguiente script. Adjunto imagen de la estructura del excel.
Set ErrorMode = 0;
LET ScriptErrorCount = 0;
LET ScriptErrorList = '';
LET fecha_ini = num(today()-5);
LET fecha_fin = num(today()-1);
LET fec_ini = $(fecha_ini);
LET fecha_graba = date($(fecha_ini),'YYYYMMDD');
LET f_anio=Year($(fecha_ini));
LET f_mes=Month($(fecha_ini))*1;
Connect:
LOAD nTienda,
Connect
FROM
Connect.xlsx
(ooxml, embedded labels, table is Sheet1);
FOR lConnect = 0 to ((NoOfRows('Connect'))-1);
LET SConnect = peek('Connect',$(lConnect),'Connect');
LET nTienda = peek('nTienda',$(lConnect),'Connect');
ODBC CONNECT32 TO $(SConnect);
FOR i = $(fecha_ini) to $(fecha_fin)
STATUS:
SQL
SELECT
2 as IdEmpresa,
'$(nTienda)' as Tienda,
th.snum as snum,
ccenter,
th.terminal,
th.statnum,
DATE_FORMAT(OPENDATE,'%d/%m/%Y') as Fecha,
th.methodnum as fpago,
dm.descript descrip,
Sum(IFNULL(TENDER,0)) as Venta,
Sum(IFNULL(changepix,0)) as changepix,
COUNT(DISTINCT TRANSACT) as Comandas
WHERE OPENDATE = '$(fecha_graba)'
AND th.snum=100&$(nTienda)
AND approved=1
AND th.methodnum=dm.methodnum
AND th.snum=dm.snum
GROUP BY
OPENDATE,
th.methodnum,
dm.descript,
th.snum,
th.terminal,
th.statnum;
STORE STATUS INTO D:\QLIKVIEW\COMERCIAL\1_Gestion_de_Ventas\2_QVD_Generados\FormaPago\$(f_anio)\$(f_mes)\FP_$(fecha_graba)_2$(nTienda).qvd;
DROP TABLE STATUS;
IF ScriptErrorCount > 0 THEN
TRACE >>> Se produjo un error durante la lectura de la base de datos 2-6.
Reason = $(ScriptErrorList);
END If;
LET ScriptErrorCount = 0;
LET ScriptErrorList = '';
LET fecha_ini = $(fecha_ini) + 1;
LET fecha_graba = date($(fecha_ini),'YYYYMMDD');
LET f_anio=Year($(fecha_ini));
LET f_mes=Month($(fecha_ini))*1;
NEXT i
DISCONNECT;
SLEEP 6000;
NEXT lConnect;
Drop Table Connect;
Puedes mostrar un ejemplo de tu Statement después del “From”
Este es mi script, como ejemplo tiene 2 conexiones, y mi intencion es hacerlo mediante un loop:
Set ErrorMode = 0;
LET ScriptErrorCount = 0;
LET ScriptErrorList = '';
LET fecha_ini = num(today()-5);
LET fecha_fin = num(today()-1);
LET fec_ini = $(fecha_ini);
LET fecha_graba = date($(fecha_ini),'YYYYMMDD');
LET f_anio=Year($(fecha_ini));
LET f_mes=Month($(fecha_ini))*1;
ODBC CONNECT32 TO [2-6] (XUserId is WSAZEZdNPDdQO, XPassword is aATSRSFMTLZCTbAGRRZB);
FOR i = $(fecha_ini) to $(fecha_fin)
TRACE Leyendo BD dia $(fecha_graba);
STATUS:
SQL
SELECT 2 as IdEmpresa, 6 as Tienda, th.snum as snum, ccenter, th.terminal, th.statnum, DATE_FORMAT(OPENDATE,'%d/%m/%Y') AS Fecha,
th.methodnum as fpago, dm.descript descrip,
Sum(IFNULL(TENDER,0)) AS Venta, Sum(IFNULL(changepix,0)) AS changepix,
COUNT(DISTINCT TRANSACT) AS Comandas
FROM t_howpaid th, d_methodpay dm
WHERE OPENDATE = '$(fecha_graba)' AND th.snum=1006 AND approved=1
and th.methodnum=dm.methodnum and th.snum=dm.snum
GROUP BY OPENDATE,th.methodnum,dm.descript,th.snum,th.terminal,th.statnum;
STORE STATUS INTO D:\QLIKVIEW\COMERCIAL\1_Gestion_de_Ventas\2_QVD_Generados\FormaPago\$(f_anio)\$(f_mes)\FP_$(fecha_graba)_26.qvd;
DROP TABLE STATUS;
IF ScriptErrorCount > 0 THEN
TRACE >>> Se produjo un error durante la lectura de la base de datos 2-6.
Reason = $(ScriptErrorList);
END If;
LET ScriptErrorCount = 0;
LET ScriptErrorList = '';
LET fecha_ini = $(fecha_ini) + 1;
LET fecha_graba = date($(fecha_ini),'YYYYMMDD');
LET f_anio=Year($(fecha_ini));
LET f_mes=Month($(fecha_ini))*1;
NEXT i
////*************************************************************************************************** Otra sucursal
ODBC CONNECT32 TO [2-7] (XUserId is ZPSXKZdNPDdCD, XPassword is cZMGaSFMTLZCTbAGRJeA);
LET fecha_ini = $(fec_ini);
LET fecha_graba = date($(fecha_ini),'YYYYMMDD');
LET f_anio=Year($(fecha_ini));
FOR i = $(fecha_ini) to $(fecha_fin)
TRACE Leyendo BD dia $(fecha_graba);
STATUS:
SQL
SELECT 2 as IdEmpresa, 7 as Tienda, th.snum as snum, ccenter, th.terminal, th.statnum, DATE_FORMAT(OPENDATE,'%d/%m/%Y') AS Fecha,
th.methodnum as fpago, dm.descript descrip,
Sum(IFNULL(TENDER,0)) AS Venta, Sum(IFNULL(changepix,0)) AS changepix,
COUNT(DISTINCT TRANSACT) AS Comandas
FROM t_howpaid th, d_methodpay dm
WHERE OPENDATE = '$(fecha_graba)' AND th.snum=1007 AND approved=1
and th.methodnum=dm.methodnum and th.snum=dm.snum
GROUP BY OPENDATE,th.methodnum,dm.descript,th.snum,th.terminal,th.statnum;
STORE STATUS INTO D:\QLIKVIEW\COMERCIAL\1_Gestion_de_Ventas\2_QVD_Generados\FormaPago\$(f_anio)\$(f_mes)\FP_$(fecha_graba)_27.qvd;
DROP TABLE STATUS;
IF ScriptErrorCount > 0 THEN
TRACE >>> Se produjo un error durante la lectura de la base de datos 2-7.
Reason = $(ScriptErrorList);
END If;
LET ScriptErrorCount = 0;
LET ScriptErrorList = '';
LET fecha_ini = $(fecha_ini) + 1;
LET fecha_graba = date($(fecha_ini),'YYYYMMDD');
LET f_anio=Year($(fecha_ini));
LET f_mes=Month($(fecha_ini))*1;
NEXT i
////***************************************************************************************************
Hola Juan,
Intenta manejar las conexiones ODBC a través de un Excel, qvs o Inline, lo que tu prefieras y utiliza el siguiente script. Adjunto imagen de la estructura del excel.
Set ErrorMode = 0;
LET ScriptErrorCount = 0;
LET ScriptErrorList = '';
LET fecha_ini = num(today()-5);
LET fecha_fin = num(today()-1);
LET fec_ini = $(fecha_ini);
LET fecha_graba = date($(fecha_ini),'YYYYMMDD');
LET f_anio=Year($(fecha_ini));
LET f_mes=Month($(fecha_ini))*1;
Connect:
LOAD nTienda,
Connect
FROM
Connect.xlsx
(ooxml, embedded labels, table is Sheet1);
FOR lConnect = 0 to ((NoOfRows('Connect'))-1);
LET SConnect = peek('Connect',$(lConnect),'Connect');
LET nTienda = peek('nTienda',$(lConnect),'Connect');
ODBC CONNECT32 TO $(SConnect);
FOR i = $(fecha_ini) to $(fecha_fin)
STATUS:
SQL
SELECT
2 as IdEmpresa,
'$(nTienda)' as Tienda,
th.snum as snum,
ccenter,
th.terminal,
th.statnum,
DATE_FORMAT(OPENDATE,'%d/%m/%Y') as Fecha,
th.methodnum as fpago,
dm.descript descrip,
Sum(IFNULL(TENDER,0)) as Venta,
Sum(IFNULL(changepix,0)) as changepix,
COUNT(DISTINCT TRANSACT) as Comandas
WHERE OPENDATE = '$(fecha_graba)'
AND th.snum=100&$(nTienda)
AND approved=1
AND th.methodnum=dm.methodnum
AND th.snum=dm.snum
GROUP BY
OPENDATE,
th.methodnum,
dm.descript,
th.snum,
th.terminal,
th.statnum;
STORE STATUS INTO D:\QLIKVIEW\COMERCIAL\1_Gestion_de_Ventas\2_QVD_Generados\FormaPago\$(f_anio)\$(f_mes)\FP_$(fecha_graba)_2$(nTienda).qvd;
DROP TABLE STATUS;
IF ScriptErrorCount > 0 THEN
TRACE >>> Se produjo un error durante la lectura de la base de datos 2-6.
Reason = $(ScriptErrorList);
END If;
LET ScriptErrorCount = 0;
LET ScriptErrorList = '';
LET fecha_ini = $(fecha_ini) + 1;
LET fecha_graba = date($(fecha_ini),'YYYYMMDD');
LET f_anio=Year($(fecha_ini));
LET f_mes=Month($(fecha_ini))*1;
NEXT i
DISCONNECT;
SLEEP 6000;
NEXT lConnect;
Drop Table Connect;
Hola Mitchael, gracias por el apoyo y por tu tiempo. Resulta que ejecute el script pero solo lo hace para una tienda, en mi caso tengo 6 diferentes empresas y cada una de ellas con sus respectivas tiendas. Te adjunto el script y el excel que estoy usando.
Tienes el Screen Shoot del error?
Bueno no sale ningún error, al parecer no entra al loop el segundo local.
Connect << Hoja1 7 Lines fetched
Connecting to 2-6
Connected
-----------------------------
>>>>> Empresa 2
>>>>> Tienda 6
>>>>> sNum 1006
>>>>> Fecha de carga 20171018
-----------------------------
STATUS << t_howpaid 40 Lines fetched
-----------------------------
>>>>> Empresa 2
>>>>> Tienda 6
>>>>> sNum 1006
>>>>> Fecha de carga 20171019
-----------------------------
STATUS << t_howpaid 45 Lines fetched
-----------------------------
>>>>> Empresa 2
>>>>> Tienda 6
>>>>> sNum 1006
>>>>> Fecha de carga 20171020
-----------------------------
STATUS << t_howpaid 68 Lines fetched
-----------------------------
>>>>> Empresa 2
>>>>> Tienda 6
>>>>> sNum 1006
>>>>> Fecha de carga 20171021
-----------------------------
STATUS << t_howpaid 62 Lines fetched
-----------------------------
>>>>> Empresa 2
>>>>> Tienda 6
>>>>> sNum 1006
>>>>> Fecha de carga 20171022
-----------------------------
STATUS << t_howpaid 36 Lines fetched
Connecting to 2-7
Connected
Connecting to 3-6
Connected
Connecting to 4-6
Connected
Connecting to 5-6
Connected
Connecting to 7-6
Connected
Connecting to 8-6
Connected
Hola Mitchael, ya lo solucione, traslade este codigo dentro del primer for y funciono, muchas gracias por tu ayuda.
LET fecha_ini = num(today()-5);
LET fecha_fin = num(today()-1);
LET fec_ini = $(fecha_ini);
LET fecha_graba = date($(fecha_ini),'YYYYMMDD');
LET f_anio=Year($(fecha_ini));
LET f_mes=Month($(fecha_ini))*1;
Hola Juan,
Que gusto saber que tu problema ya se solucionó.
Me gustaría sugerirte algo adicional.
Cambia el siguiente código en el script para que tu Excel solo tenga dos columnas y el “nEmpresa” y “nTienda” lo generes del propio string de conexión.
Saludos.
Connect:
LOAD
nSnum,
Connect,
PurgeChar(Subfield(Connect,'-',1),'[') as nEmpresa,
Subfield(SubField(Connect,']',1),'-',2) as nTienda
FROM
(ooxml, embedded labels, table is Hoja1);