Buenas tardes
Estoy modicicando mi sistema de ventas en xailer 8.2.3 y harbour 3.2.0 dev(r1912031042) al querer crear una funcion en mariadb a traves del AppData:oMariaDB:Execute( cSql )
marca error y se sale.
esta es la funcion para retornar el codigo Mariadbsql :
FUNCTION GetSQL_CtrCliente()
LOCAL cCtr_cliente := ""
cCtr_cliente += "DROP FUNCTION IF EXISTS `ctr_cliente`;" + CRLF
cCtr_cliente += "DELIMITER ;;" + CRLF
cCtr_cliente += "CREATE FUNCTION `ctr_cliente`()" + CRLF
cCtr_cliente += " RETURNS int" + CRLF
cCtr_cliente += " NOT DETERMINISTIC" + CRLF
cCtr_cliente += "BEGIN" + CRLF
cCtr_cliente += " DECLARE new_folio INT;" + CRLF
cCtr_cliente += "" + CRLF
cCtr_cliente += " -- Obtener el nuevo consecutivo" + CRLF
cCtr_cliente += " SELECT cliente INTO new_folio" + CRLF
cCtr_cliente += " FROM control" + CRLF
cCtr_cliente += " LIMIT 1 FOR UPDATE;" + CRLF
cCtr_cliente += " " + CRLF
cCtr_cliente += " -- Incrementar el consecutivo" + CRLF
cCtr_cliente += " UPDATE control" + CRLF
cCtr_cliente += " SET cliente = cliente + 1;" + CRLF
cCtr_cliente += "" + CRLF
cCtr_cliente += " RETURN new_folio;" + CRLF
cCtr_cliente += "END;;" + CRLF
cCtr_cliente += "DELIMITER ;" + CRLF
RETURN cCtr_cliente
de la cual lagrabo de la siguiente forma para tenerla en todo el sistema :
AppData:AddData( "cCtr_cliente" )
AppData:cCtr_cliente := GetSQL_CtrCliente()
al termino de la conexion a mariadb realizo lo siguiente :
AppData:oMariaDB := ::oSM1:oMariadb
cSql := AppData:cCtr_cliente
IF !AppData:oMariaDB:Execute( cSql )
MsgStop("Error al crear el procedimiento almacenado cliente: " + AppData:oMariaDB:cError)
QUIT
RETURN
ENDIF
y Este es el Error que me marca :
#1: onecore\net\netprofiles\service\src\nsp\dll\namespaceserviceprovider.cpp(601)\nlansp_c.dll!6A278528: (caller: 7655EA06) LogHr(1) tid(684) 8007277C No se conoce dicho servicio. No se puede encontrar el servicio en el espacio de nombres especificado.
#2: MariaDB:DROP FUNCTION IF EXISTS `ctr_cliente`;
DELIMITER ;;
CREATE FUNCTION `ctr_cliente`()
RETURNS int
NOT DETERMINISTIC
BEGIN
DECLARE new_folio INT;
-- Obtener el nuevo consecutivo
SELECT cliente INTO new_folio
FROM control
LIMIT 1 FOR UPDATE;
-- Incrementar el consecutivo
UPDATE control
SET cliente = cliente + 1;
RETURN new_folio;
END;;
DELIMITER ;
Commands out of sync; you can't run this command now [# 2014]
En procedimiento: TFORMSPLASH:FORMSHOW línea: 540
***************************** Registro de errores *****************************
Exe: E:\Proyectos Xailer\Projects\winsai82\winsai.exe
Version: 4.0.0.0
User name: jjgp7
Computer name: DESKTOP-VE3GAO3
Fecha: 23/04/2026
Hora: 16:18:26
Memoria libre: 816868
Area actual: 1
------------------------- Información del compilador --------------------------
Versión Xailer: Xailer 8.2.3
Compilador: Harbour 3.2.0dev (r1912031042)
Compilador C/C++: MinGW GNU C 7.3 (32-bit)
Plataforma: Windows 10 10.0
----------------------- Información detallada del error -----------------------
Subsistema: BASE
Código de error: 1004
Estado: .F.
Descripción: Message not found
Operación: TMariaDBDataSource:CERROR
Argumentos: [ 1] = Tipo: O Valor:
Fichero:
Código error SO: 0
Pila de llamadas:
__ERRRT_SBASE (0)
TMARIADBDATASOURCE:ERROR (0)
(b)HBOBJECT (0)
TMARIADBDATASOURCE:MSGNOTFOUND (0)
TMARIADBDATASOURCE:CERROR (0)
TFORMSPLASH:FORMSHOW (541)
TFORMSPLASH:ONSHOW (0)
TSCROLLINGWINCONTROL:SHOW (663)
TFORMSPLASH:SHOW (495)
TFORMSPLASH:SHOWMODAL (0)
INISYSTEM (325)
MAIN (20)
y no genera la funcion en mariadb
Favor de ayudarme para corregir este error y continuar con mi proyecto, por su ayuda mil gracias
In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Proble al crear funcion con mariadb y xailer
Re: Proble al crear funcion con mariadb y xailer
Buenas noches
para quien le seriva ya logre que xailer genere las funciones con mariadb el problema estaba en DELIMITER que no reconoce.
asi es como quedo la funcion que si se crea :
FUNCTION GetSQL_CtrCliente()
LOCAL cCtr_cliente := ""
Text into cCtr_cliente
-- Eliminar la función si existe
DROP FUNCTION IF EXISTS ctr_cliente;
-- Crear la función
CREATE FUNCTION ctr_cliente()
RETURNS INT
NOT DETERMINISTIC
BEGIN
DECLARE new_folio INT;
-- Obtener el consecutivo actual (bloqueando la fila para concurrencia)
SELECT cliente INTO new_folio
FROM control
WHERE id = 1
FOR UPDATE;
-- Incrementar el consecutivo
UPDATE control
SET cliente = cliente + 1
WHERE id = 1;
RETURN new_folio;
END;
EndText
RETURN cCtr_cliente
para preguntar si ya existe una funcion ó procedimiento en mariadb se realiza de la siguiente forma :
FUNCTION Existefunc( xBusc,nOpc )
LOCAL lStatus:=.f., oConsulta, lPaso := .F., cSql:=''
IF nOpc == 1
cSql:="SELECT COUNT(*) > 0 AS existe_funcion "+;
"FROM information_schema.ROUTINES "+ ;
"WHERE ROUTINE_SCHEMA = DATABASE() "+;
"AND ROUTINE_NAME = '"+xBusc+"' "+;
"AND ROUTINE_TYPE = 'FUNCTION';"
Else
cSql:="SELECT COUNT(*) > 0 AS existe_funcion "+;
"FROM information_schema.ROUTINES "+ ;
"WHERE ROUTINE_SCHEMA = DATABASE() "+;
"AND ROUTINE_NAME = '"+xBusc+"' "+;
"AND ROUTINE_TYPE = 'PROCEDURE';"
Endif
oConsulta := AppData:oMariaDB:Query( cSql )
oConsulta:Open()
oConsulta:Gotop()
IF oConsulta:existe_funcion >= 1
lStatus:=.t.
ELSE
lStatus:=.f.
ENDIF
oConsulta:End()
RETURN lStatus
//-------------------------------------------------------------------------------
al final solo escribes esto para crear la funcion :
IF !Existefunc( "ctr_cliente",1 ) // 1 para funcion y 2 para procedimiento
IF !AppData:oMariaDB:Execute( GetSQL_CtrCliente() )
MsgStop("Error al crear el procedimiento almacenado cliente: " + AppData:oMariaDB:cError)
QUIT
RETURN
ENDIF
Endif
para quien le seriva ya logre que xailer genere las funciones con mariadb el problema estaba en DELIMITER que no reconoce.
asi es como quedo la funcion que si se crea :
FUNCTION GetSQL_CtrCliente()
LOCAL cCtr_cliente := ""
Text into cCtr_cliente
-- Eliminar la función si existe
DROP FUNCTION IF EXISTS ctr_cliente;
-- Crear la función
CREATE FUNCTION ctr_cliente()
RETURNS INT
NOT DETERMINISTIC
BEGIN
DECLARE new_folio INT;
-- Obtener el consecutivo actual (bloqueando la fila para concurrencia)
SELECT cliente INTO new_folio
FROM control
WHERE id = 1
FOR UPDATE;
-- Incrementar el consecutivo
UPDATE control
SET cliente = cliente + 1
WHERE id = 1;
RETURN new_folio;
END;
EndText
RETURN cCtr_cliente
para preguntar si ya existe una funcion ó procedimiento en mariadb se realiza de la siguiente forma :
FUNCTION Existefunc( xBusc,nOpc )
LOCAL lStatus:=.f., oConsulta, lPaso := .F., cSql:=''
IF nOpc == 1
cSql:="SELECT COUNT(*) > 0 AS existe_funcion "+;
"FROM information_schema.ROUTINES "+ ;
"WHERE ROUTINE_SCHEMA = DATABASE() "+;
"AND ROUTINE_NAME = '"+xBusc+"' "+;
"AND ROUTINE_TYPE = 'FUNCTION';"
Else
cSql:="SELECT COUNT(*) > 0 AS existe_funcion "+;
"FROM information_schema.ROUTINES "+ ;
"WHERE ROUTINE_SCHEMA = DATABASE() "+;
"AND ROUTINE_NAME = '"+xBusc+"' "+;
"AND ROUTINE_TYPE = 'PROCEDURE';"
Endif
oConsulta := AppData:oMariaDB:Query( cSql )
oConsulta:Open()
oConsulta:Gotop()
IF oConsulta:existe_funcion >= 1
lStatus:=.t.
ELSE
lStatus:=.f.
ENDIF
oConsulta:End()
RETURN lStatus
//-------------------------------------------------------------------------------
al final solo escribes esto para crear la funcion :
IF !Existefunc( "ctr_cliente",1 ) // 1 para funcion y 2 para procedimiento
IF !AppData:oMariaDB:Execute( GetSQL_CtrCliente() )
MsgStop("Error al crear el procedimiento almacenado cliente: " + AppData:oMariaDB:cError)
QUIT
RETURN
ENDIF
Endif