La sentencia CREATE TABLE, tiene también una claúsula LIKE para que tome
la estructura de la tabla que indiques en esta cláusula (tal vez, más
sencillo que crearla con una sub-select de la tabla original). Lo que no
sé, porque no la he utilizado nunca, es si permite el "with data" o
"with no data". Yo suelo hacerlo como te indiqué. 

Una opción que quizá te pueda resultar práctica, si lo haces a menudo,
es crearte un procedimiento almacenado que reciba como parámetros
esquema y tabla de origen y de destino y si debe duplicar datos o no.
Una vez que lo tengas fino, siempre que tengas que hacer un duplicado,
sólo tienes que hacer un CALL a este procedimiento y estarás seguro de
que te va a hacer lo correcto. 

Cambiar de DDS a SQL cuesta un esfuerzo, pero cuando te habitúas a
trabajar con él, la verdad es que es una virguería.  

Saludos y ánimo.  

Juan Carlos

---
url: https://www.paredes.info
mail: [email protected] 

El 13/09/2017 18:23, Javier Mora escribió:

> Tengo claro que, como todo cambio, tendremos que hacer un esfuerzo para 
> readaptarnos a SQL. Muchas de las "costumbres" adquiridas durante más de 20 
> años tendremos que dejarlas a un lado, pero mientras descubres y aprendes la 
> alternativa nos vamos a encontrar con algún "aprieto". 
> 
> La opción que apunta Juan Carlos para duplicar tablas me puede ser válida 
> aunque más farragosa que un simple CRTDUPOBJ. El enlace de Alex también es 
> interesante. 
> 
> Respecto a los bloqueos al activar la integridad referencial es un verdadero 
> problema, porque es muy difícil encontrar un hueco en el día donde las tablas 
> afectadas no estén en uso. Para tablas completamente nuevas no es un 
> problema. En mi caso, la tabla de artículos es uno de esos objetos que la 
> utilizan todos los trabajos continuamente. Cualquier restricción referencial 
> nueva sobre ese archivo será un problema. 
> 
> Yo, de momento, me he planteado crear la tabla sin restricciones y activar 
> programas, etc. Cuando haya un hueco, haremos un ALTER TABLE para activarlas. 
> En este caso nos podremos encontrar con el caso de que los datos no las 
> cumplan y tendremos que "depurar" la tabla. 
> 
> Gracias por vuestro interés. 
> 
> Javier Mora 
> 
> DE: [email protected] 
> [mailto:[email protected]] EN NOMBRE DE Alex Martínez
> ENVIADO EL: miércoles, 13 de septiembre de 2017 14:15
> PARA: forum.help400
> ASUNTO: Re: Modernización - Transición SQL 
> 
> Hola
> 
> para el primer problema IBM tiene publicado un documento que lo explica, no 
> sé si te será de ayuda
> http://www-01.ibm.com/support/docview.wss?uid=nas8N1017004 
> 
> El problema mucha veces es seguir utilizando mandatos tradicionales como 
> CRTDUPOBJ,CPYF, etc cuando ya tienes un pie en el mundo SQL. Por ejemplo, 
> hacer un CRTDUPOBJ duplicando integridad y triggers puede ser una muy mala 
> idea.... 
> 
> Y es un problema añadir, quitar o cambiar una restricción si el objeto está 
> bloqueado, yo todo esto lo controlo antes de empezar a actualizar... por 
> motivos evidentes. Así que si encuentras la solución... coméntalo por aquí 
> !!! 
> 
> El 13 de septiembre de 2017, 13:09, Javier Mora <[email protected]> escribió:
> 
> Hola a tod@s de nuevo, 
> 
> estoy empezando a crear tablas de BBDD con el CREATE TABLE en lugar de DDS, 
> hasta el momento no he tenido ningún problema, ¡hasta ayer! 
> 
> Me encuentro con dos casos que sabría resolver pero no me gusta la solución: 
> 
> 1.       Cuando creo tablas con SQL le defino dos nombres, uno largo (y 
> descriptivo) para utilizar en SQL y el de sistema para poder utilizarlo con 
> los mandatos CL. Todo bien salvo cuando tengo que hacer un duplicado del 
> objeto en la misma biblioteca, que falla con el error CPF327E - No se permite 
> un nombre alternativo para el archivo XXXXX. 
> 
> ¿Cómo se pueden crear duplicados (CRTDUPOBJ) de ficheros con "nombre 
> alternativo" en una misma biblioteca? 
> 
> 2.       Nuestra BBDD tiene más de 20 años y nunca se han utilizado 
> "restricciones referenciales" entre archivos. Ahora quiero utilizarlas, pero 
> no es posible crear dicha tabla si las tablas referenciadas se están 
> utilizando. En un entorno como el nuestro (y seguramente como cualquier otro) 
> donde se utiliza el equipo las 24 horas del día por decenas de usuarios es 
> complicado pararlos a todos para hacer el cambio. 
> 
> ¿Existe alguna forma de crear tablas con restricciones referenciales sin 
> parar al personal? 
> 
> En un entorno tradicional de DDS estos problemas no surgían, puedes duplicar 
> tantas veces como quieras un objeto en la misma biblioteca (cambiando el 
> nombre) y puedes crear tantos archivos como quieras sin molestar al resto de 
> personal. 
> 
> ¿Cómo actuáis en estos casos? 
> 
> Saludos y gracias por vuestros comentarios, 
> 
> Javier Mora 
> 
> DE: [email protected] 
> [mailto:[email protected]] EN NOMBRE DE Javier Mora
> ENVIADO EL: miércoles, 1 de marzo de 2017 16:48
> PARA: 'forum.help400'
> ASUNTO: RE: Modernización - Transición SQL 
> 
> Gracias Alex.
> 
> Soy de los que le gusta tener casi todo atado antes de dar un paso de estas 
> dimensiones, pero en muchas ocasiones en muchas ocasiones esa necesidad lo 
> paraliza todo, porque es casi imposible tenerlo todo controlado. 
> 
> Como ya he comentado, he leído mucha documentación sobre el tema. Aunque hay 
> mucha literatura, no encuentro buenos ejemplos a lo que se plantea en estos 
> textos. En muy pocos se concretan decisiones sino que es todo muy 
> generalista. Aun así te ayuda a tener una visión amplia de la situación a la 
> que te enfrentas. 
> 
> (Creo) que tengo muy claro qué hacer para migrar las bases de datos a SQL 
> dejando los programas en RPG sin tocar (ni siquiera recompilar). Es de lo 
> poco concreto que he encontrado. 
> 
> De tus comentarios me llama la atención la gestión de la integridad y de las 
> restricciones, ¿las gestionáis con mandatos o con SQL? 
> 
> Respecto al bloque "optimista" siempre he tenido mis dudas y, desde mi punto 
> de vista, es bastante complicada una solución que detecte cuándo han cambiado 
> los datos leídos y qué datos. 
> 
> Saludos, 
> 
> Javier Mora 
> 
> DE: [email protected] 
> [mailto:[email protected]] EN NOMBRE DE Alex Martínez
> ENVIADO EL: miércoles, 01 de marzo de 2017 15:11
> PARA: forum.help400
> ASUNTO: Re: Modernización - Transición SQL 
> 
> Intento contestar de forma resumida, porque esto da para una telenovela de 
> varias temporadas.... ;-)
> 
> La moda de mover aplicaciones a SQL era para aprovechar las ventajas del 
> motor SQE... si las aplicaciones usaban OPNQRYF te quedabas con el motor 
> "tradicional" CQE... hasta que llegó la V7R2 e IBM publicó en un TR varias 
> mejoras para usar el SQE con "cosas" tradicionales.... en fin. 
> 
> Si hay programas en RPG, lo más que puedes tener es una combinación entre DDS 
> y SQL y creo que es la mejor opción (o la única). Hay varios artículos sobre 
> "DDS and SQL - The Winning Combination for DB2 for i" 
> 
> Yo no conozco aplicaciones en RPG en que TODO los accesos a base de datos 
> sean en SQL. Y te hablo de aplicaciones ya migradas a ILE hace 20 años. Si 
> todavía son OPM en tu caso, el primer paso es pasar a ILE. 
> 
> Sobre añadir integridad a tablas: Si ya utilizas ILE, en las operaciones 
> WRITE, UPDATE y DELETE nosotros empezamos a incluir una rutina GetDbErr de 
> gestión de errores de integridad referencial de base de datos, aunque las 
> tablas no tuvieran integridad, pero esto ya dejaba el programa preparado para 
> futuras reglas de integridad.  Después al añadir reglas de restricción a la 
> tablas el nombre de cada regla contenía el archivo de mensajes y el id de un 
> error, por ejemplo CHGPFCST FILE(AJUT400/TABLA)    
> CST('AJUTMSGF__AJUT400___ERR0001') 
> 
> Nota: la rutina GetDbErr se basa en unas utilidades de Julian Monypenny de 
> 1997, no recuerdo si se publicaron también en help/400 
> 
> http://iprodeveloper.com/site-files/iprodeveloper.com/files/archive/iprodeveloper.com/artarchiveimages/predec99/2462-figb.htm
>  
> 
> El mayor dolor de cabeza es realizar modificaciones de bases de datos con 
> integridad y sobre todo con trigers (a veces se ha disparado un trigger 
> durante un CPYF y se puede liar bien-bien) 
> 
> Sobre el bloqueo pesimista en SQL tal como se hace en RPG hay algo de 
> literatura 
> 
> https://www.itjungle.com/2011/07/20/fhg072011-story02/ 
> 
> En algunos casos el acceso a la BB/DD se externalizado en "APIs" en RPG-ILE 
> para tener un modelo y controlador (MVC) que incluya reglas, validaciones y 
> acceso a tablas. Esto es muy cómodo para luego externalizar como servicio 
> web.  
> 
> me dejo temas sin contestar.... en otro rato seguimos. 
> 
> El 1 de marzo de 2017, 12:41, Javier Mora <[email protected]> escribió:
> 
> Hola a tod@s, 
> 
> desde hace ya bastantes años estoy intentando modernizar nuestra BBDD pero 
> nunca he podido deshacerme de las DDS y empezar a crear los archivos con SQL. 
> Las razones son varias: creo que la más importante es "falta de ganas" y la 
> segunda son los más de 2000 programas que tenemos escritos en OPM RPG y que 
> no queremos "ni tocar". 
> 
> Esta situación provoca que casi cualquier fichero nuevo o cambiado afecte de 
> alguna manera a bastantes programas RPG antiguos, abortando el intento de 
> modernización de inmediato. Opciones como tipos de datos como VARCHAR, INT, 
> BLOB, el uso de NULOS, etc. no puedan utilizarse si no reconvertimos todos 
> los programas viejos. 
> 
> Desde hace más de ocho años utilizamos SQL incrustado en los nuevos 
> programas, procedimientos almacenados para conexiones JDBC/ODBC, funciones y 
> funciones de tablas de usuario. Pero no terminamos de decidirnos. 
> 
> Mi intención con este correo es recabar las experiencias de los miembros del 
> foro que han dado ya el paso. He leído muchísima documentación (Redbooks, 
> transparencias de conferencias, artículos, etc.) en donde todo se ve muy 
> bonito. Lo que busco son esas cuestiones que no se cuentan pero que suceden 
> en una migración de este tipo. 
> 
> Por ejemplo, yo me he encontrado con varias situaciones por resolver: 
> 
> -          Cómo documentar las tablas de la BBDD: nuestra documentación son 
> las DDS, aprovechamos el fuente para añadir los comentarios relacionados con 
> el fichero o con campos concretos. ¿Separo la documentación del fuente que 
> crea la tabla (CREATE TABLE)? ¿La dejo junta? ¿Qué herramientas existen? 
> 
> -          Bloqueos de registros: si codifico los nuevos programas con 
> SELECT, INSTERT, UPDATE y DELETE ¿cómo gestiono los bloqueos de registro como 
> lo hace CHAIN? ¿Debo renunciar al bloque por registro? 
> 
> -          Integridad referencial: es estupenda pero, ¿qué pasa con esos 
> programas tan antiguos que pueden romper esa integridad? Nos va a tocar 
> revisar los programas o esperar a que fallen para arreglarlos. 
> 
> -          CREATE TABLE: ¿cómo establezco valores como el número máximo de 
> registros o reutilizar registros borrados? Esta sentencia SQL no dispone de 
> estas opciones. ¿CHGPF? 
> 
> -          ¿Externalizo la E/S con la BBDD? 
> 
> Irán surgiendo muchas más cuestiones. 
> 
> Gracias a todos por vuestra paciencia y vuestras sugerencias. 
> 
> Javier Mora 
> 
> ____________________________________________________
> Únete a Recursos AS400, nuestra Comunidad ( http://bit.ly/db68dd [1] )
> Forum.Help400 (c) Publicaciones Help400, S.L. 
> 
> ____________________________________________________
> Únete a Recursos AS400, nuestra Comunidad ( http://bit.ly/db68dd [1] )
> Forum.Help400 (c) Publicaciones Help400, S.L. 
> 
> ____________________________________________________
> Únete a Recursos AS400, nuestra Comunidad ( http://bit.ly/db68dd )
> Forum.Help400 (c) Publicaciones Help400, S.L.
 

Links:
------
[1] http://bit.ly/db68dd
____________________________________________________
Únete a Recursos AS400, nuestra Comunidad ( http://bit.ly/db68dd )
Forum.Help400 © Publicaciones Help400, S.L.

Responder a