FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Funcion de MySQL nativa en codigo
Posts: 50
Joined: Tue Feb 02, 2021 10:21 PM
Funcion de MySQL nativa en codigo
Posted: Sat Oct 01, 2022 01:59 PM
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 (fw): Select all Collapse
 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
Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM
Re: Funcion de MySQL nativa en codigo
Posted: Sat Oct 01, 2022 03:07 PM
Creo que con Save() no se puede porner el valor de una funcion MySql sobre el Objeto Query
Podrias hacerlo asi:
Code (fw): Select all Collapse
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 (fw): Select all Collapse
CREATE TABLE mitabla (
   momento DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
)
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Funcion de MySQL nativa en codigo
Posted: Mon Oct 03, 2022 11:21 AM
cmsoft wrote:
Sino, tambien puedes dejarle el trabajo a la base de datos, definiendo la tabla para que el campo lo llene solo
Code (fw): Select all Collapse
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 (fw): Select all Collapse
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
Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM
Re: Funcion de MySQL nativa en codigo
Posted: Mon Oct 03, 2022 12:07 PM

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?

Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: Funcion de MySQL nativa en codigo
Posted: Mon Oct 03, 2022 02:30 PM

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

Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Funcion de MySQL nativa en codigo
Posted: Mon Oct 03, 2022 03:48 PM
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
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Funcion de MySQL nativa en codigo
Posted: Mon Oct 03, 2022 04:20 PM
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 (fw): Select all Collapse
`createdate` DATE NOT NULL DEFAULT (CURRENT_DATE)

I just tested.
Regards



G. N. Rao.

Hyderabad, India
Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM
Re: Funcion de MySQL nativa en codigo
Posted: Mon Oct 03, 2022 04:41 PM

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

Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Funcion de MySQL nativa en codigo
Posted: Mon Oct 03, 2022 05:18 PM

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
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Funcion de MySQL nativa en codigo
Posted: Mon Oct 03, 2022 06:26 PM

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

Regards



G. N. Rao.

Hyderabad, India
Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM
Re: Funcion de MySQL nativa en codigo
Posted: Mon Oct 03, 2022 07:33 PM
Prob茅 en mi base de datos local
Code (fw): Select all Collapse
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
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Funcion de MySQL nativa en codigo
Posted: Tue Oct 04, 2022 12:46 AM

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
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Funcion de MySQL nativa en codigo
Posted: Tue Oct 04, 2022 02:19 AM
Small Test:
Code (fw): Select all Collapse
#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 (fw): Select all Collapse
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



Regards



G. N. Rao.

Hyderabad, India
Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM
Re: Funcion de MySQL nativa en codigo
Posted: Tue Oct 04, 2022 03:02 AM

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?

Posts: 817
Joined: Sun Jun 15, 2008 07:47 PM
Re: Funcion de MySQL nativa en codigo
Posted: Tue Oct 04, 2022 06:26 AM

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

Continue the discussion