Problema en Text EndTExt con variables

253 views
Skip to first unread message

integral

unread,
Apr 7, 2023, 11:08:03 PM4/7/23
to Comunidad de Visual Foxpro en Español

Estimados Amigos :

Buenas Noches

Estoy tratando de grabar la fecha del nuevo ingreso de artículos pedro marca un error de Sintaxis.

Aquí el código de lo avanzado.

WITH Thisform                                                                       
   ltFecha = CTOD(.txtFec_Ing.Value)
ENDWITH

lcSQL_Stock_Ing  = ""

TEXT TO lcSQL_Stock_Ing TEXTMERGE NOSHOW PRETEXT 15
    UPDATE Gen_Stock
           SET st_act = <<m.new_stock>>
           SET f_ing  = <<ltFecha>>
           WHERE id_clase = '<<m.id_Clase>>'
ENDTEXT

Agradezco sus comentarios y sugerencias.

Saludos,

Integral

Antonio Meza

unread,
Apr 7, 2023, 11:25:50 PM4/7/23
to Comunidad de Visual Foxpro en Español
Creo que tienes un error de sintaxis en la instrucción UPDATE, ya que veo que usas 2 veces SET y solo se una una vez y se separa con coma para el siguiente campo a cambiar el valor

UPDATE Gen_Stock SET campo1 = valor1, campo2 = valor2

En cuanto al manejo de fechas y valores numéricos te recomiendo que lo uses con variables directas y no uses <<valor>>, ejemplo:

WITH Thisform                                                                       
   ltFecha = CTOD(.txtFec_Ing.Value)
ENDWITH

lcSQL_Stock_Ing  = ""

TEXT TO lcSQL_Stock_Ing TEXTMERGE NOSHOW PRETEXT 15
    UPDATE Gen_Stock SET
           st_act = ?m.new_stock ,
           f_ing  = ?ltFecha
           WHERE id_clase = ?m.id_Clase
ENDTEXT

saludos
Antonio Meza

Cristian Novoa

unread,
Apr 8, 2023, 8:36:22 AM4/8/23
to Comunidad de Visual Foxpro en Español
TEXT TO cSQL TEXTMERGE NOSHOW
SELECT a.fecha, a.numero, a.banco, a.plaza, a.monto, a.id
  FROM tbl_cheque_cartera a
  WHERE a.fecha <= '<<DTOA(tdFechaDep)>>'
  AND a.rut_empresa = <<goEntorno.crut_empresa>>
  AND a.id_abono IS NULL
  ORDER BY a.monto
ENDTEXT



IF ! ejecuta_bd(cSQL, lcAlias, "Buscando cheques, espere...")
RETURN .F.
ENDIF

RETURN
-------------------------------------------------------------------------------------------------------------------------------
*- Convierte un tipo date o datetime a formato ANSI, para que lo reciba SQL Server
FUNCTION DTOA(tdFecha)

LOCAL lcSetHours, lcFechaANSI


IF ISNULL(tdFecha) OR EMPTY(tdFecha)
RETURN '19000101'
ENDIF

**************
* SET HOURS produjo algo raro: al ejecutar esta funcion en un evento Timer, y estando en un textbox,
* el cursor se movia al inicio del textbox
**************
*lcSetHours = SET("HOURS")
*SET HOURS TO 24

*lcFechaANSI = DTOS(tdFecha)+" "+TTOC(tdFecha,2)
lcFechaANSI = DTOS(tdFecha)+" "+PADL(HOUR(tdFecha),2,"0")+":"+PADL(MINUTE(tdFecha),2,"0")+":"+PADL(SEC(tdFecha),2,"0")

*SET HOURS TO (lcSetHours)

RETURN lcFechaANSI

Ramón Rodríguez Martínez

unread,
Apr 8, 2023, 3:35:02 PM4/8/23
to Comunidad de Visual Foxpro en Español
Podrías convertir las fechas a formato MySQL o MarIaDB  con una función similar a esta:

FUNCTION FechaMySQL(FldFecha as Date) as String
LOCAL OldFOrmat as String
LOCAL strFecha as String

StrFecha = "0000-00-00"
TRY
IF VARTYPE(FldFecha)=="D" AND !ISBLANK(FldFecha) AND !EMPTY(fldFecha) AND !ISNULL(FldFecha) THEN
cAnio = PADL(TRANSFORM(YEAR (FldFecha)),4,"0")
cMes  = PADL(TRANSFORM(Month(FldFecha)),2,"0")
cDia  = PADL(TRANSFORM(Day  (FldFecha)),2,"0")
strFecha = cAnio + "-" + cMes + "-" + cDia
ENDIF
CATCH
StrFecha = "0000-00-00"
ENDTRY
RETURN strFecha
ENDFUNC

integral

unread,
Apr 8, 2023, 7:18:56 PM4/8/23
to Comunidad de Visual Foxpro en Español
Que tal Amigos :

Gracias a todos por sus comentarios y sugerencias.

Tema resuelto

Hasta la próxima

Saludos,

Integral

Antonio Meza

unread,
Apr 9, 2023, 1:36:51 AM4/9/23
to Comunidad de Visual Foxpro en Español
y la pregunta del millón como lo resolviste??? 

Porque eso va ayudar a otro compañero que tenga un problema parecido al tuyo!!!

saludos
Antonio Meza

GUIDO CARDONA

unread,
Apr 11, 2023, 5:55:42 PM4/11/23
to publice...@googlegroups.com
Buenos dias no indicas el motor de Bdatos pero Si es una Bd Mysql las fechas debe ir entre comillas y debes convertir la fecha a caracter
con CTOD(FECHA) .

y no debes repetir el SET

 UPDATE Gen_Stock
           SET st_act = <<m.new_stock>>,

           f_ing  = '<<ltFecha>>' 
           WHERE id_clase = '<<m.id_Clase>>'


El formato de la fecha debe ser AAAA-MM-DD (con el separador guiones, SET DATE ANSI y reemplazar el separador / por - con la funcion STRTRAN). 
Si el un campo timestamp debes armar una cadena con la fecha de arriba + un espacio + el time() en formato HH:MM:SS

Guido Cardona


--
Blog de la Comunidad Visual FoxPro en Español: http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/4e3e4bdd-4f6f-4200-bfd6-a3672df76d2dn%40googlegroups.com.

Victor Espina

unread,
Apr 12, 2023, 10:09:37 AM4/12/23
to Comunidad de Visual Foxpro en Español
Nunca debes usar concatenacion de cadenas para enviar datos a un servidor SQL.  La forma correcta es usando variables:

WITH Thisform                                                                       
   ltFecha = CTOD(.txtFec_Ing.Value)
ENDWITH

lcSQL_Stock_Ing  = ""

TEXT TO lcSQL_Stock_Ing TEXTMERGE NOSHOW 
    UPDATE Gen_Stock
           SET st_act = ?m.new_stock
           SET f_ing  = ?ltFecha

           WHERE id_clase = ?m.id_Clase
ENDTEXT

Adicionalmente el PRETEXT no aporta nada a la sentencia SQL.

Saludos

Victor Espina

integral

unread,
Apr 12, 2023, 5:46:22 PM4/12/23
to Comunidad de Visual Foxpro en Español
Que tal Amigos :

Me pidieron que publique el código corregido...

A continuación publico el código empleado.

WITH Thisform                                                                      
   ltFecha = .txtFec_Ing.Value

ENDWITH

lcSQL_Stock_Ing  = ""

TEXT TO lcSQL_Stock_Ing TEXTMERGE NOSHOW PRETEXT 15
    UPDATE Gen_Stock SET
           st_act = ?m.new_stock ,

           f_ing  = ?ltFecha
           WHERE id_clase = ?m.id_Clase
ENDTEXT

Saludos,

Integral

Gerardo Cagnola

unread,
Apr 12, 2023, 10:41:56 PM4/12/23
to publice...@googlegroups.com
el text endtext sirve para reemplazar los <<>> con su contenido correspondiente

así como lo estás usando no hace nada, con el ? el fox lo reemplaza antes de enviarlo a ejecutar

es lo mismo que:
lcSQL_Stock_Ing  = 'UPDATE Gen_Stock SET st_act = ?m.new_stock, f_ing  = ?ltFecha WHERE id_clase = ?m.id_Clase'

sino sobrepasas los 254 caracteres esta segunda forma es más rápida de escribir...


--
Blog de la Comunidad Visual FoxPro en Español: http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.

Victor Espina

unread,
Apr 13, 2023, 10:18:07 AM4/13/23
to Comunidad de Visual Foxpro en Español
No es que no hace nada; si hace, lo que pasa es que cuando usas el TEXT-ENDTEXT para generar comandos SQL de esa forma tienes que lidiar con cosas como el formato de la fecha, caracteres invalidos dentro de uno de los valores y, lo que es mas importante, corres un gran riesgo de que te hagan SQL Injection.  Imagina que tienes un form de login con un textbox para el id de usuario y otro para el password, y que tienes esto para determinar si el usuario existe o no:

cLogin = THISFORM.txtLogin.Valor
cSQL = ""
TEXT TO cSQL NOSHOW TEXTMERGE
  SELECT nombre,password,status
     FROM.usuarios
   WHERE login = '<<cLogin>>'
ENDTEXT

Si yo escribo en el textbox de login el texto VESPINA, el query queda asi:

  SELECT nombre,password,status
     FROM.usuarios
   WHERE login = 'VESPINA'

lo que es correcto.  PEro que pasa si yo soy un usuario malicioso y escribo esto en el textbox de login:

' ;DELETE FROM usuarios;--

el query quedaria:

  SELECT nombre,password,status
     FROM.usuarios
   WHERE login = ''; DELETE FROM usuarios; --'

lo que causaria que se elimine toda el contenido de la tabla de usuarios dejando el sistema inutilizable.  

Es justo por esto ultimo que el uso de concatenacion de cadenas para armar comandos SQL es considerado una muy mala practica.


Victor Espina
Reply all
Reply to author
Forward
0 new messages