Skip to main content
Announcements
See why Qlik was named a Leader in the 2024 Gartner® Magic Quadrant™ for Data Integration Tools for the ninth year in a row: Get the report
cancel
Showing results for 
Search instead for 
Did you mean: 
juanma21
Contributor III
Contributor III

Conexion ODBC a varias bases de datos

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

1 Solution

Accepted Solutions
Anonymous
Not applicable

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.

Connect.png

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;

View solution in original post

8 Replies
Anonymous
Not applicable

Puedes mostrar un ejemplo de tu Statement después del “From”

juanma21
Contributor III
Contributor III
Author

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

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

Anonymous
Not applicable

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.

Connect.png

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;

juanma21
Contributor III
Contributor III
Author

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.

Anonymous
Not applicable

Tienes el Screen Shoot del error?

juanma21
Contributor III
Contributor III
Author

Bueno no sale ningún error, al parecer no entra al loop el segundo local.

1.png

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

juanma21
Contributor III
Contributor III
Author

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;

Anonymous
Not applicable

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);