Cobol Foro

Cobol Foro (https://www.cobolforo.es/index.php)
-   Bases de datos (https://www.cobolforo.es/forumdisplay.php?f=27)
-   -   Error SQL "02000 - Data not found" (https://www.cobolforo.es/showthread.php?t=138)

Josber 19 de mayo de 2015 18:45

Error SQL "02000 - Data not found"
 
Tengo un problema bastante raro, a mi entender, con una tabla SQL, la primera vez que entro en el programa y cargo un registro que existe, lo regraba perfectamente, si vuelvo a acceder a ese registro, (seguidamente o en otro momento, pero sin salir del programa), me da el error de SQL "02000" "data not found", pero si al entrar en el registro y antes de regrabar, modifico cualquier dato, da lo mismo el que sea, me lo vuelve a regrabar perfectamente. Éste error me lo ha dado otras veces porque le he puesto al regrabar, en la sentencia SQL el campo principal (UNIQUE KEY), pero eliminandolo de la sentencia, se ha arreglado.

He probado a crear de nuevo la tabla, a ponerle a todos los campos que acepten NULL, a dejar una sola clave única de acceso, (he eliminado las otras "KEY" que tenía, que, de momento no se usaban), y alguna que otra cosa más, pero no hay manera de descubrir el por qué del error.

Ando ya desesperado, alguna sugerencia, porque lo único que me queda es borrar tabla y programa y empezar desde cero y no quisiera.

Gracias y un saludo.-

Kuk 19 de mayo de 2015 18:54

Josber, parece tema de COMMIT. Echale un ojo a ver si lo haces bien, y que la configuracion del ODBC este bien. ;)

Josber 19 de mayo de 2015 19:26

Gracias, Kuk, acabo de hacer una prueba, que era la que me faltaba, poniéndole al principio de la subrutina de regrabar, nada más entrar, un COMMIT, para "liberar" la BD, y nada, exactamente igual y la configuración del ODBC, debe estar bien porque con otras tablas, funciona sin problemas.

Un saludo.-

Kuk 19 de mayo de 2015 21:48

Josber, tienes que hacer COMMIT despues de la modificacion. Si no lo haces, la modificacion queda en Pending, pero no se le aplica a la BBDD. Todo lo que es INSERT, DELETE y UPDATE hay que hacer COMMIT despues siempre.

Hrmcobol 19 de mayo de 2015 23:55

Hola Amigos, a mi me paso algo parecido con una tabla de access, el tema era que se perdían registros sin saber porque, luego de unas 5000 ideas distintas, elimine la tabla, la cree nuevamente, elimine el control del programa, lo asigne nuevamente, recompile y anduvo, nunca supe cual fue la razón.

Saludos :banned: :banned:

Josber 20 de mayo de 2015 07:58

Cita:

Citación del post de Kuk (Mensaje 595)
Josber, tienes que hacer COMMIT despues de la modificacion. Si no lo haces, la modificacion queda en Pending, pero no se le aplica a la BBDD. Todo lo que es INSERT, DELETE y UPDATE hay que hacer COMMIT despues siempre.

Lo hago también en ese momento Kuk, incluso he puesto un ROLLBACK para probar a deshacer a ver que pasaba y nada sigue igual, el poner el COMMIT al principio era por probar.
Hrm la tabla la he borrado y creado varias veces, incluso con otro nombre pero nada y el control no puedo puedo borrarlo, no existe porque es SQL embebido.

Gracias y un saludo.-

Kuk 20 de mayo de 2015 11:53

Hrmcobol, en tu caso, me parece que era entonces culpa de la configuraicon del control.

Josber, pega aqui el codigo de INSERT en la tabla, y el codigo de SELECT, los 2 completos.

Josber 20 de mayo de 2015 12:47

Aquí tienes, (lo hago en dos post, porque en uno ólo no me deja):

Select

Código COBOL:
  1.  LEER.
  2.      MOVE POW-NUMERIC OF CAMPO1 TO PROCOD.
  3.      
  4.      EXEC SQL
  5.           SELECT * FROM PROVEEDOR
  6.                  WHERE PROCOD = :PROCOD
  7.                        INTO :PROCOD ,
  8.                           :PRONOM       ,
  9.                           :PRORAZ       ,
  10.                             :PRODIR       ,
  11.                               :PROCP        ,
  12.                           :PROPOB       ,
  13.                               :PROPRO       ,
  14.                               :PROPAI       ,
  15.                               :PROCIF       ,
  16.                               :PROTEL1      ,
  17.                               :PROTEL2      ,
  18.                               :PROFAX       ,
  19.                               :PROMAIL      ,
  20.                               :PROWEB       ,
  21.                               :PROPER       ,
  22.                           :PROGRU       ,
  23.                               :PROIBAN1     ,
  24.                               :PROIBAN2     ,
  25.                           :PROCTA       ,
  26.                           :PROENT       ,
  27.                           :PRODC        ,
  28.                           :PRONUM_CTA   ,
  29.                               :PROCOD_BAN   ,
  30.                               :PRONUM_BAN   ,
  31.                           :PROBAN       ,
  32.                           :PRODIR_BAN   ,
  33.                           :PROCP_BAN    ,
  34.                           :PROPOB_BAN   ,
  35.                           :PROPRO_BAN   ,
  36.                           :PROPAIS_BAN  ,
  37.                               :PROFOR       ,
  38.                               :PRO_ENE      ,
  39.                               :PRO_FEB      ,
  40.                               :PRO_MAR      ,
  41.                               :PRO_ABR      ,
  42.                               :PRO_MAY      ,
  43.                               :PRO_JUN      ,
  44.                               :PRO_JUL      ,
  45.                               :PRO_AGO      ,
  46.                               :PRO_SEP      ,
  47.                               :PRO_OCT      ,
  48.                               :PRO_NOV      ,
  49.                               :PRO_DIC      ,
  50.                           :PROREP       ,
  51.                               :PRODTO       ,
  52.                               :PROTAR       ,
  53.                               :PROMAY       ,
  54.                               :PRORIE_AUT   ,
  55.                               :PRORIE_ALC   ,
  56.                               :PROTOT       ,
  57.                               :PROREC       ,
  58.                               :PROIVA       ,
  59.                               :PRODTO_PP    ,
  60.                               :PROVAC       ,
  61.                               :PRODIA1      ,
  62.                               :PRODIA2      ,
  63.                               :PRODIA3      ,
  64.                               :PROACT       ,
  65.                               :PROFEC       ,
  66.                               :PROFEC_MOD   ,
  67.                               :PROFEC_COM   ,
  68.                             :PROPROV      ,
  69.                             :PROFAC_REP   ,
  70.                               :PROPLA       ,
  71.                               :PROMESF      ,
  72.                             :PROREP_LEG   ,
  73.                             :PROREP_NIF   ,
  74.                             :PROELI       ,
  75.                           :PROOBS   ,
  76.                           :PROTEX   ,
  77.                           :PROTEX_TEX   ,
  78.                           :PROLIS   ,
  79.                           :PRONOCOM
  80.      END-EXEC.

Josber 20 de mayo de 2015 12:48

Insert

Código COBOL:
  1.  GRABAR.
  2.  
  3.      MOVE "Proveedores - SQL" TO "Caption" OF POW-SELF.
  4.      
  5.      EXEC SQL
  6.           INSERT INTO PROVEEDOR
  7.                  VALUES (   :PROCOD ,
  8.                           :PRONOM       ,
  9.                           :PRORAZ       ,
  10.                             :PRODIR       ,
  11.                               :PROCP        ,
  12.                           :PROPOB       ,
  13.                               :PROPRO       ,
  14.                               :PROPAI       ,
  15.                               :PROCIF       ,
  16.                               :PROTEL1      ,
  17.                               :PROTEL2      ,
  18.                               :PROFAX       ,
  19.                               :PROMAIL      ,
  20.                               :PROWEB       ,
  21.                               :PROPER       ,
  22.                           :PROGRU       ,
  23.                               :PROIBAN1     ,
  24.                               :PROIBAN2     ,
  25.                           :PROCTA       ,
  26.                           :PROENT       ,
  27.                           :PRODC        ,
  28.                           :PRONUM_CTA   ,
  29.                               :PROCOD_BAN   ,
  30.                               :PRONUM_BAN   ,
  31.                           :PROBAN       ,
  32.                           :PRODIR_BAN   ,
  33.                           :PROCP_BAN    ,
  34.                           :PROPOB_BAN   ,
  35.                           :PROPRO_BAN   ,
  36.                           :PROPAIS_BAN  ,
  37.                               :PROFOR       ,
  38.                               :PRO_ENE      ,
  39.                               :PRO_FEB      ,
  40.                               :PRO_MAR      ,
  41.                               :PRO_ABR      ,
  42.                               :PRO_MAY      ,
  43.                               :PRO_JUN      ,
  44.                               :PRO_JUL      ,
  45.                               :PRO_AGO      ,
  46.                               :PRO_SEP      ,
  47.                               :PRO_OCT      ,
  48.                               :PRO_NOV      ,
  49.                               :PRO_DIC      ,
  50.                           :PROREP       ,
  51.                               :PRODTO       ,
  52.                               :PROTAR       ,
  53.                               :PROMAY       ,
  54.                               :PRORIE_AUT   ,
  55.                               :PRORIE_ALC   ,
  56.                               :PROTOT       ,
  57.                               :PROREC       ,
  58.                               :PROIVA       ,
  59.                               :PRODTO_PP    ,
  60.                               :PROVAC       ,
  61.                               :PRODIA1      ,
  62.                               :PRODIA2      ,
  63.                               :PRODIA3      ,
  64.                               :PROACT       ,
  65.                               :PROFEC       ,
  66.                               :PROFEC_MOD   ,
  67.                               :PROFEC_COM   ,
  68.                             :PROPROV      ,
  69.                             :PROFAC_REP   ,
  70.                               :PROPLA       ,
  71.                               :PROMESF      ,
  72.                             :PROREP_LEG   ,
  73.                             :PROREP_NIF   ,
  74.                             :PROELI       ,
  75.                           :PROOBS   ,
  76.                           :PROTEX   ,
  77.                           :PROTEX_TEX   ,
  78.                           :PROLIS   ,
  79.                           :PRONOCOM     )
  80.      END-EXEC.
  81.                            
  82.      IF SQLSTATE = "23000"  *> La CLAVE YA EXISTE (CLAVE DUPLICADA)
  83.         PERFORM REGRABAR
  84.      END-IF.    
  85.      
  86.      EXEC SQL
  87.           COMMIT
  88.      END-EXEC.
  89. *      
  90.      MOVE 0 TO WSVIEW2.
  91.      CALL "VACIAR".
  92.      CALL "INHABILITAR".
  93.      CALL "CARGAR-TABLA".
  94.      MOVE 1 TO "Enabled" OF CAMPO1.
  95.      MOVE 1 TO "CurrentPage" OF TAB1.
  96.      MOVE POW-TRUE TO "Enabled" OF TAB1.
  97.      INVOKE TAB1 "SetFocus".
  98.      INVOKE CAMPO1 "SetFocus".
  99.      EXIT PROGRAM.
  100. *
  101.  REGRABAR.
  102.      MOVE POW-NUMERIC OF CAMPO1 TO PROCOD.
  103.      EXEC SQL
  104.           UPDATE PROVEEDOR
  105.                  SET        PRONOM  =   :PRONOM       ,
  106.                           PRORAZ    =   :PRORAZ       ,
  107.                             PRODIR  =   :PRODIR       ,
  108.                               PROCP     =   :PROCP        ,
  109.                           PROPOB    =   :PROPOB       ,
  110.                               PROPRO    =   :PROPRO       ,
  111.                               PROPAI    =   :PROPAI       ,
  112.                               PROCIF    =   :PROCIF       ,
  113.                               PROTEL1   =   :PROTEL1      ,
  114.                               PROTEL2   =   :PROTEL2      ,
  115.                               PROFAX    =   :PROFAX       ,
  116.                               PROMAIL   =   :PROMAIL      ,
  117.                               PROWEB    =   :PROWEB       ,
  118.                               PROPER    =   :PROPER       ,
  119.                           PROGRU    =   :PROGRU       ,
  120.                               PROIBAN1  =   :PROIBAN1     ,
  121.                               PROIBAN2  =   :PROIBAN2     ,
  122.                           PROCTA    =   :PROCTA       ,
  123.                           PROENT    =   :PROENT       ,
  124.                           PRODC     =   :PRODC        ,
  125.                           PRONUM_CTA    =   :PRONUM_CTA   ,
  126.                               PROCOD_BAN    =   :PROCOD_BAN   ,
  127.                               PRONUM_BAN    =   :PRONUM_BAN   ,
  128.                           PROBAN    =   :PROBAN       ,
  129.                           PRODIR_BAN    =   :PRODIR_BAN   ,
  130.                           PROCP_BAN =   :PROCP_BAN    ,
  131.                           PROPOB_BAN    =   :PROPOB_BAN   ,
  132.                           PROPRO_BAN    =   :PROPRO_BAN   ,
  133.                           PROPAIS_BAN   =   :PROPAIS_BAN  ,
  134.                               PROFOR    =   :PROFOR       ,
  135.                               PRO_ENE   =   :PRO_ENE      ,
  136.                               PRO_FEB   =   :PRO_FEB      ,
  137.                               PRO_MAR   =   :PRO_MAR      ,
  138.                               PRO_ABR   =   :PRO_ABR      ,
  139.                               PRO_MAY   =   :PRO_MAY      ,
  140.                               PRO_JUN   =   :PRO_JUN      ,
  141.                               PRO_JUL   =   :PRO_JUL      ,
  142.                               PRO_AGO   =   :PRO_AGO      ,
  143.                               PRO_SEP   =   :PRO_SEP      ,
  144.                               PRO_OCT   =   :PRO_OCT      ,
  145.                               PRO_NOV   =   :PRO_NOV      ,
  146.                               PRO_DIC   =   :PRO_DIC      ,
  147.                           PROREP    =   :PROREP       ,
  148.                               PRODTO    =   :PRODTO       ,
  149.                               PROTAR    =   :PROTAR       ,
  150.                               PROMAY    =   :PROMAY       ,
  151.                               PRORIE_AUT    =   :PRORIE_AUT   ,
  152.                               PRORIE_ALC    =   :PRORIE_ALC   ,
  153.                               PROTOT    =   :PROTOT       ,
  154.                               PROREC    =   :PROREC       ,
  155.                               PROIVA    =   :PROIVA       ,
  156.                               PRODTO_PP =   :PRODTO_PP    ,
  157.                               PROVAC    =   :PROVAC       ,
  158.                               PRODIA1   =   :PRODIA1      ,
  159.                               PRODIA2   =   :PRODIA2      ,
  160.                               PRODIA3   =   :PRODIA3      ,
  161.                               PROACT    =   :PROACT       ,
  162.                               PROFEC    =   :PROFEC       ,
  163.                               PROFEC_MOD    =   :PROFEC_MOD   ,
  164.                               PROFEC_COM    =   :PROFEC_COM   ,
  165.                             PROPROV =   :PROPROV      ,
  166.                             PROFAC_REP  =   :PROFAC_REP   ,
  167.                               PROPLA    =   :PROPLA       ,
  168.                               PROMESF   =   :PROMESF      ,
  169.                             PROREP_LEG  =   :PROREP_LEG   ,
  170.                             PROREP_NIF  =   :PROREP_NIF   ,
  171.                             PROELI  =   :PROELI       ,
  172.                           PROOBS    =   :PROOBS       ,
  173.                           PROTEX    =   :PROTEX       ,
  174.                           PROTEX_TEX    =   :PROTEX_TEX   ,
  175.                           PROLIS    =   :PROLIS       ,
  176.                           PRONOCOM  =   :PRONOCOM
  177.                WHERE PROCOD = :PROCOD
  178.      END-EXEC.

Gracias a [email protected]

Kuk 20 de mayo de 2015 13:15

Josber, varias cosas. Yo lo que mas he usado ha sido DB2, asi que te voy a decir desde ese prisma cosas a mejorar: el INTO va antes que el FROM. El * (asterisco) no se aconseja usarlo jamas en programas. Tampoco se aconseja llamar de misma forma las variables y los cmapos de la tabla.

En cuanto a tu problema, como tienes definido el campo PRONOM en la tabla, y como la variable PRONOM en la WORKING?

Josber 20 de mayo de 2015 13:30

¿PRONOM?, ¿No te referirás a PROCOD?

Código COBOL:
  1. 03  PROCOD                              PIC S9(5).
  2. 03  PRONOM                              PIC X(40).

Código:

'PROCOD' decimal(5,0) unsigned NOT NULL COMMENT 'NUM. PROVEEDOR',
'PRONOM' varchar(40) DEFAULT NULL COMMENT 'NOMBRE PROVEEDOR',

En cuanto al INTO, en otra tabla está puesto así y funciona, pero luego lo cambiaré a ver, y lo del *, pues al ser tantos campos, si tengo que definirlos todos en el SELECT, vaya palo.

Un saludo.-

Kuk 20 de mayo de 2015 16:22

Josber, los campos VARCHAR son campos compuestos, y en COBOL se representan asi:

Código COBOL:
  1.  01  PRONOM.
  2.      49  PRONOM-LON        PIC S9(4) COMP-4. *> CANTIDAD DE BYTES USADA
  3.      49  PRONOM-TXT        PIC X(40). *> MAXIMO

Los niveles 49 deben ser 49 y no otro. Todos los VARCHAR contienen 2 bytes demas, al principio del campo en formato binario donde se indica la longitud, que deberiamos informar segun la longitud que vayamos a usar (de 1 a 40 en este caso). De hecho es la ventaja de los VARCHAR.

En cuanto a lo otro, para los DECIMAL debes usar COMP-3 (o que es lo mismo PACKED-DECIMAL), ademas en la tabla es UNSIGNED :

Código COBOL:
  1. 01  PROCOD                 PIC 9(5) COMP-3.

Pero joe, todo esto son mas bien temas de rendimiento (menos lo del COMP-3). Pero entiendo que en otros sitios te funcion con DECIMAL numerico simple de COBOL? Ha de haber una conversion automatica, puede que en este caso falla por algo. Intenta cambiarlo por COMP-3 a ver que tal...

Si no, ya no se me ocurre nada mas.... :piensa: :(

Josber 20 de mayo de 2015 16:44

No sabía lo del nivel 49 y que los VARCHAR eran campos compuesto, los puedo cambiar por TINYTEXT, aunque lo malo que tiene éste campo es que no pueden contener NULL, ni un valor declarado de inicio. En cuanto al UNSIGNED, si les quito el signo en la WORKING, a la hora de compilar, me dice que han de ser con signo obligatoriamente, si te pusiera la declaración de la WORKING, verías que todos los campos numéricos llevan signo, (CÓDIGO, TARIFA, GRUPO, NÚMERO DE CUENTA, etc.., y es una mier...).

Un saludo.-

Añadido despues de 2 horas 52 minutos
Confirmado Kuk, si pones COMP-3 y le quitas el signo, al compilar da el siguiente error:


FORM-PROVEEDORES-SQL WORKING-STORAGE(7) : JMN2898I-S The host variable of a binary, external decimal, or internal decimal item must contain the symbol S.
FORM-PROVEEDORES-SQL VIENE-DE-FORM-PRO-INI(85) : JMN3175I-S The USAGE of sending item 'PROCOD' in the STRING statement must be DISPLAY.


Un saludo.-

Kuk 20 de mayo de 2015 20:57

Josber, que yo sepa los VARCHAR pueden ser NULL... Pero estas cosas varian a veces, yo como uso DB2, es de lo que más sé. Lo mismo pasa con el signo, DB2 lo permite perfectamente sin signo.

Metele signo y COMP-3. Tambien prueba con COMP-4 en vez de COMP-3 y a ver que tal ;)

Josber 21 de mayo de 2024 19:20

A ver, aunque hace ya unnnnn montón de tiempo de ésto, estaba buscando otra cosa y me he topado con ello.

Al final solucioné el error, nada tan sencillo como mover a ZEROS o SPACES, (lo que corresponda), todas las variables definidas en la WORKING que atañen al fichero que se va a actualizar, ¡¡OJO!!, es muy importante, NO SIRVE hacer un INITIALIZE, no funciona, o por lo menos a mí no me funcionó, fue hacer eso y se acabó el problema.

Un salu2 a [email protected]


La franja horaria es GMT +2. Ahora son las 14:46.

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