Cobol Foro
Navegación en el Foro
Retroceder   Cobol Foro Entornos de desarrollo y compiladores Cobol Fujitsu COBOL PowerCOBOL (ActiveX, v4 - v11)
PowerCOBOL (ActiveX, v4 - v11) Versiones del IDE basadas en ActiveX
 
Otros temas que te pueden interesar
Tema Autor Foro Respuestas Último post
[Sintaxis] Cursor SQL sobre tablas de nombres variables Nino PowerCOBOL (ActiveX, v4 - v11) 4 14 de abril de 2021 23:20
[Sintaxis] Sql Embebido condición where Hrmcobol PowerCOBOL (ActiveX, v4 - v11) 3 25 de abril de 2020 21:43
[Sintaxis] Sql Embebido Hrmcobol PowerCOBOL (ActiveX, v4 - v11) 23 28 de junio de 2017 01:09
[PowerCOBOL] Ejemplo PWC y SQL Embebido Josber Cocina PowerCOBOL 10 15 de junio de 2017 03:17
[Sintaxis] Variables en programa con SQL embebido DYANY IBM Enterprise COBOL 1 20 de diciembre de 2016 16:26

Respuesta
 
Herramientas

  #1
Antiguo 11 de junio de 2018, 20:21
drvedia1981
Forero
Última Actividad 17.05.2022 22:45
Posts Posts: 66
Likes enviados Enviados: 3
Likes recibidos Recibidos: 9
Tabla SQL embebido - cursor con COUNT() en PowerCOBOL 7
0 Inactivo Inactivo

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.
.....
drvedia1981 is offline   Responder Con Cita
  #2
Antiguo 11 de junio de 2018, 20:27
Kuk
Administrador
Última Actividad 19.09.2026 20:11
Posts Posts: 2.500
Likes enviados Enviados: 1037
Likes recibidos Recibidos: 1207

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



NORMAS DEL FORO - para garantizar el buen funcionamiento del Foro.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale haciendo clic en su Nick
Kuk is offline   Responder Con Cita
  #3
Antiguo 11 de junio de 2018, 20:49
drvedia1981
Forero
Última Actividad 17.05.2022 22:45
Posts Posts: 66
Likes enviados Enviados: 3
Likes recibidos Recibidos: 9

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
drvedia1981 is offline   Responder Con Cita
  #4
Antiguo 11 de junio de 2018, 22:04
Josber
Moderador Global
Activista del Foro: Activista del Foro - Issue reason: Por aportar manuales y enriquecer  Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Issue reason: Por muchos agradecimientos 
Última Actividad 20.09.2026 12:17
Posts Posts: 883
Likes enviados Enviados: 418
Likes recibidos Recibidos: 492

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.-
Josber is offline   Responder Con Cita
  #5
Antiguo 11 de junio de 2018, 22:08
drvedia1981
Forero
Última Actividad 17.05.2022 22:45
Posts Posts: 66
Likes enviados Enviados: 3
Likes recibidos Recibidos: 9

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
drvedia1981 is offline   Responder Con Cita
  #6
Antiguo 12 de junio de 2018, 09:16
Kuk
Administrador
Última Actividad 19.09.2026 20:11
Posts Posts: 2.500
Likes enviados Enviados: 1037
Likes recibidos Recibidos: 1207

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.



NORMAS DEL FORO - para garantizar el buen funcionamiento del Foro.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale haciendo clic en su Nick
Kuk is offline   Responder Con Cita
  #7
Antiguo 12 de junio de 2018, 11:41
Josber
Moderador Global
Activista del Foro: Activista del Foro - Issue reason: Por aportar manuales y enriquecer  Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Issue reason: Por muchos agradecimientos 
Última Actividad 20.09.2026 12:17
Posts Posts: 883
Likes enviados Enviados: 418
Likes recibidos Recibidos: 492

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.-
Josber is offline   Responder Con Cita
  #8
Antiguo 12 de junio de 2018, 12:10
Kuk
Administrador
Última Actividad 19.09.2026 20:11
Posts Posts: 2.500
Likes enviados Enviados: 1037
Likes recibidos Recibidos: 1207

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



NORMAS DEL FORO - para garantizar el buen funcionamiento del Foro.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale haciendo clic en su Nick
Kuk is offline   Responder Con Cita
  #9
Antiguo 12 de junio de 2018, 13:37
Josber
Moderador Global
Activista del Foro: Activista del Foro - Issue reason: Por aportar manuales y enriquecer  Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Issue reason: Por muchos agradecimientos 
Última Actividad 20.09.2026 12:17
Posts Posts: 883
Likes enviados Enviados: 418
Likes recibidos Recibidos: 492

drvedia1981,

He estado haciendo pruebas y 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.

Citación del post de Kuk Ver Mensaje
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.-
Josber is offline   Responder Con Cita
  #10
Antiguo 12 de junio de 2018, 13:55
Kuk
Administrador
Última Actividad 19.09.2026 20:11
Posts Posts: 2.500
Likes enviados Enviados: 1037
Likes recibidos Recibidos: 1207

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.



NORMAS DEL FORO - para garantizar el buen funcionamiento del Foro.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale haciendo clic en su Nick
Kuk is offline   Responder Con Cita
Respuesta



Derechos de Publicación
No puedes publicar nuevos temas
No puedes publicar posts/responder
No puedes adjuntar archivos
No puedes editar tus posts

BB code is habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado

Saltar a Foro


La franja horaria es GMT +2. Ahora son las 13:47.
Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.