Iniciar Sesión

Ver la Versión Completa : [Compilador] Powercobol & ADO


Joseg
4 de junio de 2018, 20:08
Alguém neste foro usa esta dupla e que possa disponibilizar um exemplo CRUD de uma tabela, com uma coluna tipo "Date" (YYYMMDD).
Não estou a conseguindo fazer o "Update" da-me sempre erro, com as outras colunas não tenho problemas.
Não sei se é um bug da versão 7 do Pwoercobol.

Gracias,
José
Powercobol v7

Josber
4 de junio de 2018, 21:50
Yo no encontré la manera de que funcionase un campo DATE en MySql/MariaDB, siempre me daba error al grabar igual que a tí, al final tuve que cambiarlo por campos VARCHAR(8), ni en PWC7 ni en PWC9.

Un saludo.-

Kuk
4 de junio de 2018, 22:56
Joseg, Josber, el tipo Date en las bases de datos es un binario Integer.
En Unix Date el campo contiene segundos a partir del 1 de Enero de 1970: Tiempo Unix - Wikipedia, la enciclopedia libre (https://es.wikipedia.org/wiki/Tiempo_Unix)
Si no me equivoco, en las BD provenientes de la familia Unix, se usa este sistema. Y es el motor de la BD que lo presenta en un formato u otro, el que deseemos.

En DB2 la cosa cambia: IBM Knowledge Center (https://www.ibm.com/support/knowledgecenter/en/SSXJAV_11.1.0/com.ibm.filemanager.doc_11.1/db2/fmnu2l01321.htm)
Internally to DB2, the date is represented as a 4 byte field, with each byte containing 2 packed decimal digits stored in the format yyyymmdd.

Externally, as returned by an SQL SELECT statement, the date is represented by a character field. The format of the string is dependant on the DATE parameter in the DB2 DSNHDECP installation module (the DB2 installation option specified on the installation panel DSNTIP4). Table 24 shows valid DB2 date formats. The length of the date field is 10 bytes, except where the DB2 Installation Date format is LOCAL, in which case the length is installation-dependent and in the range 10 to 254 bytes. The date value must be in the range 0001-01-01 to 9999-12-31 (ISO format).

Y aquí información para MySQL: MySQL :: MySQL Internals Manual :: 10.9 Date and Time Data Type Representation (https://dev.mysql.com/doc/internals/en/date-and-time-data-type-representation.html)


DATE - 3 bytes, little endian
TIMESTAMP - 4 bytes, little endian


O sea que el tipo DATE de MySQL no es posible usarlo con Fujitsu ya que trabaja con binarios byte-oriented: Binary or COMP Format, a Description and Discussion (http://www.simotime.com/databn01.htm)
Es decir, no podemos declarar un binario de 3 bytes en Fujitsu. En Micro Focus sí podemos.

Conclusión: Usar campos de tiempo Timestamp que son de 4 bytes PIC S9(9) COMP-5.

Joseg
4 de junio de 2018, 23:32
Tentei este exemplo:

01 xx-fecha.
02 xx-fecha-aa pic 9999.
02 xx-fecha-g1 pic x value "-".
02 xx-fecha-mm pic 99.
02 xx-fecha-g2 pic x value "-".
02 xx-fecha-dd pic 99.
01 redefines xx-fecha.
02 ww-fecha pic x(10).


[Sintaxis] PowerCOBOL Microsoft ADO - COBOL Foro (https://www.cobolforo.es/showthread.php?t=706)

mas também da erro.

Fiz também um pequeno teste sem programação, apnas com os controls do PowerCobol:

CmADODataSource1 ----> Ligado a uma BD em MariaDB
CmEdit1 (ADO) ligada a uma coluna tipo "Fecha" de uma tabela MariaDB
CmCommand1 com o seguinte código:

INVOKE CmEdit1 "UpdateRecord"
INVOKE "Recordset" OF CmADODataSource1 "MoveNext"


Sempre que se altera CmEdit1 da o erro referido aqui:
Grupos do Google (https://groups.google.com/forum/#!topic/borland.public.delphi.database.ado/sbGeomIk5DI)

Não consigo resolver isto :(

Dasije
5 de junio de 2018, 00:10
Con SQL Server, lo solucionaba pasando una variable PIC 9(8) a 9999/99/99 al campo directamente.

Joseg
5 de junio de 2018, 00:23
Faz algo parecido com isto?


01 wdate pic 9999/99/99.
move 20180605 to wdate
move wdate to "Value" OF "Item"("ModifDate") OF "Fields" OF "Recordset" OF ADOC
INVOKE "Recordset" OF ADOC "MoveNext"



Pode colocar aqui essa parte do código?
Gracias,
Jose

Kuk
5 de junio de 2018, 09:16
Joseg, lo que cuenta es la BD, el ADO no es otra cosa que "un puente". Dependiendo del motor BD, le tienes que pasar el campo de tipo que corresponde con esa BD. El hecho de que haya funcionado un formato concreto, no quiere decir que dicho formato funcionará con otro motor BD.

Dasije
5 de junio de 2018, 09:22
Faz algo parecido com isto?


01 wdate pic 9999/99/99.
move 20180605 to wdate
move wdate to "Value" OF "Item"("ModifDate") OF "Fields" OF "Recordset" OF ADOC
INVOKE "Recordset" OF ADOC "MoveNext"



Pode colocar aqui essa parte do código?
Gracias,
Jose

Sí, así es.

Joseg
5 de junio de 2018, 10:17
No funciona :( me da siempre este mensaje:
"Row cannot be located for updating. Some values may have been changed since it was last read."

A coluna é do tipo 133 (adDBDate).
DataTypeEnum | Microsoft Docs (https://docs.microsoft.com/en-us/sql/ado/reference/ado-api/datatypeenum?view=sql-server-2017)

O resultado dos meus testes sao iguais em: MariaDB, Sqlite e Hyperfile.

Gracias

Fito
6 de junio de 2018, 05:03
Hola Amigos:

Aportando desde la ignorancia.

Joseg, probaste de usar guiones en vez de barras como separador de fecha?


01 wfecha.
02 waa pic 9999.
02 pic x value "-".
02 wmm pic 99.
02 pic x value "-".
02 wdd pic 99.
01 redefines wfecha.
02 wdate pic x(10).


Saludos.

Fito...

Joseg
6 de junio de 2018, 19:55
Fito, para ser mais fácil peguei o seu (excelente) exemplo. consigo alterar tudo excepto as coluna tipo "date" (fecha). Será que não tenho que dar uma indicação do formato da fecha, tipo yyymmdd por comando?!
Gracias


IDENTIFICATION DIVISION.
PROGRAM-ID. ADO.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
REPOSITORY.
CLASS COM AS "*COM"
CLASS EXCEP AS "*COM-EXCEPTION"
CLASS ARRAY AS "*COM-ARRAY".

DATA DIVISION.
WORKING-STORAGE SECTION.
*01 WK-OPTION PIC S9(9) COMP-5 VALUE POW-ADODB-ADCMDTEXT.
01 VARIABLES.
02 ADO-CONNECTION-TYPE PIC X(256) VALUE "ADODB.Connection".
02 ADO-RECORDSET-TYPE PIC X(256) VALUE "ADODB.Recordset".
02 OBJ-CONNECTION OBJECT REFERENCE COM.
02 OBJ-RECORDSET OBJECT REFERENCE COM.

02 OBJ-NAME OBJECT REFERENCE COM OCCURS 100.
02 OBJ-FIELD OBJECT REFERENCE COM OCCURS 100.
02 OBJ-FIELDS OBJECT REFERENCE COM .
02 OBJ-FIELDS-COUNT PIC S9(9) COMP-5 VALUE 0.
02 RECORDCOUNT PIC S9(9) COMP-5 VALUE 0.
02 RETURN-ERROR PIC 9(9) COMP-5.
02 WLOCK PIC S9(9) COMP-5 VALUE 3.
02 WCURSOR PIC S9(9) COMP-5 VALUE 3. *> 3 server
02 W-INDEX PIC 99.

02 WAFTERRECORDS PIC S9(9) COMP-5 VALUE 3.

02 ADO-CONNECT-STRING pic x(260) value low-values.
* 02 ADO-CONNECT-STRING pic x(60) value "DSN=prueba".
02 ADO-SQL-STRING pic x(500).
01 WK-0 PIC S9(9) COMP-5 VALUE 0.
01 WK-1 PIC S9(9) COMP-5 VALUE 1.
01 IS-EOF PIC S9(4) COMP-5.
01 inValue pic x(200) .
01 fieldType pic xxxx.
01 mystring pic x(30).
01 wapellido pic x(30).
01 NAME-FIELD PIC X(500) VALUE "CustomerName".

01 wmsg pic x(1000).

01 wfecha1 pic x(10) value '2018-06-07'.
01 wfecha2 pic x(10) value '07-06-2018'.
01 wfecha3 pic x(08) value '07062018'.
01 wfecha4 pic x(8) value '20180607'.
01 wfecha5 pic 9999/99/99 value "2018/01/02".

01 xx-fecha.
02 xx-fecha-aa pic 9999 VALUE 2018.
02 xx-fecha-g1 pic x value "-".
02 xx-fecha-mm pic 99 VALUE 6.
02 xx-fecha-g2 pic x value "-".
02 xx-fecha-dd pic 99 VALUE 4.
01 redefines xx-fecha.
02 ww-fecha pic x(10).

01 qq-fecha.
02 qq-fecha-dd pic 99.
02 qq-fecha-g1 pic x value "-".
02 qq-fecha-mm pic 99.
02 qq-fecha-g2 pic x value "-".
02 qq-fecha-aa pic 9999.
01 redefines qq-fecha.
02 yy-fecha pic x(10).

01 w--barras pic x(12).

01 wvto pic 9(8).
01 redefines wvto.
03 wvto-aa pic 9999.
03 wvto-mm pic 99.
03 wvto-dd pic 99.

01 wimporte pic 9(9),99. *> comp-5.

01 wresfec pic 9(8).

01 utnbase-params GLOBAL EXTERNAL.
02 utnbase-comm pic 9.
*> 1 = lee el cupon
*> 2 = Actualiza cupon
02 utnbase-error pic 9.

01 MYDATA PIC 9(9) COMP-5.

*LINKAGE SECTION.
*
*01 utnbase-params.
* 02 utnbase-comm pic 9.
* *> 1 = lee el cupon
* *> 2 = Actualiza cupon
* 02 utnbase-error pic 9.
*
PROCEDURE DIVISION. *> using utnbase-params.

comienzo.

* move fecha-amd to wresfec.

* STRING 'Provider=PCSoft.HFSQL;Initial Catalog=C:\TESTES_OLEDB_HF;
* 'Password="";Extended Properties="Language=ISO-8859-1";' DELIMITED BY SIZE
* LOW-VALUES DELIMITED BY SIZE
* INTO ADO-CONNECT-STRING



*> crea los objetos principales
invoke COM "CREATE-OBJECT" using ADO-CONNECTION-TYPE returning OBJ-CONNECTION.
invoke COM "CREATE-OBJECT" using ADO-RECORDSET-TYPE returning OBJ-RECORDSET.


*> define y abre la conexión
invoke OBJ-CONNECTION "SET-CONNECTIONSTRING" using ADO-CONNECT-STRING returning RETURN-ERROR.
invoke OBJ-CONNECTION "OPEN" USING ADO-CONNECT-STRING returning RETURN-ERROR.


*> define el string sql y lo ejecuta
evaluate utnbase-comm
when 1
when 2
string "SELECT * FROM CUSTOMER;" delimited by size
low-value delimited by size
into ADO-SQL-STRING
end-string
end-evaluate.
invoke OBJ-RECORDSET "OPEN" using ADO-SQL-STRING OBJ-CONNECTION WLOCK WCURSOR returning RETURN-ERROR.
invoke OBJ-RECORDSET "GET-RECORDCOUNT" returning RECORDCOUNT.

move 1 to utnbase-error.

if recordcount not = zeros
invoke OBJ-RECORDSET "GET-FIELDS" returning OBJ-FIELDS *> cargo el objeto fields
invoke OBJ-FIELDS "GET-COUNT" returning OBJ-FIELDS-COUNT *> cantidad de fields que tiene la tabla
perform varying W-INDEX from 0 by 1 until W-INDEX > (OBJ-FIELDS-COUNT - 1) *> cargo el los objetos field con cada campo de la tabla
invoke OBJ-FIELDS "GET-ITEM" using W-INDEX returning OBJ-FIELD(W-INDEX + 1)
end-perform

move "alterado" to mystring


evaluate utnbase-comm
when 1
invoke OBJ-RECORDSET "GET-EOF" returning IS-EOF
perform with test before until IS-EOF not = 0

invoke OBJ-FIELD(4) "GET-VALUE" returning mystring *>
invoke OBJ-FIELD(17) "GET-VALUE" returning mystring *>
invoke OBJ-FIELD(18) "GET-VALUE" returning mystring *>
invoke OBJ-FIELD(19) "GET-VALUE" returning mystring *> COLUNA QUE QUER ALTERAR COM FECHAS
move zeros to utnbase-error
invoke OBJ-RECORDSET "MoveNext"
invoke OBJ-RECORDSET "GET-EOF" returning IS-EOF
end-perform
when 2
invoke OBJ-RECORDSET "GET-EOF" returning IS-EOF
perform with test before until IS-EOF not = 0

move 1234,43 to wimporte
invoke OBJ-FIELD(1) "SET-VALUE" using wimporte
invoke OBJ-FIELD(4) "SET-VALUE" using mystring

invoke OBJ-FIELD(19) "GET-TYPE" returning mystring *> adDBDate 133 Indicates a date value (yyyymmdd) (DBTYPE_DBDATE).
invoke OBJ-FIELD(19) "SET-VALUE" using wfecha2 *> FECHA A ATUALIZAR

invoke OBJ-RECORDSET "UPDATEBATCH" USING WAFTERRECORDS

invoke OBJ-RECORDSET "GET-SOURCE" returning wmsg
invoke OBJ-RECORDSET "GET-STATE" returning wmsg
invoke OBJ-RECORDSET "GET-STATUS" returning wmsg


invoke OBJ-RECORDSET "MoveNext"
invoke OBJ-RECORDSET "GET-EOF" returning IS-EOF
end-perform
end-evaluate
end-if.

invoke OBJ-RECORDSET "Close".
invoke OBJ-CONNECTION "Close".


sale.
exit program.



END PROGRAM ADO.

Dasije
14 de julio de 2018, 16:51
Puede ser que tengas problemas con la configuración regional en las fechas en el motor de la base de datos, que este configurado de una forma y lo estas usando de otra.