PDA

Ver la Versión Completa : [Sintaxis] Sql Embebido


Hrmcobol
18 de febrero de 2016, 23:05
Hola camaradas, nunca use esta modalidad de acceso, use siempre DbAccessControl, de Power, necesitaría un código como ejemplo de como hacer para leer un tabla de una base, vía una ODBC. Estoy leyendo el manual pero no doy pie con bola.
En algún momento alguien subió algo al respecto, pero no logro encontrarlo.
Lo que quiero hacer en concreto es agregar campos a tablas ya existentes, tambien crear tablas nuevas en una base. Se que las instrucciones son CreateTable y AlterTable.
Todo desde un programa cobol.
Saludos y Gracias !!

Josber
19 de febrero de 2016, 08:16
A ver Hrm, primero tienes que empezar definiendo la estructura de la tabla en la WORKING, (y todas las variables que vayas a usar en SQL), por ejemplo


EXEC SQL
BEGIN DECLARE SECTION
END-EXEC.
* FICHERO de GASTOS
01 REG-GAS IS GLOBAL.
03 ID_GAS PIC S9(11).
03 GASLIB PIC X(4). *> LIBRO DE REGISTRO AL QUE PERTENECE EL APUNTE
03 GASFEC PIC X(8). *> FECHA DEL APUNTE
03 GASDES PIC X(60). *> DESCRIPCIÓN DEL APUNTE
03 GASIMP PIC S9(9)V999. *> IMPORTE DEL APUNTE
03 GASTIP PIC X. *> TIPO DE APUNTE (Ingreso o Gasto)
03 GASOBS PIC X(100). *> OBSERVACIONES
03 GASUSU PIC X(10). *> USUARIO ALTA DEL APUNTE
03 GASUSU_FEC PIC X(8). *> FECHA EN LA QUE SE REALIZA EL APUNTE
03 GASHO.
05 GASHOR PIC S9(6). *> HORA EN LA QUE SE REALIZA EL APUNTE
03 GASUSU_MOD PIC X(10). *> USUARIO ULTIMA MODIFICACIÓN
03 GASFEC_MOD PIC X(8). *> FECHA ULTIMA MODIFICACIÓN
03 GASHO_MOD.
05 GASHOR_MOD PIC S9(6). *> HORA ULTIMA MODIFICACIÓN
03 GASELI PIC X. *> ¿APUNTE ELIMINADO?
*
01 WGASLIB PIC X(4) IS GLOBAL.
01 WID_GAS PIC S9(11) IS GLOBAL.
01 ID_GAS1 PIC S9(11) IS GLOBAL.
*
01 SQLSTATE PIC XXXXX IS GLOBAL.
01 SQLCODE PIC S9(9) COMP-5 GLOBAL.
01 SQLMSG PIC X(600) GLOBAL.
01 CONTASQL PIC S9(9) IS GLOBAL. *> CONTADOR
01 WS-SQL PIC X(250) IS GLOBAL.
EXEC SQL
END DECLARE SECTION
END-EXEC.


Ten en cuenta que TODAS las variables numéricas, en la WORKING tienen que llevar signo SÍ o SÍ.

- PARA LEER EL NÚMERO DE REGISTROS:


EXEC SQL
SELECT COUNT(GASLIB)
FROM GASTOS
WHERE GASLIB = :WGASLIB AND GASELI <> "S"
INTO :CONTASQL
END-EXEC.


en CONTASQL se almacenaría el total de registros

- PARA LEER UN REGISTRO ESPECÍFICO


MOVE "Text" OF CAMPO10 TO WID_GAS.

EXEC SQL
SELECT ID_GAS,
GASFEC,
GASDES,
GASIMP,
GASTIP,
GASOBS,
GASELI
FROM GASTOS WHERE ID_GAS = :WID_GAS LIMIT 1
INTO :ID_GAS,
:GASFEC,
:GASDES,
:GASIMP,
:GASTIP,
:GASOBS,
:GASELI
END-EXEC.

IF SQLSTATE NOT = "00000" OR GASELI = "S"
ADD POW-DMICONERROR POW-DMOK GIVING ESTILO
INVOKE POW-SELF "DisplayMessage"
USING "*ERROR: El registro no existe ..."
WS-ATENCION
ESTILO
END-INVOKE
INVOKE CAMPO10 "SetFocus"
EXIT PROGRAM
END-IF.


- PARA LEER UN RANGO ESPECÍFICO DE REGISTROS



EXEC SQL
DECLARE cursor1 CURSOR FOR
SELECT ID_GAS,
GASFEC,
GASDES,
GASIMP,
GASTIP,
GASOBS,
GASELI
FROM GASTOS WHERE GASLIB = :WGASLIB AND GASELI <> "S"
ORDER BY ID_GAS ASC;
END-EXEC.

EXEC SQL
OPEN cursor1
END-EXEC.

PERFORM CARGAR THRU FIN-CARGAR UNTIL SQLSTATE = "02000".

EXEC SQL
CLOSE cursor1
END-EXEC.

EXEC SQL
COMMIT
END-EXEC.
.
.
.
*
CARGAR.
EXEC SQL
FETCH cursor1
INTO :ID_GAS,
:GASFEC,
:GASDES,
:GASIMP,
:GASTIP,
:GASOBS,
:GASELI
END-EXEC.

IF SQLSTATE = "02000"
GO FIN-CARGAR
END-IF.

INVOKE VIEW2 "Add" USING 1 1 RETURNING WK-IDX
IF WK-IDX > 0 THEN
MOVE "ListItems"(WK-IDX) OF VIEW2 TO POW-PCMLIST
END-IF.

MOVE GASFEC TO FECHA.
MOVE CORR FECHA TO FECHA1.
.
.
.

FIN-CARGAR.
EXIT.


- PARA INSERTAR UN NUEVO REGISTRO


EXEC SQL
INSERT INTO GASTOS
VALUES (
NULL,
:GASLIB,
:GASFEC,
:GASDES,
:GASIMP,
:GASTIP,
:GASOBS,
:GASUSU,
:GASUSU_FEC,
:GASHOR,
:GASUSU_MOD,
:GASFEC_MOD,
:GASHOR_MOD,
:GASELI )
END-EXEC


El primer campo es NULL, porque el campo ID_GAS, que es la clave principal, es un campo AUTO_INCREMENT.

- PARA MODIFICAR UN REGISTRO EXISTENTE:


EXEC SQL
UPDATE GASTOS
SET GASLIB = :GASLIB,
GASFEC = :GASFEC,
GASDES = :GASDES,
GASIMP = :GASIMP,
GASTIP = :GASTIP,
GASOBS = :GASOBS,
GASUSU_MOD = :GASUSU_MOD,
GASFEC_MOD = :GASFEC_MOD,
GASHOR_MOD = :GASHOR_MOD,
GASELI = :GASELI
WHERE ID_GAS = :ID_GAS
END-EXEC.


Aquí no puedes poner el primer campo, porque la llave principal, no se puede volver a grabar, si lo pusieras daría el error S200 en SQLSTATE.

despues de cada vez que INSERTES/MODIFIQUES un registro, has de poner


EXEC SQL
COMMIT
END-EXEC.


o de lo contrario, no te modificará la tabla, en caso que que quiereas desacer los cambios, cambias el COMMIT por ROLLBACK, pero una vez que haya hecho el COMMIT, los cambios no se pueden deshacer.

Creo que está todo, si tienes dudas o problemas, dinoslo.

Un saludo.-

Josber
19 de febrero de 2016, 11:46
Se me ha pasado el ponerte como se crea la tabla


EXEC SQL
CREATE TABLE IF NOT EXIST 'gastos' (
'ID_GAS' int(11) unsigned NOT NULL AUTO_INCREMENT,
'GASLIB' varchar(4) DEFAULT NULL COMMENT 'LIBRO DE GASTOS',
'GASFEC' varchar(8) DEFAULT NULL COMMENT 'FECHA APUNTE',
'GASDES' varchar(60) DEFAULT NULL COMMENT 'DESCRIPCIÓN APUNTE',
'GASIMP' decimal(12,3) NOT NULL DEFAULT '0.000' COMMENT 'IMPORTE APUNTE',
'GASTIP' varchar(1) DEFAULT NULL COMMENT 'TIPO DE APUNTE(GASTO o INGRESO)',
'GASOBS' varchar(100) DEFAULT NULL COMMENT 'OBSERVACIONES APUNTE',
'GASUSU' varchar(10) DEFAULT NULL COMMENT 'USUARIO QUE HIZO EL APUNTE',
'GASUSU_FEC' varchar(8) DEFAULT NULL COMMENT 'FECHA QUE SE HIZO EL APUNTE',
'GASHOR' decimal(6,0) DEFAULT '0' COMMENT 'HORA EN LA QUE SE HIZO EL APUNTE',
'GASUSU_MOD' varchar(10) DEFAULT NULL COMMENT 'USUARIO ÚLTIMA MODIFICACIÓN',
'GASFEC_MOD' varchar(8) DEFAULT NULL COMMENT 'FECHA ÚLTIMA MODIFICACIÓN',
'GASHOR_MOD' decimal(6,0) DEFAULT NULL COMMENT 'HORA ÚLTIMA MODIFICACIÓN',
'GASELI' varchar(1) DEFAULT NULL COMMENT '¿APUNTE ELIMINADO?',
UNIQUE KEY ('ID_GAS')
) ENGINE=InnoDB DEFAULT CHARSET=latin1
END-EXEC


Si no pones la instrucción IF NOT EXIST, te dará error si la tabla ya existe

- Si deseas eliminar elementos de la tabla:


EXEC SQL
DELETE FROM GASTOS
WHERE ID_GAS = :WID_GAS
END-EXEC.


- Si quieres vaciar por completo una tabla, además de poner el contador AUTO_INCREMENT a 0, (si lo tiene la tabla, que no es obligatorio)


EXEC SQL
TRUNCATE TABLE GASTOS
END-EXEC.


- Si quieres eliminar por completo la tabla, (datos y estructura)


EXEC SQL
DROP TABLE GASTOS
END-EXEC.


¡Cuidado! que TRUNCATE y DROP, no tienen vuelta atrás

Si quieres ver cómo esta creada una tabla, desde el administrador de BD, no desde tu programa COBOL


SHOW CREATE TABLE Nombre_de_la_tabla

Esto te daría un fichero de texto plano muy similar al que utilizas para crear la tabla.

Un saludo y suerte.-

---------- Post añadido : 11:46 ---------- Post anterior : 11:30 ----------

Otra cosa a tener en cuenta, es cuando creas un número en SQL y has de ponerle un tamaño con decimales, esto se define entre paréntesis, el primer número indica el tamaño total, (incluidos los decimales) y el segundo los decimales, por ejemplo, un campo en COBOL del tipo


01 WNUM PIC S9(7).
01 WDEC PIC S9(7)V999.


en SQL, sería


'WNUM' decimal(7,0),
'WDEC' decimal(10,3)

Si te fijas WDECIMAL en SQL, tiene un tamaño de 10, de los que 3 son decimales.
Los campos en SQL, se separan utilizando el símbolo de la , (coma), y las instrucciones se separan utilizando el símbolo ; (punto y coma), por ejemplo:



EXEC SQL

DECLARE cursor1 CURSOR FOR
SELECT ID_GAS,
GASFEC,
GASDES,
GASIMP,
GASTIP,
GASOBS,
GASELI
FROM GASTOS WHERE GASLIB = :WGASLIB AND GASELI <> "S"
ORDER BY ID_GAS ASC;

OPEN cursor1

END-EXEC.


Cuidado con las comas y los punto y comas, que son obligatorios y es muy estricto en ésto.



Un saludo

Hrmcobol
24 de febrero de 2016, 16:14
Estimados, sigo colgado con este tema.
La pregunta es:
Como relaciono la ODBC con el PwCobol sin usar DbAccessControl
Saludos

Kuk
24 de febrero de 2016, 21:45
Hrmcobol, si no me equivoco, tienes que crear un fichero *.inf con la configuración de la conexión e indicarlo en COBOL85.CBR con la variable @ODBC_Inf.
Ejemplo:

@ODBC_Inf=PRUEBA.inf

Hrmcobol
25 de febrero de 2016, 21:38
Asi Es Kuk, la conexión se hace r intermedio del @ODBC_Inf=PRUEBA.inf y el cobol85.cbr, logre abrir la base y leer registros de la tabla.
Gracias.

Juanghi
26 de febrero de 2016, 04:44
Como primer paso en tu proyecto deberias direccionar donde estara tu archivo de coneccion via odbc (ojo .. por fuera podes cambiar esa direccion tambien)

Luego ejecutar el SQLODBCS a los efectos de crear la sesion con el archivo de coneccion

seleccionas una seccon en este caso la llame SV4 asociada a una base "cursos", con su usuario y clave (root y su clave)

luego en la procedure estableces la coneccion y trabajas con todas aquellas
posiblidades que te brindo josber con comandos sql

al finalizar el programas te desconectas

Hrmcobol
26 de febrero de 2016, 14:56
Estimados, ante todo gracias por vuestra colaboración.
Ya he logrado leer y agregar registros a la tabla.
Aprendí la conexión Odbc/Cobol85/Sql.Inf
Ahora lo que quiero hacer es crear una tabla nueva con la instrucción CREATE TABLE, como se imaginaran copie el código del post que puso Josber, cuando compilo me da el siguiente error:
ART00101 CbLeer1-Click(20) : JMN2633I-S The SQL statement is invalid. ODBC-7600E NOT EXECUTABLE SQL STATEMENT..
Aparentemente el error es que " Create Table" no esta soportado.
Alguna idea?
Saludos

Les adjunto el código que escribí

ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.

EXEC SQL BEGIN DECLARE SECTION END-EXEC.

01 SQLSTATE PIC X(005).

EXEC SQL END DECLARE SECTION END-EXEC.

PROCEDURE DIVISION.

EXEC SQL CONNECT TO 'maestro' END-EXEC. *> Maestro es el nombre de la ODBC

EXEC SQL
CREATE TABLE IF NOT EXIST 'gastos' (
'ID_GAS' int (011) unsigned NOT NULL AUTO_INCREMENT,
'GASLIB' varchar (004) DEFAULT NULL,
'GASFEC' varchar (008) DEFAULT NULL,
'GASDES' varchar (060) DEFAULT NULL,
'GASELI' varchar (001) DEFAULT NULL,
UNIQUE KEY ('ID_GAS')) ENGINE=InnoDB DEFAULT CHARSET=latin1
END-EXEC

IF sqlstate not = "00000" INVOKE POW-SELF "DisplayMessage" USING sqlstate "Error".

EXEC SQL DISCONNECT 'maestro' END-EXEC.

Xavier
26 de febrero de 2016, 18:41
Hola Hrm
Creo haber leído en algún sitio, ahora no recuerdo donde, que desde el SQL embebido solo puedes hacer uso del lenguaje DML (Data Manipulation Laguaje) que es que estáis comentando aquí, pero no puedes hacer uso del DDL (Data Definition Laguaje) que es el que sirve para definir objetos en la base de datos (Tablas, Vistas, etc.)

Hrmcobol
27 de febrero de 2016, 19:06
Gracias Xavier. Estoy leyendo el manual un poco mas detenidamente y aparentemente es así como tu dices.

Entonces la pregunta es: No se pueden usar "Alter" y "Create" en PWC ?

Saludos

Josber
29 de febrero de 2016, 11:04
A ver yo la creación y modificación de tablas la hago a través del gestor de MySql, nunca lo he probado a través de PWC, pero por lo que he estado leyendo en otros sitios, no se puede, según parece, la única manera de hacerlo, sería atraves de los controles ADO, pero no lo he hecho nunca y no tengo ni idea de como funcionan. El resto de instrucciones que he puesto, si están probadas por mi y funcionan perfectamente.

Un saludo.-

Rapinto
1 de marzo de 2016, 00:59
Hrmcobol,

Fiz há algum tempo atras um software para transferir ficheiros de PowerCobol para uma base de dados de um site na Internet.
Está tudo feito em PowerCobol V9.0, cria as tabelas no SQL do site, apaga as tabelas também, e escreve e le dados, tudo através duma ligação á Internet.
Não utiliza ODBC, faz a ligação direta á base de dados.
A única diferença é que utilizei tudo, através de comandos COM/OLE2 e o ADO.


INVOKE COM "CREATE-OBJECT" USING ADO-CONNECTION-TYPE RETURNING OBJ-CONNECTION.
INVOKE COM "CREATE-OBJECT" USING ADO-COMMAND-TYPE RETURNING OBJ-COMMAND.
INVOKE COM "CREATE-OBJECT" USING ADO-RECORDSET-TYPE RETURNING OBJ-RECORDSET(1).
**
*** DEFINE AND OPEN CONNECTION
**
INITIALIZE ADO-CONNECT-STRING.
STRING
"Driver=" ADO-DRIVER DELIMITED BY ";" "; " DELIMITED BY SIZE
"Server=" ADO-SERVER DELIMITED BY ";" "; " DELIMITED BY SIZE
"Port=" ADO-PORT DELIMITED BY ";" "; " DELIMITED BY SIZE
"UID=" ADO-UID DELIMITED BY ";" "; " DELIMITED BY SIZE
"PWD=" ADO-PWD DELIMITED BY ";" "; " DELIMITED BY SIZE
"CHARSET=" ADO-CHARSET DELIMITED BY ";" "; " DELIMITED BY SIZE
"DATABASE=" ADO-DATABASE DELIMITED BY ";"
"; " DELIMITED BY SIZE
INTO ADO-CONNECT-STRING.
*
MAIN-05.
* MOVE "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\RPS13_SRC\RPSFtsEIbd\Database5.accdb;Jet OLEDB:Database;" TO ADO-CONNECT-STRING.
*
MOVE "SETCONNECTIONSTRING " TO INSTRUCAO.
*
INVOKE OBJ-CONNECTION "SET-CONNECTIONSTRING" USING ADO-CONNECT-STRING RETURNING RETURN-ERROR.
IF RETURN-ERROR NOT = 0 DISPLAY "ERRO: CONNECTION STRING" STOP " " GO TO MAIN-99-EXIT.
*
MOVE "OPEN CONNECTION" TO INSTRUCAO.
INVOKE OBJ-CONNECTION "OPEN" RETURNING RETURN-ERROR.
IF RETURN-ERROR NOT = 0 DISPLAY "ERRO:OPEN CONNECTION" STOP " " GO TO MAIN-99-EXIT.
*



Já subi, algum tempo atrás, para o foro um exemplo de como ligar por esse processo e ler dados da base de dados. --> Base de Dados DBF por OLE2
Se estiveres interessado na utilização de COM/OLE2, poderei dar-te uma ajuda, com um pequeno exemplo.

Un saludo,
Rui Pinto

Hrmcobol
2 de marzo de 2016, 13:42
Gracias Rapinto. Como Siempre Usted Con La Respuesta. Esto es demasiado para mi, nunca trabaje ni vi nada con ADO. El tema de crear y modificar tablas era solo una sutileza que quería hacer.
Lo dejare para mas adelante.
Saludos !!

Kuk
14 de junio de 2017, 09:28
Josber, y otros amigos del foro. ¿Utilizáis un precompilador particular de la BBDD o el que viene con NetCOBOL? Y también, ¿cómo incluís la SQLCA, con COPY o con EXEC SQL INCLUDE?

Josber
14 de junio de 2017, 20:58
Josber, y otros amigos del foro. ¿Utilizáis un precompilador particular de la BBDD o el que viene con NetCOBOL? Y también, ¿cómo incluís la SQLCA, con COPY o con EXEC SQL INCLUDE?


Yo utilizo el que viene con Netcobol incluido, en cuanto a lo otro, no caigo ahora en qué es

Un saludo.-c

Kuk
14 de junio de 2017, 21:53
Josber, lo otro es una tontería, debe ser EXEC SQL INCLUDE, se me ha ido la fresa a la hora de preguntarlo ;)

dmosca
22 de junio de 2017, 17:54
Buen dia

sigo sin poder conectar Powercobol con Mysql

por favor si tienen unos minutos para explicar el contenido de COBOL85.cbr y BD.inf

Josber
22 de junio de 2017, 20:58
dmosca, a ver lo principal es que, no sé si será tu caso, pero si tienes los ejecutables en un directorio distinto a los fuentes, no te funcionará, para que funcione, tienes que cambiarlo en el proyecto.

En el fichero COBOL85.CBR, has de poner una línea más o menos así, (puedes hacerlo con el Notepad, que funciona igual):

@ODBC_Inf=C:\Tiras y Cordones\bd.inf

El fichero .inf, en mi caso BD.inf, has de crearlo con la utilidad SQLODBCS, para ello, antes tienes que haber creado el conector ODBC, desde el panel de control de windows. Una vez creado el ODBC, es tan sencillo como abrir la utilidad que te he dicho, darle al botón de buscar en la primera pantalla, (Browse), selccionas la carpeta donde quieres guardar el archivo .inf, en esa carpeta pones el nombre que quieres darle al archivo y te preguntará si quieres crear uno nuevo, le dices que sí y entras en la pantalla de configuración.

- En Server Name, pones el nombre que quieras, pero ten en cuenta que, el nombre que pongas ahí, va a ser el que uses en tu programa POWER COBOL, por ejemplo para abrir la BD. (EXEC SQL CONNECT TO nombre END EXEC.)
- Marca la opción Machine Data Source
- En Data Source Name, abres el desplegable, y te aparecerá la conexión ODBC que tengas hecha, la seleccionas.
- En User ID, pones el nombre del usuario autorizado para acceder a la BD, si no tienes ninguno, será root
- En Password, pones la contraseña de ese usuario.
- En Comment, no hace falta que pongas nada si no quieres
- En Access Mode, marcas la opción de Read/Write
- En COMMIT MODE, depende de como lo tengas definidio en MySQL, si es AUTO o NO

El resto de opciones, no me ha hecho falta nunca modificarlas, le das a aceptar y listo, te crea el archivo .inf y a funcionar.

Si tienes mas problemas, no dudes en consultar.

Un saludo.-

dmosca
23 de junio de 2017, 03:11
Josber

pude consultar la base, muchas gracias

Joseg
23 de junio de 2017, 10:21
Numa instalação em rede (local network), existe alguma forma de automatizar a criação do DNS?
O objetivo era não ter que ir a cada maquina para criar manualmente a ligação de ODBC.

Gracias
Jose

Josber
23 de junio de 2017, 13:35
Numa instalação em rede (local network), existe alguma forma de automatizar a criação do DNS?
O objetivo era não ter que ir a cada maquina para criar manualmente a ligação de ODBC.

Gracias
Jose

Yo no le he probado, siempre he creado los ODBC a mano, pero algo así debería funcionar:

- Creas un archivo con extensión .reg, por ejemplo conexión.reg, con los siguientes valores:


Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\SOFTWARE\ODBC\ODBC.INI\BD]
"Driver"="MariaDB ODBC 3.0 Driver"
"DESCRIPTION"="Tiras y Cordones"
"OPTIONS"="4194304"
"TCPIP"="1"
"SERVER"="127.0.0.1"
"UID"=nombre_de_usuario
"PWD"=contraseña_de_usuario
"DATABASE"=nombre_base_de_datos
"PORT"="3306"
"CONN_TIMEOUT"="0"
"CHARSET"="utf8"
"SSLVERIFY"="0"

Una vez grabado, con la siguiente instrucción desde la linea de comandos, debería de crearlo:

REG IMPORT [unidad/ruta]nombre_archivo.reg

Si en vez de querer crear el DSN por usuario, quieres crearlo por máquina, tienes que cambiar en el archivo .reg

HKEY_CURRENT_USER por HKEY_LOCAL_MACHINE

Si lo pruebas, comenta el resultado

Un saludo.-

dmosca
24 de junio de 2017, 02:41
Rapinto, buenas tardes.

tienes el ejemplo de como acceder bdl con ADO?

pude conectar y leer una base .mdb, pero necesito conectar a MySql.

si puedes compartir el ejemplo para ver como conectar POWERCOBOL V9 a Mysql con COM/OLE2

muchas gracias

Joseg
26 de junio de 2017, 11:32
Yo no le he probado, siempre he creado los ODBC a mano, pero algo así debería funcionar:

- Creas un archivo con extensión .reg, por ejemplo conexión.reg, con los siguientes valores:


Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\SOFTWARE\ODBC\ODBC.INI\BD]
"Driver"="MariaDB ODBC 3.0 Driver"
"DESCRIPTION"="Tiras y Cordones"
"OPTIONS"="4194304"
"TCPIP"="1"
"SERVER"="127.0.0.1"
"UID"=nombre_de_usuario
"PWD"=contraseña_de_usuario
"DATABASE"=nombre_base_de_datos
"PORT"="3306"
"CONN_TIMEOUT"="0"
"CHARSET"="utf8"
"SSLVERIFY"="0"

Una vez grabado, con la siguiente instrucción desde la linea de comandos, debería de crearlo:

REG IMPORT [unidad/ruta]nombre_archivo.reg

Si en vez de querer crear el DSN por usuario, quieres crearlo por máquina, tienes que cambiar en el archivo .reg

HKEY_CURRENT_USER por HKEY_LOCAL_MACHINE

Si lo pruebas, comenta el resultado

Un saludo.-


Não consigo adicionar o registo :( mas deve ser algo parecido.

Gracias

---------- Post añadido : 10:32 ---------- Post anterior : 10:19 ----------

Não consigo adicionar o registo :( mas deve ser algo parecido.

Gracias


Encontrei esta forma e funciona bem (command-line):

Add-OdbcDsn (https://technet.microsoft.com/itpro/powershell/windows/wdac/add-odbcdsn)
ou
ODBCCONF.EXE (vai ser descontinuado pela Microsoft)

Mysql tem esta opção: myodbc-installer.exe (MariaDB não encontrei esta possibilidade)

Desta forma é possivel automatizar todo um setup

Rapinto
28 de junio de 2017, 01:09
DMOSCA,

Não sei se é isto que pretendes:

DRIVER={MySQL ODBC 5.3 ANSI Driver}
SERVER=db4free.net
PORT=03306
UID=rpsuser
PWD=teste1234
CHARSET=utf8
DATABASE=dbrps

Tens que alterar o SERVER para o nome correto.
Tens que alterar a PORT para o numero de porta certo
Tens que alterar o UID para o nome do usuário
Altera a PWD para a password correta.
Altera DATABASE para o nome correto da base de dados.

Na Working-Storage


01 BDVARIABLES GLOBAL.
05 ADO-CONNECTION-TYPE PIC X(8192) VALUE "ADODB.Connection".
05 ADO-RECORDSET-TYPE PIC X(8192) VALUE "ADODB.Recordset".
05 ADO-COMMAND-TYPE PIC X(8192) VALUE "ADODB.Command".
05 OBJ-CONNECTION OBJECT REFERENCE COM .
05 OBJ-RECORDSET OBJECT REFERENCE COM OCCURS 10.
05 OBJ-RECORDSETSCHEMA OBJECT REFERENCE COM.
05 OBJ-COMMAND OBJECT REFERENCE COM.
*
05 OBJ-FIELD OBJECT REFERENCE COM OCCURS 50.
05 OBJ-FIELDS OBJECT REFERENCE COM.
*
05 OBJ-FIELDS-COUNT PIC S9(9) COMP-5 VALUE 0.
05 RECORDCOUNT PIC S9(9) COMP-5 VALUE 0.
05 NUMBER-FIELD PIC S9(9)V9(9) VALUE 0.
05 NUMBER-FIELD-EDT PIC -(10).9(9).
05 ALPHA-FIELD PIC X(200).
05 RETURN-ERROR PIC 9(9) COMP-5.
*
05 ADO-SQL-CMDTEXT PIC 9(9) COMP-5 VALUE 1.
05 WLOCK PIC S9(9) COMP-5 VALUE 1.
05 WCURSOR PIC S9(9) COMP-5 VALUE 1.
05 WOPTION PIC S9(9) COMP-5 VALUE -1.
05 W-INDEX PIC 99.
05 W-INDEX-1 PIC 99.
05 EOF PIC S9(9) COMP-5.
05 BOF PIC S9(9) COMP-5.


e para abrir:


**
*** CREATE OBJECTS NEEDED
**
INVOKE COM "CREATE-OBJECT" USING ADO-CONNECTION-TYPE
RETURNING OBJ-CONNECTION.
INVOKE COM "CREATE-OBJECT" USING ADO-COMMAND-TYPE
RETURNING OBJ-COMMAND.
INVOKE COM "CREATE-OBJECT" USING ADO-RECORDSET-TYPE
RETURNING OBJ-RECORDSET(1).
**
*** DEFINE AND OPEN CONNECTION
**
INITIALIZE ADO-CONNECT-STRING.
STRING
"Driver=" ADO-DRIVER DELIMITED BY ";" "; " DELIMITED BY SIZE
"Server=" ADO-SERVER DELIMITED BY ";" "; " DELIMITED BY SIZE
"Port=" ADO-PORT DELIMITED BY ";" "; " DELIMITED BY SIZE
"UID=" ADO-UID DELIMITED BY ";" "; " DELIMITED BY SIZE
"PWD=" ADO-PWD DELIMITED BY ";" "; " DELIMITED BY SIZE
"CHARSET=" ADO-CHARSET DELIMITED BY ";" "; " DELIMITED BY SIZE
"DATABASE=" ADO-DATABASE DELIMITED BY ";"
"; " DELIMITED BY SIZE
INTO ADO-CONNECT-STRING.
*
MAIN-05.

INVOKE OBJ-CONNECTION "SET-CONNECTIONSTRING" USING ADO-CONNECT-STRING RETURNING RETURN-ERROR.
IF RETURN-ERROR NOT = 0 DISPLAY "ERRO: CONNECTION STRING" STOP " " GO TO MAIN-99-EXIT.
*
INVOKE OBJ-CONNECTION "OPEN" RETURNING RETURN-ERROR.
IF RETURN-ERROR NOT = 0 DISPLAY "ERRO:OPEN CONNECTION" STOP " " GO TO MAIN-99-EXIT.



Não sei se isto ajuda alguma coisa.

Saludos,
Rui Pinto