Página 1 de 1

Campo Virtual en MariaDB

Publicado: Mar Nov 20, 2018 10:59 pm
por gerencia
Hola Ignacio,

He añadido unos campos virtuales a una tabla de Mariadb, pero al intentar Insertar un nuevo registro desde
un Dataset con Update() intenta Insertar también los campos virtuales.

La columna nomcompleto es un campo VIRTUAL(`nomcompleto` char(130) AS (IF(pjuridica=1,nomcli,CONCAT(TRIM(nomcli),' ',TRIM(apellcli) ) )) VIRTUAL COMMENT 'Nombre Completo')

El INSERT y el UPDATE no deberían ignorar los campos Virtuales ?


El error,

MariaDB:INSERT INTO m_clientes( codcli, pjuridica, nomcli, apellcli, nomcompleto, nomcomer, nombre, tipcli, ti_ident, no_ident, digver, cupo_cre, barrio, dircli, dircli2, direccion, telcli, telcli2, telcli3, Telefonos, codmun, ciudcli, coddep, contacto, referen, clasifica, email, apdo, zona, vdor, Observacion, estado, desc_pro, desc_fin, dia_vcto, tipovta, rec_fact, cop_fact, ult_com, ult_pag, ult_liq, porc_int, ret_fte, ret_iva, ret_ica, ret_cre, exento, exenimpoc, bloqueado, blocupcre, cliweb, codpre, sdoant, fltinici, fltfin, fltonoff, baserete, porcrete, servrete, porcsret, baserica, porcrica, servrica, porcsica, baseriva, porcriva, basecree, porccree, servcree, porcscree, NombreFe, EmailFe, TeleFe, CeluFe, fapertura, uapertura, linhabilitado, ldelete ) VALUES( '92502305', 0, '', 'Angulo U', '', '', '', '', 2, '92452305', '', 0, '', 'Av. Venezulea', '', '', '', '', '', '', '01', '', '01', '', '', '', '', '', '', '', '', '', 0, 0, 0, 0, 0, 0, '0000-00-00', '0000-00-00', '0000-00-00', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '', 0, '0000-00-00', '0000-00-00', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Jose', 'gerencia@mi.com', '', '', '0000-00-00', '', 0, 0 )
The value specified for computed column 'nomcompleto' in table 'm_clientes' ignored [# 1906]


Gracias por tu colaboración,

Re: Campo Virtual en MariaDB

Publicado: Mié Nov 21, 2018 1:06 am
por hgarciaj
Tomado de la base de conocimientos de MariaDB:

If you try to insert non-default values into a virtual column, you will receive a warning and what you tried to insert will be ignored and the derived value inserted instead:

WARNINGS;
Show warnings enabled.

INSERT INTO table1 VALUES (1, 'some text',default,default);
Query OK, 1 row affected (0.00 sec)

INSERT INTO table1 VALUES (2, 'more text',5,default);
Query OK, 1 row affected, 1 warning (0.00 sec)

Warning (Code 1645): The value specified for computed column 'c' in table 'table1' ignored.

INSERT INTO table1 VALUES (123, 'even more text',default,'something');
Query OK, 1 row affected, 2 warnings (0.00 sec)

Warning (Code 1645): The value specified for computed column 'd' in table 'table1' ignored.
Warning (Code 1265): Data truncated for column 'd' at row 1

SELECT * FROM table1;
+-----+----------------+------+-------+
| a | b | c | d |
+-----+----------------+------+-------+
| 1 | some text | 1 | some |
| 2 | more text | 2 | more |
| 123 | even more text | 3 | even |
+-----+----------------+------+-------+
3 rows in set (0.00 sec)

Re: Campo Virtual en MariaDB

Publicado: Mié Nov 21, 2018 7:40 pm
por Hurricane
Hi,

Las columnas de tipo VIRTUAL sólo se generan (calculadas) en las consultas.
Usted (o el Xailer) que informó la columna de nomcompleto en el INSERT?
Creo que deberías omitir este tipo de columna. Si esta declaración fue generada por Xailer, creo que es un error. Cree un pequeño ejemplo para demostrar.

¿Qué versión de MariaDB?
gerencia escribió: ...
El INSERT y el UPDATE no deberían ignorar los campos Virtuales ?
El error,
MariaDB:INSERT INTO m_clientes( codcli, pjuridica, nomcli, apellcli, nomcompleto...

Re: Campo Virtual en MariaDB

Publicado: Mié Nov 21, 2018 9:11 pm
por gerencia
Efectivamente,
Xailer genero el INSERT, estoy de acuerdo contigo las columnas virtuales deberían excluirse cuando prepare el INSERT o el UPDATE.

Ignacio, por favor revisar el tema.

Gracias,

Hurricane escribió:Hi,

Las columnas de tipo VIRTUAL sólo se generan (calculadas) en las consultas.
Usted (o el Xailer) que informó la columna de nomcompleto en el INSERT?
Creo que deberías omitir este tipo de columna. Si esta declaración fue generada por Xailer, creo que es un error. Cree un pequeño ejemplo para demostrar.

¿Qué versión de MariaDB?
gerencia escribió: ...
El INSERT y el UPDATE no deberían ignorar los campos Virtuales ?
El error,
MariaDB:INSERT INTO m_clientes( codcli, pjuridica, nomcli, apellcli, nomcompleto...

Re: Campo Virtual en MariaDB

Publicado: Jue Nov 22, 2018 2:44 am
por hgarciaj
El objeto dataset usado para el update o insert está basado en la instrucción dbstruct tomando como punto de partida el query de la tabla, así que es por demás imposible que se pueda determinar si el campo incluido es uno virtual o persitent cuya información solo se puede obtener mediante el comando describe.
El mensaje de advertencia lo emite MariaDB como se puede leer en su documentación por lo que no se puede considerar un defecto de Xailer.
Atrape el error con Try catch y quite la opción de desplegar errores de su objetoi dataset.
Complementando la información si en el query que genera el dataset se incluyen campos de más de una base de datos Xailer no enviará ningún tipo de error pero no se realizará el insert o update porque es una limitante de Maria DB, por lo que sugiero leer la documentación de ambas herramientas.
Particularmente prefiero hacer los inserts o update usando las instrucciones sql usando los métodos BuildsqlSt y Execute del datasource de MariaDB, para evitar este tipo de inconvenientes.

Re: Campo Virtual en MariaDB

Publicado: Jue Nov 22, 2018 7:04 am
por Hurricane
Hola Jose,

Una solución temporal:

Código: Seleccionar todo

METHOD Button1Click( oSender ) CLASS TFrmProduto
   ::oDBMaskEdit1:oDataField:lEditable:=.f.   // <-- my virtual field
   ::oTbProduto:Update()
   ::oTbProduto:Refresh()    // <- también se requirió
RETURN Nil
he creado una prueba, con una columna virtual y funcionó.
la columna no se incluye en la instrucción :D
gerencia escribió: El INSERT y el UPDATE no deberían ignorar los campos Virtuales ?
El error,

Re: Campo Virtual en MariaDB

Publicado: Jue Nov 22, 2018 11:02 am
por ignacio
Buenos días,

Intenta poner: oDataField:lEditable := .F.

Saludos

Re: Campo Virtual en MariaDB

Publicado: Jue Nov 22, 2018 4:26 pm
por gerencia
Hola Ignacio y Hurricane,

Si funciona, por lo pronto una solución rápida.
Considero que deberían tenerlo en cuenta para futuras versiones.

Mil gracias por su colaboración,

Saludos,
ignacio escribió:Buenos días,

Intenta poner: oDataField:lEditable := .F.

Saludos