Cobol Foro

Cobol Foro (https://www.cobolforo.es/index.php)
-   PowerCOBOL (ActiveX, v4 - v11) (https://www.cobolforo.es/forumdisplay.php?f=9)
-   -   [Sintaxis] SQL embebido - cursor con COUNT() en PowerCOBOL 7 (https://www.cobolforo.es/showthread.php?t=863)

drvedia1981 11 de junio de 2018 20:21

SQL embebido - cursor con COUNT() en PowerCOBOL 7
 
Hola tengo esta sentencia sql probada en phpadmin ahora lo quiero pasar a un programa en power con sql embebido pero no me funciona alguna ayuda, gracias

Codigo en php admin
Código PHP:
  1. SELECT caja, COUNT( 1 )
  2. FROM  `ventanilla`
  3. where DATE( fecha ) = '2018-05-03'
  4. GROUP BY caja

en power
Código COBOL:
  1.      EXEC SQL CONNECT TO 'BASE'     END-EXEC.
  2.  
  3.      EXEC SQL DECLARE Registro CURSOR  FOR  SELECT caja, COUNT( 1 ) FROM  'ventanilla'  where DATE( fecha ) = '2018-05-03'  GROUP BY caja END-EXEC
  4.  
  5.   EXEC SQL        OPEN   Registro END-EXEC.
  6.      PERFORM cargo UNTIL SQLSTATE = "02000".
  7.      EXEC SQL        CLOSE  Registro END-EXEC
  8.      EXEC SQL       DISCONNECT 'BASE'              
  9.   END-EXEC. EXIT PROGRAM.

cargo.
.....

Kuk 11 de junio de 2018 20:27

drvedia1981, danos más datos. ¿Qué error te da exactamente?

drvedia1981 11 de junio de 2018 20:49

Hola KUK, el cursor no me devuelve nada o algo pongo mal, el resultado de la sentencia da 0 el sqlstate creo que eso esta bien, estoy trabajando con esta base pero no recuperando datos de esta forma que puede ser gracias es algo urgente!!!.
Esto me devuelve el phpadmin
Código:

01  47
02  18
03  34
04  55
06  59
07  31
08  18


Josber 11 de junio de 2018 22:04

drvedia1981, No puedes usar sql embebido con un declare cursor y un select count, o por lo menos yo no lo he conseguido, ejecútalo sin el count y verás como funciona perfectamente.

Un saludo.-

drvedia1981 11 de junio de 2018 22:08

Hola si todo parece ser el COUNT( 1 ) como puedo hacerlo de otra forma que no sea sql embebido necesito esos resultados para mostrar gracias

Kuk 12 de junio de 2018 09:16

Me parece muy raro que no se pueda hacer cursores con COUNT(). Habéis probado con COUNT(*) ?

drvedia1981, puedes hacer algo así:

Código COBOL:
  1.      EXEC SQL
  2.          CONNECT TO 'BASE'    
  3.      END-EXEC.
  4.      
  5.      EXEC SQL
  6.          DECLARE Registro CURSOR  FOR  
  7.           SELECT DISTINCT caja
  8.             FROM 'ventanilla'  
  9.            where DATE( fecha ) = '2018-05-03'          
  10.      END-EXEC.
  11.      
  12.      EXEC SQL
  13.         OPEN Registro
  14.      END-EXEC.
  15.      
  16.      PERFORM cargo
  17.      
  18.      PERFORM UNTIL SQLSTATE = "02000"
  19.          SELECT COUNT(*)
  20.            INTO :WS-COUNT
  21.            FROM caja
  22.           WHERE ID_caja = :WS-ID-CAJA
  23.          
  24.          PERFORM cargo
  25.      END-PERFORM
  26.        
  27.      EXEC SQL
  28.          CLOSE Registro
  29.      END-EXEC
  30.      
  31.      EXEC SQL
  32.          DISCONNECT 'BASE'              
  33.      END-EXEC.

Josber 12 de junio de 2018 11:41

drvedia1981,

A ver una cosa, no me había dado cuenta pero ... es ilógico usar un COUNT con un DECLARE CURSOR, los cursores, se utilizan para un FETCH, (un READ NEXT en COBOL), y un SELECT COUNT, no se puede utilizar con un FETCH, por lo menos hasta donde yo sé, donde yo lo he probado y no funciona, es en un PREPARE.

¿Qué es lo que quieres hacer exactamente?, a ver si es que lo estás haciendo mal y podemos ayudarte.


Kuk,

No he probado a hacer un SELECT COUNT(*), porque no es lógico, sobre todo por hacer el COUNT más rápido y no sobrecargar la BD haciéndole contar todas las columnas, imagínate una tabla con 50.000 registros y 40 columnas, por ejemplo, pero lo pruebo y digo algo.


Un saludo.-

Kuk 12 de junio de 2018 12:10

Josber, lo decía por si había un bug en el parser de sintaxis.

Y en cuanto a lo de usar COUNT() en un cursor, no es frecuente pero puede haber necesidad. Y DB2, que es lo que más he usado, lo permite: IBM MAINFRAME: Db2 query to fetch duplicate rows

Josber 12 de junio de 2018 13:37

drvedia1981,

He estado haciendo pruebas y SÍ se puede usar un COUNT() en un PREPARE, vamos a suponer que tienes una tabla que se llama ABREVIAS y tiene como campos:
ABRCOD varchar(3) UNIQUE
ABRNOM varchar(60)

la programación en PWC sería de ésta manera:

Código COBOL:
  1.  WORKING-STORAGE SECTION.
  2.             EXEC SQL
  3.                  BEGIN DECLARE SECTION
  4.             END-EXEC.
  5.  01  WTEX               PIC X(100).
  6.  01  CONTASQL           PIC S9(5).
  7.             EXEC SQL
  8.                  END DECLARE SECTION
  9.             END-EXEC.
  10. .
  11. .
  12. .
  13. .
  14.  
  15.  PROCEDURE       DIVISION.
  16.  INICIO.
  17. *
  18.      MOVE "SELECT COUNT(ABRCOD) FROM ABREVIAS WHERE ABRCOD LIKE '%A%'" TO WTEX.
  19.  
  20.      EXEC SQL
  21.           PREPARE CONSULTA FROM :WTEX
  22.      END-EXEC.
  23.      
  24.      EXEC SQL
  25.           execute CONSULTA INTO :CONTASQL
  26.      END-EXEC.

Lo que ya no reconoce el SqlEmbebido es la instrucción DEALLOCATE PREPARE ..., pero bueno, el resto funciona perfectamente, tanto poniendo un * como el nombre de la variable en el COUNT.

Cita:

Citación del post de Kuk (Mensaje 4325)
Y en cuanto a lo de usar COUNT() en un cursor

No le veo la utilidad, si lo que quieres es contar los registros que cumplan unos parámetros, y SQL, te los cuenta sin tener que hacer un recorrido por la tabla con un FETCH, el que se pueda usar, vale, pero el que sea útil ...

Un saludo.-

Kuk 12 de junio de 2018 13:55

Josber, según entiendo, lo que tiene es una tabla con campos:
  • CAJA - que viene a ser el ID
  • FECHA

Donde CAJA no es único y puede haber varios registros.

Para los resultados de phpMyAdmin:

Código:

01 47
02 18
03 34
04 55
06 59
07 31
08 18

Lo que deduzco es que tal ID ha hecho una acción (por ejemplo venta) tantas veces al día.

¿Cómo lo harías tú?

Lo mismo no es la mejor manera como lo está haciendo, pero yo en este caso le veo sentido al COUNT(). Porque el cursor no es otra cosa que crear una tabla temporal basada en tu SELECT que vas recorreidno.


La franja horaria es GMT +2. Ahora son las 10:24.

Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.