Funcion de MySQL nativa en codigo

Post Reply
nlerdafehn
Posts: 50
Joined: Tue Feb 02, 2021 10:21 pm
Location: Buenos Aires, Argentina
Contact:

Funcion de MySQL nativa en codigo

Post by nlerdafehn »

Hola Foro!

Estuve buscando ya hace un tiempo y no logro encontrar como hacerlo. Estoy usando dolphin para comunicarme con MySQL, y estoy usando esto de fivewin pero no logro ver como hacer para utilizar una funcion de MySQL en el insert. Siempre tengo que recaer en escribir el insert a mano si quiero utilizar alguna función de MySQL.

Les doy un ejemplo: Si yo tengo una columna de control de cuando se realizo el momento, en el insert de MySQL en ese campo, le ejecuto la funcion now(), que es un timestamp de fecha, hora y segundos. En cuanto a la manera que lo utilizo, no se como hacer para que tome una función de SQL, ya que no quiero que tome time() de harbour, porque va a tomar la hora local de la PC que es alterable, ni tampoco quiero hacer una query preguntando el now y despues insertarlo. Hay alternativas, lo se. Pero quisiera que fluya mejor y si hay alguna manera de hacer que la función de MYSQL se pueda poner.

Ejemplo de codigo

Code: Select all | Expand

ntab:=oodbc:query('select * from ventas limit 0')
  ntab:getblankrow(.f.)
  ntab:caja  := hvnum["caja"]
  ntab:fecha   := date() // aca toma la fecha de la PC, pero quisiera hacer la funcion current_date() de mysql
  ntab:momento := date() +" " +time() // aca me gustaria poner now()
  ntab:cliente   := "A Consumidor Final"
  ntab:save()
  ntab:end()


Espero sus comentarios,
Buen finde!
Nicolás
User avatar
cmsoft
Posts: 1297
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina
Been thanked: 2 times

Re: Funcion de MySQL nativa en codigo

Post by cmsoft »

Creo que con Save() no se puede porner el valor de una funcion MySql sobre el Objeto Query
Podrias hacerlo asi:

Code: Select all | Expand


ntab:=oodbc:query('select * from ventas limit 0')
  oRow := ntab:getblankrow(.f.)
  oRow:caja  := hvnum["caja"]
  oRow:fecha   := oodbc:query("select curdate() as fecha from dual"):fecha
  oRow:momento := oodbc:query("select now() as hora from dual"):hora
  oRow:cliente   := "A Consumidor Final"
  ntab:oRow := oRow
  ntab:save()
  ntab:end()

 

Sino, tambien puedes dejarle el trabajo a la base de datos, definiendo la tabla para que el campo lo llene solo

Code: Select all | Expand


CREATE TABLE mitabla (
   momento DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
)
 
User avatar
nageswaragunupudi
Posts: 10721
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Been thanked: 8 times
Contact:

Re: Funcion de MySQL nativa en codigo

Post by nageswaragunupudi »

cmsoft wrote:Sino, tambien puedes dejarle el trabajo a la base de datos, definiendo la tabla para que el campo lo llene solo

Code: Select all | Expand


CREATE TABLE mitabla (
   momento DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
)
 


The above is recommended.

In the above case, MySql server fills the field `momento` with correct DateTime value at the time of insertion of the row. This value will not change when any fields of the record are modified.
See another variant:

Code: Select all | Expand

CREATE TABLE mitabla (
   momento DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
   `modify_dt`  TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
 

MySql server updates the value of `modify_dt` everytime any field in the record is updated.
Regards

G. N. Rao.
Hyderabad, India
User avatar
cmsoft
Posts: 1297
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina
Been thanked: 2 times

Re: Funcion de MySQL nativa en codigo

Post by cmsoft »

Muchas gracias Mr. Rao por la explicación.
En el caso de lo que solicita Nicolás, que es también un campo DATE (no DATETIME) que se llene con la fecha de creación, el único camino es crear una trigger que lo haga?
User avatar
carlos vargas
Posts: 1721
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Funcion de MySQL nativa en codigo

Post by carlos vargas »

Tener cuidado con la fecha y hora del sever, por si esta en un hosting.
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
nageswaragunupudi
Posts: 10721
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Been thanked: 8 times
Contact:

Re: Funcion de MySQL nativa en codigo

Post by nageswaragunupudi »

carlos vargas wrote:Tener cuidado con la fecha y hora del sever, por si esta en un hosting.

i do not have any problem with TIMESTAMP even on cloud hosted servers.
Can you please explain the problems you face.

Better we discuss.
Regards

G. N. Rao.
Hyderabad, India
User avatar
nageswaragunupudi
Posts: 10721
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Been thanked: 8 times
Contact:

Re: Funcion de MySQL nativa en codigo

Post by nageswaragunupudi »

cmsoft wrote:Muchas gracias Mr. Rao por la explicación.
En el caso de lo que solicita Nicolás, que es también un campo DATE (no DATETIME) que se llene con la fecha de creación, el único camino es crear una trigger que lo haga?


You are right in case of all MySQL versions prior to 8.0.13.
In later versions, this works:

Code: Select all | Expand

`createdate` DATE NOT NULL DEFAULT (CURRENT_DATE)

I just tested.
Regards

G. N. Rao.
Hyderabad, India
User avatar
cmsoft
Posts: 1297
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina
Been thanked: 2 times

Re: Funcion de MySQL nativa en codigo

Post by cmsoft »

Excelente Mr. Rao, lo había leído pero intenté en algunas bases con versiones anteriores y no funcionaba.
Es cuestión de actualizar la versión de MySql
User avatar
nageswaragunupudi
Posts: 10721
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Been thanked: 8 times
Contact:

Re: Funcion de MySQL nativa en codigo

Post by nageswaragunupudi »

You can test on our cloud server version 8.0.29
"209.250.245.152",
database: "fwh",
user: "fwhuser",
pwd : "FiveTech@2022"
Regards

G. N. Rao.
Hyderabad, India
User avatar
nageswaragunupudi
Posts: 10721
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Been thanked: 8 times
Contact:

Re: Funcion de MySQL nativa en codigo

Post by nageswaragunupudi »

We need to explore more with MariaDB.
I read that DEFAULT (expression) works from version 10.2.1
Regards

G. N. Rao.
Hyderabad, India
User avatar
cmsoft
Posts: 1297
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina
Been thanked: 2 times

Re: Funcion de MySQL nativa en codigo

Post by cmsoft »

Probé en mi base de datos local

Code: Select all | Expand


ALTER TABLE `test`.`art524`  
  ADD COLUMN `fecha_alta` DATE  DEFAULT (CURRENT_DATE)  ;
Resultado
Error Code: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '(CURRENT_DATE)' at line 2
 

Version 10.0.24-MariaDB
Voy a tratar de actualizar la versión y hacer las pruebas

En mi base remota:
8.0.30-0ubuntu0.20.04.2
El resultado correcto
User avatar
nageswaragunupudi
Posts: 10721
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Been thanked: 8 times
Contact:

Re: Funcion de MySQL nativa en codigo

Post by nageswaragunupudi »

With MariaDB, use (CURRENT_DATE()) not (CURRENT_DATE).

With MySQL 8.0.28. both (CURRENT_DATE) and (CURRENT_DATE()) are working.
Regards

G. N. Rao.
Hyderabad, India
User avatar
nageswaragunupudi
Posts: 10721
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Been thanked: 8 times
Contact:

Re: Funcion de MySQL nativa en codigo

Post by nageswaragunupudi »

Small Test:

Code: Select all | Expand

#include "fivewin.ch"

function Main()

   local oCn, oRs

   SET DATE ITALIAN
   SET CENTURY ON

   oCn   := maria_Connect( "209.250.245.152","fwh","fwhuser","FiveTech@2022" )
   oCn:lShowErrors   := .t.
   ? oCn:cServerInfo
   xbrowser ocn:ListTables()

   oCn:DropTable( "dt" )

   ? oCn:CreateTable( "dt", { ;
      { "NAME", "C", 10, 0 }, ;
      { "NUMB", "N", 10, 0 }, ;
      { "CRDT1", "DATE NOT NULL DEFAULT (CURRENT_DATE)", 8, 0 }, ;
      { "CRDT2", "DATE NOT NULL DEFAULT (CURRENT_DATE())", 8, 0 }, ;
      { "CRDTT", "@", 8, 0 }, ;
      { "UPDTT", "=", 8, 0 } } )
     
   FW_MemoEdit( oCn:CreateTableSQL( "dt" ) )

   oRs := oCn:dt
   oRs:Edit()
   xbrowser oRs FASTEDIT

   oCn:Close()

return nil
 


Result of oCn:CreateTableSQL( "dt" ):

Code: Select all | Expand

CREATE TABLE `dt` (
  `id` int NOT NULL AUTO_INCREMENT,
  `NAME` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8_unicode_ci DEFAULT NULL,
  `NUMB` bigint DEFAULT NULL,
  `CRDT1` date NOT NULL DEFAULT (curdate()),
  `CRDT2` date NOT NULL DEFAULT (curdate()),
  `CRDTT` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `UPDTT` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_unicode_ci



Image
Regards

G. N. Rao.
Hyderabad, India
User avatar
cmsoft
Posts: 1297
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina
Been thanked: 2 times

Re: Funcion de MySQL nativa en codigo

Post by cmsoft »

Muy buen ejemplo.
Aprovecho para consulta: como actualizo mi versión de MariaDB para Windows? Se ejecuta un nuevo instalador con la versión elegida o hay otra manera?
xmanuel
Posts: 768
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla
Been thanked: 5 times
Contact:

Re: Funcion de MySQL nativa en codigo

Post by xmanuel »

Creo que lo que quiere hacer Nicolás es usar funciones nativas de MySQL...
Por lo tanto lo mejor es que construya la sentencia INSERT manualmente.
______________________________________________________________________________
Sevilla - Andalucía
Post Reply